src/hotspot/share/gc/shenandoah/shenandoahSharedVariables.hpp
changeset 59252 623722a6aeb9
parent 59247 56bf71d64d51
child 59290 97d13893ec3c
equal deleted inserted replaced
59251:4cbfa5077d68 59252:623722a6aeb9
    72 
    72 
    73   bool try_set() {
    73   bool try_set() {
    74     if (is_set()) {
    74     if (is_set()) {
    75       return false;
    75       return false;
    76     }
    76     }
    77     ShenandoahSharedValue old = Atomic::cmpxchg((ShenandoahSharedValue)SET, &value, (ShenandoahSharedValue)UNSET);
    77     ShenandoahSharedValue old = Atomic::cmpxchg(&value, (ShenandoahSharedValue)UNSET, (ShenandoahSharedValue)SET);
    78     return old == UNSET; // success
    78     return old == UNSET; // success
    79   }
    79   }
    80 
    80 
    81   bool try_unset() {
    81   bool try_unset() {
    82     if (!is_set()) {
    82     if (!is_set()) {
    83       return false;
    83       return false;
    84     }
    84     }
    85     ShenandoahSharedValue old = Atomic::cmpxchg((ShenandoahSharedValue)UNSET, &value, (ShenandoahSharedValue)SET);
    85     ShenandoahSharedValue old = Atomic::cmpxchg(&value, (ShenandoahSharedValue)SET, (ShenandoahSharedValue)UNSET);
    86     return old == SET; // success
    86     return old == SET; // success
    87   }
    87   }
    88 
    88 
    89   volatile ShenandoahSharedValue* addr_of() {
    89   volatile ShenandoahSharedValue* addr_of() {
    90     return &value;
    90     return &value;
   123         // already set
   123         // already set
   124         return;
   124         return;
   125       }
   125       }
   126 
   126 
   127       ShenandoahSharedValue nv = ov | mask_val;
   127       ShenandoahSharedValue nv = ov | mask_val;
   128       if (Atomic::cmpxchg(nv, &value, ov) == ov) {
   128       if (Atomic::cmpxchg(&value, ov, nv) == ov) {
   129         // successfully set
   129         // successfully set
   130         return;
   130         return;
   131       }
   131       }
   132     }
   132     }
   133   }
   133   }
   141         // already unset
   141         // already unset
   142         return;
   142         return;
   143       }
   143       }
   144 
   144 
   145       ShenandoahSharedValue nv = ov & ~mask_val;
   145       ShenandoahSharedValue nv = ov & ~mask_val;
   146       if (Atomic::cmpxchg(nv, &value, ov) == ov) {
   146       if (Atomic::cmpxchg(&value, ov, nv) == ov) {
   147         // successfully unset
   147         // successfully unset
   148         return;
   148         return;
   149       }
   149       }
   150     }
   150     }
   151   }
   151   }
   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");
   224     return (T)Atomic::cmpxchg((ShenandoahSharedValue)new_value, &value, (ShenandoahSharedValue)expected);
   224     return (T)Atomic::cmpxchg(&value, (ShenandoahSharedValue)expected, (ShenandoahSharedValue)new_value);
   225   }
   225   }
   226 
   226 
   227   volatile ShenandoahSharedValue* addr_of() {
   227   volatile ShenandoahSharedValue* addr_of() {
   228     return &value;
   228     return &value;
   229   }
   229   }