OSDN Git Service

Use try lock to fix class resolution race
authorMathieu Chartier <mathieuc@google.com>
Wed, 13 Jul 2016 16:53:35 +0000 (09:53 -0700)
committerMathieu Chartier <mathieuc@google.com>
Wed, 24 Aug 2016 01:09:40 +0000 (18:09 -0700)
commit1386f8619bb9cd338e51a9b6b5121bc8443bda76
treef1fa8f807790ee0d49d32af66819a458d0c4702d
parent7ae0862d40f2d326bd3acdcd4f9e1369e628856a
Use try lock to fix class resolution race

There was some possible deadlocks related to EnsureResolved caused by
acquiring an object lock.

Scenario:
Thread 1 acquires lock on obj1
Thread 1 begins to resolve / initialize class1
Thread 1 blocks since it sees that class1 is already being resolved and
gets preempted before it can acquire the object lock on class1
Thread 2 finishes resolving and initializing class1 and locks class1
Thread 2 blocks attempting to lock obj1
Thread 1 blocks attempting to lock class1
Deadlock

Fixed the deadlock by changing EnsureResolved to use a try lock for the
unresolved case.

Added a test.

Test: Device boot, test-art-host, monitor_test

Bug: 27417671

(cherry picked from commit a704eda0078989a73cac111ed309aca50d2e289b)

Change-Id: I1150b19bdc1a5cc87ae95eda4f2b6b4bca215a60
runtime/class_linker.cc
runtime/mirror/object-inl.h
runtime/mirror/object.h
runtime/monitor.cc
runtime/monitor.h
runtime/monitor_test.cc
runtime/object_lock.cc
runtime/object_lock.h