bool ponyint_gc_acquire(gc_t* gc, actorref_t* aref) { size_t rc = aref->rc; gc->rc += rc; objectmap_t* map = &aref->map; size_t i = HASHMAP_BEGIN; object_t* obj; while((obj = ponyint_objectmap_next(map, &i)) != NULL) { // Add to our RC. The object may not be in our object map, if it was // reached through another immutable reference. object_t* obj_local = ponyint_objectmap_getorput(&gc->local, obj->address, gc->mark); obj_local->rc += obj->rc; // Mark as immutable if necessary. if(obj->immutable) obj_local->immutable = true; } ponyint_actorref_free(aref); return rc > 0; }
static void send_local_object(pony_ctx_t* ctx, void* p, pony_type_t* t, int mutability) { gc_t* gc = ponyint_actor_gc(ctx->current); object_t* obj = ponyint_objectmap_getorput(&gc->local, p, gc->mark); if(obj->mark == gc->mark) return; // Implicitly send the owner. send_local_actor(gc); // Inc, mark, and recurse if not immutable. obj->rc++; obj->mark = gc->mark; if(mutability == PONY_TRACE_OPAQUE) return; if(mutability == PONY_TRACE_IMMUTABLE) obj->immutable = true; if(!obj->immutable) recurse(ctx, p, t->trace); }
static void send_local_object(pony_ctx_t* ctx, void* p, pony_trace_fn f, bool immutable) { gc_t* gc = ponyint_actor_gc(ctx->current); object_t* obj = ponyint_objectmap_getorput(&gc->local, p, gc->mark); if(obj->mark == gc->mark) return; // Implicitly send the owner. send_local_actor(gc); // Inc, mark, and recurse if not immutable. obj->rc++; obj->mark = gc->mark; if(immutable) obj->immutable = true; if(!obj->immutable) recurse(ctx, p, f); }
object_t* ponyint_actorref_getorput(actorref_t* aref, void* address, uint32_t mark) { return ponyint_objectmap_getorput(&aref->map, address, mark); }