[PATCH][cr-tests] Have threads wait in pthread_cond_wait()

Sukadev Bhattiprolu sukadev at linux.vnet.ibm.com
Thu Dec 10 20:10:04 PST 2009


From: Sukadev Bhattiprolu <sukadev at linux.vnet.ibm.com>
Date: Wed, 9 Dec 2009 10:09:08 +0530
Subject: [PATCH] Have threads wait in pthread_cond_wait()

Rather than sleep() have the threads wait in pthread_cond_wait() for
the checkpoint and ensure they are properly signalled after restart.
Also add some debug messages.

Signed-off-by: Sukadev Bhattiprolu <sukadev at linux.vnet.ibm.com>
---
 process-tree/pthread1.c |   66 +++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 61 insertions(+), 5 deletions(-)

diff --git a/process-tree/pthread1.c b/process-tree/pthread1.c
index c9e849c..fa45127 100644
--- a/process-tree/pthread1.c
+++ b/process-tree/pthread1.c
@@ -5,6 +5,7 @@
 #include <string.h>
 #include <stdlib.h>
 #include <libcrtest.h>
+#include <pthread.h>
 
 int num_threads = 5;
 FILE *logfp;
@@ -17,17 +18,61 @@ static void usage(char *argv[])
 	do_exit(1);
 }
 
+struct test_arg {
+	pthread_mutex_t *mutex;
+	pthread_cond_t  *cond;
+};
+
 void *
 do_work(void *arg)
 {
-#if 0
-	fprintf(logfp, "Thread %lu sleeping...\n", pthread_self());
+	int rc;
+	struct test_arg *targ = (struct test_arg *)arg;
+
+	fprintf(logfp, "Thread %lu: waiting...\n", pthread_self());
 	fflush(logfp);
-#endif
+
+	rc = pthread_cond_wait(targ->cond, targ->mutex);
+	if (rc < 0) {
+		perror("pthread_cond_wait()");
+		exit(1);
+	}
+	pthread_mutex_unlock(targ->mutex);
+
+	fprintf(logfp, "Thread %lu: wokeup...\n", pthread_self());
+	rc = pthread_cond_signal(targ->cond);
+	if (rc < 0)
+		fprintf(logfp, "do_work(): pthread_cond_signal() failed %s\n",
+					strerror(errno));
+
+	fprintf(logfp, "Thread %lu: exiting...\n", pthread_self());
+	fflush(logfp);
+}
+
+void *
+do_work_coord(void *arg)
+{
+	int rc;
+	struct test_arg *targ = (struct test_arg *)arg;
+
 	while(!test_done())
 		sleep(1);
+
+	fprintf(logfp, "Thread %lu: test-done\n", pthread_self());
+
+	rc = pthread_cond_signal(targ->cond);
+	if (rc < 0)
+		fprintf(logfp, "do_work_coord(): pthread_cond_signal() error "
+				"%s\n", strerror(errno));
+
+	fprintf(logfp, "Thread %lu: exiting...\n", pthread_self());
+	fflush(logfp);
 }
 
+pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
+pthread_cond_t  cond = PTHREAD_COND_INITIALIZER;
+struct test_arg targ;
+
 pthread_t *create_threads(int n)
 {
 	int i;
@@ -35,6 +80,9 @@ pthread_t *create_threads(int n)
 	pthread_t *tid_list;
 	pthread_t tid;
 
+	targ.mutex = &mutex;
+	targ.cond = &cond;
+
 	tid_list = (pthread_t *)malloc(n * sizeof(pthread_t));
 	if (!tid_list) {
 		fprintf(logfp, "malloc(%d) failed, error %s\n",
@@ -42,8 +90,16 @@ pthread_t *create_threads(int n)
 		do_exit(1);
 	}
 
-	for (i = 0; i < n; i++) {
-		rc = pthread_create(&tid, NULL, do_work, NULL);
+	rc = pthread_create(&tid, NULL, do_work_coord, &targ);
+	if (rc < 0) {
+		fprintf(logfp, "pthread_create() of coord failed, rc %d "
+				"error %s\n", rc, strerror(errno));
+		do_exit(1);
+	}
+	tid_list[0] = tid;
+
+	for (i = 1; i < n; i++) {
+		rc = pthread_create(&tid, NULL, do_work, &targ);
 		if (rc < 0) {
 			fprintf(logfp, "pthread_create() failed, i %d, rc %d "
 					"error %s\n", i, rc, strerror(errno));
-- 
1.6.0.4



More information about the Containers mailing list