initial import
[ICEs.git] / 194076 / nptl_test.c
CommitLineData
45516216 1#include <stdio.h>
2#include <stdlib.h>
3#include <pthread.h>
4
5pthread_attr_t __thread_attr;
6pthread_t __thread_id;
7
8pthread_mutex_t __posix_mutex;
9pthread_mutexattr_t __posix_mutexattr;
10
11/// entry point for the spawned thread
12void* __pthread_launcher(void* p) {
13 // let the thread be killable under any circumstances
14 // (without this function call, this test always succeeds !)
15 pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);
16
17 printf("2nd thread is running\n");
18 fflush(stdout);
19
20 // this will block this 2nd thread, since we already
21 // locked this mutex by the main thread
22 pthread_mutex_lock(&__posix_mutex);
23
24 // here we would access shared resources, etc.
25
26 // just pro forma, the remainder of this function is actually not of
27 // interest, since this thread is always terminated at its mutex lock call
28 pthread_mutex_unlock(&__posix_mutex);
29 return NULL;
30}
31
32int main() {
33 // initialize mutex and thread attribute
34 pthread_mutexattr_init(&__posix_mutexattr);
35 pthread_mutex_init(&__posix_mutex, &__posix_mutexattr);
36 pthread_attr_init(&__thread_attr);
37
38 // already lock the mutex by the main thread ...
39 pthread_mutex_lock(&__posix_mutex);
40
41 int res;
42
43 // create and run a 2nd thread
44 res = pthread_create(&__thread_id, &__thread_attr, __pthread_launcher, NULL);
45 if (res) {
46 printf("thread creation failed\n");
47 fflush(stdout);
48 exit(-1);
49 }
50
51 // give the other thread a chance to spawn
52 usleep(400000);
53
54 // kill the other thread
55 pthread_cancel(__thread_id);
56 pthread_detach(__thread_id);
57
58 // give the other thread a chance to finish its execution
59 usleep(400000);
60
61 // cleanup
62 // (just pro forma, doesnt actually matter for this test case)
63 pthread_attr_destroy(&__thread_attr);
64 pthread_mutex_destroy(&__posix_mutex);
65 pthread_mutexattr_destroy(&__posix_mutexattr);
66
67 printf("TEST PASSED! :-)\n");
68
69 return res;
70}