]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Add a very simple test for pthread_once().
authorJulian Seward <jseward@acm.org>
Wed, 24 Apr 2002 19:23:50 +0000 (19:23 +0000)
committerJulian Seward <jseward@acm.org>
Wed, 24 Apr 2002 19:23:50 +0000 (19:23 +0000)
git-svn-id: svn://svn.valgrind.org/valgrind/trunk@133

tests/Makefile.am
tests/pth_once.c [new file with mode: 0644]

index 0f144e7ea2eef20484e1489c6539fbb8895b44c9..6869a2c70b106c7e46ee3079104a2c0c035675d8 100644 (file)
@@ -26,4 +26,5 @@ EXTRA_DIST = \
        twoparams.s \
        pth_cvsimple.c pth_simple_threads.c pth_simple_mutex.c \
        bt_everything.c bt_literal.c \
-       pth_threadpool.c pth_specific.c pth_mutexspeed.c malloc3.c
+       pth_threadpool.c pth_specific.c pth_mutexspeed.c malloc3.c \
+       pth_once.c
diff --git a/tests/pth_once.c b/tests/pth_once.c
new file mode 100644 (file)
index 0000000..0d795c5
--- /dev/null
@@ -0,0 +1,81 @@
+/********************************************************
+ * An example source module to accompany...
+ *
+ * "Using POSIX Threads: Programming with Pthreads"
+ *     by Brad nichols, Dick Buttlar, Jackie Farrell
+ *     O'Reilly & Associates, Inc.
+ *
+ ********************************************************
+ * once_exam.c
+ *
+ * An example of using the pthreads_once() call to execute an
+ * initialization procedure.
+ *
+ * A program spawns multiple threads and each one tries to
+ * execute the routine welcome() using the once call. Only
+ * the first thread into the once routine will actually
+ * execute welcome().
+ *
+ * The program's main thread synchronizes its exit with the
+ * exit of the threads using the pthread_join() operation.
+ *
+*/
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <sys/types.h>
+
+#include <pthread.h>
+
+#define  NUM_THREADS   10
+
+static pthread_once_t welcome_once_block = PTHREAD_ONCE_INIT;
+
+void welcome(void)
+{
+       printf("welcome: Welcome\n");
+}
+
+void *identify_yourself(void *arg)
+{
+        int *pid=(int *)arg;
+       int rtn;
+
+       if ((rtn = pthread_once(&welcome_once_block,
+                               welcome)) != 0) {
+               fprintf(stderr, "pthread_once failed with %d",rtn);
+               pthread_exit((void *)NULL);
+       }
+       printf("identify_yourself: Hi, I'm thread # %d\n",*pid);
+        return(NULL);
+}
+
+extern int
+main(void)
+{
+       int             *id_arg, thread_num, rtn;
+       pthread_t       threads[NUM_THREADS];
+
+       id_arg = (int *)malloc(NUM_THREADS*sizeof(int));
+
+       for (thread_num = 0; thread_num < NUM_THREADS; (thread_num)++) {
+
+               id_arg[thread_num] = thread_num;
+
+               if (( rtn = pthread_create(&threads[thread_num], 
+                                          NULL,
+                                          identify_yourself,
+                                          (void *) &(id_arg[thread_num]))) 
+                   != 0) {
+                 fprintf(stderr, "pthread_create failed with %d",rtn);
+                 exit(1);
+               }
+       }       
+
+       for (thread_num = 0; thread_num < NUM_THREADS; thread_num++) {
+         pthread_join(threads[thread_num], NULL);
+         printf("main: joined to thread %d\n", thread_num);
+       }
+       printf("main: Goodbye\n");
+}