Annotation of embedaddon/iftop/config/pthread.c, revision 1.1.1.1
1.1 misho 1: /*
2: * pthread.c:
3: * Tiny test program to see whether POSIX threads work.
4: */
5:
6: static const char rcsid[] = "$Id: pthread.c,v 1.4 2005/10/26 22:56:05 chris Exp $";
7:
8: #include <sys/types.h>
9:
10: #include <errno.h>
11: #include <pthread.h>
12: #include <stdio.h>
13: #include <string.h>
14: #include <time.h>
15: #include <unistd.h>
16:
17: static pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER;
18: static pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
19: static int return_value = -1;
20:
21: void *worker_thread(void *v) {
22: /* Record successful return and signal parent to wake up. */
23: return_value = 0;
24: pthread_mutex_lock(&mtx);
25: pthread_cond_signal(&cond);
26: pthread_mutex_unlock(&mtx);
27: while (1) {
28: sleep(1);
29: pthread_testcancel();
30: }
31: }
32:
33: /* Start a thread, and have it set a variable to some other value, then signal
34: * a condition variable. If this doesn't happen within some set time, we assume
35: * that something's gone badly wrong and abort (for instance, the thread never
36: * got started). */
37: int main(void) {
38: pthread_t thr;
39: int res;
40: struct timespec deadline = {0};
41: if ((res = pthread_mutex_lock(&mtx)) != 0
42: || (res = pthread_create(&thr, NULL, worker_thread, NULL)) != 0) {
43: fprintf(stderr, "%s\n", strerror(res));
44: return -1;
45: }
46:
47: /* Thread should now be running; we should wait on the condition
48: * variable. */
49: do
50: deadline.tv_sec = 2 + time(NULL);
51: while ((res = pthread_cond_timedwait(&cond, &mtx, &deadline)) == EINTR);
52:
53: if (res != 0) {
54: fprintf(stderr, "%s\n", strerror(res));
55: return -1;
56: }
57:
58: if ((res = pthread_cancel(thr)) != 0
59: || (res = pthread_join(thr, NULL)) != 0) {
60: fprintf(stderr, "%s\n", strerror(res));
61: return -1;
62: }
63:
64: return return_value;
65: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>