8042428: CompileQueue::free_all() code is incorrect
authoranoll
Tue, 06 May 2014 09:52:38 +0200
changeset 24346 46eee6f68757
parent 24344 9cd6465ec36c
child 24347 c657ae48974c
8042428: CompileQueue::free_all() code is incorrect Summary: Free task after getting next pointer of freelist. Reviewed-by: kvn, adlertz
hotspot/src/share/vm/compiler/compileBroker.cpp
--- a/hotspot/src/share/vm/compiler/compileBroker.cpp	Mon May 05 15:10:43 2014 +0200
+++ b/hotspot/src/share/vm/compiler/compileBroker.cpp	Tue May 06 09:52:38 2014 +0200
@@ -625,17 +625,27 @@
   lock()->notify_all();
 }
 
+/**
+ * Empties compilation queue by putting all compilation tasks onto
+ * a freelist. Furthermore, the method wakes up all threads that are
+ * waiting on a compilation task to finish. This can happen if background
+ * compilation is disabled.
+ */
 void CompileQueue::free_all() {
   MutexLocker mu(lock());
-  if (_first != NULL) {
-    for (CompileTask* task = _first; task != NULL; task = task->next()) {
-      // Wake up thread that blocks on the compile task.
-      task->lock()->notify();
-      // Puts task back on the freelist.
-      CompileTask::free(task);
-    }
-    _first = NULL;
+  CompileTask* next = _first;
+
+  // Iterate over all tasks in the compile queue
+  while (next != NULL) {
+    CompileTask* current = next;
+    next = current->next();
+    // Wake up thread that blocks on the compile task.
+    current->lock()->notify();
+    // Put the task back on the freelist.
+    CompileTask::free(current);
   }
+  _first = NULL;
+
   // Wake up all threads that block on the queue.
   lock()->notify_all();
 }