diff options
Diffstat (limited to 'runtime/class_linker.cc')
| -rw-r--r-- | runtime/class_linker.cc | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/runtime/class_linker.cc b/runtime/class_linker.cc index c667fe2f30..2a80e3c609 100644 --- a/runtime/class_linker.cc +++ b/runtime/class_linker.cc @@ -4977,8 +4977,14 @@ bool ClassLinker::InitializeDefaultInterfaceRecursive(Thread* self, // interface since we can still avoid the traversal. This is purely a performance optimization. if (result) { // TODO This should be done in a better way - ObjectLock<mirror::Class> lock(self, iface); - iface->SetRecursivelyInitialized(); + // Note: Use a try-lock to avoid blocking when someone else is holding the lock on this + // interface. It is bad (Java) style, but not impossible. Marking the recursive + // initialization is a performance optimization (to avoid another idempotent visit + // for other implementing classes/interfaces), and can be revisited later. + ObjectTryLock<mirror::Class> lock(self, iface); + if (lock.Acquired()) { + iface->SetRecursivelyInitialized(); + } } return result; } |