void set_handle(STATE, capi::Handle* handle) { if(inflated_header_p()) { inflated_header(state)->set_handle(state, handle); } else { rubinius::bug("Setting handle directly on not inflated header"); } }
InflatedHeader* deflate_header() { InflatedHeader* ih = inflated_header(); header.f = ih->flags(); header.f.inflated = 0; return ih; }
ObjectFlags flags() { HeaderWord copy = header; if(copy.f.inflated) { return inflated_header()->flags(); } return copy.f; }
InflatedHeader* ObjectHeader::deflate_header() { // Probably needs to CAS, but this only used by immix and in a place // we don't hit currently, so don't worry about it for now. InflatedHeader* ih = inflated_header(); header.f = ih->flags(); header.f.meaning = eAuxWordEmpty; header.f.aux_word = 0; return ih; }
unsigned int ObjectHeader::inc_age() { for(;;) { if(inflated_header_p()) { return inflated_header()->inc_age(); } else { HeaderWord orig = header; orig.f.inflated = 0; HeaderWord new_val = orig; unsigned int new_age = new_val.f.age++; if(header.atomic_set(orig, new_val)) return new_age; } } }
void ObjectHeader::mark(unsigned int which) { for(;;) { if(inflated_header_p()) { inflated_header()->mark(which); return; } else { HeaderWord orig = header; orig.f.inflated = 0; HeaderWord new_val = orig; new_val.f.Marked = which; if(header.atomic_set(orig, new_val)) return; } } }
void ObjectHeader::set_untrusted(int val) { for(;;) { if(inflated_header_p()) { inflated_header()->set_untrusted(val); return; } else { HeaderWord orig = header; orig.f.inflated = 0; HeaderWord new_val = orig; new_val.f.Untrusted = val; if(header.atomic_set(orig, new_val)) return; } } }
void ObjectHeader::clear_remember() { for(;;) { if(inflated_header_p()) { inflated_header()->clear_remember(); return; } else { HeaderWord orig = header; orig.f.inflated = 0; HeaderWord new_val = orig; new_val.f.Remember = 0; if(header.atomic_set(orig, new_val)) return; } } }
void ObjectHeader::set_lock_contended() { for(;;) { if(inflated_header_p()) { inflated_header()->set_lock_contended(); return; } else { HeaderWord orig = header; orig.f.inflated = 0; HeaderWord new_val = orig; new_val.f.LockContended = 1; if(header.atomic_set(orig, new_val)) return; } } }
void ObjectHeader::set_zone(gc_zone zone) { for(;;) { if(inflated_header_p()) { inflated_header()->set_zone(zone); return; } else { HeaderWord orig = header; orig.f.inflated = 0; HeaderWord new_val = orig; new_val.f.zone = zone; if(header.atomic_set(orig, new_val)) return; } } }
void ObjectHeader::set_in_immix() { for(;;) { if(inflated_header_p()) { inflated_header()->set_in_immix(); return; } else { HeaderWord orig = header; orig.f.inflated = 0; HeaderWord new_val = orig; new_val.f.InImmix = 1; if(header.atomic_set(orig, new_val)) return; } } }
void ObjectHeader::unpin() { for(;;) { if(inflated_header_p()) { inflated_header()->unpin(); return; } else { HeaderWord orig = header; orig.f.inflated = 0; HeaderWord new_val = orig; new_val.f.Pinned = 0; if(header.atomic_set(orig, new_val)) return; } } }
void ObjectHeader::set_age(unsigned int age) { for(;;) { if(inflated_header_p()) { inflated_header()->set_age(age); return; } else { HeaderWord orig = header; orig.f.inflated = 0; HeaderWord new_val = orig; new_val.f.age = age; if(header.atomic_set(orig, new_val)) return; } } }
void ObjectHeader::clear_handle(STATE) { for(;;) { if(inflated_header_p()) { inflated_header()->set_handle(state, NULL); return; } else { HeaderWord orig = header; orig.f.meaning = eAuxWordHandle; HeaderWord new_val = orig; new_val.f.meaning = eAuxWordEmpty; new_val.f.aux_word = 0; if(header.atomic_set(orig, new_val)) return; } } }
bool ObjectHeader::pin() { // Can't pin young objects! if(young_object_p()) return false; for(;;) { if(inflated_header_p()) { return inflated_header()->pin(); } else { HeaderWord orig = header; orig.f.inflated = 0; HeaderWord new_val = orig; new_val.f.Pinned = 1; if(header.atomic_set(orig, new_val)) return true; } } return true; }
ObjectFlags& flags() const { if(inflated_header_p()) return inflated_header()->flags(); return const_cast<ObjectFlags&>(header.f); }
ObjectFlags& flags() { if(inflated_header_p()) return inflated_header()->flags(); return header.f; }