bool isObjptrInNursery (GC_state s, objptr op) { pointer p; if (not (isObjptr(op))) return TRUE; p = objptrToPointer (op, s->heap.start); return isPointerInNursery (s, p); }
void updateWeaksForCheneyCopy (GC_state s) { pointer p; GC_weak w; for (w = s->weaks; w != NULL; w = w->link) { assert (BOGUS_OBJPTR != w->objptr); if (DEBUG_WEAK) fprintf (stderr, "updateWeaksForCheneyCopy w = "FMTPTR" ", (uintptr_t)w); p = objptrToPointer (w->objptr, s->heap.start); if (GC_FORWARDED == getHeader (p)) { if (DEBUG_WEAK) fprintf (stderr, "forwarded from "FMTOBJPTR" to "FMTOBJPTR"\n", w->objptr, *(objptr*)p); w->objptr = *(objptr*)p; } else { if (DEBUG_WEAK) fprintf (stderr, "cleared\n"); *(getHeaderp((pointer)w - offsetofWeak (s))) = GC_WEAK_GONE_HEADER; w->objptr = BOGUS_OBJPTR; } } s->weaks = NULL; }
pointer GC_getSavedThread (GC_state s) { pointer p; assert(s->savedThread != BOGUS_OBJPTR); p = objptrToPointer (s->savedThread, s->heap.start); s->savedThread = BOGUS_OBJPTR; return p; }
void translateObjptr (GC_state s, objptr *opp) { pointer p; pointer from, to; from = s->translateState.from; to = s->translateState.to; p = objptrToPointer (*opp, from); p = (p - from) + to; *opp = pointerToObjptr (p, to); }
void displayThread (GC_state s, GC_thread thread, FILE *stream) { fprintf(stream, "\t\texnStack = %"PRIuMAX"\n" "\t\tbytesNeeded = %"PRIuMAX"\n" "\t\tstack = "FMTOBJPTR"\n", (uintmax_t)thread->exnStack, (uintmax_t)thread->bytesNeeded, thread->stack); displayStack (s, (GC_stack)(objptrToPointer (thread->stack, s->heap.start)), stream); }
void growStackCurrent (GC_state s) { size_t reserved; GC_stack stack; reserved = sizeofStackGrowReserved (s, getStackCurrent(s)); if (DEBUG_STACKS or s->controls.messages) fprintf (stderr, "[GC: Growing stack of size %s bytes to size %s bytes, using %s bytes.]\n", uintmaxToCommaString(getStackCurrent(s)->reserved), uintmaxToCommaString(reserved), uintmaxToCommaString(getStackCurrent(s)->used)); assert (hasHeapBytesFree (s, sizeofStackWithHeader (s, reserved), 0)); stack = newStack (s, reserved, TRUE); copyStack (s, getStackCurrent(s), stack); getThreadCurrent(s)->stack = pointerToObjptr ((pointer)stack, s->heap.start); markCard (s, objptrToPointer (getThreadCurrentObjptr(s), s->heap.start)); }
void displayGCState (GC_state s, FILE *stream) { fprintf (stream, "GC state\n"); fprintf (stream, "\tcurrentThread = "FMTOBJPTR"\n", s->currentThread); displayThread (s, (GC_thread)(objptrToPointer (s->currentThread, s->heap.start) + offsetofThread (s)), stream); fprintf (stream, "\tgenerational\n"); displayGenerationalMaps (s, &s->generationalMaps, stream); fprintf (stream, "\theap\n"); displayHeap (s, &s->heap, stream); fprintf (stream, "\tlimit = "FMTPTR"\n" "\tstackBottom = "FMTPTR"\n" "\tstackTop = "FMTPTR"\n", (uintptr_t)s->limit, (uintptr_t)s->stackBottom, (uintptr_t)s->stackTop); }
pointer GC_getCurrentThread (GC_state s) { pointer p = objptrToPointer (s->currentThread, s->heap.start); return p; }
pointer GC_getCallFromCHandlerThread (GC_state s) { pointer p = objptrToPointer (s->callFromCHandlerThread, s->heap.start); return p; }