1
- use std:: ptr:: NonNull ;
2
-
3
- use mbox:: MBox ;
4
-
5
1
use super :: bindings:: tsk_tree_t;
6
2
use super :: flags:: TreeFlags ;
3
+ use super :: tskbox:: TskBox ;
7
4
use super :: Error ;
8
5
use super :: LLTreeSeq ;
9
6
10
7
pub struct LLTree < ' treeseq > {
11
- inner : MBox < tsk_tree_t > ,
8
+ inner : TskBox < tsk_tree_t > ,
12
9
// NOTE: this reference exists becaust tsk_tree_t
13
10
// contains a NON-OWNING pointer to tsk_treeseq_t.
14
11
// Thus, we could theoretically cause UB without
@@ -19,28 +16,16 @@ pub struct LLTree<'treeseq> {
19
16
20
17
impl < ' treeseq > LLTree < ' treeseq > {
21
18
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
+ ) ;
40
25
// Gotta ask Jerome about this one--why isn't this handled in tsk_tree_init??
41
26
if !flags. contains ( TreeFlags :: NO_SAMPLE_COUNTS ) {
42
27
// SAFETY: nobody is null here.
43
- rv = unsafe {
28
+ let rv = unsafe {
44
29
super :: bindings:: tsk_tree_set_tracked_samples (
45
30
inner. as_mut ( ) ,
46
31
treeseq. num_samples ( ) ,
@@ -55,14 +40,6 @@ impl<'treeseq> LLTree<'treeseq> {
55
40
}
56
41
57
42
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 ( )
67
44
}
68
45
}
0 commit comments