#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 UiQueueElm UiQueueElm;
typedef struct UiQueue UiQueue;
typedef struct UiJob {
UiObject *obj;
ui_threadfunc job_func;
void *job_data;
ui_callback finish_callback;
void *finish_data;
} UiJob;
struct UiQueueElm {
void *data;
UiQueueElm *next;
};
struct UiQueue {
UiQueueElm *elements;
size_t length;
pthread_mutex_t lock;
pthread_mutex_t avlbl_lock;
pthread_cond_t available;
};
typedef struct _threadpool_job threadpool_job;
typedef void*(*job_callback_f)(
void *data);
typedef struct _pool_queue
pool_queue_t;
struct UiThreadpool {
UiQueue *queue;
uint32_t num_idle;
int min_threads;
int max_threads;
pthread_t *threads;
int nthreads;
};
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);
int threadpool_join(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);
UiQueue* ui_queue_create(
void);
void ui_queue_free(UiQueue *queue);
void ui_queue_put(UiQueue *queue,
void *data);
void* ui_queue_get_wait(UiQueue *queue);
#ifdef __cplusplus
}
#endif
#endif