Skip to content

Commit 71e927a

Browse files
authored
TreeSequence::new now takes ownership of the TableCollection. (#235)
1 parent be211b8 commit 71e927a

File tree

2 files changed

+26
-4
lines changed

2 files changed

+26
-4
lines changed

src/table_collection.rs

+15
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,21 @@ impl TableCollection {
151151
Ok(tables)
152152
}
153153

154+
pub(crate) fn into_raw(self) -> Result<*mut ll_bindings::tsk_table_collection_t, TskitError> {
155+
let mut tables = self;
156+
// rust won't let use move inner out b/c this type implements Drop.
157+
// So we have to replace the existing pointer with a new one.
158+
let table_ptr = unsafe {
159+
libc::malloc(std::mem::size_of::<ll_bindings::tsk_table_collection_t>())
160+
as *mut ll_bindings::tsk_table_collection_t
161+
};
162+
let rv = unsafe { ll_bindings::tsk_table_collection_init(table_ptr, 0) };
163+
164+
let mut temp = unsafe { MBox::from_raw(table_ptr) };
165+
std::mem::swap(&mut temp, &mut tables.inner);
166+
handle_tsk_return_value!(rv, MBox::into_raw(temp))
167+
}
168+
154169
/// Load a table collection from a file.
155170
///
156171
/// # Panics

src/trees.rs

+11-4
Original file line numberDiff line numberDiff line change
@@ -1000,15 +1000,22 @@ impl TreeSequence {
10001000
/// let tree_sequence = tskit::TreeSequence::new(tables,
10011001
/// tskit::TreeSequenceFlags::default()).unwrap();
10021002
/// ```
1003+
///
1004+
/// ## Note
1005+
///
1006+
/// This function makes *no extra copies* of the tables.
1007+
/// There is, however, a temporary allocation of an empty table collection
1008+
/// in order to convince rust that we are safely handling all memory.
10031009
pub fn new<F: Into<TreeSequenceFlags>>(
10041010
tables: TableCollection,
10051011
flags: F,
10061012
) -> Result<Self, TskitError> {
1007-
let mut t = tables;
10081013
let mut treeseq = Self::wrap();
1009-
let rv = unsafe {
1010-
ll_bindings::tsk_treeseq_init(treeseq.as_mut_ptr(), t.as_mut_ptr(), flags.into().bits())
1011-
};
1014+
let mut flags: u32 = flags.into().bits();
1015+
flags |= ll_bindings::TSK_TAKE_OWNERSHIP;
1016+
let raw_tables_ptr = tables.into_raw()?;
1017+
let rv =
1018+
unsafe { ll_bindings::tsk_treeseq_init(treeseq.as_mut_ptr(), raw_tables_ptr, flags) };
10121019
handle_tsk_return_value!(rv, treeseq)
10131020
}
10141021

0 commit comments

Comments
 (0)