src/hotspot/share/gc/z/zPageAllocator.cpp
changeset 50582 6464882498b5
parent 50581 0cc4711c2112
child 50875 2217b2fc29ea
--- a/src/hotspot/share/gc/z/zPageAllocator.cpp	Fri Jun 15 13:31:20 2018 +0200
+++ b/src/hotspot/share/gc/z/zPageAllocator.cpp	Fri Jun 15 13:31:27 2018 +0200
@@ -459,24 +459,25 @@
   satisfy_alloc_queue();
 }
 
+bool ZPageAllocator::is_alloc_stalled() const {
+  assert(SafepointSynchronize::is_at_safepoint(), "Should be at safepoint");
+  return !_queue.is_empty();
+}
+
 void ZPageAllocator::check_out_of_memory() {
   ZLocker locker(&_lock);
 
-  ZPageAllocRequest* const first = _queue.first();
-  if (first == NULL) {
-    // Allocation queue is empty
-    return;
-  }
-
-  // Fail the allocation request if it was enqueued before the
+  // Fail allocation requests that were enqueued before the
   // last GC cycle started, otherwise start a new GC cycle.
-  if (first->total_collections() < ZCollectedHeap::heap()->total_collections()) {
-    // Out of memory, fail all enqueued requests
-    for (ZPageAllocRequest* request = _queue.remove_first(); request != NULL; request = _queue.remove_first()) {
-      request->satisfy(NULL);
+  for (ZPageAllocRequest* request = _queue.first(); request != NULL; request = _queue.first()) {
+    if (request->total_collections() == ZCollectedHeap::heap()->total_collections()) {
+      // Start a new GC cycle, keep allocation requests enqueued
+      request->satisfy(gc_marker);
+      return;
     }
-  } else {
-    // Start another GC cycle, keep all enqueued requests
-    first->satisfy(gc_marker);
+
+    // Out of memory, fail allocation request
+    _queue.remove_first();
+    request->satisfy(NULL);
   }
 }