@@ -63,8 +63,7 @@ pub fn futex<'tcx>(
6363} ;
6464
6565if bitset == 0 {
66- this. set_last_error ( LibcError ( "EINVAL" ) ) ?;
67- this. write_scalar ( Scalar :: from_target_isize ( -1 , this) , dest) ?;
66+ this. set_last_error_and_return ( LibcError ( "EINVAL" ) , dest) ?;
6867return interp_ok ( ( ) ) ;
6968}
7069
@@ -75,9 +74,7 @@ pub fn futex<'tcx>(
7574let duration = match this. read_timespec ( & timeout) ? {
7675Some ( duration) => duration,
7776None => {
78- this. set_last_error ( LibcError ( "EINVAL" ) ) ?;
79- this. write_scalar ( Scalar :: from_target_isize ( -1 , this) , dest) ?;
80- return interp_ok ( ( ) ) ;
77+ return this. set_last_error_and_return ( LibcError ( "EINVAL" ) , dest) ;
8178}
8279} ;
8380let timeout_clock = if op & futex_realtime == futex_realtime {
@@ -153,12 +150,12 @@ pub fn futex<'tcx>(
153150Scalar :: from_target_isize ( 0 , this) , // retval_succ
154151Scalar :: from_target_isize ( -1 , this) , // retval_timeout
155152 dest. clone ( ) ,
156- this. eval_libc ( "ETIMEDOUT" ) ,
153+ this. eval_libc ( "ETIMEDOUT" ) , // errno_timeout
157154) ;
158155} else {
159156// The futex value doesn't match the expected value, so we return failure
160157// right away without sleeping: -1 and errno set to EAGAIN.
161- this. set_last_error_and_return ( LibcError ( "EAGAIN" ) , dest) ? ;
158+ return this. set_last_error_and_return ( LibcError ( "EAGAIN" ) , dest) ;
162159}
163160}
164161// FUTEX_WAKE: (int *addr, int op = FUTEX_WAKE, int val)
@@ -178,9 +175,7 @@ pub fn futex<'tcx>(
178175 u32:: MAX
179176} ;
180177if bitset == 0 {
181- this. set_last_error ( LibcError ( "EINVAL" ) ) ?;
182- this. write_scalar ( Scalar :: from_target_isize ( -1 , this) , dest) ?;
183- return interp_ok ( ( ) ) ;
178+ return this. set_last_error_and_return ( LibcError ( "EINVAL" ) , dest) ;
184179}
185180// Together with the SeqCst fence in futex_wait, this makes sure that futex_wait
186181// will see the latest value on addr which could be changed by our caller
0 commit comments