Skip to content

Commit 6e60355

Browse files
author
Joel Dice
committed
zero heap space ahead of time when allocating raw storage and garbage collecting, not when allocating individual objects
This helps us support the Java Memory Model without adding a memory barrier to every object allocation. It's also potentially more efficient, since we zero out each heap segment all at once instead of bit-by-bit with each object allocation.
1 parent 8410e1d commit 6e60355

File tree

8 files changed

+90
-101
lines changed

8 files changed

+90
-101
lines changed

src/builtin.cpp

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ search(Thread* t, jstring name, object (*op)(Thread*, object),
2727
bool replaceDots)
2828
{
2929
if (LIKELY(name)) {
30-
object n = makeByteArray(t, stringLength(t, *name) + 1, false);
30+
object n = makeByteArray(t, stringLength(t, *name) + 1);
3131
char* s = reinterpret_cast<char*>(&byteArrayBody(t, n, 0));
3232
stringChars(t, *name, s);
3333

@@ -406,7 +406,7 @@ Java_java_lang_reflect_Array_makeObjectArray
406406
{
407407
ENTER(t, Thread::ActiveState);
408408

409-
return makeLocalReference(t, makeObjectArray(t, *elementType, length, true));
409+
return makeLocalReference(t, makeObjectArray(t, *elementType, length));
410410
}
411411

412412
extern "C" JNIEXPORT jint JNICALL
@@ -671,7 +671,7 @@ Java_java_lang_Throwable_trace(Thread* t, jclass, jint skipCount)
671671

672672
t->m->processor->walkStack(t, &v);
673673

674-
if (v.trace == 0) v.trace = makeArray(t, 0, true);
674+
if (v.trace == 0) v.trace = makeArray(t, 0);
675675

676676
return makeLocalReference(t, v.trace);
677677
}
@@ -683,8 +683,7 @@ Java_java_lang_Throwable_resolveTrace(Thread* t, jclass, jobject trace)
683683

684684
unsigned length = arrayLength(t, *trace);
685685
object array = makeObjectArray
686-
(t, arrayBody(t, t->m->types, Machine::StackTraceElementType),
687-
length, true);
686+
(t, arrayBody(t, t->m->types, Machine::StackTraceElementType), length);
688687
PROTECT(t, array);
689688

690689
object e = 0;

src/compile.cpp

Lines changed: 17 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1568,8 +1568,7 @@ uint64_t
15681568
makeBlankObjectArray(MyThread* t, object class_, int32_t length)
15691569
{
15701570
if (length >= 0) {
1571-
return reinterpret_cast<uint64_t>
1572-
(makeObjectArray(t, class_, length, true));
1571+
return reinterpret_cast<uint64_t>(makeObjectArray(t, class_, length));
15731572
} else {
15741573
object message = makeString(t, "%d", length);
15751574
t->exception = makeNegativeArraySizeException(t, message);
@@ -1581,7 +1580,7 @@ uint64_t
15811580
makeBlankArray(MyThread* t, unsigned type, int32_t length)
15821581
{
15831582
if (length >= 0) {
1584-
object (*constructor)(Thread*, uintptr_t, bool);
1583+
object (*constructor)(Thread*, uintptr_t);
15851584
switch (type) {
15861585
case T_BOOLEAN:
15871586
constructor = makeBooleanArray;
@@ -1618,7 +1617,7 @@ makeBlankArray(MyThread* t, unsigned type, int32_t length)
16181617
default: abort(t);
16191618
}
16201619

1621-
return reinterpret_cast<uintptr_t>(constructor(t, length, true));
1620+
return reinterpret_cast<uintptr_t>(constructor(t, length));
16221621
} else {
16231622
object message = makeString(t, "%d", length);
16241623
t->exception = makeNegativeArraySizeException(t, message);
@@ -1698,7 +1697,7 @@ makeMultidimensionalArray2(MyThread* t, object class_, uintptr_t* countStack,
16981697
}
16991698
}
17001699

1701-
object array = makeArray(t, counts[0], true);
1700+
object array = makeArray(t, counts[0]);
17021701
setObjectClass(t, array, class_);
17031702
PROTECT(t, array);
17041703

@@ -3828,10 +3827,10 @@ translateExceptionHandlerTable(MyThread* t, Compiler* c, object code,
38283827

38293828
unsigned length = exceptionHandlerTableLength(t, oldTable);
38303829

3831-
object newIndex = makeIntArray(t, length * 3, false);
3830+
object newIndex = makeIntArray(t, length * 3);
38323831
PROTECT(t, newIndex);
38333832

3834-
object newTable = makeArray(t, length + 1, true);
3833+
object newTable = makeArray(t, length + 1);
38353834
PROTECT(t, newTable);
38363835

38373836
set(t, newTable, ArrayBody, newIndex);
@@ -3874,7 +3873,7 @@ translateLineNumberTable(MyThread* t, Compiler* c, object code, intptr_t start)
38743873
PROTECT(t, oldTable);
38753874

38763875
unsigned length = lineNumberTableLength(t, oldTable);
3877-
object newTable = makeLineNumberTable(t, length, false);
3876+
object newTable = makeLineNumberTable(t, length);
38783877
for (unsigned i = 0; i < length; ++i) {
38793878
LineNumber* oldLine = lineNumberTableBody(t, oldTable, i);
38803879
LineNumber* newLine = lineNumberTableBody(t, newTable, i);
@@ -4107,7 +4106,7 @@ finish(MyThread* t, Allocator* allocator, Context* context)
41074106
FixedSizeOfArray + ((context->objectPoolCount + 1) * BytesPerWord),
41084107
true);
41094108

4110-
initArray(t, pool, context->objectPoolCount + 1, false);
4109+
initArray(t, pool, context->objectPoolCount + 1);
41114110
mark(t, pool, 0);
41124111

41134112
set(t, pool, ArrayBody, objectPools(t));
@@ -4150,7 +4149,7 @@ finish(MyThread* t, Allocator* allocator, Context* context)
41504149
codeLineNumberTable(t, code),
41514150
codeMaxStack(t, code),
41524151
codeMaxLocals(t, code),
4153-
0, false);
4152+
0);
41544153

41554154
set(t, context->method, MethodCode, code);
41564155
}
@@ -4176,8 +4175,7 @@ finish(MyThread* t, Allocator* allocator, Context* context)
41764175
unsigned size = usableFrameSizeWithParameters(t, context->method);
41774176
object map = makeIntArray
41784177
(t, context->traceLogCount
4179-
+ ceiling(context->traceLogCount * size, 32),
4180-
false);
4178+
+ ceiling(context->traceLogCount * size, 32));
41814179

41824180
assert(t, intArrayLength(t, map) == context->traceLogCount
41834181
+ frameObjectMapSize(t, context->method, map));
@@ -5076,7 +5074,7 @@ class MyProcessor: public Processor {
50765074
return vm::makeClass
50775075
(t, flags, vmFlags, arrayDimensions, fixedSize, arrayElementSize,
50785076
objectMask, name, super, interfaceTable, virtualTable, fieldTable,
5079-
methodTable, staticTable, loader, vtableLength, false);
5077+
methodTable, staticTable, loader, vtableLength);
50805078
}
50815079

50825080
virtual void
@@ -5399,7 +5397,7 @@ class MyProcessor: public Processor {
53995397
if (image) {
54005398
::boot(static_cast<MyThread*>(t), image);
54015399
} else {
5402-
callTable = makeArray(t, 128, true);
5400+
callTable = makeArray(t, 128);
54035401

54045402
methodTree = methodTreeSentinal = makeTreeNode(t, 0, 0, 0);
54055403
set(t, methodTree, TreeNodeLeft, methodTreeSentinal);
@@ -5471,7 +5469,7 @@ resizeTable(MyThread* t, object oldTable, unsigned newLength)
54715469
object oldNode = 0;
54725470
PROTECT(t, oldNode);
54735471

5474-
object newTable = makeArray(t, newLength, true);
5472+
object newTable = makeArray(t, newLength);
54755473
PROTECT(t, newTable);
54765474

54775475
for (unsigned i = 0; i < arrayLength(t, oldTable); ++i) {
@@ -5532,7 +5530,7 @@ insertCallNode(MyThread* t, object node)
55325530
object
55335531
makeClassMap(Thread* t, unsigned* table, unsigned count, uintptr_t* heap)
55345532
{
5535-
object array = makeArray(t, nextPowerOfTwo(count), true);
5533+
object array = makeArray(t, nextPowerOfTwo(count));
55365534
object map = makeHashMap(t, 0, array);
55375535
PROTECT(t, map);
55385536

@@ -5548,7 +5546,7 @@ object
55485546
makeStaticTableArray(Thread* t, unsigned* table, unsigned count,
55495547
uintptr_t* heap)
55505548
{
5551-
object array = makeArray(t, count, false);
5549+
object array = makeArray(t, count);
55525550

55535551
for (unsigned i = 0; i < count; ++i) {
55545552
set(t, array, ArrayBody + (i * BytesPerWord),
@@ -5561,7 +5559,7 @@ makeStaticTableArray(Thread* t, unsigned* table, unsigned count,
55615559
object
55625560
makeStringMap(Thread* t, unsigned* table, unsigned count, uintptr_t* heap)
55635561
{
5564-
object array = makeArray(t, nextPowerOfTwo(count), true);
5562+
object array = makeArray(t, nextPowerOfTwo(count));
55655563
object map = makeWeakHashMap(t, 0, array);
55665564
PROTECT(t, map);
55675565

@@ -5577,7 +5575,7 @@ object
55775575
makeCallTable(MyThread* t, uintptr_t* heap, unsigned* calls, unsigned count,
55785576
uintptr_t base)
55795577
{
5580-
object table = makeArray(t, nextPowerOfTwo(count), true);
5578+
object table = makeArray(t, nextPowerOfTwo(count));
55815579
PROTECT(t, table);
55825580

55835581
unsigned size = 0;

src/jnienv.cpp

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ NewString(Thread* t, const jchar* chars, jsize size)
168168

169169
object a = 0;
170170
if (size) {
171-
a = makeCharArray(t, size, false);
171+
a = makeCharArray(t, size);
172172
memcpy(&charArrayBody(t, a, 0), chars, size * sizeof(jchar));
173173
}
174174
object s = makeString(t, a, 0, size, 0);
@@ -184,7 +184,7 @@ NewStringUTF(Thread* t, const char* chars)
184184
object a = 0;
185185
unsigned size = strlen(chars);
186186
if (size) {
187-
a = makeByteArray(t, size, false);
187+
a = makeByteArray(t, size);
188188
memcpy(&byteArrayBody(t, a, 0), chars, size);
189189
}
190190
object s = makeString(t, a, 0, size, 0);
@@ -208,7 +208,7 @@ FindClass(Thread* t, const char* name)
208208
{
209209
ENTER(t, Thread::ActiveState);
210210

211-
object n = makeByteArray(t, strlen(name) + 1, false);
211+
object n = makeByteArray(t, strlen(name) + 1);
212212
replace('.', '/', name, &byteArrayBody(t, n, 0));
213213

214214
return makeLocalReference(t, resolveClass(t, n));
@@ -1214,7 +1214,7 @@ NewObjectArray(Thread* t, jsize length, jclass class_, jobject init)
12141214
{
12151215
ENTER(t, Thread::ActiveState);
12161216

1217-
object a = makeObjectArray(t, *class_, length, false);
1217+
object a = makeObjectArray(t, *class_, length);
12181218
object value = (init ? *init : 0);
12191219
for (jsize i = 0; i < length; ++i) {
12201220
set(t, a, ArrayBody + (i * BytesPerWord), value);
@@ -1244,63 +1244,63 @@ NewBooleanArray(Thread* t, jsize length)
12441244
{
12451245
ENTER(t, Thread::ActiveState);
12461246

1247-
return makeLocalReference(t, makeBooleanArray(t, length, true));
1247+
return makeLocalReference(t, makeBooleanArray(t, length));
12481248
}
12491249

12501250
jbyteArray JNICALL
12511251
NewByteArray(Thread* t, jsize length)
12521252
{
12531253
ENTER(t, Thread::ActiveState);
12541254

1255-
return makeLocalReference(t, makeByteArray(t, length, true));
1255+
return makeLocalReference(t, makeByteArray(t, length));
12561256
}
12571257

12581258
jcharArray JNICALL
12591259
NewCharArray(Thread* t, jsize length)
12601260
{
12611261
ENTER(t, Thread::ActiveState);
12621262

1263-
return makeLocalReference(t, makeCharArray(t, length, true));
1263+
return makeLocalReference(t, makeCharArray(t, length));
12641264
}
12651265

12661266
jshortArray JNICALL
12671267
NewShortArray(Thread* t, jsize length)
12681268
{
12691269
ENTER(t, Thread::ActiveState);
12701270

1271-
return makeLocalReference(t, makeShortArray(t, length, true));
1271+
return makeLocalReference(t, makeShortArray(t, length));
12721272
}
12731273

12741274
jintArray JNICALL
12751275
NewIntArray(Thread* t, jsize length)
12761276
{
12771277
ENTER(t, Thread::ActiveState);
12781278

1279-
return makeLocalReference(t, makeIntArray(t, length, true));
1279+
return makeLocalReference(t, makeIntArray(t, length));
12801280
}
12811281

12821282
jlongArray JNICALL
12831283
NewLongArray(Thread* t, jsize length)
12841284
{
12851285
ENTER(t, Thread::ActiveState);
12861286

1287-
return makeLocalReference(t, makeLongArray(t, length, true));
1287+
return makeLocalReference(t, makeLongArray(t, length));
12881288
}
12891289

12901290
jfloatArray JNICALL
12911291
NewFloatArray(Thread* t, jsize length)
12921292
{
12931293
ENTER(t, Thread::ActiveState);
12941294

1295-
return makeLocalReference(t, makeFloatArray(t, length, true));
1295+
return makeLocalReference(t, makeFloatArray(t, length));
12961296
}
12971297

12981298
jdoubleArray JNICALL
12991299
NewDoubleArray(Thread* t, jsize length)
13001300
{
13011301
ENTER(t, Thread::ActiveState);
13021302

1303-
return makeLocalReference(t, makeDoubleArray(t, length, true));
1303+
return makeLocalReference(t, makeDoubleArray(t, length));
13041304
}
13051305

13061306
jboolean* JNICALL

0 commit comments

Comments
 (0)