[Sheepdog] [PATCH v2 05/13] sheep: export some structures for trace use

Liu Yuan namei.unix at gmail.com
Thu Feb 16 12:21:24 CET 2012


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  |   46 ++++++++++++++++++----------------------------
 sheep/work.h  |   32 ++++++++++++++++++++++++++++++++
 3 files changed, 53 insertions(+), 28 deletions(-)

diff --git a/sheep/sheep.c b/sheep/sheep.c
index 94b4a9e..b86f8e5 100644
--- a/sheep/sheep.c
+++ b/sheep/sheep.c
@@ -207,6 +207,9 @@ int main(int argc, char **argv)
 	    !sys->recovery_wqueue || !sys->deletion_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..5468d4c 100644
--- a/sheep/work.c
+++ b/sheep/work.c
@@ -24,6 +24,7 @@
 #include <sys/types.h>
 #include <sys/eventfd.h>
 #include <linux/types.h>
+#include <signal.h>
 
 #include "list.h"
 #include "util.h"
@@ -32,40 +33,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 +264,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:
 
@@ -308,6 +284,20 @@ destroy_threads:
 	return NULL;
 }
 
+int init_signal(void)
+{
+	struct sigaction act;
+
+	memset(&act, 0, sizeof(act));
+	act.sa_handler = suspend;
+	/* trace uses this signal to suspend the worker threads */
+	if (sigaction(SIGUSR1, &act, NULL) < 0) {
+		dprintf("%m\n");
+		return -1;
+	}
+	return 0;
+}
+
 #ifdef COMPILE_UNUSED_CODE
 static void exit_work_queue(struct work_queue *q)
 {
diff --git a/sheep/work.h b/sheep/work.h
index 9ef9936..b453b2a 100644
--- a/sheep/work.h
+++ b/sheep/work.h
@@ -18,7 +18,39 @@ 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);
+int init_signal(void);
+void suspend(int);
 
 #endif
-- 
1.7.8.2




More information about the sheepdog mailing list