23#include <acfutils/worker.h>
24#include <acfutils/time.h>
40 pthread_sigmask(SIG_BLOCK, NULL, &set);
41 if (!sigismember(&set, SIGPIPE)) {
42 sigaddset(&set, SIGPIPE);
43 pthread_sigmask(SIG_BLOCK, &set, NULL);
52 uint64_t now = microclock();
63 if (wk->init_func != NULL) {
64 if (!wk->init_func(wk->userinfo))
75 timeGetDevCaps(&tc,
sizeof (tc));
76 timeBeginPeriod(tc.wPeriodMin);
82 uint64_t intval_us = wk->intval_us;
84 if (intval_us == 0 && !wk->dontstop) {
96 wk->inside_cb = B_TRUE;
98 result = wk->worker_func(wk->userinfo);
100 wk->inside_cb = B_FALSE;
109 if (intval_us != 0 && !wk->dontstop) {
121 new_now = microclock();
122 if (new_now >= now + intval_us) {
123 uint64_t d_t = new_now - now;
124 now += (d_t / intval_us) * intval_us;
127 wk->dontstop = B_FALSE;
131 if (wk->fini_func != NULL)
132 wk->fini_func(wk->userinfo);
135 timeEndPeriod(tc.wPeriodMin);
140worker_init(
worker_t *wk, bool_t (*worker_func)(
void *userinfo),
141 uint64_t intval_us,
void *userinfo,
const char *thread_name)
143 worker_init2(wk, NULL, worker_func, NULL, intval_us, userinfo,
149 bool_t (*init_func)(
void *userinfo),
150 bool_t (*worker_func)(
void *userinfo),
151 void (*fini_func)(
void *userinfo),
152 uint64_t intval_us,
void *userinfo,
const char *thread_name)
154 ASSERT(worker_func != NULL);
159 wk->init_func = init_func;
160 wk->worker_func = worker_func;
161 wk->fini_func = fini_func;
162 wk->intval_us = intval_us;
163 wk->userinfo = userinfo;
164 if (thread_name != NULL)
167 memset(wk->name, 0, sizeof (wk->name));
194worker_set_interval(
worker_t *wk, uint64_t intval_us)
198 while (wk->inside_cb)
200 if (wk->intval_us != intval_us) {
201 wk->intval_us = intval_us;
212worker_set_interval_nowake(
worker_t *wk, uint64_t intval_us)
215 wk->intval_us = intval_us;
223 wk->dontstop = B_TRUE;
233 while (wk->inside_cb)
void lacf_strlcpy(char *dest, const char *src, size_t cap)
static void cv_destroy(condvar_t *cv)
void lacf_mask_sigpipe(void)
static void thread_set_name(const char *name)
static void mutex_destroy(mutex_t *mtx)
static void thread_join(thread_t *thrp)
static void mutex_enter(mutex_t *mtx)
static void cv_init(condvar_t *cv)
static void mutex_exit(mutex_t *mtx)
static void cv_wait(condvar_t *cv, mutex_t *mtx)
static int cv_timedwait(condvar_t *cv, mutex_t *mtx, uint64_t limit)
static void mutex_init(mutex_t *mtx)
static void cv_broadcast(condvar_t *cv)
#define thread_create(thrp, start_proc, arg)