int s_eventq_add (s_window_t *window, s_event_t *event) { int ret; s_thread_mutex_lock(window->eventq->mut); event->window = window; ret = s_list_add(window->eventq->queue, event, -1); s_thread_cond_signal(window->eventq->cond); s_thread_mutex_unlock(window->eventq->mut); return ret; }
static void * s_thread_run (void *farg) { s_thread_arg_t *arg = (s_thread_arg_t *) farg; void *p = arg->arg; void * (*f) (void *) = arg->f; s_thread_mutex_lock(arg->mut); arg->flag = 1; s_thread_cond_signal(arg->cond); s_thread_mutex_unlock(arg->mut); f(p); return NULL; }
s_thread_t * s_thread_create (void * (*f) (void *), void *farg) { s_thread_t *tid; s_thread_arg_t *arg; if ((s_thread_api == NULL) || (s_thread_api->thread_create == NULL)) { return NULL; } tid = (s_thread_t *) s_malloc(sizeof(s_thread_t)); arg = (s_thread_arg_t *) s_malloc(sizeof(s_thread_arg_t)); arg->r = &s_thread_run; arg->f = f; arg->arg = farg; s_thread_cond_init(&arg->cond); s_thread_mutex_init(&arg->mut); s_thread_mutex_lock(arg->mut); arg->flag = 0; s_thread_cond_signal(arg->cond); s_thread_mutex_unlock(arg->mut); s_thread_api->thread_create(tid, arg); s_thread_mutex_lock(arg->mut); while (arg->flag != 1) { if (s_thread_cond_wait(arg->cond, arg->mut)) { debugf(DSYS, "s_thread_cond_wait failed"); return NULL; } } s_thread_mutex_unlock(arg->mut); s_thread_cond_destroy(arg->cond); s_thread_mutex_destroy(arg->mut); s_free(arg); arg = NULL; return tid; }