]>
Commit | Line | Data |
---|---|---|
0ecb606c | 1 | /* Copyright (C) 2002, 2004, 2006 Free Software Foundation, Inc. |
76a50749 UD |
2 | This file is part of the GNU C Library. |
3 | Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. | |
4 | ||
5 | The GNU C Library is free software; you can redistribute it and/or | |
6 | modify it under the terms of the GNU Lesser General Public | |
7 | License as published by the Free Software Foundation; either | |
8 | version 2.1 of the License, or (at your option) any later version. | |
9 | ||
10 | The GNU C Library is distributed in the hope that it will be useful, | |
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
13 | Lesser General Public License for more details. | |
14 | ||
15 | You should have received a copy of the GNU Lesser General Public | |
16 | License along with the GNU C Library; if not, write to the Free | |
17 | Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | |
18 | 02111-1307 USA. */ | |
19 | ||
0ecb606c | 20 | #include <errno.h> |
76a50749 UD |
21 | #include <pthread.h> |
22 | #include <stdio.h> | |
0ecb606c | 23 | #include <stdlib.h> |
76a50749 UD |
24 | #include <time.h> |
25 | ||
26 | ||
0ecb606c JJ |
27 | #ifndef TYPE |
28 | # define TYPE PTHREAD_MUTEX_DEFAULT | |
2c0b891a UD |
29 | #endif |
30 | ||
31 | ||
0ecb606c | 32 | static pthread_mutex_t lock; |
76a50749 UD |
33 | |
34 | ||
35 | #define ROUNDS 1000 | |
36 | #define N 100 | |
37 | ||
38 | ||
39 | static void * | |
40 | tf (void *arg) | |
41 | { | |
42 | int nr = (long int) arg; | |
43 | int cnt; | |
44 | struct timespec ts = { .tv_sec = 0, .tv_nsec = 11000 }; | |
45 | ||
46 | for (cnt = 0; cnt < ROUNDS; ++cnt) | |
47 | { | |
48 | if (pthread_mutex_lock (&lock) != 0) | |
49 | { | |
50 | printf ("thread %d: failed to get the lock\n", nr); | |
51 | return (void *) 1l; | |
52 | } | |
53 | ||
54 | if (pthread_mutex_unlock (&lock) != 0) | |
55 | { | |
56 | printf ("thread %d: failed to release the lock\n", nr); | |
57 | return (void *) 1l; | |
58 | } | |
59 | ||
60 | nanosleep (&ts, NULL); | |
61 | } | |
62 | ||
63 | return NULL; | |
64 | } | |
65 | ||
66 | ||
67 | static int | |
68 | do_test (void) | |
69 | { | |
0ecb606c JJ |
70 | pthread_mutexattr_t a; |
71 | ||
72 | if (pthread_mutexattr_init (&a) != 0) | |
73 | { | |
74 | puts ("mutexattr_init failed"); | |
75 | exit (1); | |
76 | } | |
77 | ||
78 | if (pthread_mutexattr_settype (&a, TYPE) != 0) | |
79 | { | |
80 | puts ("mutexattr_settype failed"); | |
81 | exit (1); | |
82 | } | |
83 | ||
84 | #ifdef ENABLE_PI | |
85 | if (pthread_mutexattr_setprotocol (&a, PTHREAD_PRIO_INHERIT) != 0) | |
86 | { | |
87 | puts ("pthread_mutexattr_setprotocol failed"); | |
88 | return 1; | |
89 | } | |
90 | #endif | |
91 | ||
92 | int e = pthread_mutex_init (&lock, &a); | |
93 | if (e != 0) | |
94 | { | |
95 | #ifdef ENABLE_PI | |
96 | if (e == ENOTSUP) | |
97 | { | |
98 | puts ("PI mutexes unsupported"); | |
99 | return 0; | |
100 | } | |
101 | #endif | |
102 | puts ("mutex_init failed"); | |
103 | return 1; | |
104 | } | |
105 | ||
106 | if (pthread_mutexattr_destroy (&a) != 0) | |
107 | { | |
108 | puts ("mutexattr_destroy failed"); | |
109 | return 1; | |
110 | } | |
111 | ||
4d1a02ef | 112 | pthread_attr_t at; |
76a50749 UD |
113 | pthread_t th[N]; |
114 | int cnt; | |
115 | ||
4d1a02ef UD |
116 | if (pthread_attr_init (&at) != 0) |
117 | { | |
118 | puts ("attr_init failed"); | |
119 | return 1; | |
120 | } | |
121 | ||
122 | if (pthread_attr_setstacksize (&at, 1 * 1024 * 1024) != 0) | |
123 | { | |
124 | puts ("attr_setstacksize failed"); | |
125 | return 1; | |
126 | } | |
127 | ||
76a50749 UD |
128 | if (pthread_mutex_lock (&lock) != 0) |
129 | { | |
130 | puts ("locking in parent failed"); | |
131 | return 1; | |
132 | } | |
133 | ||
134 | for (cnt = 0; cnt < N; ++cnt) | |
4d1a02ef | 135 | if (pthread_create (&th[cnt], &at, tf, (void *) (long int) cnt) != 0) |
76a50749 UD |
136 | { |
137 | printf ("creating thread %d failed\n", cnt); | |
138 | return 1; | |
139 | } | |
140 | ||
4d1a02ef UD |
141 | if (pthread_attr_destroy (&at) != 0) |
142 | { | |
143 | puts ("attr_destroy failed"); | |
144 | return 1; | |
145 | } | |
146 | ||
76a50749 UD |
147 | if (pthread_mutex_unlock (&lock) != 0) |
148 | { | |
149 | puts ("unlocking in parent failed"); | |
150 | return 1; | |
151 | } | |
152 | ||
153 | for (cnt = 0; cnt < N; ++cnt) | |
154 | if (pthread_join (th[cnt], NULL) != 0) | |
155 | { | |
156 | printf ("joining thread %d failed\n", cnt); | |
157 | return 1; | |
158 | } | |
159 | ||
160 | return 0; | |
161 | } | |
162 | ||
163 | #define TIMEOUT 60 | |
164 | #define TEST_FUNCTION do_test () | |
165 | #include "../test-skeleton.c" |