#include CX_Thread * cx_thread_new(void *(*target)(void *), void *ctx) { CX_Thread *self; int err; self = malloc(sizeof(CX_Thread)); if (!self) { goto err; } self->ctx = ctx; err = pthread_create(&self->thread, NULL, target, self); if (err) { goto err; } return self; err: free(self); return NULL; } void cx_thread_free(CX_Thread *self) { if (self) { /* TODO */ /* This is naive in its current form and will shatter * sooner or later. * Fix the context structures so that this call * is guaranteed not to touch invalid memory. */ ((CX_GL_CTX *)self->ctx)->free(self->ctx); } free(self); } CX_ThreadGroup * cx_threadGroup_new(void *(*target)(void *), void *ctx) { CX_ThreadGroup *self; self = malloc(sizeof(CX_ThreadGroup)); self->workers = malloc(8 * sizeof(CX_Thread *)); self->worker_count = 0; self->worker_size = 8; self->group_manager = cx_thread_new(target, ctx); return self; } void cx_threadGroup_free(CX_ThreadGroup *self) { if (self) { cx_thread_free(self->group_manager); free(self->workers); } free(self); }