83 lines
1.5 KiB
C
83 lines
1.5 KiB
C
#include "worker.h"
|
|
|
|
static bool s_workerInitialized = 0;
|
|
static thrd_t s_workerThread;
|
|
static cnd_t s_workerCdn;
|
|
static mtx_t s_workerMtx;
|
|
|
|
static volatile struct
|
|
{
|
|
workerThreadFunc func;
|
|
void* data;
|
|
|
|
bool exit;
|
|
} s_workerParam;
|
|
|
|
static int workerThreadProc(void* unused)
|
|
{
|
|
mtx_lock(&s_workerMtx);
|
|
|
|
for (;;)
|
|
{
|
|
cnd_wait(&s_workerCdn, &s_workerMtx);
|
|
|
|
if (s_workerParam.exit)
|
|
break;
|
|
|
|
s_workerParam.func(s_workerParam.data);
|
|
}
|
|
|
|
mtx_unlock(&s_workerMtx);
|
|
|
|
return 0;
|
|
}
|
|
|
|
bool workerInit(void)
|
|
{
|
|
if (s_workerInitialized) return 1;
|
|
|
|
if (cnd_init(&s_workerCdn) != thrd_success) return 0;
|
|
if (mtx_init(&s_workerMtx, mtx_plain) != thrd_success) {
|
|
cnd_destroy(&s_workerCdn);
|
|
return 0;
|
|
}
|
|
|
|
if (thrd_create(&s_workerThread, workerThreadProc, 0) != thrd_success) {
|
|
mtx_destroy(&s_workerMtx);
|
|
cnd_destroy(&s_workerCdn);
|
|
return 0;
|
|
}
|
|
|
|
s_workerInitialized = 1;
|
|
return 1;
|
|
}
|
|
|
|
void workerExit(void)
|
|
{
|
|
int res=0;
|
|
|
|
if (!s_workerInitialized) return;
|
|
s_workerInitialized = 0;
|
|
|
|
mtx_lock(&s_workerMtx);
|
|
s_workerParam.exit = true;
|
|
cnd_signal(&s_workerCdn);
|
|
mtx_unlock(&s_workerMtx);
|
|
|
|
thrd_join(s_workerThread, &res);
|
|
mtx_destroy(&s_workerMtx);
|
|
cnd_destroy(&s_workerCdn);
|
|
}
|
|
|
|
void workerSchedule(workerThreadFunc func, void* data)
|
|
{
|
|
if (!s_workerInitialized) return;
|
|
|
|
mtx_lock(&s_workerMtx);
|
|
s_workerParam.func = func;
|
|
s_workerParam.data = data;
|
|
cnd_signal(&s_workerCdn);
|
|
mtx_unlock(&s_workerMtx);
|
|
}
|
|
|