struct thread_context *ctx = _ctx;
void *result;
+ mtx_lock(&ctx->lock);
while (ctx->state != THREAD_STATE_TERMINATED) {
- if (ctx->timer.tv_sec || ctx->timer.tv_nsec)
+ if (ctx->timer.tv_sec || ctx->timer.tv_nsec) {
+ mtx_unlock(&ctx->lock);
thrd_sleep(&ctx->timer, NULL);
+ mtx_lock(&ctx->lock);
+ }
- mtx_lock(&ctx->lock);
while (ctx->state == THREAD_STATE_STOPPED)
cnd_wait(&ctx->wait, &ctx->lock);
if (ctx->state == THREAD_STATE_TERMINATED)
ctx->state = THREAD_STATE_TERMINATED;
ctx->result = result;
}
- mtx_unlock(&ctx->lock);
}
+ mtx_unlock(&ctx->lock);
thrd_exit(ret);
}
ctx->func = func;
ctx->arg = arg;
+ mtx_lock(&ctx->lock);
switch (type) {
case THREAD_TYPE_WORKER:
ctx->state = THREAD_STATE_STOPPED;
new_thread->ctx = ctx;
*thread = new_thread;
+ mtx_unlock(&ctx->lock);
return 0;
err:
+ mtx_unlock(&ctx->lock);
cnd_destroy(&ctx->wait);
mtx_destroy(&ctx->lock);
free(ctx);