2019-05-27 08:55:01 +02:00
// SPDX-License-Identifier: GPL-2.0-or-later
2015-05-12 21:07:52 -07:00
/******************************************************************************
*
* Copyright © International Business Machines Corp . , 2009
*
* DESCRIPTION
* Block on a futex and wait for timeout .
*
* AUTHOR
* Darren Hart < dvhart @ linux . intel . com >
*
* HISTORY
* 2009 - Nov - 6 : Initial version by Darren Hart < dvhart @ linux . intel . com >
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
# include <errno.h>
# include <getopt.h>
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
# include <time.h>
# include "futextest.h"
# include "logging.h"
2017-05-22 12:47:43 +05:30
# define TEST_NAME "futex-wait-timeout"
2015-05-12 21:07:52 -07:00
static long timeout_ns = 100000 ; /* 100us default timeout */
void usage ( char * prog )
{
printf ( " Usage: %s \n " , prog ) ;
printf ( " -c Use color \n " ) ;
printf ( " -h Display this help message \n " ) ;
printf ( " -t N Timeout in nanoseconds (default: 100,000) \n " ) ;
printf ( " -v L Verbosity level: %d=QUIET %d=CRITICAL %d=INFO \n " ,
VQUIET , VCRITICAL , VINFO ) ;
}
int main ( int argc , char * argv [ ] )
{
futex_t f1 = FUTEX_INITIALIZER ;
struct timespec to ;
int res , ret = RET_PASS ;
int c ;
while ( ( c = getopt ( argc , argv , " cht:v: " ) ) ! = - 1 ) {
switch ( c ) {
case ' c ' :
log_color ( 1 ) ;
break ;
case ' h ' :
usage ( basename ( argv [ 0 ] ) ) ;
exit ( 0 ) ;
case ' t ' :
timeout_ns = atoi ( optarg ) ;
break ;
case ' v ' :
log_verbosity ( atoi ( optarg ) ) ;
break ;
default :
usage ( basename ( argv [ 0 ] ) ) ;
exit ( 1 ) ;
}
}
2017-08-04 17:12:29 -06:00
ksft_print_header ( ) ;
2019-04-24 16:12:37 -07:00
ksft_set_plan ( 1 ) ;
2017-08-04 17:12:29 -06:00
ksft_print_msg ( " %s: Block on a futex and wait for timeout \n " ,
2015-05-12 21:07:52 -07:00
basename ( argv [ 0 ] ) ) ;
2017-08-04 17:12:29 -06:00
ksft_print_msg ( " \t Arguments: timeout=%ldns \n " , timeout_ns ) ;
2015-05-12 21:07:52 -07:00
/* initialize timeout */
to . tv_sec = 0 ;
to . tv_nsec = timeout_ns ;
info ( " Calling futex_wait on f1: %u @ %p \n " , f1 , & f1 ) ;
res = futex_wait ( & f1 , f1 , & to , FUTEX_PRIVATE_FLAG ) ;
if ( ! res | | errno ! = ETIMEDOUT ) {
fail ( " futex_wait returned %d \n " , ret < 0 ? errno : ret ) ;
ret = RET_FAIL ;
}
2017-05-22 12:47:43 +05:30
print_result ( TEST_NAME , ret ) ;
2015-05-12 21:07:52 -07:00
return ret ;
}