From: Liu Yuan <tailai.ly at taobao.com> Signed-off-by: Liu Yuan <tailai.ly at taobao.com> --- sheep/sheep.c | 3 +++ sheep/work.c | 31 +++---------------------------- sheep/work.h | 30 ++++++++++++++++++++++++++++++ 3 files changed, 36 insertions(+), 28 deletions(-) diff --git a/sheep/sheep.c b/sheep/sheep.c index b2c03b8..fd98044 100644 --- a/sheep/sheep.c +++ b/sheep/sheep.c @@ -226,6 +226,9 @@ int main(int argc, char **argv) !sys->flush_wqueue) exit(1); + ret = init_signal(); + if (ret) + exit(1); vprintf(SDOG_NOTICE, "sheepdog daemon (version %s) started\n", PACKAGE_VERSION); while (!sys_stat_shutdown() || sys->nr_outstanding_reqs != 0) diff --git a/sheep/work.c b/sheep/work.c index 789272e..ec9678d 100644 --- a/sheep/work.c +++ b/sheep/work.c @@ -32,40 +32,14 @@ #include "event.h" static int efd; -static LIST_HEAD(worker_info_list); - -struct work_queue { - int wq_state; - int nr_active; - struct list_head pending_list; - struct list_head blocked_list; -}; +int total_nr_workers; +LIST_HEAD(worker_info_list); enum wq_state { WQ_BLOCKED = (1U << 0), WQ_DEAD = (1U << 1), }; -struct worker_info { - struct list_head worker_info_siblings; - - int nr_threads; - - pthread_mutex_t finished_lock; - struct list_head finished_list; - - /* wokers sleep on this and signaled by tgtd */ - pthread_cond_t pending_cond; - /* locked by tgtd and workers */ - pthread_mutex_t pending_lock; - /* protected by pending_lock */ - struct work_queue q; - - pthread_mutex_t startup_lock; - - pthread_t worker_thread[0]; -}; - static void work_queue_set_blocked(struct work_queue *q) { q->wq_state |= WQ_BLOCKED; @@ -289,6 +263,7 @@ struct work_queue *init_work_queue(int nr) list_add(&wi->worker_info_siblings, &worker_info_list); + total_nr_workers += nr; return &wi->q; destroy_threads: diff --git a/sheep/work.h b/sheep/work.h index 9ef9936..3598ad9 100644 --- a/sheep/work.h +++ b/sheep/work.h @@ -18,6 +18,36 @@ struct work { enum work_attr attr; }; +struct work_queue { + int wq_state; + int nr_active; + struct list_head pending_list; + struct list_head blocked_list; +}; + +struct worker_info { + struct list_head worker_info_siblings; + + int nr_threads; + + pthread_mutex_t finished_lock; + struct list_head finished_list; + + /* wokers sleep on this and signaled by tgtd */ + pthread_cond_t pending_cond; + /* locked by tgtd and workers */ + pthread_mutex_t pending_lock; + /* protected by pending_lock */ + struct work_queue q; + + pthread_mutex_t startup_lock; + + pthread_t worker_thread[0]; +}; + +extern struct list_head worker_info_list; +extern int total_nr_workers; + struct work_queue *init_work_queue(int nr); void queue_work(struct work_queue *q, struct work *work); -- 1.7.8.2 |