1- use std:: ptr:: NonNull ;
2-
3- use mbox:: MBox ;
4-
51use super :: bindings:: tsk_tree_t;
62use super :: flags:: TreeFlags ;
3+ use super :: tskbox:: TskBox ;
74use super :: Error ;
85use super :: LLTreeSeq ;
96
107pub 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
2017impl < ' 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