src/hotspot/share/gc/shenandoah/shenandoahSharedVariables.hpp
changeset 59247 56bf71d64d51
parent 54848 5d8c5c7bca95
child 59252 623722a6aeb9
equal deleted inserted replaced
59246:fcad92f425c5 59247:56bf71d64d51
    45   ShenandoahSharedFlag() {
    45   ShenandoahSharedFlag() {
    46     unset();
    46     unset();
    47   }
    47   }
    48 
    48 
    49   void set() {
    49   void set() {
    50     OrderAccess::release_store_fence(&value, (ShenandoahSharedValue)SET);
    50     Atomic::release_store_fence(&value, (ShenandoahSharedValue)SET);
    51   }
    51   }
    52 
    52 
    53   void unset() {
    53   void unset() {
    54     OrderAccess::release_store_fence(&value, (ShenandoahSharedValue)UNSET);
    54     Atomic::release_store_fence(&value, (ShenandoahSharedValue)UNSET);
    55   }
    55   }
    56 
    56 
    57   bool is_set() const {
    57   bool is_set() const {
    58     return OrderAccess::load_acquire(&value) == SET;
    58     return Atomic::load_acquire(&value) == SET;
    59   }
    59   }
    60 
    60 
    61   bool is_unset() const {
    61   bool is_unset() const {
    62     return OrderAccess::load_acquire(&value) == UNSET;
    62     return Atomic::load_acquire(&value) == UNSET;
    63   }
    63   }
    64 
    64 
    65   void set_cond(bool val) {
    65   void set_cond(bool val) {
    66     if (val) {
    66     if (val) {
    67       set();
    67       set();
   116 
   116 
   117   void set(uint mask) {
   117   void set(uint mask) {
   118     assert (mask < (sizeof(ShenandoahSharedValue) * CHAR_MAX), "sanity");
   118     assert (mask < (sizeof(ShenandoahSharedValue) * CHAR_MAX), "sanity");
   119     ShenandoahSharedValue mask_val = (ShenandoahSharedValue) mask;
   119     ShenandoahSharedValue mask_val = (ShenandoahSharedValue) mask;
   120     while (true) {
   120     while (true) {
   121       ShenandoahSharedValue ov = OrderAccess::load_acquire(&value);
   121       ShenandoahSharedValue ov = Atomic::load_acquire(&value);
   122       if ((ov & mask_val) != 0) {
   122       if ((ov & mask_val) != 0) {
   123         // already set
   123         // already set
   124         return;
   124         return;
   125       }
   125       }
   126 
   126 
   134 
   134 
   135   void unset(uint mask) {
   135   void unset(uint mask) {
   136     assert (mask < (sizeof(ShenandoahSharedValue) * CHAR_MAX), "sanity");
   136     assert (mask < (sizeof(ShenandoahSharedValue) * CHAR_MAX), "sanity");
   137     ShenandoahSharedValue mask_val = (ShenandoahSharedValue) mask;
   137     ShenandoahSharedValue mask_val = (ShenandoahSharedValue) mask;
   138     while (true) {
   138     while (true) {
   139       ShenandoahSharedValue ov = OrderAccess::load_acquire(&value);
   139       ShenandoahSharedValue ov = Atomic::load_acquire(&value);
   140       if ((ov & mask_val) == 0) {
   140       if ((ov & mask_val) == 0) {
   141         // already unset
   141         // already unset
   142         return;
   142         return;
   143       }
   143       }
   144 
   144 
   149       }
   149       }
   150     }
   150     }
   151   }
   151   }
   152 
   152 
   153   void clear() {
   153   void clear() {
   154     OrderAccess::release_store_fence(&value, (ShenandoahSharedValue)0);
   154     Atomic::release_store_fence(&value, (ShenandoahSharedValue)0);
   155   }
   155   }
   156 
   156 
   157   bool is_set(uint mask) const {
   157   bool is_set(uint mask) const {
   158     return !is_unset(mask);
   158     return !is_unset(mask);
   159   }
   159   }
   160 
   160 
   161   bool is_unset(uint mask) const {
   161   bool is_unset(uint mask) const {
   162     assert (mask < (sizeof(ShenandoahSharedValue) * CHAR_MAX), "sanity");
   162     assert (mask < (sizeof(ShenandoahSharedValue) * CHAR_MAX), "sanity");
   163     return (OrderAccess::load_acquire(&value) & (ShenandoahSharedValue) mask) == 0;
   163     return (Atomic::load_acquire(&value) & (ShenandoahSharedValue) mask) == 0;
   164   }
   164   }
   165 
   165 
   166   bool is_clear() const {
   166   bool is_clear() const {
   167     return (OrderAccess::load_acquire(&value)) == 0;
   167     return (Atomic::load_acquire(&value)) == 0;
   168   }
   168   }
   169 
   169 
   170   void set_cond(uint mask, bool val) {
   170   void set_cond(uint mask, bool val) {
   171     if (val) {
   171     if (val) {
   172       set(mask);
   172       set(mask);
   209   }
   209   }
   210 
   210 
   211   void set(T v) {
   211   void set(T v) {
   212     assert (v >= 0, "sanity");
   212     assert (v >= 0, "sanity");
   213     assert (v < (sizeof(ShenandoahSharedValue) * CHAR_MAX), "sanity");
   213     assert (v < (sizeof(ShenandoahSharedValue) * CHAR_MAX), "sanity");
   214     OrderAccess::release_store_fence(&value, (ShenandoahSharedValue)v);
   214     Atomic::release_store_fence(&value, (ShenandoahSharedValue)v);
   215   }
   215   }
   216 
   216 
   217   T get() const {
   217   T get() const {
   218     return (T)OrderAccess::load_acquire(&value);
   218     return (T)Atomic::load_acquire(&value);
   219   }
   219   }
   220 
   220 
   221   T cmpxchg(T new_value, T expected) {
   221   T cmpxchg(T new_value, T expected) {
   222     assert (new_value >= 0, "sanity");
   222     assert (new_value >= 0, "sanity");
   223     assert (new_value < (sizeof(ShenandoahSharedValue) * CHAR_MAX), "sanity");
   223     assert (new_value < (sizeof(ShenandoahSharedValue) * CHAR_MAX), "sanity");