本文整理汇总了C++中saw_object函数的典型用法代码示例。如果您正苦于以下问题:C++ saw_object函数的具体用法?C++ saw_object怎么用?C++ saw_object使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了saw_object函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: saw_object
void ObjectWalker::seed(GCData& data) {
ObjectArray *current_rs = memory_->remember_set();
for(ObjectArray::iterator oi = current_rs->begin();
oi != current_rs->end();
++oi) {
Object* tmp = *oi;
// unremember_object throws a NULL in to remove an object
// so we don't have to compact the set in unremember
if(tmp) saw_object(0, tmp);
}
for(Roots::Iterator i(data.roots()); i.more(); i.advance()) {
saw_object(0, i->get());
}
{
std::lock_guard<std::mutex> guard(data.thread_nexus()->threads_mutex());
for(ThreadList::iterator i = data.thread_nexus()->threads()->begin();
i != data.thread_nexus()->threads()->end();
++i)
{
scan(*i, false);
}
}
}
示例2: ObjectArray
/* Understands how to read the inside of an object and find all references
* located within. It copies the objects pointed to, but does not follow into
* those further (ie, not recursive) */
void GarbageCollector::scan_object(Object* obj) {
Object* slot;
// If this object's refs are weak, then add it to the weak_refs
// vector and don't look at it otherwise.
if(obj->RefsAreWeak) {
if(!weak_refs) {
weak_refs = new ObjectArray(0);
}
weak_refs->push_back(obj);
return;
}
if(obj->klass() && obj->klass()->reference_p()) {
slot = saw_object(obj->klass());
if(slot) object_memory->set_class(obj, slot);
}
if(obj->ivars() && obj->ivars()->reference_p()) {
slot = saw_object(obj->ivars());
if(slot) obj->ivars(object_memory->state, slot);
}
TypeInfo* ti = object_memory->type_info[obj->obj_type];
assert(ti);
ObjectMark mark(this);
ti->mark(obj, mark);
}
示例3: walk_finalizers
void ImmixGC::walk_finalizers() {
FinalizerHandler* fh = object_memory_->finalizer_handler();
if(!fh) return;
for(FinalizerHandler::iterator i = fh->begin();
!i.end();
/* advance is handled in the loop */)
{
FinalizeObject& fi = i.current();
bool live = fi.object->marked_p(object_memory_->mark());
if(fi.ruby_finalizer) {
if(Object* fwd = saw_object(fi.ruby_finalizer)) {
fi.ruby_finalizer = fwd;
}
}
if(Object* fwd = saw_object(fi.object)) {
fi.object = fwd;
}
i.next(live);
}
}
示例4: saw_object
void ObjectWalker::seed(GCData& data) {
ObjectArray *current_rs = object_memory_->remember_set();
for(ObjectArray::iterator oi = current_rs->begin();
oi != current_rs->end();
++oi) {
Object* tmp = *oi;
// unremember_object throws a NULL in to remove an object
// so we don't have to compact the set in unremember
if(tmp) saw_object(tmp);
}
for(Roots::Iterator i(data.roots()); i.more(); i.advance()) {
saw_object(i->get());
}
if(data.threads()) {
for(std::list<ManagedThread*>::iterator i = data.threads()->begin();
i != data.threads()->end();
++i) {
scan(*i, false);
}
}
for(Allocator<capi::Handle>::Iterator i(data.handles()->allocator()); i.more(); i.advance()) {
saw_object(i->object());
}
}
示例5: guard
void ImmixGC::collect_scan(GCData* data) {
for(Roots::Iterator i(data->roots()); i.more(); i.advance()) {
if(Object* fwd = saw_object(i->get())) {
i->set(fwd);
}
}
{
utilities::thread::SpinLock::LockGuard guard(data->thread_nexus()->threads_lock());
for(ThreadList::iterator i = data->thread_nexus()->threads()->begin();
i != data->thread_nexus()->threads()->end();
++i)
{
scan(*i, false);
}
}
for(Allocator<capi::Handle>::Iterator i(data->handles()->allocator()); i.more(); i.advance()) {
if(i->in_use_p() && !i->weak_p()) {
if(Object* fwd = saw_object(i->object())) {
i->set_object(fwd);
}
}
}
std::list<capi::GlobalHandle*>* gh = data->global_handle_locations();
if(gh) {
for(std::list<capi::GlobalHandle*>::iterator i = gh->begin();
i != gh->end();
++i) {
capi::Handle** loc = (*i)->handle();
if(capi::Handle* hdl = *loc) {
if(!REFERENCE_P(hdl)) continue;
if(hdl->valid_p()) {
Object* obj = hdl->object();
if(obj && obj->reference_p()) {
if(Object* fwd = saw_object(obj)) {
hdl->set_object(fwd);
}
}
} else {
std::cerr << "Detected bad handle checking global capi handles\n";
}
}
}
}
/* TODO: JIT
if(LLVMState* ls = data->llvm_state()) ls->gc_scan(this);
*/
}
示例6: while
void MarkSweepGC::collect(Roots &roots, CallFrameLocationList& call_frames) {
Object* tmp;
Root* root = static_cast<Root*>(roots.head());
while(root) {
tmp = root->get();
if(tmp->reference_p()) {
saw_object(tmp);
}
root = static_cast<Root*>(root->next());
}
// Walk all the call frames
for(CallFrameLocationList::const_iterator i = call_frames.begin();
i != call_frames.end();
++i) {
CallFrame** loc = *i;
walk_call_frame(*loc);
}
while(!mark_stack_.empty()) {
tmp = mark_stack_.back();
mark_stack_.pop_back();
scan_object(tmp);
}
after_marked();
}
示例7: scanned_object
/**
* Scans the specified Object +obj+ for references to other Objects, and
* marks those Objects as reachable. Understands how to read the inside of
* an Object and find all references located within. For each reference
* found, it marks the object pointed to as live (which may trigger
* movement of the object in a copying garbage collector), but does not
* recursively scan into the referenced object (since such recursion could
* be arbitrarily deep, depending on the object graph, and this could cause
* the stack to blow up).
* /param obj The Object to be scanned for references to other Objects.
*/
void GarbageCollector::scan_object(Object* obj) {
#ifdef ENABLE_OBJECT_WATCH
if(watched_p(obj)) {
std::cout << "detected " << obj << " during scan_object.\n";
}
#endif
// We set scanned here before we finish scanning the object.
// This is done so we don't have a race condition while we're
// scanning the object and another thread updates a field during
// the phase where the object is partially scanned.
scanned_object(obj);
if(Object* klass = saw_object(obj->klass())) {
obj->klass(object_memory_, force_as<Class>(klass));
}
if(obj->ivars()->reference_p()) {
if(Object* ivars = saw_object(obj->ivars())) {
obj->ivars(object_memory_, ivars);
}
}
// Handle Tuple directly, because it's so common
if(Tuple* tup = try_as<Tuple>(obj)) {
native_int size = tup->num_fields();
for(native_int i = 0; i < size; i++) {
Object* slot = tup->field[i];
if(slot->reference_p()) {
if(Object* moved = saw_object(slot)) {
tup->field[i] = moved;
object_memory_->write_barrier(tup, moved);
}
}
}
} else {
TypeInfo* ti = object_memory_->type_info[obj->type_id()];
ObjectMark mark(this);
ti->mark(obj, mark);
}
}
示例8: scan
void GarbageCollector::scan(ManagedThread* thr, bool young_only) {
for(Roots::Iterator ri(thr->roots()); ri.more(); ri.advance()) {
ri->set(saw_object(ri->get()));
}
scan(thr->variable_root_buffers(), young_only);
scan(thr->root_buffers(), young_only);
if(VM* vm = thr->as_vm()) {
vm->gc_scan(this);
}
}
示例9: scan_object
void BakerGC::walk_finalizers() {
FinalizerHandler* fh = object_memory_->finalizer_handler();
if(!fh) return;
for(FinalizerHandler::iterator i = fh->begin();
!i.end();
/* advance is handled in the loop */)
{
FinalizeObject& fi = i.current();
bool live = true;
if(fi.object->young_object_p()) {
live = fi.object->forwarded_p();
if(Object* fwd = saw_object(fi.object)) {
fi.object = fwd;
}
} else {
// If this object is mature, scan it. This
// means that any young objects it refers to are properly
// GC'ed and kept alive if necessary
scan_object(fi.object);
}
Object* fin = fi.ruby_finalizer;
if(fin && fin->reference_p()) {
if(fin->young_object_p()) {
if(Object* fwd = saw_object(fin)) {
fi.ruby_finalizer = fwd;
}
} else {
// If this object is mature, scan it. This
// means that any young objects it refers to are properly
// GC'ed and kept alive if necessary
scan_object(fin);
}
}
i.next(live);
}
}
示例10: while
void MarkSweepGC::collect(Roots &roots) {
Object* tmp;
Root* root = static_cast<Root*>(roots.head());
while(root) {
tmp = root->get();
if(tmp->reference_p()) {
saw_object(tmp);
}
root = static_cast<Root*>(root->next());
}
// Cleanup all weakrefs seen
clean_weakrefs();
// Sweep up the garbage
sweep_objects();
}
示例11: saw_object
void ImmixGC::check_finalize() {
// If finalizers are running right now, just fixup any finalizer references
if(object_memory_->running_finalizers()) {
for(std::list<FinalizeObject>::iterator i = object_memory_->finalize().begin();
i != object_memory_->finalize().end();
++i) {
if(i->object) {
i->object = saw_object(i->object);
}
if(i->ruby_finalizer) {
i->ruby_finalizer = saw_object(i->ruby_finalizer);
}
}
return;
}
for(std::list<FinalizeObject>::iterator i = object_memory_->finalize().begin();
i != object_memory_->finalize().end(); )
{
FinalizeObject& fi = *i;
if(i->ruby_finalizer) {
i->ruby_finalizer = saw_object(i->ruby_finalizer);
}
bool remove = false;
switch(i->status) {
case FinalizeObject::eLive:
if(!i->object->marked_p(object_memory_->mark())) {
// Run C finalizers now rather that queue them.
if(i->finalizer) {
State state_obj(state());
(*i->finalizer)(&state_obj, i->object);
i->status = FinalizeObject::eFinalized;
remove = true;
} else {
i->queued();
object_memory_->add_to_finalize(&fi);
// We have to still keep it alive though until we finish with it.
i->object = saw_object(i->object);
}
} else {
// Update the reference
i->object = saw_object(i->object);
}
break;
case FinalizeObject::eQueued:
// Nothing, we haven't gotten to it yet.
// Keep waiting and keep i->object updated.
i->object = saw_object(i->object);
i->queue_count++;
break;
case FinalizeObject::eFinalized:
if(!i->object->marked_p(object_memory_->mark())) {
// finalized and done with.
remove = true;
} else {
// RESURRECTION!
i->queued();
i->object = saw_object(i->object);
}
break;
}
if(remove) {
i = object_memory_->finalize().erase(i);
} else {
++i;
}
}
}
示例12: saw_object
void ImmixGC::collect(GCData& data) {
Object* tmp;
gc_.clear_lines();
int via_handles_ = 0;
int via_roots = 0;
int via_stack = 0;
int callframes = 0;
for(Roots::Iterator i(data.roots()); i.more(); i.advance()) {
tmp = i->get();
if(tmp->reference_p()) saw_object(tmp);
via_roots++;
}
if(data.threads()) {
for(std::list<ManagedThread*>::iterator i = data.threads()->begin();
i != data.threads()->end();
i++) {
for(Roots::Iterator ri((*i)->roots()); ri.more(); ri.advance()) {
ri->set(saw_object(ri->get()));
}
}
}
for(capi::Handles::Iterator i(*data.handles()); i.more(); i.advance()) {
if(i->in_use_p() && !i->weak_p()) {
saw_object(i->object());
via_handles_++;
}
}
for(capi::Handles::Iterator i(*data.cached_handles()); i.more(); i.advance()) {
if(i->in_use_p() && !i->weak_p()) {
saw_object(i->object());
via_handles_++;
}
}
std::list<capi::Handle**>* gh = data.global_handle_locations();
if(gh) {
for(std::list<capi::Handle**>::iterator i = gh->begin();
i != gh->end();
i++) {
capi::Handle** loc = *i;
if(capi::Handle* hdl = *loc) {
if(!CAPI_REFERENCE_P(hdl)) continue;
if(hdl->valid_p()) {
Object* obj = hdl->object();
if(obj && obj->reference_p()) {
saw_object(obj);
via_handles_++;
}
} else {
std::cerr << "Detected bad handle checking global capi handles\n";
}
}
}
}
for(VariableRootBuffers::Iterator i(data.variable_buffers());
i.more(); i.advance()) {
Object*** buffer = i->buffer();
for(int idx = 0; idx < i->size(); idx++) {
Object** var = buffer[idx];
Object* tmp = *var;
via_stack++;
if(tmp->reference_p() && tmp->young_object_p()) {
saw_object(tmp);
}
}
}
// Walk all the call frames
for(CallFrameLocationList::const_iterator i = data.call_frames().begin();
i != data.call_frames().end();
i++) {
callframes++;
CallFrame** loc = *i;
walk_call_frame(*loc);
}
gc_.process_mark_stack(allocator_);
// We've now finished marking the entire object graph.
check_finalize();
// Finalize can cause more things to continue to live, so we must
// check the mark_stack again.
gc_.process_mark_stack(allocator_);
// Sweep up the garbage
gc_.sweep_blocks();
// This resets the allocator state to sync it up with the BlockAllocator
// properly.
//.........这里部分代码省略.........
示例13: mark_object
/**
* Marks the specified Object +obj+ as live.
*/
Object* mark_object(Object* obj) {
if(!obj || !obj->reference_p()) return obj;
Object* tmp = saw_object(obj);
if(tmp) return tmp;
return obj;
}
示例14: saw_object
void ObjectWalker::seed(GCData& data) {
Object* tmp;
ObjectArray *current_rs = object_memory_->remember_set();
for(ObjectArray::iterator oi = current_rs->begin();
oi != current_rs->end();
++oi) {
tmp = *oi;
// unremember_object throws a NULL in to remove an object
// so we don't have to compact the set in unremember
if(tmp) saw_object(tmp);
}
for(std::list<gc::WriteBarrier*>::iterator wbi = object_memory_->aux_barriers().begin();
wbi != object_memory_->aux_barriers().end();
++wbi) {
gc::WriteBarrier* wb = *wbi;
ObjectArray* rs = wb->remember_set();
for(ObjectArray::iterator oi = rs->begin();
oi != rs->end();
++oi) {
tmp = *oi;
if(tmp) saw_object(tmp);
}
}
for(Roots::Iterator i(data.roots()); i.more(); i.advance()) {
saw_object(i->get());
}
if(data.threads()) {
for(std::list<ManagedThread*>::iterator i = data.threads()->begin();
i != data.threads()->end();
++i) {
for(Roots::Iterator ri((*i)->roots()); ri.more(); ri.advance()) {
saw_object(ri->get());
}
}
}
for(capi::Handles::Iterator i(*data.handles()); i.more(); i.advance()) {
saw_object(i->object());
}
for(capi::Handles::Iterator i(*data.cached_handles()); i.more(); i.advance()) {
saw_object(i->object());
}
for(VariableRootBuffers::Iterator i(data.variable_buffers());
i.more(); i.advance()) {
Object*** buffer = i->buffer();
for(int idx = 0; idx < i->size(); idx++) {
Object** var = buffer[idx];
Object* tmp = *var;
saw_object(tmp);
}
}
RootBuffers* rb = data.root_buffers();
if(rb) {
for(RootBuffers::Iterator i(*rb);
i.more();
i.advance())
{
Object** buffer = i->buffer();
for(int idx = 0; idx < i->size(); idx++) {
saw_object(buffer[idx]);
}
}
}
// Walk all the call frames
for(CallFrameLocationList::iterator i = data.call_frames().begin();
i != data.call_frames().end();
++i) {
CallFrame** loc = *i;
walk_call_frame(*loc);
}
}
示例15: mprotect
/**
* Perform garbage collection on the young objects.
*/
void BakerGC::collect(GCData* data, YoungCollectStats* stats) {
#ifdef HAVE_VALGRIND_H
(void)VALGRIND_MAKE_MEM_DEFINED(next->start().as_int(), next->size());
(void)VALGRIND_MAKE_MEM_DEFINED(current->start().as_int(), current->size());
#endif
mprotect(next->start(), next->size(), PROT_READ | PROT_WRITE);
mprotect(current->start(), current->size(), PROT_READ | PROT_WRITE);
check_growth_start();
ObjectArray *current_rs = object_memory_->swap_remember_set();
total_objects = 0;
copy_spills_ = 0;
reset_promoted();
// Start by copying objects in the remember set
for(ObjectArray::iterator oi = current_rs->begin();
oi != current_rs->end();
++oi) {
Object* tmp = *oi;
// unremember_object throws a NULL in to remove an object
// so we don't have to compact the set in unremember
if(tmp) {
// Remove the Remember bit, since we're clearing the set.
tmp->clear_remember();
scan_object(tmp);
}
}
delete current_rs;
scan_mark_set();
scan_mature_mark_stack();
for(Roots::Iterator i(data->roots()); i.more(); i.advance()) {
i->set(saw_object(i->get()));
}
if(data->threads()) {
for(std::list<ManagedThread*>::iterator i = data->threads()->begin();
i != data->threads()->end();
++i) {
scan(*i, true);
}
}
for(Allocator<capi::Handle>::Iterator i(data->handles()->allocator()); i.more(); i.advance()) {
if(!i->in_use_p()) continue;
if(!i->weak_p() && i->object()->young_object_p()) {
i->set_object(saw_object(i->object()));
// Users manipulate values accessible from the data* within an
// RData without running a write barrier. Thusly if we see a mature
// rdata, we must always scan it because it could contain
// young pointers.
} else if(!i->object()->young_object_p() && i->is_rdata()) {
scan_object(i->object());
}
}
std::list<capi::GlobalHandle*>* gh = data->global_handle_locations();
if(gh) {
for(std::list<capi::GlobalHandle*>::iterator i = gh->begin();
i != gh->end();
++i) {
capi::GlobalHandle* global_handle = *i;
capi::Handle** loc = global_handle->handle();
if(capi::Handle* hdl = *loc) {
if(!REFERENCE_P(hdl)) continue;
if(hdl->valid_p()) {
Object* obj = hdl->object();
if(obj && obj->reference_p() && obj->young_object_p()) {
hdl->set_object(saw_object(obj));
}
} else {
std::cerr << "Detected bad handle checking global capi handles\n";
}
}
}
}
#ifdef ENABLE_LLVM
if(LLVMState* ls = data->llvm_state()) ls->gc_scan(this);
#endif
// Handle all promotions to non-young space that occurred.
handle_promotions();
assert(fully_scanned_p());
// We're now done seeing the entire object graph of normal, live references.
// Now we get to handle the unusual references, like finalizers and such.
//.........这里部分代码省略.........