From: Sukadev Bhattiprolu <sukadev@xxxxxxxxxxxxxxxxxx> 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@xxxxxxxxxxxxxxxxxx> --- 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 _______________________________________________ Containers mailing list Containers@xxxxxxxxxxxxxxxxxxxxxxxxxx https://lists.linux-foundation.org/mailman/listinfo/containers