@@ -6,35 +6,47 @@ use std::alloc::{Global, Alloc, Layout, System};
6
6
use std:: slice;
7
7
8
8
fn check_alloc < T : Alloc > ( mut allocator : T ) { unsafe {
9
- let layout = Layout :: from_size_align ( 20 , 4 ) . unwrap ( ) ;
10
- let a = allocator. alloc ( layout) . unwrap ( ) ;
11
- allocator. dealloc ( a, layout) ;
9
+ for & align in & [ 4 , 8 , 16 , 32 ] {
10
+ let layout = Layout :: from_size_align ( 20 , align) . unwrap ( ) ;
12
11
13
- let p1 = allocator. alloc_zeroed ( layout) . unwrap ( ) ;
12
+ for _ in 0 ..32 {
13
+ let a = allocator. alloc ( layout) . unwrap ( ) ;
14
+ assert_eq ! ( a. as_ptr( ) as usize % align, 0 , "pointer is incorrectly aligned" ) ;
15
+ allocator. dealloc ( a, layout) ;
16
+ }
17
+
18
+ let p1 = allocator. alloc_zeroed ( layout) . unwrap ( ) ;
19
+ assert_eq ! ( p1. as_ptr( ) as usize % align, 0 , "pointer is incorrectly aligned" ) ;
14
20
15
- let p2 = allocator. realloc ( p1, Layout :: from_size_align ( 20 , 4 ) . unwrap ( ) , 40 ) . unwrap ( ) ;
16
- let slice = slice:: from_raw_parts ( p2. as_ptr ( ) , 20 ) ;
17
- assert_eq ! ( & slice, & [ 0_u8 ; 20 ] ) ;
21
+ let p2 = allocator. realloc ( p1, layout, 40 ) . unwrap ( ) ;
22
+ let layout = Layout :: from_size_align ( 40 , align) . unwrap ( ) ;
23
+ assert_eq ! ( p2. as_ptr( ) as usize % align, 0 , "pointer is incorrectly aligned" ) ;
24
+ let slice = slice:: from_raw_parts ( p2. as_ptr ( ) , 20 ) ;
25
+ assert_eq ! ( & slice, & [ 0_u8 ; 20 ] ) ;
18
26
19
- // old size == new size
20
- let p3 = allocator. realloc ( p2, Layout :: from_size_align ( 40 , 4 ) . unwrap ( ) , 40 ) . unwrap ( ) ;
21
- let slice = slice:: from_raw_parts ( p3. as_ptr ( ) , 20 ) ;
22
- assert_eq ! ( & slice, & [ 0_u8 ; 20 ] ) ;
27
+ // old size == new size
28
+ let p3 = allocator. realloc ( p2, layout, 40 ) . unwrap ( ) ;
29
+ assert_eq ! ( p3. as_ptr( ) as usize % align, 0 , "pointer is incorrectly aligned" ) ;
30
+ let slice = slice:: from_raw_parts ( p3. as_ptr ( ) , 20 ) ;
31
+ assert_eq ! ( & slice, & [ 0_u8 ; 20 ] ) ;
23
32
24
- // old size > new size
25
- let p4 = allocator. realloc ( p3, Layout :: from_size_align ( 40 , 4 ) . unwrap ( ) , 10 ) . unwrap ( ) ;
26
- let slice = slice:: from_raw_parts ( p4. as_ptr ( ) , 10 ) ;
27
- assert_eq ! ( & slice, & [ 0_u8 ; 10 ] ) ;
33
+ // old size > new size
34
+ let p4 = allocator. realloc ( p3, layout, 10 ) . unwrap ( ) ;
35
+ let layout = Layout :: from_size_align ( 10 , align) . unwrap ( ) ;
36
+ assert_eq ! ( p4. as_ptr( ) as usize % align, 0 , "pointer is incorrectly aligned" ) ;
37
+ let slice = slice:: from_raw_parts ( p4. as_ptr ( ) , 10 ) ;
38
+ assert_eq ! ( & slice, & [ 0_u8 ; 10 ] ) ;
28
39
29
- allocator. dealloc ( p4, Layout :: from_size_align ( 10 , 4 ) . unwrap ( ) ) ;
40
+ allocator. dealloc ( p4, layout) ;
41
+ }
30
42
} }
31
43
32
44
fn check_overalign_requests < T : Alloc > ( mut allocator : T ) {
33
45
let size = 8 ;
34
- // Greater than `size`.
35
- let align = 16 ;
46
+ // Greater than `size`, and also greater than `MIN_ALIGN` .
47
+ let align = 32 ;
36
48
37
- let iterations = 5 ;
49
+ let iterations = 32 ;
38
50
unsafe {
39
51
let pointers: Vec < _ > = ( 0 ..iterations) . map ( |_| {
40
52
allocator. alloc ( Layout :: from_size_align ( size, align) . unwrap ( ) ) . unwrap ( )
0 commit comments