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 { |         } else { | ||||||
|             ClockID::CLOCK_MONOTONIC |             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))) |         Ok(Some(FutexTimeout::new(clock_id, ts))) | ||||||
|     }; |     }; | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user