1
1
use crate :: Dlmalloc ;
2
2
use core:: alloc:: { GlobalAlloc , Layout } ;
3
- use core:: ops :: { Deref , DerefMut } ;
3
+ use core:: ptr ;
4
4
5
5
pub use crate :: sys:: enable_alloc_after_fork;
6
6
@@ -10,52 +10,47 @@ pub use crate::sys::enable_alloc_after_fork;
10
10
/// implements the `GlobalAlloc` trait in the standard library.
11
11
pub struct GlobalDlmalloc ;
12
12
13
+ static mut DLMALLOC : Dlmalloc = Dlmalloc :: new ( ) ;
14
+
13
15
unsafe impl GlobalAlloc for GlobalDlmalloc {
14
16
#[ inline]
15
17
unsafe fn alloc ( & self , layout : Layout ) -> * mut u8 {
16
- <Dlmalloc >:: malloc ( & mut get ( ) , layout. size ( ) , layout. align ( ) )
18
+ let _guard = lock ( ) ;
19
+ let dlmalloc = ptr:: addr_of_mut!( DLMALLOC ) ;
20
+ ( * dlmalloc) . malloc ( layout. size ( ) , layout. align ( ) )
17
21
}
18
22
19
23
#[ inline]
20
24
unsafe fn dealloc ( & self , ptr : * mut u8 , layout : Layout ) {
21
- <Dlmalloc >:: free ( & mut get ( ) , ptr, layout. size ( ) , layout. align ( ) )
25
+ let _guard = lock ( ) ;
26
+ let dlmalloc = ptr:: addr_of_mut!( DLMALLOC ) ;
27
+ ( * dlmalloc) . free ( ptr, layout. size ( ) , layout. align ( ) )
22
28
}
23
29
24
30
#[ inline]
25
31
unsafe fn alloc_zeroed ( & self , layout : Layout ) -> * mut u8 {
26
- <Dlmalloc >:: calloc ( & mut get ( ) , layout. size ( ) , layout. align ( ) )
32
+ let _guard = lock ( ) ;
33
+ let dlmalloc = ptr:: addr_of_mut!( DLMALLOC ) ;
34
+ ( * dlmalloc) . calloc ( layout. size ( ) , layout. align ( ) )
27
35
}
28
36
29
37
#[ inline]
30
38
unsafe fn realloc ( & self , ptr : * mut u8 , layout : Layout , new_size : usize ) -> * mut u8 {
31
- <Dlmalloc >:: realloc ( & mut get ( ) , ptr, layout. size ( ) , layout. align ( ) , new_size)
39
+ let _guard = lock ( ) ;
40
+ let dlmalloc = ptr:: addr_of_mut!( DLMALLOC ) ;
41
+ ( * dlmalloc) . realloc ( ptr, layout. size ( ) , layout. align ( ) , new_size)
32
42
}
33
43
}
34
44
35
- static mut DLMALLOC : Dlmalloc = Dlmalloc :: new ( ) ;
36
-
37
- struct Instance ;
38
-
39
- unsafe fn get ( ) -> Instance {
45
+ unsafe fn lock ( ) -> impl Drop {
40
46
crate :: sys:: acquire_global_lock ( ) ;
41
- Instance
42
- }
43
47
44
- impl Deref for Instance {
45
- type Target = Dlmalloc ;
46
- fn deref ( & self ) -> & Dlmalloc {
47
- unsafe { & DLMALLOC }
48
+ struct Guard ;
49
+ impl Drop for Guard {
50
+ fn drop ( & mut self ) {
51
+ crate :: sys:: release_global_lock ( )
52
+ }
48
53
}
49
- }
50
54
51
- impl DerefMut for Instance {
52
- fn deref_mut ( & mut self ) -> & mut Dlmalloc {
53
- unsafe { & mut DLMALLOC }
54
- }
55
- }
56
-
57
- impl Drop for Instance {
58
- fn drop ( & mut self ) {
59
- crate :: sys:: release_global_lock ( )
60
- }
55
+ Guard
61
56
}
0 commit comments