Mercurial > hg > graal-jvmci-8
diff src/share/vm/gc_implementation/parallelScavenge/gcTaskThread.cpp @ 4132:6d7d0790074d
7119584: UseParallelGC barrier task can be overwritten.
Summary: Provoke a GC for a metadata allocation failure.
Reviewed-by: johnc, iveresov
author | jmasa |
---|---|
date | Fri, 09 Dec 2011 19:28:34 -0800 |
parents | bca17e38de00 |
children | d2a62e0f25eb |
line wrap: on
line diff
--- a/src/share/vm/gc_implementation/parallelScavenge/gcTaskThread.cpp Fri Dec 09 06:46:57 2011 -0800 +++ b/src/share/vm/gc_implementation/parallelScavenge/gcTaskThread.cpp Fri Dec 09 19:28:34 2011 -0800 @@ -1,6 +1,6 @@ /* - * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -129,6 +129,8 @@ for (; /* break */; ) { // This will block until there is a task to be gotten. GCTask* task = manager()->get_task(which()); + // Record if this is an idle task for later use. + bool is_idle_task = task->is_idle_task(); // In case the update is costly if (PrintGCTaskTimeStamps) { timer.update(); @@ -137,9 +139,13 @@ jlong entry_time = timer.ticks(); char* name = task->name(); + // If this is the barrier task, it can be destroyed + // by the GC task manager once the do_it() executes. task->do_it(manager(), which()); - if (!task->is_idle_task()) { + // Use the saved value of is_idle_task because references + // using "task" are not reliable for the barrier task. + if (!is_idle_task) { manager()->note_completion(which()); if (PrintGCTaskTimeStamps) {