< prev index next >

src/hotspot/share/code/nmethod.cpp

Print this page




1883 
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");
1886   assert(extract_state(next) == claim_weak_done_tag, "Should be claimed as weak done");
1887 
1888   oops_do_mark_link* old_next = Atomic::cmpxchg(mark_link(extract_nmethod(next), claim_strong_done_tag), &_oops_do_mark_link, next);
1889   if (old_next == next) {
1890     oops_do_log_change("oops_do, mark weak done -> mark strong done");
1891     return true;
1892   }
1893   return false;
1894 }
1895 
1896 nmethod* nmethod::oops_do_try_add_to_list_as_weak_done() {
1897   assert(SafepointSynchronize::is_at_safepoint(), "only at safepoint");
1898 
1899   assert(extract_state(_oops_do_mark_link) == claim_weak_request_tag ||
1900          extract_state(_oops_do_mark_link) == claim_strong_request_tag,
1901          "must be but is nmethod " PTR_FORMAT " %u", p2i(extract_nmethod(_oops_do_mark_link)), extract_state(_oops_do_mark_link));
1902 
1903   nmethod* old_head = Atomic::xchg(this, &_oops_do_mark_nmethods);
1904   // Self-loop if needed.
1905   if (old_head == NULL) {
1906     old_head = this;
1907   }
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)) {
1910     oops_do_log_change("oops_do, mark weak done");
1911     return NULL;
1912   } else {
1913     return old_head;
1914   }
1915 }
1916 
1917 void nmethod::oops_do_add_to_list_as_strong_done() {
1918   assert(SafepointSynchronize::is_at_safepoint(), "only at safepoint");
1919 
1920   nmethod* old_head = Atomic::xchg(this, &_oops_do_mark_nmethods);
1921   // Self-loop if needed.
1922   if (old_head == NULL) {
1923     old_head = this;
1924   }
1925   assert(_oops_do_mark_link == mark_link(this, claim_strong_done_tag), "must be but is nmethod " PTR_FORMAT " state %u",
1926          p2i(extract_nmethod(_oops_do_mark_link)), extract_state(_oops_do_mark_link));
1927 
1928   oops_do_set_strong_done(old_head);
1929 }
1930 
1931 void nmethod::oops_do_process_weak(OopsDoProcessor* p) {
1932   if (!oops_do_try_claim_weak_request()) {
1933     // Failed to claim for weak processing.
1934     oops_do_log_change("oops_do, mark weak request fail");
1935     return;
1936   }
1937 
1938   p->do_regular_processing(this);
1939 
1940   nmethod* old_head = oops_do_try_add_to_list_as_weak_done();




1883 
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");
1886   assert(extract_state(next) == claim_weak_done_tag, "Should be claimed as weak done");
1887 
1888   oops_do_mark_link* old_next = Atomic::cmpxchg(mark_link(extract_nmethod(next), claim_strong_done_tag), &_oops_do_mark_link, next);
1889   if (old_next == next) {
1890     oops_do_log_change("oops_do, mark weak done -> mark strong done");
1891     return true;
1892   }
1893   return false;
1894 }
1895 
1896 nmethod* nmethod::oops_do_try_add_to_list_as_weak_done() {
1897   assert(SafepointSynchronize::is_at_safepoint(), "only at safepoint");
1898 
1899   assert(extract_state(_oops_do_mark_link) == claim_weak_request_tag ||
1900          extract_state(_oops_do_mark_link) == claim_strong_request_tag,
1901          "must be but is nmethod " PTR_FORMAT " %u", p2i(extract_nmethod(_oops_do_mark_link)), extract_state(_oops_do_mark_link));
1902 
1903   nmethod* old_head = Atomic::xchg(&_oops_do_mark_nmethods, this);
1904   // Self-loop if needed.
1905   if (old_head == NULL) {
1906     old_head = this;
1907   }
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)) {
1910     oops_do_log_change("oops_do, mark weak done");
1911     return NULL;
1912   } else {
1913     return old_head;
1914   }
1915 }
1916 
1917 void nmethod::oops_do_add_to_list_as_strong_done() {
1918   assert(SafepointSynchronize::is_at_safepoint(), "only at safepoint");
1919 
1920   nmethod* old_head = Atomic::xchg(&_oops_do_mark_nmethods, this);
1921   // Self-loop if needed.
1922   if (old_head == NULL) {
1923     old_head = this;
1924   }
1925   assert(_oops_do_mark_link == mark_link(this, claim_strong_done_tag), "must be but is nmethod " PTR_FORMAT " state %u",
1926          p2i(extract_nmethod(_oops_do_mark_link)), extract_state(_oops_do_mark_link));
1927 
1928   oops_do_set_strong_done(old_head);
1929 }
1930 
1931 void nmethod::oops_do_process_weak(OopsDoProcessor* p) {
1932   if (!oops_do_try_claim_weak_request()) {
1933     // Failed to claim for weak processing.
1934     oops_do_log_change("oops_do, mark weak request fail");
1935     return;
1936   }
1937 
1938   p->do_regular_processing(this);
1939 
1940   nmethod* old_head = oops_do_try_add_to_list_as_weak_done();


< prev index next >