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(); |