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