• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2015 Cyril Hrubis <chrubis@suse.cz>
3  *
4  * Licensed under the GNU GPLv2 or later.
5  * This program is free software;  you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 2 of the License, or
8  * (at your option) any later version.
9  *
10  * This program 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
13  * the GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program;  if not, write to the Free Software
17  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18  */
19  /*
20   * Block on a futex and wait for wakeup.
21   *
22   * This tests uses private mutexes with threads.
23   */
24 
25 #include <errno.h>
26 #include <pthread.h>
27 
28 #include "test.h"
29 #include "futextest.h"
30 
31 const char *TCID="futex_wait03";
32 const int TST_TOTAL=1;
33 
34 static futex_t futex = FUTEX_INITIALIZER;
35 
threaded(void * arg LTP_ATTRIBUTE_UNUSED)36 static void *threaded(void *arg LTP_ATTRIBUTE_UNUSED)
37 {
38 	long ret;
39 
40 	tst_process_state_wait2(getpid(), 'S');
41 
42 	ret = futex_wake(&futex, 1, FUTEX_PRIVATE_FLAG);
43 
44 	return (void*)ret;
45 }
46 
verify_futex_wait(void)47 static void verify_futex_wait(void)
48 {
49 	long ret;
50 	int res;
51 	pthread_t t;
52 
53 	res = pthread_create(&t, NULL, threaded, NULL);
54 	if (res) {
55 		tst_brkm(TBROK, NULL, "pthread_create(): %s",
56 	                 tst_strerrno(res));
57 	}
58 
59 	res = futex_wait(&futex, futex, NULL, FUTEX_PRIVATE_FLAG);
60 	if (res) {
61 		tst_resm(TFAIL, "futex_wait() returned %i, errno %s",
62 	                 res, tst_strerrno(errno));
63 		pthread_join(t, NULL);
64 		return;
65 	}
66 
67 	res = pthread_join(t, (void*)&ret);
68 	if (res)
69 		tst_brkm(TBROK, NULL, "pthread_join(): %s", tst_strerrno(res));
70 
71 	if (ret != 1)
72 		tst_resm(TFAIL, "futex_wake() returned %li", ret);
73 	else
74 		tst_resm(TPASS, "futex_wait() woken up");
75 }
76 
main(int argc,char * argv[])77 int main(int argc, char *argv[])
78 {
79 	int lc;
80 
81 	tst_parse_opts(argc, argv, NULL, NULL);
82 
83 	for (lc = 0; TEST_LOOPING(lc); lc++)
84 		verify_futex_wait();
85 
86 	tst_exit();
87 }
88