@@ -63,8 +63,7 @@ pub fn futex<'tcx>(
6363 } ;
6464
6565 if 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) ?;
6867 return interp_ok ( ( ) ) ;
6968 }
7069
@@ -75,9 +74,7 @@ pub fn futex<'tcx>(
7574 let duration = match this. read_timespec ( & timeout) ? {
7675 Some ( duration) => duration,
7776 None => {
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 } ;
8380 let timeout_clock = if op & futex_realtime == futex_realtime {
@@ -153,12 +150,12 @@ pub fn futex<'tcx>(
153150 Scalar :: from_target_isize ( 0 , this) , // retval_succ
154151 Scalar :: 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 } ;
180177 if 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