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 } |