16270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis/* 26270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis * Copyright (C) 2015 Cyril Hrubis <chrubis@suse.cz> 36270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis * 46270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis * Licensed under the GNU GPLv2 or later. 56270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis * This program is free software; you can redistribute it and/or modify 66270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis * it under the terms of the GNU General Public License as published by 76270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis * the Free Software Foundation; either version 2 of the License, or 86270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis * (at your option) any later version. 96270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis * 106270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis * This program is distributed in the hope that it will be useful, 116270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis * but WITHOUT ANY WARRANTY; without even the implied warranty of 126270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See 136270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis * the GNU General Public License for more details. 146270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis * 156270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis * You should have received a copy of the GNU General Public License 166270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis * along with this program; if not, write to the Free Software 176270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 186270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis */ 196270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis /* 206270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis * Block on a futex and wait for wakeup. 216270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis * 226270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis * This tests uses private mutexes with threads. 236270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis */ 246270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis 256270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis#include <errno.h> 266270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis#include <pthread.h> 276270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis 286270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis#include "test.h" 296270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis#include "futextest.h" 306270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis 316270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubisconst char *TCID="futex_wait03"; 326270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubisconst int TST_TOTAL=1; 336270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis 346270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubisstatic futex_t futex = FUTEX_INITIALIZER; 356270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis 366270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubisstatic void *threaded(void *arg LTP_ATTRIBUTE_UNUSED) 376270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis{ 386270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis long ret; 396270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis 406270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis tst_process_state_wait2(getpid(), 'S'); 416270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis 426270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis ret = futex_wake(&futex, 1, FUTEX_PRIVATE_FLAG); 436270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis 446270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis return (void*)ret; 456270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis} 466270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis 476270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubisstatic void verify_futex_wait(void) 486270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis{ 496270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis long ret; 506270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis int res; 516270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis pthread_t t; 526270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis 536270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis res = pthread_create(&t, NULL, threaded, NULL); 546270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis if (res) { 556270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis tst_brkm(TBROK, NULL, "pthread_create(): %s", 566270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis tst_strerrno(res)); 576270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis } 586270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis 596270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis res = futex_wait(&futex, futex, NULL, FUTEX_PRIVATE_FLAG); 606270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis if (res) { 616270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis tst_resm(TFAIL, "futex_wait() returned %i, errno %s", 626270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis res, tst_strerrno(errno)); 636270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis pthread_join(t, NULL); 646270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis return; 656270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis } 666270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis 676270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis res = pthread_join(t, (void*)&ret); 686270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis if (res) 696270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis tst_brkm(TBROK, NULL, "pthread_join(): %s", tst_strerrno(res)); 706270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis 716270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis if (ret != 1) 726270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis tst_resm(TFAIL, "futex_wake() returned %li", ret); 736270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis else 746270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis tst_resm(TPASS, "futex_wait() woken up"); 756270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis} 766270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis 776270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubisint main(int argc, char *argv[]) 786270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis{ 796270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis int lc; 806270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis 81d6d11d08678aac1ed2c370ea8e42e5f45aea07beCyril Hrubis tst_parse_opts(argc, argv, NULL, NULL); 826270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis 836270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis for (lc = 0; TEST_LOOPING(lc); lc++) 846270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis verify_futex_wait(); 856270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis 866270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis tst_exit(); 876270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis} 88