51 volatile int flag_exit;
52 pthread_mutex_t interr_mutex;
53 pthread_cond_t interr_signal;
61 interr_usleep_ctx->flag_exit= 1; \ 62 pthread_mutex_lock(&interr_usleep_ctx->interr_mutex); \ 63 pthread_cond_broadcast(&interr_usleep_ctx->interr_signal); \ 64 pthread_mutex_unlock(&interr_usleep_ctx->interr_mutex); 72 pthread_condattr_t condattr;
73 int ret_code, end_code= STAT_ERROR;
80 CHECK_DO(interr_usleep_ctx!= NULL,
goto end);
84 interr_usleep_ctx->flag_exit= 0;
86 ret_code= pthread_mutex_init(&interr_usleep_ctx->interr_mutex, NULL);
89 pthread_condattr_init(&condattr);
90 pthread_condattr_setclock(&condattr, CLOCK_MONOTONIC);
91 ret_code= pthread_cond_init(&interr_usleep_ctx->interr_signal,
95 end_code= STAT_SUCCESS;
97 if(end_code!= STAT_SUCCESS)
99 return interr_usleep_ctx;
107 if(ref_interr_usleep_ctx== NULL ||
108 (interr_usleep_ctx= *ref_interr_usleep_ctx)== NULL)
115 ASSERT(pthread_mutex_destroy(&interr_usleep_ctx->interr_mutex)== 0);
116 ASSERT(pthread_cond_destroy(&interr_usleep_ctx->interr_signal)== 0);
118 free(interr_usleep_ctx);
119 *ref_interr_usleep_ctx= NULL;
127 CHECK_DO(interr_usleep_ctx!= NULL,
return);
135 register uint64_t curr_nsec;
136 struct timespec monotime_curr, monotime_tout;
141 CHECK_DO(interr_usleep_ctx!= NULL,
return STAT_ERROR);
144 CHECK_DO(clock_gettime(CLOCK_MONOTONIC, &monotime_curr)== 0,
146 curr_nsec= (uint64_t)monotime_curr.tv_sec*1000000000+
147 (uint64_t)monotime_curr.tv_nsec;
150 curr_nsec+= ((uint64_t)usec)* 1000;
152 monotime_tout.tv_sec= curr_nsec/ 1000000000;
153 monotime_tout.tv_nsec= curr_nsec% 1000000000;
159 pthread_mutex_lock(&interr_usleep_ctx->interr_mutex);
160 ret_code= STAT_SUCCESS;
161 while(interr_usleep_ctx->flag_exit== 0 && ret_code!= ETIMEDOUT) {
162 ret_code= pthread_cond_timedwait(
163 &interr_usleep_ctx->interr_signal,
164 &interr_usleep_ctx->interr_mutex, &monotime_tout);
166 pthread_mutex_unlock(&interr_usleep_ctx->interr_mutex);
167 return (ret_code== ETIMEDOUT)? STAT_SUCCESS: STAT_EINTR;
interr_usleep_ctx_t * interr_usleep_open()
void interr_usleep_unblock(interr_usleep_ctx_t *interr_usleep_ctx)
General status codes enumeration.
#define CHECK_DO(COND, ACTION)
struct interr_usleep_ctx_s interr_usleep_ctx_t
int interr_usleep(interr_usleep_ctx_t *interr_usleep_ctx, uint32_t usec)
Interruptible usleep module. This module ("interruptible usleep") implements a wrapper to the 'usleep...
void interr_usleep_close(interr_usleep_ctx_t **ref_interr_usleep_ctx)