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