1823 assert(hd == next_hd, "how not?"); |
1823 assert(hd == next_hd, "how not?"); |
1824 } |
1824 } |
1825 } |
1825 } |
1826 } |
1826 } |
1827 |
1827 |
1828 |
1828 bool G1CMIsAliveClosure::do_object_b(oop obj) { |
1829 class G1CMIsAliveClosure: public BoolObjectClosure { |
1829 HeapWord* addr = (HeapWord*)obj; |
1830 G1CollectedHeap* _g1; |
1830 return addr != NULL && |
1831 public: |
1831 (!_g1->is_in_g1_reserved(addr) || !_g1->is_obj_ill(obj)); |
1832 G1CMIsAliveClosure(G1CollectedHeap* g1) : |
1832 } |
1833 _g1(g1) |
|
1834 {} |
|
1835 |
|
1836 void do_object(oop obj) { |
|
1837 assert(false, "not to be invoked"); |
|
1838 } |
|
1839 bool do_object_b(oop obj) { |
|
1840 HeapWord* addr = (HeapWord*)obj; |
|
1841 return addr != NULL && |
|
1842 (!_g1->is_in_g1_reserved(addr) || !_g1->is_obj_ill(obj)); |
|
1843 } |
|
1844 }; |
|
1845 |
1833 |
1846 class G1CMKeepAliveClosure: public OopClosure { |
1834 class G1CMKeepAliveClosure: public OopClosure { |
1847 G1CollectedHeap* _g1; |
1835 G1CollectedHeap* _g1; |
1848 ConcurrentMark* _cm; |
1836 ConcurrentMark* _cm; |
1849 CMBitMap* _bitMap; |
1837 CMBitMap* _bitMap; |
1894 |
1882 |
1895 // Process weak references. |
1883 // Process weak references. |
1896 rp->setup_policy(clear_all_soft_refs); |
1884 rp->setup_policy(clear_all_soft_refs); |
1897 assert(_markStack.isEmpty(), "mark stack should be empty"); |
1885 assert(_markStack.isEmpty(), "mark stack should be empty"); |
1898 |
1886 |
1899 G1CMIsAliveClosure g1IsAliveClosure (g1h); |
1887 G1CMIsAliveClosure g1_is_alive(g1h); |
1900 G1CMKeepAliveClosure g1KeepAliveClosure(g1h, this, nextMarkBitMap()); |
1888 G1CMKeepAliveClosure g1_keep_alive(g1h, this, nextMarkBitMap()); |
1901 G1CMDrainMarkingStackClosure |
1889 G1CMDrainMarkingStackClosure |
1902 g1DrainMarkingStackClosure(nextMarkBitMap(), &_markStack, |
1890 g1_drain_mark_stack(nextMarkBitMap(), &_markStack, &g1_keep_alive); |
1903 &g1KeepAliveClosure); |
|
1904 |
1891 |
1905 // XXXYYY Also: copy the parallel ref processing code from CMS. |
1892 // XXXYYY Also: copy the parallel ref processing code from CMS. |
1906 rp->process_discovered_references(&g1IsAliveClosure, |
1893 rp->process_discovered_references(&g1_is_alive, |
1907 &g1KeepAliveClosure, |
1894 &g1_keep_alive, |
1908 &g1DrainMarkingStackClosure, |
1895 &g1_drain_mark_stack, |
1909 NULL); |
1896 NULL); |
1910 assert(_markStack.overflow() || _markStack.isEmpty(), |
1897 assert(_markStack.overflow() || _markStack.isEmpty(), |
1911 "mark stack should be empty (unless it overflowed)"); |
1898 "mark stack should be empty (unless it overflowed)"); |
1912 if (_markStack.overflow()) { |
1899 if (_markStack.overflow()) { |
1913 set_has_overflown(); |
1900 set_has_overflown(); |
1916 rp->enqueue_discovered_references(); |
1903 rp->enqueue_discovered_references(); |
1917 rp->verify_no_references_recorded(); |
1904 rp->verify_no_references_recorded(); |
1918 assert(!rp->discovery_enabled(), "should have been disabled"); |
1905 assert(!rp->discovery_enabled(), "should have been disabled"); |
1919 |
1906 |
1920 // Now clean up stale oops in SymbolTable and StringTable |
1907 // Now clean up stale oops in SymbolTable and StringTable |
1921 SymbolTable::unlink(&g1IsAliveClosure); |
1908 SymbolTable::unlink(&g1_is_alive); |
1922 StringTable::unlink(&g1IsAliveClosure); |
1909 StringTable::unlink(&g1_is_alive); |
1923 } |
1910 } |
1924 |
1911 |
1925 void ConcurrentMark::swapMarkBitMaps() { |
1912 void ConcurrentMark::swapMarkBitMaps() { |
1926 CMBitMapRO* temp = _prevMarkBitMap; |
1913 CMBitMapRO* temp = _prevMarkBitMap; |
1927 _prevMarkBitMap = (CMBitMapRO*)_nextMarkBitMap; |
1914 _prevMarkBitMap = (CMBitMapRO*)_nextMarkBitMap; |