예제 #1
0
  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);
    }

  }
예제 #2
0
  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);
    }

  }
예제 #3
0
  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;
  }
예제 #4
0
  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;
  }