@@ -195,7 +195,7 @@ pub fn GeneralPurposeAllocator(comptime config: Config) type {
195
195
196
196
pub const Error = mem .Allocator .Error ;
197
197
198
- const small_bucket_count = math .log2 (page_size );
198
+ const small_bucket_count = math .log2 (std . heap . pageSize () );
199
199
const largest_bucket_object_size = 1 << (small_bucket_count - 1 );
200
200
const LargestSizeClassInt = std .math .IntFittingRange (0 , largest_bucket_object_size );
201
201
@@ -262,14 +262,14 @@ pub fn GeneralPurposeAllocator(comptime config: Config) type {
262
262
if (! config .safety ) @compileError ("requested size is only stored when safety is enabled" );
263
263
const start_ptr = @as ([* ]u8 , @ptrCast (bucket )) + bucketRequestedSizesStart (size_class );
264
264
const sizes = @as ([* ]LargestSizeClassInt , @ptrCast (@alignCast (start_ptr )));
265
- const slot_count = @divExact (page_size , size_class );
265
+ const slot_count = @divExact (std . heap . pageSize () , size_class );
266
266
return sizes [0.. slot_count ];
267
267
}
268
268
269
269
fn log2PtrAligns (bucket : * BucketHeader , size_class : usize ) []u8 {
270
270
if (! config .safety ) @compileError ("requested size is only stored when safety is enabled" );
271
271
const aligns_ptr = @as ([* ]u8 , @ptrCast (bucket )) + bucketAlignsStart (size_class );
272
- const slot_count = @divExact (page_size , size_class );
272
+ const slot_count = @divExact (std . heap . pageSize () , size_class );
273
273
return aligns_ptr [0.. slot_count ];
274
274
}
275
275
@@ -338,13 +338,13 @@ pub fn GeneralPurposeAllocator(comptime config: Config) type {
338
338
339
339
fn bucketAlignsStart (size_class : usize ) usize {
340
340
if (! config .safety ) @compileError ("requested sizes are not stored unless safety is enabled" );
341
- const slot_count = @divExact (page_size , size_class );
341
+ const slot_count = @divExact (std . heap . pageSize () , size_class );
342
342
return bucketRequestedSizesStart (size_class ) + (@sizeOf (LargestSizeClassInt ) * slot_count );
343
343
}
344
344
345
345
fn bucketStackFramesStart (size_class : usize ) usize {
346
346
const unaligned_start = if (config .safety ) blk : {
347
- const slot_count = @divExact (page_size , size_class );
347
+ const slot_count = @divExact (std . heap . pageSize () , size_class );
348
348
break :blk bucketAlignsStart (size_class ) + slot_count ;
349
349
} else @sizeOf (BucketHeader ) + usedBitsCount (size_class );
350
350
return mem .alignForward (
@@ -355,12 +355,12 @@ pub fn GeneralPurposeAllocator(comptime config: Config) type {
355
355
}
356
356
357
357
fn bucketSize (size_class : usize ) usize {
358
- const slot_count = @divExact (page_size , size_class );
358
+ const slot_count = @divExact (std . heap . pageSize () , size_class );
359
359
return bucketStackFramesStart (size_class ) + one_trace_size * traces_per_slot * slot_count ;
360
360
}
361
361
362
362
fn usedBitsCount (size_class : usize ) usize {
363
- const slot_count = @divExact (page_size , size_class );
363
+ const slot_count = @divExact (std . heap . pageSize () , size_class );
364
364
if (slot_count < 8 ) return 1 ;
365
365
return @divExact (slot_count , 8 );
366
366
}
@@ -444,10 +444,10 @@ pub fn GeneralPurposeAllocator(comptime config: Config) type {
444
444
var bucket = node .key ;
445
445
if (config .never_unmap ) {
446
446
// free page that was intentionally leaked by never_unmap
447
- self .backing_allocator .free (bucket .page [0.. page_size ]);
447
+ self .backing_allocator .free (bucket .page [0.. std . heap . pageSize () ]);
448
448
}
449
449
// alloc_cursor was set to slot count when bucket added to empty_buckets
450
- self .freeBucket (bucket , @divExact (page_size , bucket .alloc_cursor ));
450
+ self .freeBucket (bucket , @divExact (std . heap . pageSize () , bucket .alloc_cursor ));
451
451
self .bucket_node_pool .destroy (node );
452
452
}
453
453
self .empty_buckets .root = null ;
@@ -510,7 +510,7 @@ pub fn GeneralPurposeAllocator(comptime config: Config) type {
510
510
fn allocSlot (self : * Self , size_class : usize , trace_addr : usize ) Error ! Slot {
511
511
const bucket_index = math .log2 (size_class );
512
512
var buckets = & self .buckets [bucket_index ];
513
- const slot_count = @divExact (page_size , size_class );
513
+ const slot_count = @divExact (std . heap . pageSize () , size_class );
514
514
if (self .cur_buckets [bucket_index ] == null or self .cur_buckets [bucket_index ].? .alloc_cursor == slot_count ) {
515
515
var new_bucket = try self .createBucket (size_class );
516
516
errdefer self .freeBucket (new_bucket , size_class );
@@ -543,7 +543,7 @@ pub fn GeneralPurposeAllocator(comptime config: Config) type {
543
543
addr : usize ,
544
544
current_bucket : ? * BucketHeader ,
545
545
) ? * BucketHeader {
546
- const search_page : [* ]align (page_size ) u8 = @ptrFromInt (mem .alignBackward (usize , addr , page_size ));
546
+ const search_page : [* ]align (page_size ) u8 = @ptrFromInt (mem .alignBackward (usize , addr , std . heap . pageSize () ));
547
547
if (current_bucket != null and current_bucket .? .page == search_page ) {
548
548
return current_bucket ;
549
549
}
@@ -921,14 +921,14 @@ pub fn GeneralPurposeAllocator(comptime config: Config) type {
921
921
self .cur_buckets [bucket_index ] = null ;
922
922
}
923
923
if (! config .never_unmap ) {
924
- self .backing_allocator .free (bucket .page [0.. page_size ]);
924
+ self .backing_allocator .free (bucket .page [0.. std . heap . pageSize () ]);
925
925
}
926
926
if (! config .retain_metadata ) {
927
927
self .freeBucket (bucket , size_class );
928
928
self .bucket_node_pool .destroy (node );
929
929
} else {
930
930
// move alloc_cursor to end so we can tell size_class later
931
- const slot_count = @divExact (page_size , size_class );
931
+ const slot_count = @divExact (std . heap . pageSize () , size_class );
932
932
bucket .alloc_cursor = @as (SlotIndex , @truncate (slot_count ));
933
933
var empty_entry = self .empty_buckets .getEntryFor (node .key );
934
934
empty_entry .set (node );
@@ -1012,7 +1012,7 @@ pub fn GeneralPurposeAllocator(comptime config: Config) type {
1012
1012
}
1013
1013
1014
1014
fn createBucket (self : * Self , size_class : usize ) Error ! * BucketHeader {
1015
- const page = try self .backing_allocator .alignedAlloc (u8 , page_size , page_size );
1015
+ const page = try self .backing_allocator .alignedAlloc (u8 , std . heap . pageSize (), std . heap . pageSize () );
1016
1016
errdefer self .backing_allocator .free (page );
1017
1017
1018
1018
const bucket_size = bucketSize (size_class );
@@ -1152,17 +1152,17 @@ test "large object - grow" {
1152
1152
defer std .testing .expect (gpa .deinit () == .ok ) catch @panic ("leak" );
1153
1153
const allocator = gpa .allocator ();
1154
1154
1155
- var slice1 = try allocator .alloc (u8 , page_size * 2 - 20 );
1155
+ var slice1 = try allocator .alloc (u8 , std . heap . pageSize () * 2 - 20 );
1156
1156
defer allocator .free (slice1 );
1157
1157
1158
1158
const old = slice1 ;
1159
- slice1 = try allocator .realloc (slice1 , page_size * 2 - 10 );
1159
+ slice1 = try allocator .realloc (slice1 , std . heap . pageSize () * 2 - 10 );
1160
1160
try std .testing .expect (slice1 .ptr == old .ptr );
1161
1161
1162
- slice1 = try allocator .realloc (slice1 , page_size * 2 );
1162
+ slice1 = try allocator .realloc (slice1 , std . heap . pageSize () * 2 );
1163
1163
try std .testing .expect (slice1 .ptr == old .ptr );
1164
1164
1165
- slice1 = try allocator .realloc (slice1 , page_size * 2 + 1 );
1165
+ slice1 = try allocator .realloc (slice1 , std . heap . pageSize () * 2 + 1 );
1166
1166
}
1167
1167
1168
1168
test "realloc small object to large object" {
@@ -1176,7 +1176,7 @@ test "realloc small object to large object" {
1176
1176
slice [60 ] = 0x34 ;
1177
1177
1178
1178
// This requires upgrading to a large object
1179
- const large_object_size = page_size * 2 + 50 ;
1179
+ const large_object_size = std . heap . pageSize () * 2 + 50 ;
1180
1180
slice = try allocator .realloc (slice , large_object_size );
1181
1181
try std .testing .expect (slice [0 ] == 0x12 );
1182
1182
try std .testing .expect (slice [60 ] == 0x34 );
@@ -1187,22 +1187,22 @@ test "shrink large object to large object" {
1187
1187
defer std .testing .expect (gpa .deinit () == .ok ) catch @panic ("leak" );
1188
1188
const allocator = gpa .allocator ();
1189
1189
1190
- var slice = try allocator .alloc (u8 , page_size * 2 + 50 );
1190
+ var slice = try allocator .alloc (u8 , std . heap . pageSize () * 2 + 50 );
1191
1191
defer allocator .free (slice );
1192
1192
slice [0 ] = 0x12 ;
1193
1193
slice [60 ] = 0x34 ;
1194
1194
1195
- if (! allocator .resize (slice , page_size * 2 + 1 )) return ;
1196
- slice = slice .ptr [0 .. page_size * 2 + 1 ];
1195
+ if (! allocator .resize (slice , std . heap . pageSize () * 2 + 1 )) return ;
1196
+ slice = slice .ptr [0 .. std . heap . pageSize () * 2 + 1 ];
1197
1197
try std .testing .expect (slice [0 ] == 0x12 );
1198
1198
try std .testing .expect (slice [60 ] == 0x34 );
1199
1199
1200
- try std .testing .expect (allocator .resize (slice , page_size * 2 + 1 ));
1201
- slice = slice [0 .. page_size * 2 + 1 ];
1200
+ try std .testing .expect (allocator .resize (slice , std . heap . pageSize () * 2 + 1 ));
1201
+ slice = slice [0 .. std . heap . pageSize () * 2 + 1 ];
1202
1202
try std .testing .expect (slice [0 ] == 0x12 );
1203
1203
try std .testing .expect (slice [60 ] == 0x34 );
1204
1204
1205
- slice = try allocator .realloc (slice , page_size * 2 );
1205
+ slice = try allocator .realloc (slice , std . heap . pageSize () * 2 );
1206
1206
try std .testing .expect (slice [0 ] == 0x12 );
1207
1207
try std .testing .expect (slice [60 ] == 0x34 );
1208
1208
}
@@ -1216,13 +1216,13 @@ test "shrink large object to large object with larger alignment" {
1216
1216
var fba = std .heap .FixedBufferAllocator .init (& debug_buffer );
1217
1217
const debug_allocator = fba .allocator ();
1218
1218
1219
- const alloc_size = page_size * 2 + 50 ;
1219
+ const alloc_size = std . heap . pageSize () * 2 + 50 ;
1220
1220
var slice = try allocator .alignedAlloc (u8 , 16 , alloc_size );
1221
1221
defer allocator .free (slice );
1222
1222
1223
1223
const big_alignment : usize = switch (builtin .os .tag ) {
1224
- .windows = > page_size * 32 , // Windows aligns to 64K.
1225
- else = > page_size * 2 ,
1224
+ .windows = > std . heap . pageSize () * 32 , // Windows aligns to 64K.
1225
+ else = > std . heap . pageSize () * 2 ,
1226
1226
};
1227
1227
// This loop allocates until we find a page that is not aligned to the big
1228
1228
// alignment. Then we shrink the allocation after the loop, but increase the
@@ -1248,7 +1248,7 @@ test "realloc large object to small object" {
1248
1248
defer std .testing .expect (gpa .deinit () == .ok ) catch @panic ("leak" );
1249
1249
const allocator = gpa .allocator ();
1250
1250
1251
- var slice = try allocator .alloc (u8 , page_size * 2 + 50 );
1251
+ var slice = try allocator .alloc (u8 , std . heap . pageSize () * 2 + 50 );
1252
1252
defer allocator .free (slice );
1253
1253
slice [0 ] = 0x12 ;
1254
1254
slice [16 ] = 0x34 ;
@@ -1288,34 +1288,34 @@ test "realloc large object to larger alignment" {
1288
1288
var fba = std .heap .FixedBufferAllocator .init (& debug_buffer );
1289
1289
const debug_allocator = fba .allocator ();
1290
1290
1291
- var slice = try allocator .alignedAlloc (u8 , 16 , page_size * 2 + 50 );
1291
+ var slice = try allocator .alignedAlloc (u8 , 16 , std . heap . pageSize () * 2 + 50 );
1292
1292
defer allocator .free (slice );
1293
1293
1294
1294
const big_alignment : usize = switch (builtin .os .tag ) {
1295
- .windows = > page_size * 32 , // Windows aligns to 64K.
1296
- else = > page_size * 2 ,
1295
+ .windows = > std . heap . pageSize () * 32 , // Windows aligns to 64K.
1296
+ else = > std . heap . pageSize () * 2 ,
1297
1297
};
1298
1298
// This loop allocates until we find a page that is not aligned to the big alignment.
1299
1299
var stuff_to_free = std .ArrayList ([]align (16 ) u8 ).init (debug_allocator );
1300
1300
while (mem .isAligned (@intFromPtr (slice .ptr ), big_alignment )) {
1301
1301
try stuff_to_free .append (slice );
1302
- slice = try allocator .alignedAlloc (u8 , 16 , page_size * 2 + 50 );
1302
+ slice = try allocator .alignedAlloc (u8 , 16 , std . heap . pageSize () * 2 + 50 );
1303
1303
}
1304
1304
while (stuff_to_free .popOrNull ()) | item | {
1305
1305
allocator .free (item );
1306
1306
}
1307
1307
slice [0 ] = 0x12 ;
1308
1308
slice [16 ] = 0x34 ;
1309
1309
1310
- slice = try allocator .reallocAdvanced (slice , 32 , page_size * 2 + 100 );
1310
+ slice = try allocator .reallocAdvanced (slice , 32 , std . heap . pageSize () * 2 + 100 );
1311
1311
try std .testing .expect (slice [0 ] == 0x12 );
1312
1312
try std .testing .expect (slice [16 ] == 0x34 );
1313
1313
1314
- slice = try allocator .reallocAdvanced (slice , 32 , page_size * 2 + 25 );
1314
+ slice = try allocator .reallocAdvanced (slice , 32 , std . heap . pageSize () * 2 + 25 );
1315
1315
try std .testing .expect (slice [0 ] == 0x12 );
1316
1316
try std .testing .expect (slice [16 ] == 0x34 );
1317
1317
1318
- slice = try allocator .reallocAdvanced (slice , big_alignment , page_size * 2 + 100 );
1318
+ slice = try allocator .reallocAdvanced (slice , big_alignment , std . heap . pageSize () * 2 + 100 );
1319
1319
try std .testing .expect (slice [0 ] == 0x12 );
1320
1320
try std .testing .expect (slice [16 ] == 0x34 );
1321
1321
}
@@ -1326,7 +1326,7 @@ test "large object shrinks to small but allocation fails during shrink" {
1326
1326
defer std .testing .expect (gpa .deinit () == .ok ) catch @panic ("leak" );
1327
1327
const allocator = gpa .allocator ();
1328
1328
1329
- var slice = try allocator .alloc (u8 , page_size * 2 + 50 );
1329
+ var slice = try allocator .alloc (u8 , std . heap . pageSize () * 2 + 50 );
1330
1330
defer allocator .free (slice );
1331
1331
slice [0 ] = 0x12 ;
1332
1332
slice [3 ] = 0x34 ;
@@ -1397,7 +1397,7 @@ test "double frees" {
1397
1397
try std .testing .expect (GPA .searchBucket (& gpa .empty_buckets , @intFromPtr (small .ptr ), null ) != null );
1398
1398
1399
1399
// detect a large allocation double free
1400
- const large = try allocator .alloc (u8 , 2 * page_size );
1400
+ const large = try allocator .alloc (u8 , 2 * std . heap . pageSize () );
1401
1401
try std .testing .expect (gpa .large_allocations .contains (@intFromPtr (large .ptr )));
1402
1402
try std .testing .expectEqual (gpa .large_allocations .getEntry (@intFromPtr (large .ptr )).? .value_ptr .bytes , large );
1403
1403
allocator .free (large );
@@ -1406,7 +1406,7 @@ test "double frees" {
1406
1406
1407
1407
const normal_small = try allocator .alloc (u8 , size_class );
1408
1408
defer allocator .free (normal_small );
1409
- const normal_large = try allocator .alloc (u8 , 2 * page_size );
1409
+ const normal_large = try allocator .alloc (u8 , 2 * std . heap . pageSize () );
1410
1410
defer allocator .free (normal_large );
1411
1411
1412
1412
// check that flushing retained metadata doesn't disturb live allocations
@@ -1422,8 +1422,8 @@ test "bug 9995 fix, large allocs count requested size not backing size" {
1422
1422
var gpa = GeneralPurposeAllocator (.{ .enable_memory_limit = true }){};
1423
1423
const allocator = gpa .allocator ();
1424
1424
1425
- var buf = try allocator .alignedAlloc (u8 , 1 , page_size + 1 );
1426
- try std .testing .expect (gpa .total_requested_bytes == page_size + 1 );
1425
+ var buf = try allocator .alignedAlloc (u8 , 1 , std . heap . pageSize () + 1 );
1426
+ try std .testing .expect (gpa .total_requested_bytes == std . heap . pageSize () + 1 );
1427
1427
buf = try allocator .realloc (buf , 1 );
1428
1428
try std .testing .expect (gpa .total_requested_bytes == 1 );
1429
1429
buf = try allocator .realloc (buf , 2 );
0 commit comments