< prev index next >

src/hotspot/share/gc/shenandoah/shenandoahSharedVariables.hpp

Print this page




  57   bool is_set() const {
  58     return Atomic::load_acquire(&value) == SET;
  59   }
  60 
  61   bool is_unset() const {
  62     return Atomic::load_acquire(&value) == UNSET;
  63   }
  64 
  65   void set_cond(bool val) {
  66     if (val) {
  67       set();
  68     } else {
  69       unset();
  70     }
  71   }
  72 
  73   bool try_set() {
  74     if (is_set()) {
  75       return false;
  76     }
  77     ShenandoahSharedValue old = Atomic::cmpxchg((ShenandoahSharedValue)SET, &value, (ShenandoahSharedValue)UNSET);
  78     return old == UNSET; // success
  79   }
  80 
  81   bool try_unset() {
  82     if (!is_set()) {
  83       return false;
  84     }
  85     ShenandoahSharedValue old = Atomic::cmpxchg((ShenandoahSharedValue)UNSET, &value, (ShenandoahSharedValue)SET);
  86     return old == SET; // success
  87   }
  88 
  89   volatile ShenandoahSharedValue* addr_of() {
  90     return &value;
  91   }
  92 
  93 private:
  94   volatile ShenandoahSharedValue* operator&() {
  95     fatal("Use addr_of() instead");
  96     return NULL;
  97   }
  98 
  99   bool operator==(ShenandoahSharedFlag& other) { fatal("Use is_set() instead"); return false; }
 100   bool operator!=(ShenandoahSharedFlag& other) { fatal("Use is_set() instead"); return false; }
 101   bool operator> (ShenandoahSharedFlag& other) { fatal("Use is_set() instead"); return false; }
 102   bool operator>=(ShenandoahSharedFlag& other) { fatal("Use is_set() instead"); return false; }
 103   bool operator< (ShenandoahSharedFlag& other) { fatal("Use is_set() instead"); return false; }
 104   bool operator<=(ShenandoahSharedFlag& other) { fatal("Use is_set() instead"); return false; }
 105 


 108 typedef struct ShenandoahSharedBitmap {
 109   DEFINE_PAD_MINUS_SIZE(0, DEFAULT_CACHE_LINE_SIZE, sizeof(volatile ShenandoahSharedValue));
 110   volatile ShenandoahSharedValue value;
 111   DEFINE_PAD_MINUS_SIZE(1, DEFAULT_CACHE_LINE_SIZE, 0);
 112 
 113   ShenandoahSharedBitmap() {
 114     clear();
 115   }
 116 
 117   void set(uint mask) {
 118     assert (mask < (sizeof(ShenandoahSharedValue) * CHAR_MAX), "sanity");
 119     ShenandoahSharedValue mask_val = (ShenandoahSharedValue) mask;
 120     while (true) {
 121       ShenandoahSharedValue ov = Atomic::load_acquire(&value);
 122       if ((ov & mask_val) != 0) {
 123         // already set
 124         return;
 125       }
 126 
 127       ShenandoahSharedValue nv = ov | mask_val;
 128       if (Atomic::cmpxchg(nv, &value, ov) == ov) {
 129         // successfully set
 130         return;
 131       }
 132     }
 133   }
 134 
 135   void unset(uint mask) {
 136     assert (mask < (sizeof(ShenandoahSharedValue) * CHAR_MAX), "sanity");
 137     ShenandoahSharedValue mask_val = (ShenandoahSharedValue) mask;
 138     while (true) {
 139       ShenandoahSharedValue ov = Atomic::load_acquire(&value);
 140       if ((ov & mask_val) == 0) {
 141         // already unset
 142         return;
 143       }
 144 
 145       ShenandoahSharedValue nv = ov & ~mask_val;
 146       if (Atomic::cmpxchg(nv, &value, ov) == ov) {
 147         // successfully unset
 148         return;
 149       }
 150     }
 151   }
 152 
 153   void clear() {
 154     Atomic::release_store_fence(&value, (ShenandoahSharedValue)0);
 155   }
 156 
 157   bool is_set(uint mask) const {
 158     return !is_unset(mask);
 159   }
 160 
 161   bool is_unset(uint mask) const {
 162     assert (mask < (sizeof(ShenandoahSharedValue) * CHAR_MAX), "sanity");
 163     return (Atomic::load_acquire(&value) & (ShenandoahSharedValue) mask) == 0;
 164   }
 165 
 166   bool is_clear() const {


 204   volatile ShenandoahSharedValue value;
 205   DEFINE_PAD_MINUS_SIZE(1, DEFAULT_CACHE_LINE_SIZE, 0);
 206 
 207   ShenandoahSharedEnumFlag() {
 208     value = 0;
 209   }
 210 
 211   void set(T v) {
 212     assert (v >= 0, "sanity");
 213     assert (v < (sizeof(ShenandoahSharedValue) * CHAR_MAX), "sanity");
 214     Atomic::release_store_fence(&value, (ShenandoahSharedValue)v);
 215   }
 216 
 217   T get() const {
 218     return (T)Atomic::load_acquire(&value);
 219   }
 220 
 221   T cmpxchg(T new_value, T expected) {
 222     assert (new_value >= 0, "sanity");
 223     assert (new_value < (sizeof(ShenandoahSharedValue) * CHAR_MAX), "sanity");
 224     return (T)Atomic::cmpxchg((ShenandoahSharedValue)new_value, &value, (ShenandoahSharedValue)expected);
 225   }
 226 
 227   volatile ShenandoahSharedValue* addr_of() {
 228     return &value;
 229   }
 230 
 231 private:
 232   volatile T* operator&() {
 233     fatal("Use addr_of() instead");
 234     return NULL;
 235   }
 236 
 237   bool operator==(ShenandoahSharedEnumFlag& other) { fatal("Use get() instead"); return false; }
 238   bool operator!=(ShenandoahSharedEnumFlag& other) { fatal("Use get() instead"); return false; }
 239   bool operator> (ShenandoahSharedEnumFlag& other) { fatal("Use get() instead"); return false; }
 240   bool operator>=(ShenandoahSharedEnumFlag& other) { fatal("Use get() instead"); return false; }
 241   bool operator< (ShenandoahSharedEnumFlag& other) { fatal("Use get() instead"); return false; }
 242   bool operator<=(ShenandoahSharedEnumFlag& other) { fatal("Use get() instead"); return false; }
 243 
 244 };


  57   bool is_set() const {
  58     return Atomic::load_acquire(&value) == SET;
  59   }
  60 
  61   bool is_unset() const {
  62     return Atomic::load_acquire(&value) == UNSET;
  63   }
  64 
  65   void set_cond(bool val) {
  66     if (val) {
  67       set();
  68     } else {
  69       unset();
  70     }
  71   }
  72 
  73   bool try_set() {
  74     if (is_set()) {
  75       return false;
  76     }
  77     ShenandoahSharedValue old = Atomic::cmpxchg(&value, (ShenandoahSharedValue)UNSET, (ShenandoahSharedValue)SET);
  78     return old == UNSET; // success
  79   }
  80 
  81   bool try_unset() {
  82     if (!is_set()) {
  83       return false;
  84     }
  85     ShenandoahSharedValue old = Atomic::cmpxchg(&value, (ShenandoahSharedValue)SET, (ShenandoahSharedValue)UNSET);
  86     return old == SET; // success
  87   }
  88 
  89   volatile ShenandoahSharedValue* addr_of() {
  90     return &value;
  91   }
  92 
  93 private:
  94   volatile ShenandoahSharedValue* operator&() {
  95     fatal("Use addr_of() instead");
  96     return NULL;
  97   }
  98 
  99   bool operator==(ShenandoahSharedFlag& other) { fatal("Use is_set() instead"); return false; }
 100   bool operator!=(ShenandoahSharedFlag& other) { fatal("Use is_set() instead"); return false; }
 101   bool operator> (ShenandoahSharedFlag& other) { fatal("Use is_set() instead"); return false; }
 102   bool operator>=(ShenandoahSharedFlag& other) { fatal("Use is_set() instead"); return false; }
 103   bool operator< (ShenandoahSharedFlag& other) { fatal("Use is_set() instead"); return false; }
 104   bool operator<=(ShenandoahSharedFlag& other) { fatal("Use is_set() instead"); return false; }
 105 


 108 typedef struct ShenandoahSharedBitmap {
 109   DEFINE_PAD_MINUS_SIZE(0, DEFAULT_CACHE_LINE_SIZE, sizeof(volatile ShenandoahSharedValue));
 110   volatile ShenandoahSharedValue value;
 111   DEFINE_PAD_MINUS_SIZE(1, DEFAULT_CACHE_LINE_SIZE, 0);
 112 
 113   ShenandoahSharedBitmap() {
 114     clear();
 115   }
 116 
 117   void set(uint mask) {
 118     assert (mask < (sizeof(ShenandoahSharedValue) * CHAR_MAX), "sanity");
 119     ShenandoahSharedValue mask_val = (ShenandoahSharedValue) mask;
 120     while (true) {
 121       ShenandoahSharedValue ov = Atomic::load_acquire(&value);
 122       if ((ov & mask_val) != 0) {
 123         // already set
 124         return;
 125       }
 126 
 127       ShenandoahSharedValue nv = ov | mask_val;
 128       if (Atomic::cmpxchg(&value, ov, nv) == ov) {
 129         // successfully set
 130         return;
 131       }
 132     }
 133   }
 134 
 135   void unset(uint mask) {
 136     assert (mask < (sizeof(ShenandoahSharedValue) * CHAR_MAX), "sanity");
 137     ShenandoahSharedValue mask_val = (ShenandoahSharedValue) mask;
 138     while (true) {
 139       ShenandoahSharedValue ov = Atomic::load_acquire(&value);
 140       if ((ov & mask_val) == 0) {
 141         // already unset
 142         return;
 143       }
 144 
 145       ShenandoahSharedValue nv = ov & ~mask_val;
 146       if (Atomic::cmpxchg(&value, ov, nv) == ov) {
 147         // successfully unset
 148         return;
 149       }
 150     }
 151   }
 152 
 153   void clear() {
 154     Atomic::release_store_fence(&value, (ShenandoahSharedValue)0);
 155   }
 156 
 157   bool is_set(uint mask) const {
 158     return !is_unset(mask);
 159   }
 160 
 161   bool is_unset(uint mask) const {
 162     assert (mask < (sizeof(ShenandoahSharedValue) * CHAR_MAX), "sanity");
 163     return (Atomic::load_acquire(&value) & (ShenandoahSharedValue) mask) == 0;
 164   }
 165 
 166   bool is_clear() const {


 204   volatile ShenandoahSharedValue value;
 205   DEFINE_PAD_MINUS_SIZE(1, DEFAULT_CACHE_LINE_SIZE, 0);
 206 
 207   ShenandoahSharedEnumFlag() {
 208     value = 0;
 209   }
 210 
 211   void set(T v) {
 212     assert (v >= 0, "sanity");
 213     assert (v < (sizeof(ShenandoahSharedValue) * CHAR_MAX), "sanity");
 214     Atomic::release_store_fence(&value, (ShenandoahSharedValue)v);
 215   }
 216 
 217   T get() const {
 218     return (T)Atomic::load_acquire(&value);
 219   }
 220 
 221   T cmpxchg(T new_value, T expected) {
 222     assert (new_value >= 0, "sanity");
 223     assert (new_value < (sizeof(ShenandoahSharedValue) * CHAR_MAX), "sanity");
 224     return (T)Atomic::cmpxchg(&value, (ShenandoahSharedValue)expected, (ShenandoahSharedValue)new_value);
 225   }
 226 
 227   volatile ShenandoahSharedValue* addr_of() {
 228     return &value;
 229   }
 230 
 231 private:
 232   volatile T* operator&() {
 233     fatal("Use addr_of() instead");
 234     return NULL;
 235   }
 236 
 237   bool operator==(ShenandoahSharedEnumFlag& other) { fatal("Use get() instead"); return false; }
 238   bool operator!=(ShenandoahSharedEnumFlag& other) { fatal("Use get() instead"); return false; }
 239   bool operator> (ShenandoahSharedEnumFlag& other) { fatal("Use get() instead"); return false; }
 240   bool operator>=(ShenandoahSharedEnumFlag& other) { fatal("Use get() instead"); return false; }
 241   bool operator< (ShenandoahSharedEnumFlag& other) { fatal("Use get() instead"); return false; }
 242   bool operator<=(ShenandoahSharedEnumFlag& other) { fatal("Use get() instead"); return false; }
 243 
 244 };
< prev index next >