diff options
| author | zy <[email protected]> | 2023-09-20 08:23:04 +0000 |
|---|---|---|
| committer | zy <[email protected]> | 2023-09-20 08:23:04 +0000 |
| commit | f83a1b92fabb2005791f76eec9fb58e8b4ecc0cd (patch) | |
| tree | 61cdd8785a6cfaebd46de30264e555283f6bb2a0 | |
| parent | 5fad62b7f916f14556a264e4d065cf57ebeb90af (diff) | |
- 简化 TimeoutSItFlag
- 修正 TimeoutSIt 实例申请 bug (Box::into_raw)
| -rw-r--r-- | src/timeout.rs | 27 |
1 files changed, 10 insertions, 17 deletions
diff --git a/src/timeout.rs b/src/timeout.rs index ae04060..9dd050f 100644 --- a/src/timeout.rs +++ b/src/timeout.rs @@ -101,34 +101,28 @@ impl Drop for Timeout { } pub enum TimeoutSItFlag { - PENDING, - EXPIRED, - ALL, - CLEAR, + PENDING = TIMEOUTS_PENDING as isize, + EXPIRED = TIMEOUTS_EXPIRED as isize, + ALL = TIMEOUTS_ALL as isize, + CLEAR = TIMEOUTS_CLEAR as isize, } // as i32 impl From<TimeoutSItFlag> for i32 { fn from(flag: TimeoutSItFlag) -> Self { - match flag { - TimeoutSItFlag::PENDING => TIMEOUTS_PENDING, - TimeoutSItFlag::EXPIRED => TIMEOUTS_EXPIRED, - TimeoutSItFlag::ALL => TIMEOUTS_ALL, - TimeoutSItFlag::CLEAR => TIMEOUTS_CLEAR, - } + flag as i32 } } pub struct TimeoutSIt { - raw: NonNull<*mut timeouts_it>, + raw: NonNull<timeouts_it>, } impl TimeoutSIt { /// flag has 4 value: PENDING, EXPIRED, ALL, CLEAR fn new(flags: TimeoutSItFlag) -> Result<TimeoutSIt, &'static str> { - let mut instance = timeouts_it::default(); - TIMEOUTS_IT_INIT(&mut instance, flags as i32); - let raw = NonNull::new(&mut instance as *mut timeouts_it as *mut *mut timeouts_it) - .ok_or("Failed to create TimeoutSIt")?; + let mut instance = Box::into_raw(Box::new(timeouts_it::default())); + TIMEOUTS_IT_INIT(instance, flags as i32); + let raw = NonNull::new(instance).ok_or("Failed to create TimeoutSIt")?; Ok(TimeoutSIt { raw }) } } @@ -228,8 +222,7 @@ impl TimeoutManager { } /// return next timeout as timeout_sit requested, or NULL if none pub fn next_timeout(&mut self, timeout_sit: &TimeoutSIt) -> Option<Timeout> { - let to: *mut timeout = - unsafe { timeouts_next(self.get_raw(), timeout_sit.raw.as_ref().clone()) }; + let to: *mut timeout = unsafe { timeouts_next(self.get_raw(), timeout_sit.raw.as_ptr()) }; if to.is_null() { return None; } |
