Replace weak-ref access disable checkpoint with STW pause

Disabling weak-ref access in ConcurrentCopying collector can lead to
deadlocks. For instance, if mutator M1 acquires W1 mutex and then
participates in the checkpoint and then gets blocked in getReferent(),
waiting for the gc-thread to finish reference processing. Mutator M2
waits for M1 to release W1 so that it can acquire the mutex before
participating in the checkpoint. On the other hand, GC-thread waits
for M2 to finish checkpoint.
A STW pause avoids the deadlock by ensuring that mutators are not
blocked on weak-ref access before the pause, and GC-thread can make
progress after the pause in reference processing.

Bug: 195336624
Bug: 195261575
Test: art/test/testrunner/testrunner.py
Change-Id: I03d6bcd4d53f37ec84064edd8292951d30f48eaf
1 file changed