--- libeio/etp.c 2015/06/25 18:08:47 1.6 +++ libeio/etp.c 2015/06/25 18:12:53 1.7 @@ -132,6 +132,8 @@ xmutex_t reslock; xmutex_t reqlock; xcond_t reqwait; + + etp_worker wrk_first; }; typedef struct etp_pool *etp_pool; @@ -152,8 +154,6 @@ #endif } etp_worker; -static etp_worker wrk_first; /* NOT etp */ - #define ETP_WORKER_LOCK(wrk) X_LOCK (pool->wrklock) #define ETP_WORKER_UNLOCK(wrk) X_UNLOCK (pool->wrklock) @@ -276,7 +276,7 @@ } ETP_API_DECL int ecb_cold -etp_init (etp_pool pool, void (*want_poll)(void *userdata), void (*done_poll)(void *userdata)) +etp_init (etp_pool pool, void *userdata, void (*want_poll)(void *userdata), void (*done_poll)(void *userdata)) { X_MUTEX_CREATE (pool->wrklock); X_MUTEX_CREATE (pool->reslock); @@ -286,8 +286,8 @@ reqq_init (&pool->req_queue); reqq_init (&pool->res_queue); - wrk_first.next = - wrk_first.prev = &wrk_first; + pool->wrk_first.next = + pool->wrk_first.prev = &pool->wrk_first; pool->started = 0; pool->idle = 0; @@ -299,6 +299,7 @@ pool->max_idle = 4; /* maximum number of threads that can pool->idle indefinitely */ pool->idle_timeout = 10; /* number of seconds after which an pool->idle threads exit */ + pool->userdata = userdata; pool->want_poll_cb = want_poll; pool->done_poll_cb = done_poll; @@ -419,10 +420,10 @@ if (xthread_create (&wrk->tid, etp_proc, (void *)wrk)) { - wrk->prev = &wrk_first; - wrk->next = wrk_first.next; - wrk_first.next->prev = wrk; - wrk_first.next = wrk; + wrk->prev = &wpool->rk_first; + wrk->next = pool->wrk_first.next; + pool->wrk_first.next->prev = wrk; + pool->wrk_first.next = wrk; ++pool->started; } else