void ponyint_gc_markimmutable(pony_ctx_t* ctx, gc_t* gc) { objectmap_t* map = &gc->local; size_t i = HASHMAP_BEGIN; object_t* obj; while((obj = ponyint_objectmap_next(map, &i)) != NULL) { if(obj->immutable && (obj->rc > 0)) { // Mark in our heap and recurse if it wasn't already marked. void* p = obj->address; chunk_t* chunk = (chunk_t*)ponyint_pagemap_get(p); pony_type_t* type = *(pony_type_t**)p; mark_local_object(ctx, chunk, p, type->trace); } } }
void ponyint_gc_markobject(pony_ctx_t* ctx, void* p, pony_trace_fn f, bool immutable) { chunk_t* chunk = (chunk_t*)ponyint_pagemap_get(p); // Don't gc memory that wasn't pony_allocated, but do recurse. if(chunk == NULL) { recurse(ctx, p, f); return; } pony_actor_t* actor = ponyint_heap_owner(chunk); if(actor == ctx->current) mark_local_object(ctx, chunk, p, f); else mark_remote_object(ctx, actor, p, f, immutable, chunk); }
void ponyint_gc_markobject(pony_ctx_t* ctx, void* p, pony_type_t* t, int mutability) { chunk_t* chunk = (chunk_t*)ponyint_pagemap_get(p); // Don't gc memory that wasn't pony_allocated, but do recurse. if(chunk == NULL) { if(mutability != PONY_TRACE_OPAQUE) recurse(ctx, p, t->trace); return; } pony_actor_t* actor = ponyint_heap_owner(chunk); if(actor == ctx->current) mark_local_object(ctx, chunk, p, t, mutability); else mark_remote_object(ctx, actor, p, t, mutability); }