< prev index next >

src/share/vm/utilities/bitMap.inline.hpp

Print this page
rev 13431 : imported patch remove_cmpxchg_ptr_users


  32   verify_index(bit);
  33   *word_addr(bit) |= bit_mask(bit);
  34 }
  35 
  36 inline void BitMap::clear_bit(idx_t bit) {
  37   verify_index(bit);
  38   *word_addr(bit) &= ~bit_mask(bit);
  39 }
  40 
  41 inline bool BitMap::par_set_bit(idx_t bit) {
  42   verify_index(bit);
  43   volatile bm_word_t* const addr = word_addr(bit);
  44   const bm_word_t mask = bit_mask(bit);
  45   bm_word_t old_val = *addr;
  46 
  47   do {
  48     const bm_word_t new_val = old_val | mask;
  49     if (new_val == old_val) {
  50       return false;     // Someone else beat us to it.
  51     }
  52     const bm_word_t cur_val = (bm_word_t) Atomic::cmpxchg_ptr((void*) new_val,
  53                                                       (volatile void*) addr,
  54                                                       (void*) old_val);
  55     if (cur_val == old_val) {
  56       return true;      // Success.
  57     }
  58     old_val = cur_val;  // The value changed, try again.
  59   } while (true);
  60 }
  61 
  62 inline bool BitMap::par_clear_bit(idx_t bit) {
  63   verify_index(bit);
  64   volatile bm_word_t* const addr = word_addr(bit);
  65   const bm_word_t mask = ~bit_mask(bit);
  66   bm_word_t old_val = *addr;
  67 
  68   do {
  69     const bm_word_t new_val = old_val & mask;
  70     if (new_val == old_val) {
  71       return false;     // Someone else beat us to it.
  72     }
  73     const bm_word_t cur_val = (bm_word_t) Atomic::cmpxchg_ptr((void*) new_val,
  74                                                       (volatile void*) addr,
  75                                                       (void*) old_val);
  76     if (cur_val == old_val) {
  77       return true;      // Success.
  78     }
  79     old_val = cur_val;  // The value changed, try again.
  80   } while (true);
  81 }
  82 
  83 inline void BitMap::set_range(idx_t beg, idx_t end, RangeSizeHint hint) {
  84   if (hint == small_range && end - beg == 1) {
  85     set_bit(beg);
  86   } else {
  87     if (hint == large_range) {
  88       set_large_range(beg, end);
  89     } else {
  90       set_range(beg, end);
  91     }
  92   }
  93 }
  94 
  95 inline void BitMap::clear_range(idx_t beg, idx_t end, RangeSizeHint hint) {




  32   verify_index(bit);
  33   *word_addr(bit) |= bit_mask(bit);
  34 }
  35 
  36 inline void BitMap::clear_bit(idx_t bit) {
  37   verify_index(bit);
  38   *word_addr(bit) &= ~bit_mask(bit);
  39 }
  40 
  41 inline bool BitMap::par_set_bit(idx_t bit) {
  42   verify_index(bit);
  43   volatile bm_word_t* const addr = word_addr(bit);
  44   const bm_word_t mask = bit_mask(bit);
  45   bm_word_t old_val = *addr;
  46 
  47   do {
  48     const bm_word_t new_val = old_val | mask;
  49     if (new_val == old_val) {
  50       return false;     // Someone else beat us to it.
  51     }
  52     const bm_word_t cur_val = Atomic::cmpxchg(new_val, addr, old_val);


  53     if (cur_val == old_val) {
  54       return true;      // Success.
  55     }
  56     old_val = cur_val;  // The value changed, try again.
  57   } while (true);
  58 }
  59 
  60 inline bool BitMap::par_clear_bit(idx_t bit) {
  61   verify_index(bit);
  62   volatile bm_word_t* const addr = word_addr(bit);
  63   const bm_word_t mask = ~bit_mask(bit);
  64   bm_word_t old_val = *addr;
  65 
  66   do {
  67     const bm_word_t new_val = old_val & mask;
  68     if (new_val == old_val) {
  69       return false;     // Someone else beat us to it.
  70     }
  71     const bm_word_t cur_val = Atomic::cmpxchg(new_val, addr, old_val);


  72     if (cur_val == old_val) {
  73       return true;      // Success.
  74     }
  75     old_val = cur_val;  // The value changed, try again.
  76   } while (true);
  77 }
  78 
  79 inline void BitMap::set_range(idx_t beg, idx_t end, RangeSizeHint hint) {
  80   if (hint == small_range && end - beg == 1) {
  81     set_bit(beg);
  82   } else {
  83     if (hint == large_range) {
  84       set_large_range(beg, end);
  85     } else {
  86       set_range(beg, end);
  87     }
  88   }
  89 }
  90 
  91 inline void BitMap::clear_range(idx_t beg, idx_t end, RangeSizeHint hint) {


< prev index next >