< prev index next >

src/hotspot/share/gc/shenandoah/shenandoahStackWatermark.cpp

Print this page
*** 1,8 ***
--- 1,9 ---
  /*
   * Copyright (c) 2021, Red Hat, Inc. All rights reserved.
   * Copyright (c) 2020, 2023, Oracle and/or its affiliates. All rights reserved.
+  * Copyright Amazon.com Inc. 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
   * under the terms of the GNU General Public License version 2 only, as
   * published by the Free Software Foundation.

*** 73,15 ***
             _heap->is_concurrent_mark_in_progress(),
             "Only these two phases");
      assert(Thread::current()->is_Worker_thread(), "Unexpected thread passing in context: " PTR_FORMAT, p2i(context));
      return reinterpret_cast<OopClosure*>(context);
    } else {
!     if (_heap->is_concurrent_mark_in_progress()) {
-       return &_keep_alive_cl;
-     } else if (_heap->is_concurrent_weak_root_in_progress()) {
        assert(_heap->is_evacuation_in_progress(), "Nothing to evacuate");
        return &_evac_update_oop_cl;
      } else {
        ShouldNotReachHere();
        return nullptr;
      }
    }
--- 74,15 ---
             _heap->is_concurrent_mark_in_progress(),
             "Only these two phases");
      assert(Thread::current()->is_Worker_thread(), "Unexpected thread passing in context: " PTR_FORMAT, p2i(context));
      return reinterpret_cast<OopClosure*>(context);
    } else {
!     if (_heap->is_concurrent_weak_root_in_progress()) {
        assert(_heap->is_evacuation_in_progress(), "Nothing to evacuate");
        return &_evac_update_oop_cl;
+     } else if (_heap->is_concurrent_mark_in_progress()) {
+       return &_keep_alive_cl;
      } else {
        ShouldNotReachHere();
        return nullptr;
      }
    }

*** 90,26 ***
  void ShenandoahStackWatermark::start_processing_impl(void* context) {
    NoSafepointVerifier nsv;
    ShenandoahHeap* const heap = ShenandoahHeap::heap();
  
    // Process the non-frame part of the thread
!   if (heap->is_concurrent_mark_in_progress()) {
-     // We need to reset all TLABs because they might be below the TAMS, and we need to mark
-     // the objects in them. Do not let mutators allocate any new objects in their current TLABs.
-     // It is also a good place to resize the TLAB sizes for future allocations.
-     retire_tlab();
- 
-     _jt->oops_do_no_frames(closure_from_context(context), &_cb_cl);
-   } else if (heap->is_concurrent_weak_root_in_progress()) {
      assert(heap->is_evacuation_in_progress(), "Should not be armed");
      // Retire the TLABs, which will force threads to reacquire their TLABs.
      // This is needed for two reasons. Strong one: new allocations would be with new freeset,
      // which would be outside the collection set, so no cset writes would happen there.
      // Weaker one: new allocations would happen past update watermark, and so less work would
      // be needed for reference updates (would update the large filler instead).
      retire_tlab();
  
      _jt->oops_do_no_frames(closure_from_context(context), &_cb_cl);
    } else {
      ShouldNotReachHere();
    }
  
--- 91,26 ---
  void ShenandoahStackWatermark::start_processing_impl(void* context) {
    NoSafepointVerifier nsv;
    ShenandoahHeap* const heap = ShenandoahHeap::heap();
  
    // Process the non-frame part of the thread
!   if (heap->is_concurrent_weak_root_in_progress()) {
      assert(heap->is_evacuation_in_progress(), "Should not be armed");
      // Retire the TLABs, which will force threads to reacquire their TLABs.
      // This is needed for two reasons. Strong one: new allocations would be with new freeset,
      // which would be outside the collection set, so no cset writes would happen there.
      // Weaker one: new allocations would happen past update watermark, and so less work would
      // be needed for reference updates (would update the large filler instead).
      retire_tlab();
  
+     _jt->oops_do_no_frames(closure_from_context(context), &_cb_cl);
+   } else if (heap->is_concurrent_mark_in_progress()) {
+     // We need to reset all TLABs because they might be below the TAMS, and we need to mark
+     // the objects in them. Do not let mutators allocate any new objects in their current TLABs.
+     // It is also a good place to resize the TLAB sizes for future allocations.
+     retire_tlab();
+ 
      _jt->oops_do_no_frames(closure_from_context(context), &_cb_cl);
    } else {
      ShouldNotReachHere();
    }
  
< prev index next >