Mercurial > lbo > hg > leveldb-rs
changeset 551:05dac197bc8d
#13: fix crash after last change
author | Lewin Bormann <lbo@spheniscida.de> |
---|---|
date | Mon, 07 Mar 2022 21:52:56 +0100 |
parents | faa58d765e30 |
children | f43574f976dc |
files | src/cache.rs |
diffstat | 1 files changed, 13 insertions(+), 18 deletions(-) [+] |
line wrap: on
line diff
--- a/src/cache.rs Sun Mar 06 21:42:34 2022 +0100 +++ b/src/cache.rs Mon Mar 07 21:52:56 2022 +0100 @@ -18,15 +18,14 @@ /// This is likely unstable; more investigation is needed into correct behavior! impl<T> LRUList<T> { fn new() -> LRUList<T> { - let l = LRUList { + LRUList { head: LRUNode { data: None, next: None, prev: None, }, count: 0, - }; - l + } } /// Inserts new element at front (least recently used element) @@ -71,10 +70,7 @@ return None; } let mut lasto = unsafe { - replace( - &mut (*((*self.head.prev.unwrap()).prev.unwrap())).next, - None, - ) + (*((*self.head.prev.unwrap()).prev.unwrap())).next.take() }; assert!(lasto.is_some()); @@ -83,7 +79,7 @@ assert!(self.head.prev.is_some()); self.head.prev = last.prev; self.count -= 1; - replace(&mut (*last).data, None) + (*last).data.take() } else { None } @@ -91,17 +87,16 @@ fn remove(&mut self, node_handle: LRUHandle<T>) -> T { unsafe { - let d = replace(&mut (*node_handle).data, None).unwrap(); - // If has next - if let Some(ref mut nextp) = (*node_handle).next { - swap(&mut (**nextp).prev, &mut (*node_handle).prev); + let d = (*node_handle).data.take().unwrap(); + // Take ownership of node to be removed. + let mut current = (*(*node_handle).prev.unwrap()).next.take().unwrap(); + let prev = current.prev.unwrap(); + // Update previous node's successor. + if current.next.is_some() { + // Update next node's predecessor. + current.next.as_mut().unwrap().prev = current.prev.take(); } - // If has prev - if let Some(ref mut prevp) = (*node_handle).prev { - // swap prev.next with sink. sink will be dropped. - let mut sink = (*node_handle).next.take(); - swap(&mut (**prevp).next, &mut sink); - } + (*prev).next = current.next.take(); self.count -= 1;