Skip to content

Commit 8031fd5

Browse files
committed
Merge branch 'master' of github.com:dsm9000/sdc into slab_alloc_threadcache
2 parents 54c3968 + 45559e2 commit 8031fd5

File tree

4 files changed

+235
-121
lines changed

4 files changed

+235
-121
lines changed

sdlib/d/gc/arena.d

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -112,12 +112,13 @@ public:
112112
/**
113113
* Small allocation facilities.
114114
*/
115-
void* allocSmall(shared(ExtentMap)* emap, size_t size) shared {
115+
uint allocSmallSlots(shared(ExtentMap)* emap, size_t size,
116+
void*[] allocs) shared {
116117
// TODO: in contracts
117118
assert(isSmallSize(size));
118119

119120
auto sizeClass = getSizeClass(size);
120-
return bins[sizeClass].alloc(&this, emap, sizeClass);
121+
return bins[sizeClass].alloc(&this, emap, sizeClass, allocs);
121122
}
122123

123124
/**

sdlib/d/gc/bin.d

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -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 {

sdlib/d/gc/slab.d

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,10 @@ public:
7676
return true;
7777
}
7878

79+
void clearMetadata() {
80+
setFreeSpace(0);
81+
}
82+
7983
@property
8084
Finalizer finalizer() {
8185
if (!finalizerEnabled) {

0 commit comments

Comments
 (0)