1e986eeecSDavid Xu /*- 2e986eeecSDavid Xu * Copyright (c) 2006, David Xu <davidxu@freebsd.org> 3e986eeecSDavid Xu * All rights reserved. 4e986eeecSDavid Xu * 5e986eeecSDavid Xu * Redistribution and use in source and binary forms, with or without 6e986eeecSDavid Xu * modification, are permitted provided that the following conditions 7e986eeecSDavid Xu * are met: 8e986eeecSDavid Xu * 1. Redistributions of source code must retain the above copyright 9e986eeecSDavid Xu * notice unmodified, this list of conditions, and the following 10e986eeecSDavid Xu * disclaimer. 11e986eeecSDavid Xu * 2. Redistributions in binary form must reproduce the above copyright 12e986eeecSDavid Xu * notice, this list of conditions and the following disclaimer in the 13e986eeecSDavid Xu * documentation and/or other materials provided with the distribution. 14e986eeecSDavid Xu * 15e986eeecSDavid Xu * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 16e986eeecSDavid Xu * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 17e986eeecSDavid Xu * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 18e986eeecSDavid Xu * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 19e986eeecSDavid Xu * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 20e986eeecSDavid Xu * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 21e986eeecSDavid Xu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 22e986eeecSDavid Xu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23e986eeecSDavid Xu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 24e986eeecSDavid Xu * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25e986eeecSDavid Xu * 26e986eeecSDavid Xu * $FreeBSD$ 27e986eeecSDavid Xu * 28e986eeecSDavid Xu */ 29e986eeecSDavid Xu #include <pthread.h> 30e986eeecSDavid Xu #include <stdio.h> 314b30cabdSKevin Lo #include <unistd.h> 32e986eeecSDavid Xu 33e986eeecSDavid Xu #define NLOOPS 10 34e986eeecSDavid Xu 3556073c9eSDavid Xu pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER; 3656073c9eSDavid Xu pthread_cond_t cv = PTHREAD_COND_INITIALIZER; 37e986eeecSDavid Xu 38e986eeecSDavid Xu int wake; 39e986eeecSDavid Xu int stop; 40e986eeecSDavid Xu 41e986eeecSDavid Xu void * 42e986eeecSDavid Xu thr_routine(void *arg) 43e986eeecSDavid Xu { 44e986eeecSDavid Xu pthread_mutex_lock(&m); 45e986eeecSDavid Xu while (wake == 0) 46e986eeecSDavid Xu pthread_cond_wait(&cv, &m); 47e986eeecSDavid Xu pthread_mutex_unlock(&m); 48e986eeecSDavid Xu 49e986eeecSDavid Xu while (stop == 0) 50e986eeecSDavid Xu pthread_yield(); 51e986eeecSDavid Xu return (NULL); 52e986eeecSDavid Xu } 53e986eeecSDavid Xu 54e986eeecSDavid Xu int main(int argc, char **argv) 55e986eeecSDavid Xu { 56e986eeecSDavid Xu pthread_t td; 57e986eeecSDavid Xu int i; 58e986eeecSDavid Xu void *result; 59e986eeecSDavid Xu 60e986eeecSDavid Xu pthread_setconcurrency(1); 61e986eeecSDavid Xu for (i = 0; i < NLOOPS; ++i) { 62e986eeecSDavid Xu stop = 0; 63e986eeecSDavid Xu wake = 0; 64e986eeecSDavid Xu 65e986eeecSDavid Xu pthread_create(&td, NULL, thr_routine, NULL); 66e986eeecSDavid Xu sleep(1); 67e986eeecSDavid Xu printf("trying: %d\n", i); 68e986eeecSDavid Xu pthread_mutex_lock(&m); 69e986eeecSDavid Xu wake = 1; 70e986eeecSDavid Xu pthread_cond_signal(&cv); 71e986eeecSDavid Xu pthread_cancel(td); 72e986eeecSDavid Xu pthread_mutex_unlock(&m); 73e986eeecSDavid Xu stop = 1; 74e986eeecSDavid Xu result = NULL; 75e986eeecSDavid Xu pthread_join(td, &result); 76e986eeecSDavid Xu if (result == PTHREAD_CANCELED) { 77a3f452e8SDavid Xu printf("the condition variable implementation does not\n" 78e986eeecSDavid Xu "conform to SUSv3, a thread unblocked from\n" 79e986eeecSDavid Xu "condition variable still can be canceled.\n"); 80e986eeecSDavid Xu return (1); 81e986eeecSDavid Xu } 82e986eeecSDavid Xu } 83e986eeecSDavid Xu 84e986eeecSDavid Xu printf("OK\n"); 85e986eeecSDavid Xu return (0); 86e986eeecSDavid Xu } 87