@@ -20,8 +20,8 @@ struct Bin {
2020 import d.gc.heap;
2121 Heap! (Extent, addrExtentCmp) slabs;
2222
23- void * alloc (shared (Arena)* arena, shared (ExtentMap)* emap,
24- ubyte sizeClass ) shared {
23+ uint alloc (shared (Arena)* arena, shared (ExtentMap)* emap, ubyte sizeClass ,
24+ void * [] allocs ) shared {
2525 import d.gc.sizeclass;
2626 assert (sizeClass < ClassCount.Small);
2727 assert (&arena.bins[sizeClass] == &this , " Invalid arena or sizeClass!" );
@@ -31,21 +31,27 @@ struct Bin {
3131 auto size = binInfos[sizeClass].itemSize;
3232
3333 Extent* slab;
34- uint index ;
34+ uint gotAllocs ;
3535
3636 {
3737 mutex.lock();
3838 scope (exit) mutex.unlock();
3939
4040 slab = (cast (Bin* ) &this ).getSlab(arena, emap, sizeClass);
4141 if (slab is null ) {
42- return null ;
42+ return 0 ;
4343 }
4444
45- index = slab.allocate();
45+ // Get as many of the requested slots as we can from the current slab:
46+ import d.gc.util;
47+ gotAllocs = min(cast (uint ) allocs.length, slab.freeSlots);
48+ foreach (i; 0 .. gotAllocs) {
49+ auto index = slab.allocate();
50+ allocs[i] = slab.address + index * size;
51+ }
4652 }
4753
48- return slab.address + index * size ;
54+ return gotAllocs ;
4955 }
5056
5157 bool free (shared (Arena)* arena, void * ptr, PageDescriptor pd) shared {
0 commit comments