Path: blob/master/tools/testing/selftests/futex/functional/futex_wait_wouldblock.c
29271 views
// SPDX-License-Identifier: GPL-2.0-or-later1/******************************************************************************2*3* Copyright © International Business Machines Corp., 20094*5* DESCRIPTION6* Test if FUTEX_WAIT op returns -EWOULDBLOCK if the futex value differs7* from the expected one.8*9* AUTHOR10* Gowrishankar <[email protected]>11*12* HISTORY13* 2009-Nov-14: Initial version by Gowrishankar <[email protected]>14*15*****************************************************************************/1617#include <errno.h>18#include <getopt.h>19#include <stdio.h>20#include <stdlib.h>21#include <string.h>22#include <time.h>2324#include "futextest.h"25#include "futex2test.h"26#include "../../kselftest_harness.h"2728#define timeout_ns 1000002930TEST(futex_wait_wouldblock)31{32struct timespec to = {.tv_sec = 0, .tv_nsec = timeout_ns};33futex_t f1 = FUTEX_INITIALIZER;34int res;3536ksft_print_dbg_msg("Calling futex_wait on f1: %u @ %p with val=%u\n", f1, &f1, f1+1);37res = futex_wait(&f1, f1+1, &to, FUTEX_PRIVATE_FLAG);38if (!res || errno != EWOULDBLOCK) {39ksft_test_result_fail("futex_wait returned: %d %s\n",40res ? errno : res,41res ? strerror(errno) : "");42} else {43ksft_test_result_pass("futex_wait\n");44}45}4647TEST(futex_waitv_wouldblock)48{49struct timespec to = {.tv_sec = 0, .tv_nsec = timeout_ns};50futex_t f1 = FUTEX_INITIALIZER;51struct futex_waitv waitv = {52.uaddr = (uintptr_t)&f1,53.val = f1 + 1,54.flags = FUTEX_32,55.__reserved = 0,56};57int res;5859if (clock_gettime(CLOCK_MONOTONIC, &to))60ksft_exit_fail_msg("clock_gettime failed %d\n", errno);6162to.tv_nsec += timeout_ns;6364if (to.tv_nsec >= 1000000000) {65to.tv_sec++;66to.tv_nsec -= 1000000000;67}6869ksft_print_dbg_msg("Calling futex_waitv on f1: %u @ %p with val=%u\n", f1, &f1, f1+1);70res = futex_waitv(&waitv, 1, 0, &to, CLOCK_MONOTONIC);71if (!res || errno != EWOULDBLOCK) {72ksft_test_result_fail("futex_waitv returned: %d %s\n",73res ? errno : res,74res ? strerror(errno) : "");75} else {76ksft_test_result_pass("futex_waitv\n");77}78}7980TEST_HARNESS_MAIN818283