Fix futex wait timeout with absolute time
This commit is contained in:
		
							parent
							
								
									122cf2a7bc
								
							
						
					
					
						commit
						63db3e340c
					
				| @ -286,6 +286,28 @@ pub fn do_futex( | ||||
|         } else { | ||||
|             ClockID::CLOCK_MONOTONIC | ||||
|         }; | ||||
| 
 | ||||
|         // From futex man page:
 | ||||
|         // for FUTEX_WAIT, timeout is interpreted as a relative value. This differs from other futex operations, where
 | ||||
|         // timeout is interpreted as an absolute value. To obtain the equivalent of FUTEX_WAIT with an absolute timeout,
 | ||||
|         // employ FUTEX_WAIT_BITSET with val3 specified as FUTEX_BITSET_MATCH_ANY.
 | ||||
|         //
 | ||||
|         // However, in Occlum, we prefer to use relative value for timeout for performance consideration because getting current time
 | ||||
|         // requires an extra ocall.
 | ||||
|         let ts = match futex_op { | ||||
|             FutexOp::FUTEX_WAIT => ts, | ||||
|             _ => { | ||||
|                 let relative_ts = { | ||||
|                     let absolute_ts = ts.as_duration(); | ||||
|                     let current_ts = crate::time::do_clock_gettime(clock_id)?.as_duration(); | ||||
|                     debug_assert!(current_ts <= absolute_ts); | ||||
| 
 | ||||
|                     timespec_t::from(absolute_ts - current_ts) | ||||
|                 }; | ||||
|                 relative_ts | ||||
|             } | ||||
|         }; | ||||
| 
 | ||||
|         Ok(Some(FutexTimeout::new(clock_id, ts))) | ||||
|     }; | ||||
| 
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user