1
- #![ feature( allocator_api) ]
2
-
3
1
extern crate dlmalloc;
4
2
extern crate rand;
5
3
6
4
use std:: cmp;
7
- use std:: heap:: { Layout , Alloc , System } ;
8
-
9
5
use dlmalloc:: Dlmalloc ;
10
6
use rand:: Rng ;
11
7
12
8
#[ test]
13
9
fn smoke ( ) {
14
10
let mut a = Dlmalloc :: new ( ) ;
15
11
unsafe {
16
- let layout = Layout :: new :: < u8 > ( ) ;
17
- let ptr = a . alloc ( layout . clone ( ) ) . unwrap_or_else ( |e| System . oom ( e ) ) ;
12
+ let ptr = a . malloc ( 1 , 1 ) ;
13
+ assert ! ( ! ptr. is_null ( ) ) ;
18
14
* ptr = 9 ;
19
15
assert_eq ! ( * ptr, 9 ) ;
20
- a. dealloc ( ptr, layout . clone ( ) ) ;
16
+ a. free ( ptr, 1 , 1 ) ;
21
17
22
- let ptr = a. alloc ( layout. clone ( ) ) . unwrap_or_else ( |e| System . oom ( e) ) ;
18
+ let ptr = a. malloc ( 1 , 1 ) ;
19
+ assert ! ( !ptr. is_null( ) ) ;
23
20
* ptr = 10 ;
24
21
assert_eq ! ( * ptr, 10 ) ;
25
- a. dealloc ( ptr, layout . clone ( ) ) ;
22
+ a. free ( ptr, 1 , 1 ) ;
26
23
}
27
24
}
28
25
@@ -31,41 +28,39 @@ fn stress() {
31
28
let mut a = Dlmalloc :: new ( ) ;
32
29
let mut rng = rand:: thread_rng ( ) ;
33
30
let mut ptrs = Vec :: new ( ) ;
31
+ let max = if cfg ! ( test_lots) { 1_000_000 } else { 1_000 } ;
34
32
unsafe {
35
- for _ in 0 ..1_000_000 {
33
+ for _ in 0 ..max {
36
34
let free =
37
35
ptrs. len ( ) > 0 &&
38
36
( ( ptrs. len ( ) < 10_000 && rng. gen_weighted_bool ( 3 ) ) || rng. gen ( ) ) ;
39
37
if free {
40
38
let idx = rng. gen_range ( 0 , ptrs. len ( ) ) ;
41
- let ( ptr, layout ) : ( _ , Layout ) = ptrs. swap_remove ( idx) ;
42
- a. dealloc ( ptr, layout ) ;
39
+ let ( ptr, size , align ) = ptrs. swap_remove ( idx) ;
40
+ a. free ( ptr, size , align ) ;
43
41
continue
44
42
}
45
43
46
44
if ptrs. len ( ) > 0 && rng. gen_weighted_bool ( 100 ) {
47
45
let idx = rng. gen_range ( 0 , ptrs. len ( ) ) ;
48
- let ( ptr, old) : ( _ , Layout ) = ptrs. swap_remove ( idx) ;
49
- let new = if rng. gen ( ) {
50
- Layout :: from_size_align ( rng. gen_range ( old. size ( ) , old. size ( ) * 2 ) ,
51
- old. align ( ) ) . unwrap ( )
52
- } else if old. size ( ) > 10 {
53
- Layout :: from_size_align ( rng. gen_range ( old. size ( ) / 2 , old. size ( ) ) ,
54
- old. align ( ) ) . unwrap ( )
46
+ let ( ptr, size, align) = ptrs. swap_remove ( idx) ;
47
+ let new_size = if rng. gen ( ) {
48
+ rng. gen_range ( size, size * 2 )
49
+ } else if size > 10 {
50
+ rng. gen_range ( size / 2 , size)
55
51
} else {
56
52
continue
57
53
} ;
58
54
let mut tmp = Vec :: new ( ) ;
59
- for i in 0 ..cmp:: min ( old . size ( ) , new . size ( ) ) {
55
+ for i in 0 ..cmp:: min ( size, new_size ) {
60
56
tmp. push ( * ptr. offset ( i as isize ) ) ;
61
57
}
62
- let ptr = Alloc :: realloc ( & mut a, ptr, old, new. clone ( ) ) . unwrap_or_else ( |e| {
63
- System . oom ( e)
64
- } ) ;
58
+ let ptr = a. realloc ( ptr, size, align, new_size) ;
59
+ assert ! ( !ptr. is_null( ) ) ;
65
60
for ( i, byte) in tmp. iter ( ) . enumerate ( ) {
66
61
assert_eq ! ( * byte, * ptr. offset( i as isize ) ) ;
67
62
}
68
- ptrs. push ( ( ptr, new ) ) ;
63
+ ptrs. push ( ( ptr, new_size , align ) ) ;
69
64
}
70
65
71
66
let size = if rng. gen ( ) {
@@ -80,20 +75,18 @@ fn stress() {
80
75
} ;
81
76
82
77
let zero = rng. gen_weighted_bool ( 50 ) ;
83
- let layout = Layout :: from_size_align ( size, align) . unwrap ( ) ;
84
-
85
78
let ptr = if zero {
86
- a. alloc_zeroed ( layout . clone ( ) ) . unwrap_or_else ( |e| System . oom ( e ) )
79
+ a. calloc ( size , align )
87
80
} else {
88
- a. alloc ( layout . clone ( ) ) . unwrap_or_else ( |e| System . oom ( e ) )
81
+ a. malloc ( size , align )
89
82
} ;
90
- for i in 0 ..layout . size ( ) {
83
+ for i in 0 ..size {
91
84
if zero {
92
85
assert_eq ! ( * ptr. offset( i as isize ) , 0 ) ;
93
86
}
94
87
* ptr. offset ( i as isize ) = 0xce ;
95
88
}
96
- ptrs. push ( ( ptr, layout ) ) ;
89
+ ptrs. push ( ( ptr, size , align ) ) ;
97
90
}
98
91
}
99
92
}
0 commit comments