Skip to content

Commit 22391dc

Browse files
authored
replace MBox with TskBox for low-level tree (#551)
* remove mbox as dependency
1 parent cd60c9a commit 22391dc

File tree

3 files changed

+10
-95
lines changed

3 files changed

+10
-95
lines changed

Cargo.lock

Lines changed: 0 additions & 61 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ serde = {version = "1.0.188", features = ["derive"], optional = true}
2626
serde_json = {version = "1.0.107", optional = true}
2727
bincode = {version = "1.3.1", optional = true}
2828
tskit-derive = {version = "0.2.0", path = "tskit-derive", optional = true}
29-
mbox = "0.6.0"
3029
delegate = "0.10.0"
3130

3231
[dev-dependencies]

src/sys/tree.rs

Lines changed: 10 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,11 @@
1-
use std::ptr::NonNull;
2-
3-
use mbox::MBox;
4-
51
use super::bindings::tsk_tree_t;
62
use super::flags::TreeFlags;
3+
use super::tskbox::TskBox;
74
use super::Error;
85
use super::LLTreeSeq;
96

107
pub struct LLTree<'treeseq> {
11-
inner: MBox<tsk_tree_t>,
8+
inner: TskBox<tsk_tree_t>,
129
// NOTE: this reference exists becaust tsk_tree_t
1310
// contains a NON-OWNING pointer to tsk_treeseq_t.
1411
// Thus, we could theoretically cause UB without
@@ -19,28 +16,16 @@ pub struct LLTree<'treeseq> {
1916

2017
impl<'treeseq> LLTree<'treeseq> {
2118
pub fn new(treeseq: &'treeseq LLTreeSeq, flags: TreeFlags) -> Result<Self, Error> {
22-
// SAFETY: this is the type we want :)
23-
let temp = unsafe {
24-
libc::malloc(std::mem::size_of::<super::bindings::tsk_tree_t>())
25-
as *mut super::bindings::tsk_tree_t
26-
};
27-
28-
// Get our pointer into MBox ASAP
29-
let nonnull = NonNull::<super::bindings::tsk_tree_t>::new(temp)
30-
.ok_or_else(|| Error::Message("failed to malloc tsk_tree_t".to_string()))?;
31-
32-
// SAFETY: if temp is NULL, we have returned Err already.
33-
let mut inner = unsafe { mbox::MBox::from_non_null_raw(nonnull) };
34-
let mut rv = unsafe {
35-
super::bindings::tsk_tree_init(inner.as_mut(), treeseq.as_ptr(), flags.bits())
36-
};
37-
if rv < 0 {
38-
return Err(Error::Code(rv));
39-
}
19+
let mut inner = TskBox::new(
20+
|x: *mut super::bindings::tsk_tree_t| unsafe {
21+
super::bindings::tsk_tree_init(x, treeseq.as_ref(), flags.bits())
22+
},
23+
super::bindings::tsk_tree_free,
24+
);
4025
// Gotta ask Jerome about this one--why isn't this handled in tsk_tree_init??
4126
if !flags.contains(TreeFlags::NO_SAMPLE_COUNTS) {
4227
// SAFETY: nobody is null here.
43-
rv = unsafe {
28+
let rv = unsafe {
4429
super::bindings::tsk_tree_set_tracked_samples(
4530
inner.as_mut(),
4631
treeseq.num_samples(),
@@ -55,14 +40,6 @@ impl<'treeseq> LLTree<'treeseq> {
5540
}
5641

5742
pub fn as_mut_ptr(&mut self) -> *mut tsk_tree_t {
58-
MBox::<tsk_tree_t>::as_mut_ptr(&mut self.inner)
59-
}
60-
}
61-
62-
impl<'treeseq> Drop for LLTree<'treeseq> {
63-
fn drop(&mut self) {
64-
// SAFETY: Mbox<_> cannot hold a NULL ptr
65-
let rv = unsafe { super::bindings::tsk_tree_free(self.inner.as_mut()) };
66-
assert_eq!(rv, 0);
43+
self.inner.as_mut()
6744
}
6845
}

0 commit comments

Comments
 (0)