34 #include <yaz/thread_create.h>
35 #include <yaz/mutex.h>
36 #include <yaz/spipe.h>
46 struct work_item **work_p = q, *work_this = 0;
48 while (*work_p && (*work_p)->
next)
49 work_p = &(*work_p)->
next;
60 for (; q; q = q->
next)
91 yaz_mutex_enter(p->
mutex);
107 yaz_mutex_leave(p->
mutex);
113 yaz_mutex_enter(p->
mutex);
116 yaz_mutex_leave(p->
mutex);
125 yaz_mutex_leave(p->
mutex);
131 int *read_fd,
int no_of_threads)
134 NMEM nmem = nmem_create();
140 assert(no_of_threads >= 1);
146 p->
spipe = yaz_spipe_create(12119, 0);
148 p->
spipe = yaz_spipe_create(0, 0);
156 *read_fd = p->
read_fd = yaz_spipe_get_read_fd(p->
spipe);
167 yaz_mutex_create(&p->
mutex);
185 yaz_mutex_enter(p->
mutex);
188 yaz_mutex_leave(p->
mutex);
199 yaz_spipe_destroy(p->
spipe);
201 yaz_mutex_destroy(&p->
mutex);
202 nmem_destroy(p->
nmem);
209 yaz_mutex_enter(p->
mutex);
217 work_p = nmem_malloc(p->
nmem,
sizeof(*work_p));
224 yaz_log(YLOG_DEBUG,
"sel_thread_add: Input queue length after push: %d",
input_queue_length);
227 yaz_mutex_leave(p->
mutex);
236 yaz_mutex_enter(p->
mutex);
248 (void) recv(p->
read_fd, read_buf, 1, 0);
250 (void) read(p->
read_fd, read_buf, 1);
253 yaz_mutex_leave(p->
mutex);
static void work_handler(void *work_data)
static void queue_trav(struct work_item *q, void(*f)(void *data))
void * sel_thread_result(sel_thread_t p)
gets result of work
static void * sel_thread_handler(void *vp)
static int input_queue_length
void sel_thread_add(sel_thread_t p, void *data)
adds work to be carried out in thread
sel_thread_t sel_thread_create(void(*work_handler)(void *work_data), void(*work_destroy)(void *work_data), int *read_fd, int no_of_threads)
creates select thread
void sel_thread_destroy(sel_thread_t p)
destorys select thread
static struct work_item * queue_remove_last(struct work_item **q)
struct sel_thread * sel_thread_t
select thread handler type
struct work_item * output_queue
struct work_item * free_queue
void(* work_destroy)(void *work_data)
void(* work_handler)(void *work_data)
struct work_item * input_queue
static void work_destroy(void *vp)
how work is destructed