src/hotspot/share/code/nmethod.cpp
changeset 59252 623722a6aeb9
parent 59251 4cbfa5077d68
equal deleted inserted replaced
59251:4cbfa5077d68 59252:623722a6aeb9
  1148     signed char old_state = Atomic::load(&_state);
  1148     signed char old_state = Atomic::load(&_state);
  1149     if (old_state >= new_state) {
  1149     if (old_state >= new_state) {
  1150       // Ensure monotonicity of transitions.
  1150       // Ensure monotonicity of transitions.
  1151       return false;
  1151       return false;
  1152     }
  1152     }
  1153     if (Atomic::cmpxchg(new_state, &_state, old_state) == old_state) {
  1153     if (Atomic::cmpxchg(&_state, old_state, new_state) == old_state) {
  1154       return true;
  1154       return true;
  1155     }
  1155     }
  1156   }
  1156   }
  1157 }
  1157 }
  1158 
  1158 
  1847 
  1847 
  1848 bool nmethod::oops_do_try_claim_weak_request() {
  1848 bool nmethod::oops_do_try_claim_weak_request() {
  1849   assert(SafepointSynchronize::is_at_safepoint(), "only at safepoint");
  1849   assert(SafepointSynchronize::is_at_safepoint(), "only at safepoint");
  1850 
  1850 
  1851   if ((_oops_do_mark_link == NULL) &&
  1851   if ((_oops_do_mark_link == NULL) &&
  1852       (Atomic::replace_if_null(mark_link(this, claim_weak_request_tag), &_oops_do_mark_link))) {
  1852       (Atomic::replace_if_null(&_oops_do_mark_link, mark_link(this, claim_weak_request_tag)))) {
  1853     oops_do_log_change("oops_do, mark weak request");
  1853     oops_do_log_change("oops_do, mark weak request");
  1854     return true;
  1854     return true;
  1855   }
  1855   }
  1856   return false;
  1856   return false;
  1857 }
  1857 }
  1861 }
  1861 }
  1862 
  1862 
  1863 nmethod::oops_do_mark_link* nmethod::oops_do_try_claim_strong_done() {
  1863 nmethod::oops_do_mark_link* nmethod::oops_do_try_claim_strong_done() {
  1864   assert(SafepointSynchronize::is_at_safepoint(), "only at safepoint");
  1864   assert(SafepointSynchronize::is_at_safepoint(), "only at safepoint");
  1865 
  1865 
  1866   oops_do_mark_link* old_next = Atomic::cmpxchg(mark_link(this, claim_strong_done_tag), &_oops_do_mark_link, mark_link(NULL, claim_weak_request_tag));
  1866   oops_do_mark_link* old_next = Atomic::cmpxchg(&_oops_do_mark_link, mark_link(NULL, claim_weak_request_tag), mark_link(this, claim_strong_done_tag));
  1867   if (old_next == NULL) {
  1867   if (old_next == NULL) {
  1868     oops_do_log_change("oops_do, mark strong done");
  1868     oops_do_log_change("oops_do, mark strong done");
  1869   }
  1869   }
  1870   return old_next;
  1870   return old_next;
  1871 }
  1871 }
  1872 
  1872 
  1873 nmethod::oops_do_mark_link* nmethod::oops_do_try_add_strong_request(nmethod::oops_do_mark_link* next) {
  1873 nmethod::oops_do_mark_link* nmethod::oops_do_try_add_strong_request(nmethod::oops_do_mark_link* next) {
  1874   assert(SafepointSynchronize::is_at_safepoint(), "only at safepoint");
  1874   assert(SafepointSynchronize::is_at_safepoint(), "only at safepoint");
  1875   assert(next == mark_link(this, claim_weak_request_tag), "Should be claimed as weak");
  1875   assert(next == mark_link(this, claim_weak_request_tag), "Should be claimed as weak");
  1876 
  1876 
  1877   oops_do_mark_link* old_next = Atomic::cmpxchg(mark_link(this, claim_strong_request_tag), &_oops_do_mark_link, next);
  1877   oops_do_mark_link* old_next = Atomic::cmpxchg(&_oops_do_mark_link, next, mark_link(this, claim_strong_request_tag));
  1878   if (old_next == next) {
  1878   if (old_next == next) {
  1879     oops_do_log_change("oops_do, mark strong request");
  1879     oops_do_log_change("oops_do, mark strong request");
  1880   }
  1880   }
  1881   return old_next;
  1881   return old_next;
  1882 }
  1882 }
  1883 
  1883 
  1884 bool nmethod::oops_do_try_claim_weak_done_as_strong_done(nmethod::oops_do_mark_link* next) {
  1884 bool nmethod::oops_do_try_claim_weak_done_as_strong_done(nmethod::oops_do_mark_link* next) {
  1885   assert(SafepointSynchronize::is_at_safepoint(), "only at safepoint");
  1885   assert(SafepointSynchronize::is_at_safepoint(), "only at safepoint");
  1886   assert(extract_state(next) == claim_weak_done_tag, "Should be claimed as weak done");
  1886   assert(extract_state(next) == claim_weak_done_tag, "Should be claimed as weak done");
  1887 
  1887 
  1888   oops_do_mark_link* old_next = Atomic::cmpxchg(mark_link(extract_nmethod(next), claim_strong_done_tag), &_oops_do_mark_link, next);
  1888   oops_do_mark_link* old_next = Atomic::cmpxchg(&_oops_do_mark_link, next, mark_link(extract_nmethod(next), claim_strong_done_tag));
  1889   if (old_next == next) {
  1889   if (old_next == next) {
  1890     oops_do_log_change("oops_do, mark weak done -> mark strong done");
  1890     oops_do_log_change("oops_do, mark weak done -> mark strong done");
  1891     return true;
  1891     return true;
  1892   }
  1892   }
  1893   return false;
  1893   return false;
  1904   // Self-loop if needed.
  1904   // Self-loop if needed.
  1905   if (old_head == NULL) {
  1905   if (old_head == NULL) {
  1906     old_head = this;
  1906     old_head = this;
  1907   }
  1907   }
  1908   // Try to install end of list and weak done tag.
  1908   // Try to install end of list and weak done tag.
  1909   if (Atomic::cmpxchg(mark_link(old_head, claim_weak_done_tag), &_oops_do_mark_link, mark_link(this, claim_weak_request_tag)) == mark_link(this, claim_weak_request_tag)) {
  1909   if (Atomic::cmpxchg(&_oops_do_mark_link, mark_link(this, claim_weak_request_tag), mark_link(old_head, claim_weak_done_tag)) == mark_link(this, claim_weak_request_tag)) {
  1910     oops_do_log_change("oops_do, mark weak done");
  1910     oops_do_log_change("oops_do, mark weak done");
  1911     return NULL;
  1911     return NULL;
  1912   } else {
  1912   } else {
  1913     return old_head;
  1913     return old_head;
  1914   }
  1914   }