Example #1
0
 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");
   }
 }
Example #2
0
    InflatedHeader* deflate_header() {
      InflatedHeader* ih = inflated_header();
      header.f = ih->flags();
      header.f.inflated = 0;

      return ih;
    }
Example #3
0
 ObjectFlags flags() {
   HeaderWord copy = header;
   if(copy.f.inflated) {
     return inflated_header()->flags();
   }
   return copy.f;
 }
Example #4
0
  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;
  }
Example #5
0
  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;
      }
    }
  }
Example #6
0
  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;
      }
    }
  }
Example #7
0
  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;
      }
    }
  }
Example #8
0
  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;
      }
    }
  }
Example #9
0
  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;
      }
    }
  }
Example #10
0
  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;
      }
    }
  }
Example #11
0
  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;
      }
    }
  }
Example #12
0
  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;
      }
    }
  }
Example #13
0
  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;
      }
    }
  }
Example #14
0
  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;
      }
    }
  }
Example #15
0
  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;
  }
Example #16
0
 ObjectFlags& flags() const {
   if(inflated_header_p()) return inflated_header()->flags();
   return const_cast<ObjectFlags&>(header.f);
 }
Example #17
0
 ObjectFlags& flags() {
   if(inflated_header_p()) return inflated_header()->flags();
   return header.f;
 }