void ObjectMemory::inflate_for_handle(STATE, ObjectHeader* obj, capi::Handle* handle) { utilities::thread::SpinLock::LockGuard guard(inflation_lock_); HeaderWord orig = obj->header; if(orig.f.meaning == eAuxWordInflated) { obj->inflated_header(state)->set_handle(state, handle); return; } uint32_t ih_index = 0; InflatedHeader* ih = inflated_headers_->allocate(state, obj, &ih_index); ih->update(state, orig); ih->set_handle(state, handle); ih->mark(this, mark_); while(!obj->set_inflated_header(state, ih_index, orig)) { orig = obj->header; if(orig.f.meaning == eAuxWordInflated) { obj->inflated_header(state)->set_handle(state, handle); ih->clear(); return; } ih->update(state, orig); ih->set_handle(state, handle); } }
void ObjectMemory::inflate_for_handle(STATE, ObjectHeader* obj, capi::Handle* handle) { utilities::thread::SpinLock::LockGuard guard(inflation_lock_); HeaderWord orig = obj->header; if(orig.f.inflated) { obj->inflated_header()->set_handle(state, handle); return; } InflatedHeader* header = inflated_headers_->allocate(obj); header->update(state, orig); header->set_handle(state, handle); while(!obj->set_inflated_header(state, header, orig)) { orig = obj->header; if(orig.f.inflated) { obj->inflated_header()->set_handle(state, handle); return; } header->update(state, orig); header->set_handle(state, handle); } }
bool ObjectMemory::inflate_lock_count_overflow(STATE, ObjectHeader* obj, int count) { utilities::thread::SpinLock::LockGuard guard(inflation_lock_); HeaderWord orig = obj->header; if(orig.f.meaning == eAuxWordInflated) { return false; } uint32_t ih_header = 0; InflatedHeader* ih = inflated_headers_->allocate(state, obj, &ih_header); ih->update(state, orig); ih->initialize_mutex(state->vm()->thread_id(), count); ih->mark(this, mark_); while(!obj->set_inflated_header(state, ih_header, orig)) { orig = obj->header; if(orig.f.meaning == eAuxWordInflated) { return false; } ih->update(state, orig); ih->initialize_mutex(state->vm()->thread_id(), count); } return true; }
bool ObjectMemory::inflate_lock_count_overflow(STATE, ObjectHeader* obj, int count) { utilities::thread::SpinLock::LockGuard guard(inflation_lock_); HeaderWord orig = obj->header; if(orig.f.inflated) { return false; } InflatedHeader* header = inflated_headers_->allocate(obj); header->update(state, orig); header->initialize_mutex(state->vm()->thread_id(), count); while(!obj->set_inflated_header(state, header, orig)) { orig = obj->header; if(orig.f.inflated) { return false; } header->update(state, orig); header->initialize_mutex(state->vm()->thread_id(), count); } return true; }