mirror of
https://github.com/corda/corda.git
synced 2025-01-19 11:16:54 +00:00
fix over-agressive state reset in state mapping code; logging tweaks
This commit is contained in:
parent
25f12ca40a
commit
259dd643e0
@ -3491,24 +3491,27 @@ calculateJunctions(MyThread* t, Context* context, uintptr_t* originalRoots,
|
|||||||
case IpEvent: {
|
case IpEvent: {
|
||||||
ip = context->eventLog.get2(ei);
|
ip = context->eventLog.get2(ei);
|
||||||
|
|
||||||
|
if (DebugFrameMaps) {
|
||||||
|
fprintf(stderr, " roots at ip %3d: ", ip);
|
||||||
|
printSet(*roots);
|
||||||
|
fprintf(stderr, "\n");
|
||||||
|
|
||||||
|
fprintf(stderr, " known at ip %3d: ", ip);
|
||||||
|
printSet(*known);
|
||||||
|
fprintf(stderr, "\n");
|
||||||
|
}
|
||||||
|
|
||||||
if (context->visitTable[ip] > 1) {
|
if (context->visitTable[ip] > 1) {
|
||||||
uintptr_t* tableRoots = context->rootTable + (ip * mapSize);
|
uintptr_t* tableRoots = context->rootTable + (ip * mapSize);
|
||||||
uintptr_t* tableKnown = context->knownTable + (ip * mapSize);
|
uintptr_t* tableKnown = context->knownTable + (ip * mapSize);
|
||||||
|
|
||||||
if (DebugFrameMaps) {
|
|
||||||
fprintf(stderr, " roots at ip %3d: ", ip);
|
|
||||||
printSet(*roots);
|
|
||||||
fprintf(stderr, "\n");
|
|
||||||
|
|
||||||
fprintf(stderr, " known at ip %3d: ", ip);
|
|
||||||
printSet(*known);
|
|
||||||
fprintf(stderr, "\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
for (unsigned wi = 0; wi < mapSize; ++wi) {
|
for (unsigned wi = 0; wi < mapSize; ++wi) {
|
||||||
tableRoots[wi] &= ~(known[wi] & ~roots[wi]);
|
tableRoots[wi] &= ~(known[wi] & ~roots[wi]);
|
||||||
tableRoots[wi] |= known[wi] & roots[wi] & ~tableKnown[wi];
|
tableRoots[wi] |= known[wi] & roots[wi] & ~tableKnown[wi];
|
||||||
tableKnown[wi] |= known[wi];
|
tableKnown[wi] |= known[wi];
|
||||||
|
|
||||||
|
roots[wi] = 0;
|
||||||
|
known[wi] = tableKnown[wi] & ~tableRoots[wi];
|
||||||
}
|
}
|
||||||
|
|
||||||
if (DebugFrameMaps) {
|
if (DebugFrameMaps) {
|
||||||
@ -3520,9 +3523,6 @@ calculateJunctions(MyThread* t, Context* context, uintptr_t* originalRoots,
|
|||||||
printSet(*tableKnown);
|
printSet(*tableKnown);
|
||||||
fprintf(stderr, "\n");
|
fprintf(stderr, "\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
memset(roots, 0, mapSize * BytesPerWord);
|
|
||||||
memset(known, 0, mapSize * BytesPerWord);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ei += 2;
|
ei += 2;
|
||||||
@ -3579,6 +3579,12 @@ updateTraceElements(MyThread* t, Context* context, uintptr_t* originalRoots,
|
|||||||
case IpEvent: {
|
case IpEvent: {
|
||||||
ip = context->eventLog.get2(ei);
|
ip = context->eventLog.get2(ei);
|
||||||
|
|
||||||
|
if (DebugFrameMaps) {
|
||||||
|
fprintf(stderr, " map at ip %3d: ", ip);
|
||||||
|
printSet(*roots);
|
||||||
|
fprintf(stderr, "\n");
|
||||||
|
}
|
||||||
|
|
||||||
if (context->visitTable[ip] > 1) {
|
if (context->visitTable[ip] > 1) {
|
||||||
uintptr_t* tableRoots = context->rootTable + (ip * mapSize);
|
uintptr_t* tableRoots = context->rootTable + (ip * mapSize);
|
||||||
uintptr_t* tableKnown = context->knownTable + (ip * mapSize);
|
uintptr_t* tableKnown = context->knownTable + (ip * mapSize);
|
||||||
@ -3609,12 +3615,6 @@ updateTraceElements(MyThread* t, Context* context, uintptr_t* originalRoots,
|
|||||||
TraceElement* te; context->eventLog.get(ei, &te, BytesPerWord);
|
TraceElement* te; context->eventLog.get(ei, &te, BytesPerWord);
|
||||||
memcpy(te->map, roots, mapSize * BytesPerWord);
|
memcpy(te->map, roots, mapSize * BytesPerWord);
|
||||||
|
|
||||||
if (DebugFrameMaps) {
|
|
||||||
fprintf(stderr, " map at ip %3d: ", ip);
|
|
||||||
printSet(*roots);
|
|
||||||
fprintf(stderr, "\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
ei += BytesPerWord;
|
ei += BytesPerWord;
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
|
32
test/GC.java
32
test/GC.java
@ -47,6 +47,16 @@ public class GC {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private static void stackMap3(boolean predicate) {
|
private static void stackMap3(boolean predicate) {
|
||||||
|
if (predicate) {
|
||||||
|
Object a = null;
|
||||||
|
} else {
|
||||||
|
int a = 42;
|
||||||
|
}
|
||||||
|
|
||||||
|
System.gc();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void stackMap4(boolean predicate) {
|
||||||
int i = 2;
|
int i = 2;
|
||||||
if (predicate) {
|
if (predicate) {
|
||||||
Object a = null;
|
Object a = null;
|
||||||
@ -61,6 +71,22 @@ public class GC {
|
|||||||
} while (i >= 0);
|
} while (i >= 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static void noop() { }
|
||||||
|
|
||||||
|
private static void stackMap5(boolean predicate) {
|
||||||
|
if (predicate) {
|
||||||
|
noop();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (predicate) {
|
||||||
|
noop();
|
||||||
|
} else {
|
||||||
|
Object a = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
System.gc();
|
||||||
|
}
|
||||||
|
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
Object[] array = new Object[1024 * 1024];
|
Object[] array = new Object[1024 * 1024];
|
||||||
array[0] = new Object();
|
array[0] = new Object();
|
||||||
@ -87,6 +113,12 @@ public class GC {
|
|||||||
|
|
||||||
stackMap3(true);
|
stackMap3(true);
|
||||||
stackMap3(false);
|
stackMap3(false);
|
||||||
|
|
||||||
|
stackMap4(true);
|
||||||
|
stackMap4(false);
|
||||||
|
|
||||||
|
stackMap5(true);
|
||||||
|
stackMap5(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user