Annotation of embedaddon/iftop/config/pthread.c, revision 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>