void GlobalCache::prune_unmarked(unsigned int mark) { for(size_t i = 0; i < CPU_CACHE_SIZE; i++) { CacheEntry* entry = &entries[i]; Object* klass = entry->klass; if(!klass) continue; Object* mod = entry->module; Object* exec = entry->method; if(!klass->marked_p(mark) || !mod->marked_p(mark) || !exec->marked_p(mark)) { entry_names[i] = NULL; entry->clear(); } } }
void GlobalCache::prune_young() { for(size_t i = 0; i < CPU_CACHE_SIZE; i++) { CacheEntry* entry = &entries[i]; bool clear = false; Object* klass = entry->klass; if(!klass) continue; if(klass->young_object_p()) { if(klass->forwarded_p()) { Module* fwd = force_as<Module>(klass->forward()); entry->klass = fwd; } else { clear = true; } } Object* mod = entry->module; if(mod->young_object_p()) { if(mod->forwarded_p()) { entry->module = force_as<Module>(mod->forward()); } else { clear = true; } } Object* exec = entry->method; if(exec->young_object_p()) { if(exec->forwarded_p()) { entry->method = force_as<Executable>(exec->forward()); } else { clear = true; } } if(clear) { entry_names[i] = NULL; entry->clear(); } } }