16270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis/* 26270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis * Copyright (C) 2015 Cyril Hrubis <chrubis@suse.cz> 36270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis * 46270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis * Based on futextest (futext_wait_timeout.c and futex_wait_ewouldblock.c) 56270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis * written by Darren Hart <dvhltc@us.ibm.com> 66270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis * Gowrishankar <gowrishankar.m@in.ibm.com> 76270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis * 86270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis * Licensed under the GNU GPLv2 or later. 96270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis * This program is free software; you can redistribute it and/or modify 106270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis * it under the terms of the GNU General Public License as published by 116270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis * the Free Software Foundation; either version 2 of the License, or 126270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis * (at your option) any later version. 136270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis * 146270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis * This program is distributed in the hope that it will be useful, 156270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis * but WITHOUT ANY WARRANTY; without even the implied warranty of 166270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See 176270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis * the GNU General Public License for more details. 186270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis * 196270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis * You should have received a copy of the GNU General Public License 206270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis * along with this program; if not, write to the Free Software 216270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 226270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis */ 236270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis /* 246270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis * 1. Block on a futex and wait for timeout. 256270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis * 2. Test if FUTEX_WAIT op returns -EWOULDBLOCK if the futex value differs 266270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis * from the expected one. 276270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis */ 286270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis 296270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis#include <errno.h> 306270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis 316270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis#include "test.h" 326270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis#include "futextest.h" 336270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis 346270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubisconst char *TCID="futex_wait01"; 356270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis 366270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubisstruct testcase { 376270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis futex_t *f_addr; 386270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis futex_t f_val; 396270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis int opflags; 406270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis int exp_errno; 416270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis}; 426270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis 436270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubisstatic futex_t futex = FUTEX_INITIALIZER; 446270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubisstatic struct timespec to = {.tv_sec = 0, .tv_nsec = 10000}; 456270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis 466270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubisstatic struct testcase testcases[] = { 476270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis {&futex, FUTEX_INITIALIZER, 0, ETIMEDOUT}, 486270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis {&futex, FUTEX_INITIALIZER+1, 0, EWOULDBLOCK}, 496270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis {&futex, FUTEX_INITIALIZER, FUTEX_PRIVATE_FLAG, ETIMEDOUT}, 506270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis {&futex, FUTEX_INITIALIZER+1, FUTEX_PRIVATE_FLAG, EWOULDBLOCK}, 516270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis}; 526270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis 536270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubisconst int TST_TOTAL=ARRAY_SIZE(testcases); 546270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis 556270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubisstatic void verify_futex_wait(struct testcase *tc) 566270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis{ 576270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis int res; 586270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis 596270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis res = futex_wait(tc->f_addr, tc->f_val, &to, tc->opflags); 606270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis 616270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis if (res != -1) { 626270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis tst_resm(TFAIL, "futex_wait() returned %i, expected -1", res); 636270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis return; 646270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis } 656270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis 666270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis if (errno != tc->exp_errno) { 676270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis tst_resm(TFAIL | TERRNO, "expected errno=%s", 686270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis tst_strerrno(tc->exp_errno)); 696270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis return; 706270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis } 716270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis 726270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis tst_resm(TPASS | TERRNO, "futex_wait()"); 736270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis} 746270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis 756270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubisint main(int argc, char *argv[]) 766270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis{ 776270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis int lc, i; 786270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis 79d6d11d08678aac1ed2c370ea8e42e5f45aea07beCyril Hrubis tst_parse_opts(argc, argv, NULL, NULL); 806270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis 816270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis for (lc = 0; TEST_LOOPING(lc); lc++) { 826270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis for (i = 0; i < TST_TOTAL; i++) 836270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis verify_futex_wait(testcases + i); 846270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis } 856270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis 866270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis tst_exit(); 876270ba2ebe999ffdb1364e5e814d7e56070a0198Cyril Hrubis} 88