| OLD | NEW |
| 1 /* This testcase is part of GDB, the GNU debugger. | 1 /* This testcase is part of GDB, the GNU debugger. |
| 2 | 2 |
| 3 Copyright 2008-2012 Free Software Foundation, Inc. | 3 Copyright 2008-2012 Free Software Foundation, Inc. |
| 4 | 4 |
| 5 This program is free software; you can redistribute it and/or modify | 5 This program is free software; you can redistribute it and/or modify |
| 6 it under the terms of the GNU General Public License as published by | 6 it under the terms of the GNU General Public License as published by |
| 7 the Free Software Foundation; either version 3 of the License, or | 7 the Free Software Foundation; either version 3 of the License, or |
| 8 (at your option) any later version. | 8 (at your option) any later version. |
| 9 | 9 |
| 10 This program is distributed in the hope that it will be useful, | 10 This program is distributed in the hope that it will be useful, |
| (...skipping 10 matching lines...) Expand all Loading... |
| 21 #include <stdio.h> | 21 #include <stdio.h> |
| 22 #include <stdlib.h> | 22 #include <stdlib.h> |
| 23 #include <errno.h> | 23 #include <errno.h> |
| 24 #include <unistd.h> | 24 #include <unistd.h> |
| 25 #include <sys/types.h> | 25 #include <sys/types.h> |
| 26 #include <sys/wait.h> | 26 #include <sys/wait.h> |
| 27 | 27 |
| 28 #define NUMTHREADS 10 | 28 #define NUMTHREADS 10 |
| 29 | 29 |
| 30 volatile int done = 0; | 30 volatile int done = 0; |
| 31 static pthread_barrier_t barrier; |
| 31 | 32 |
| 32 static void * | 33 static void * |
| 33 start (void *arg) | 34 start (void *arg) |
| 34 { | 35 { |
| 35 while (!done) | 36 while (!done) |
| 36 usleep (100); | 37 usleep (100); |
| 37 assert (0); | 38 assert (0); |
| 38 return arg; | 39 return arg; |
| 39 } | 40 } |
| 40 | 41 |
| 41 void * | 42 void * |
| 42 thread_function (void *arg) | 43 thread_function (void *arg) |
| 43 { | 44 { |
| 44 int x = * (int *) arg; | 45 int x = * (int *) arg; |
| 45 | 46 |
| 46 printf ("Thread <%d> executing\n", x); | 47 printf ("Thread <%d> executing\n", x); |
| 47 | 48 |
| 49 pthread_barrier_wait (&barrier); |
| 50 |
| 48 while (!done) | 51 while (!done) |
| 49 usleep (100); | 52 usleep (100); |
| 50 | 53 |
| 51 return NULL; | 54 return NULL; |
| 52 } | 55 } |
| 53 | 56 |
| 54 void * | 57 void * |
| 55 thread_forker (void *arg) | 58 thread_forker (void *arg) |
| 56 { | 59 { |
| 57 int x = * (int *) arg; | 60 int x = * (int *) arg; |
| 58 pid_t pid; | 61 pid_t pid; |
| 59 int rv; | 62 int rv; |
| 60 int i; | 63 int i; |
| 61 pthread_t thread; | 64 pthread_t thread; |
| 62 | 65 |
| 63 printf ("Thread forker <%d> executing\n", x); | 66 printf ("Thread forker <%d> executing\n", x); |
| 64 | 67 |
| 68 pthread_barrier_wait (&barrier); |
| 69 |
| 65 switch ((pid = fork ())) | 70 switch ((pid = fork ())) |
| 66 { | 71 { |
| 67 case -1: | 72 case -1: |
| 68 assert (0); | 73 assert (0); |
| 69 default: | 74 default: |
| 70 wait (&rv); | 75 wait (&rv); |
| 71 done = 1; | 76 done = 1; |
| 72 break; | 77 break; |
| 73 case 0: | 78 case 0: |
| 74 i = pthread_create (&thread, NULL, start, NULL); | 79 i = pthread_create (&thread, NULL, start, NULL); |
| 75 assert (i == 0); | 80 assert (i == 0); |
| 76 i = pthread_join (thread, NULL); | 81 i = pthread_join (thread, NULL); |
| 77 assert (i == 0); | 82 assert (i == 0); |
| 78 | 83 |
| 79 assert (0); | 84 assert (0); |
| 80 } | 85 } |
| 81 | 86 |
| 82 return NULL; | 87 return NULL; |
| 83 } | 88 } |
| 84 | 89 |
| 85 int | 90 int |
| 86 main (void) | 91 main (void) |
| 87 { | 92 { |
| 88 pthread_t threads[NUMTHREADS]; | 93 pthread_t threads[NUMTHREADS]; |
| 89 int args[NUMTHREADS]; | 94 int args[NUMTHREADS]; |
| 90 int i, j; | 95 int i, j; |
| 91 | 96 |
| 97 i = pthread_barrier_init (&barrier, NULL, NUMTHREADS); |
| 98 assert (i == 0); |
| 99 |
| 92 /* Create a few threads that do mostly nothing, and then one that | 100 /* Create a few threads that do mostly nothing, and then one that |
| 93 forks. */ | 101 forks. */ |
| 94 for (j = 0; j < NUMTHREADS - 1; ++j) | 102 for (j = 0; j < NUMTHREADS - 1; ++j) |
| 95 { | 103 { |
| 96 args[j] = j; | 104 args[j] = j; |
| 97 pthread_create (&threads[j], NULL, thread_function, &args[j]); | 105 pthread_create (&threads[j], NULL, thread_function, &args[j]); |
| 98 } | 106 } |
| 99 | 107 |
| 100 args[j] = j; | 108 args[j] = j; |
| 101 pthread_create (&threads[j], NULL, thread_forker, &args[j]); | 109 pthread_create (&threads[j], NULL, thread_forker, &args[j]); |
| 102 | 110 |
| 103 for (j = 0; j < NUMTHREADS; ++j) | 111 for (j = 0; j < NUMTHREADS; ++j) |
| 104 { | 112 { |
| 105 pthread_join (threads[j], NULL); | 113 pthread_join (threads[j], NULL); |
| 106 } | 114 } |
| 107 | 115 |
| 108 return 0; | 116 return 0; |
| 109 } | 117 } |
| OLD | NEW |