@@ -47,13 +47,13 @@ TEST(SanitizerCommon, DefaultSizeClassMap) {
47
47
}
48
48
}
49
49
50
+ static const uptr kAllocatorSpace = 0x600000000000ULL ;
51
+ static const uptr kAllocatorSize = 0x10000000000 ; // 1T.
52
+
50
53
TEST (SanitizerCommon, SizeClassAllocator64) {
51
- const uptr space_beg = 0x600000000000ULL ;
52
- const uptr space_size = 0x10000000000 ; // 1T
53
- const uptr metadata_size = 16 ;
54
54
typedef DefaultSizeClassMap SCMap;
55
- typedef SizeClassAllocator64<space_beg, space_size ,
56
- metadata_size , SCMap> Allocator;
55
+ typedef SizeClassAllocator64<kAllocatorSpace , kAllocatorSize ,
56
+ 16 , SCMap> Allocator;
57
57
58
58
Allocator a;
59
59
a.Init ();
@@ -76,11 +76,18 @@ TEST(SanitizerCommon, SizeClassAllocator64) {
76
76
CHECK (a.PointerIsMine (x));
77
77
uptr class_id = a.GetSizeClass (x);
78
78
CHECK_EQ (class_id, SCMap::ClassID (size));
79
+ uptr *metadata = reinterpret_cast <uptr*>(a.GetMetaData (x));
80
+ metadata[0 ] = reinterpret_cast <uptr>(x) + 1 ;
81
+ metadata[1 ] = 0xABCD ;
79
82
}
80
83
}
81
84
// Deallocate all.
82
85
for (uptr i = 0 ; i < allocated.size (); i++) {
83
- a.Deallocate (allocated[i]);
86
+ void *x = allocated[i];
87
+ uptr *metadata = reinterpret_cast <uptr*>(a.GetMetaData (x));
88
+ CHECK_EQ (metadata[0 ], reinterpret_cast <uptr>(x) + 1 );
89
+ CHECK_EQ (metadata[1 ], 0xABCD );
90
+ a.Deallocate (x);
84
91
}
85
92
allocated.clear ();
86
93
uptr total_allocated = a.TotalMemoryUsedIncludingFreeLists ();
@@ -91,3 +98,30 @@ TEST(SanitizerCommon, SizeClassAllocator64) {
91
98
92
99
a.TestOnlyUnmap ();
93
100
}
101
+
102
+
103
+ TEST (SanitizerCommon, SizeClassAllocator64MetadataStress) {
104
+ typedef DefaultSizeClassMap SCMap;
105
+ typedef SizeClassAllocator64<kAllocatorSpace , kAllocatorSize ,
106
+ 16 , SCMap> Allocator;
107
+ Allocator a;
108
+ a.Init ();
109
+ static volatile uptr sink;
110
+
111
+ const uptr kNumAllocs = 10000 ;
112
+ void *allocated[kNumAllocs ];
113
+ for (uptr i = 0 ; i < kNumAllocs ; i++) {
114
+ uptr size = (i % 4096 ) + 1 ;
115
+ void *x = a.Allocate (size);
116
+ allocated[i] = x;
117
+ }
118
+ // Get Metadata kNumAllocs^2 times.
119
+ for (uptr i = 0 ; i < kNumAllocs * kNumAllocs ; i++) {
120
+ sink = a.GetMetaData (allocated[i % kNumAllocs ]);
121
+ }
122
+ for (uptr i = 0 ; i < kNumAllocs ; i++) {
123
+ a.Deallocate (allocated[i]);
124
+ }
125
+
126
+ a.TestOnlyUnmap ();
127
+ }
0 commit comments