Mercurial > hg > graal-compiler
diff src/share/vm/code/nmethod.cpp @ 20269:9717199cb8de
8047373: Clean the ExceptionCache in one pass
Summary: Also-reviewed-by: kim.barrett@oracle.com
Reviewed-by: jmasa, jwilhelm
author | stefank |
---|---|
date | Tue, 24 Jun 2014 17:09:48 +0200 |
parents | ce8f6bb717c9 |
children | 882004b9e7e1 |
line wrap: on
line diff
--- a/src/share/vm/code/nmethod.cpp Tue Jun 24 16:20:15 2014 +0200 +++ b/src/share/vm/code/nmethod.cpp Tue Jun 24 17:09:48 2014 +0200 @@ -384,27 +384,30 @@ set_exception_cache(new_entry); } -void nmethod::remove_from_exception_cache(ExceptionCache* ec) { +void nmethod::clean_exception_cache(BoolObjectClosure* is_alive) { ExceptionCache* prev = NULL; ExceptionCache* curr = exception_cache(); - assert(curr != NULL, "nothing to remove"); - // find the previous and next entry of ec - while (curr != ec) { - prev = curr; - curr = curr->next(); - assert(curr != NULL, "ExceptionCache not found"); + + while (curr != NULL) { + ExceptionCache* next = curr->next(); + + Klass* ex_klass = curr->exception_type(); + if (ex_klass != NULL && !ex_klass->is_loader_alive(is_alive)) { + if (prev == NULL) { + set_exception_cache(next); + } else { + prev->set_next(next); + } + delete curr; + // prev stays the same. + } else { + prev = curr; + } + + curr = next; } - // now: curr == ec - ExceptionCache* next = curr->next(); - if (prev == NULL) { - set_exception_cache(next); - } else { - prev->set_next(next); - } - delete curr; } - // public method for accessing the exception cache // These are the public access methods. address nmethod::handler_for_exception_and_pc(Handle exception, address pc) { @@ -1650,15 +1653,7 @@ } // Exception cache - ExceptionCache* ec = exception_cache(); - while (ec != NULL) { - Klass* ex_klass = ec->exception_type(); - ExceptionCache* next_ec = ec->next(); - if (ex_klass != NULL && !ex_klass->is_loader_alive(is_alive)) { - remove_from_exception_cache(ec); - } - ec = next_ec; - } + clean_exception_cache(is_alive); // If class unloading occurred we first iterate over all inline caches and // clear ICs where the cached oop is referring to an unloaded klass or method.