]> git.ipfire.org Git - thirdparty/glibc.git/blob - nptl/tst-mutex-errorcheck.c
Update copyright dates with scripts/update-copyrights.
[thirdparty/glibc.git] / nptl / tst-mutex-errorcheck.c
1 /* Check that error checking mutexes are not subject to lock elision.
2 Copyright (C) 2016-2017 Free Software Foundation, Inc.
3 This file is part of the GNU C Library.
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, see
17 <http://www.gnu.org/licenses/>. */
18
19 #include <stdio.h>
20 #include <errno.h>
21 #include <time.h>
22 #include <pthread.h>
23
24 static int
25 do_test (void)
26 {
27 struct timespec tms = { 0 };
28 pthread_mutex_t mutex;
29 pthread_mutexattr_t mutexattr;
30 int ret = 0;
31
32 if (pthread_mutexattr_init (&mutexattr) != 0)
33 return 1;
34 if (pthread_mutexattr_settype (&mutexattr, PTHREAD_MUTEX_ERRORCHECK) != 0)
35 return 1;
36
37 if (pthread_mutex_init (&mutex, &mutexattr) != 0)
38 return 1;
39 if (pthread_mutexattr_destroy (&mutexattr) != 0)
40 return 1;
41
42 /* The call to pthread_mutex_timedlock erroneously enabled lock elision
43 on the mutex, which then triggered an assertion failure in
44 pthread_mutex_unlock. It would also defeat the error checking nature
45 of the mutex. */
46 if (pthread_mutex_timedlock (&mutex, &tms) != 0)
47 return 1;
48 if (pthread_mutex_timedlock (&mutex, &tms) != EDEADLK)
49 {
50 printf ("Failed error checking on locked mutex\n");
51 ret = 1;
52 }
53
54 if (pthread_mutex_unlock (&mutex) != 0)
55 ret = 1;
56
57 return ret;
58 }
59
60 #define TEST_FUNCTION do_test ()
61 #include "../test-skeleton.c"