#ifndef UIC_THREADPOOL_H
#define UIC_THREADPOOL_H
#include "../ui/toolkit.h"
#ifndef _WIN32
#include <pthread.h>
#endif
#ifdef __cplusplus
extern "C" {
#endif
typedef struct UiJob {
UiObject *obj;
ui_threadfunc job_func;
void *job_data;
ui_callback finish_callback;
void *finish_data;
} UiJob;
typedef struct _threadpool_job threadpool_job;
typedef void*(*job_callback_f)(
void *data);
typedef struct _pool_queue
pool_queue_t;
struct UiThreadpool {
pthread_mutex_t queue_lock;
pthread_mutex_t avlbl_lock;
pthread_cond_t available;
pool_queue_t *queue;
uint32_t queue_len;
uint32_t num_idle;
int min_threads;
int max_threads;
};
struct _threadpool_job {
job_callback_f callback;
void *data;
};
struct _pool_queue {
threadpool_job *job;
pool_queue_t *next;
};
UiThreadpool* threadpool_new(
int min,
int max);
int threadpool_start(UiThreadpool *pool);
void* threadpool_func(
void *data);
threadpool_job* threadpool_get_job(UiThreadpool *pool);
void threadpool_run(UiThreadpool *pool, job_callback_f func,
void *data);
void threadpool_enqueue_job(UiThreadpool *pool, threadpool_job *job);
#ifdef __cplusplus
}
#endif
#endif