Skip to content

Commit 75d3d97

Browse files
committed
Improvements
1 parent 63c1c41 commit 75d3d97

2 files changed

Lines changed: 121 additions & 66 deletions

File tree

src/arcache/ll.rs

Lines changed: 66 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -53,15 +53,6 @@ pub trait LLWeight {
5353
fn ll_weight(&self) -> usize;
5454
}
5555

56-
/*
57-
impl<T> LLWeight for T {
58-
#[inline]
59-
default fn ll_weight(&self) -> usize {
60-
1
61-
}
62-
}
63-
*/
64-
6556
#[derive(Clone, Debug)]
6657
pub(crate) struct LL<K>
6758
where
@@ -138,8 +129,7 @@ impl<K> LLNodeOwned<K>
138129
where
139130
K: LLWeight + Clone + Debug,
140131
{
141-
#[allow(clippy::wrong_self_convention)]
142-
fn into_inner(&mut self) -> *mut LLNode<K> {
132+
fn into_inner(mut self) -> *mut LLNode<K> {
143133
let x = self.inner;
144134
self.inner = ptr::null_mut();
145135
x
@@ -187,7 +177,7 @@ where
187177
debug_assert!((*self.inner).next.is_null());
188178
debug_assert!((*self.inner).prev.is_null());
189179
}
190-
panic!("dropping LLNodeOwned<K>");
180+
panic!("dropping LLNodeOwned<K> which has valid content, this should never happen!");
191181
}
192182
}
193183
}
@@ -234,18 +224,28 @@ where
234224
}
235225

236226
// Append an arbitrary node into this set.
237-
pub(crate) fn append_n(&mut self, mut owned: LLNodeOwned<K>) -> LLNodeRef<K> {
227+
pub(crate) fn append_n(&mut self, owned: LLNodeOwned<K>) -> LLNodeRef<K> {
238228
// Who is to the left of tail?
239229
let n = owned.into_inner();
240230
unsafe {
241231
self.size += (*(*n).k.as_ptr()).ll_weight();
242232
// must be untagged
243233
// assert!((*n).tag == 0);
234+
// Tail has no trailing nodes.
244235
debug_assert!((*self.tail).next.is_null());
236+
// Tail must have a previous node.
245237
debug_assert!(!(*self.tail).prev.is_null());
238+
// What is that predecessor?
246239
let pred = (*self.tail).prev;
247240
debug_assert!(!pred.is_null());
241+
// Assert that the predecessor points at tail correctly.
242+
// We know now that:
243+
//
244+
// pred <-> tail
248245
debug_assert!((*pred).next == self.tail);
246+
247+
// Tell our node where we are.
248+
// pred <-> n <-> tail
249249
(*n).prev = pred;
250250
(*n).next = self.tail;
251251
// (*n).tag = self.tag;
@@ -259,6 +259,7 @@ where
259259
debug_assert!(!(*(*n).next).prev.is_null());
260260
debug_assert!((*(*n).prev).next == n);
261261
debug_assert!((*(*n).next).prev == n);
262+
// We have asserted the list is sane.
262263
};
263264
LLNodeRef { inner: n }
264265
}
@@ -275,13 +276,28 @@ where
275276
}
276277

277278
// remove this node from the ll, and return it's ptr.
278-
pub(crate) fn pop(&mut self) -> LLNodeOwned<K> {
279-
let n = unsafe { (*self.head).next };
280-
let owned = self.extract(LLNodeRef { inner: n });
281-
debug_assert!(!owned.is_null());
282-
debug_assert!(owned.inner != self.head);
283-
debug_assert!(owned.inner != self.tail);
284-
owned
279+
pub(crate) fn pop(&mut self) -> Option<LLNodeOwned<K>> {
280+
let next = unsafe { (*self.head).next };
281+
if next == self.tail {
282+
None
283+
} else {
284+
let n = unsafe { (*self.head).next };
285+
let owned = self.extract(LLNodeRef { inner: n });
286+
debug_assert!(!owned.is_null());
287+
debug_assert!(owned.inner != self.head);
288+
debug_assert!(owned.inner != self.tail);
289+
Some(owned)
290+
}
291+
}
292+
293+
pub(crate) fn pop_n_free(&mut self) -> Option<K> {
294+
if let Some(owned) = self.pop() {
295+
let ll_node = owned.into_inner();
296+
let k = LLNode::into_inner(ll_node);
297+
Some(k)
298+
} else {
299+
None
300+
}
285301
}
286302

287303
// Cut a node out from this list from any location.
@@ -293,6 +309,10 @@ where
293309
debug_assert!(!(*n.inner).prev.is_null());
294310
debug_assert!(!(*n.inner).next.is_null());
295311
// And that prev's next is us, and next's prev is us.
312+
// This is asserting that we have a proper construction
313+
//
314+
// prev <-> n <-> next
315+
//
296316
debug_assert!(!(*(*n.inner).prev).next.is_null());
297317
debug_assert!(!(*(*n.inner).next).prev.is_null());
298318
debug_assert!((*(*n.inner).prev).next == n.inner);
@@ -305,14 +325,24 @@ where
305325
unsafe {
306326
let prev = (*n.inner).prev;
307327
let next = (*n.inner).next;
328+
// Currently is:
329+
//
308330
// prev <-> n <-> next
309331
(*next).prev = prev;
310332
(*prev).next = next;
333+
// Now is
334+
// prev <-> next
335+
311336
// Null things for paranoia.
312337
if cfg!(test) || cfg!(debug_assertions) {
313338
(*n.inner).prev = ptr::null_mut();
314339
(*n.inner).next = ptr::null_mut();
315340
}
341+
// Finally, we have
342+
//
343+
// null <- n -> null
344+
// prev <-> next
345+
316346
// (*n).tag = 0;
317347
}
318348

@@ -324,10 +354,7 @@ where
324354
}
325355

326356
pub(crate) fn drop_head(&mut self) {
327-
assert!(self.size > 0);
328-
let next = unsafe { (*self.head).next };
329-
if next != self.tail {
330-
let mut owned = self.pop();
357+
while let Some(owned) = self.pop() {
331358
let n = owned.into_inner();
332359
LLNode::free(n);
333360
}
@@ -446,13 +473,20 @@ where
446473
}
447474

448475
#[inline]
449-
fn free(v: *mut Self) {
476+
fn into_inner(v: *mut Self) -> K {
450477
debug_assert!(!v.is_null());
451478
let llnode = unsafe { Box::from_raw(v) };
452-
// drop the inner k.
453-
let _ = unsafe { llnode.k.assume_init() };
479+
let k = unsafe { llnode.k.assume_init() };
454480
#[cfg(all(test, not(miri)))]
455-
release_nid(llnode.nid)
481+
release_nid(llnode.nid);
482+
483+
k
484+
}
485+
486+
#[inline]
487+
fn free(v: *mut Self) {
488+
// drop the inner k.
489+
let _ = Self::into_inner(v);
456490
}
457491

458492
#[inline]
@@ -552,7 +586,7 @@ mod tests {
552586
assert!(ll.peek_tail().unwrap().as_ref() == &1);
553587

554588
// pop from head
555-
let n3 = ll.pop();
589+
let n3 = ll.pop().unwrap();
556590
assert!(ll.len() == 3);
557591
assert!(ll.peek_head().unwrap().as_ref() == &4);
558592
assert!(ll.peek_tail().unwrap().as_ref() == &1);
@@ -574,7 +608,7 @@ mod tests {
574608
assert!(ll.peek_head().unwrap().as_ref() == &4);
575609
assert!(ll.peek_tail().unwrap().as_ref() == &4);
576610
// Remove last
577-
let n4 = ll.pop();
611+
let n4 = ll.pop().unwrap();
578612
assert!(ll.len() == 0);
579613
assert!(ll.peek_head().is_none());
580614
assert!(ll.peek_tail().is_none());
@@ -610,9 +644,9 @@ mod tests {
610644
assert!(ll.len() == 8);
611645
let _n2 = ll.append_k(Weighted { _i: 2 });
612646
assert!(ll.len() == 16);
613-
let n1 = ll.pop();
647+
let n1 = ll.pop().unwrap();
614648
assert!(ll.len() == 8);
615-
let n2 = ll.pop();
649+
let n2 = ll.pop().unwrap();
616650
assert!(ll.len() == 0);
617651
// Add back so they drop
618652
ll.append_n(n1);

0 commit comments

Comments
 (0)