summaryrefslogtreecommitdiff
path: root/compiler/utils/assembler.cc
diff options
context:
space:
mode:
authorSebastien Hertz <shertz@google.com>2015-06-01 17:33:12 +0200
committerSebastien Hertz <shertz@google.com>2015-06-10 09:35:08 +0200
commitcbc5064ff05179b97b416f00ca579c55e38cd7d9 (patch)
tree9ce221e6644ff770b8484ba8cb5581e538b88eef /compiler/utils/assembler.cc
parent864a2d955aa85ab989c86d7f1eeacbe0b11f8b0f (diff)
JDWP: asynchronous invoke command handling
The JDWP thread used to wait for the result of a method invocation running in an event thread. But doing that prevents the JDWP thread from processing incoming commands from the debugger if the event thread gets suspended by a debug event occurring in another thread. In Android Studio (or another IDE), this leads to the debugger being blocked (with the famous message "Waiting until last debugger command completes" of Android Studio / IntelliJ) because it is actually waiting for the reply of its latest command while the JDWP thread cannot process it. This CL changes the way invoke commands (ClassType.InvokeCommand, ClassType.NewInstance and ObjectReference.InvokeCommand) are handled in the ART runtime. The JDWP thread no longer waits for the event thread to complete the method invocation. It now simply waits for the next JDWP command to process. This means it does not send any reply for invoke commands, except if the information given by the debugger is wrong. In this case, it still sends a reply with the appropriate error code. The event thread is now responsible for sending the reply (containing the result and the exception object of the invoked method) before going back to the suspended state. In other words, we add special handling for invoke commands so they are handled asynchronously while other commands remained handled synchronously. In the future, we may want to handle all commands asynchronously (using a queue of reply/event for instance) to remove the special handling code this CL is adding. Now the JDWP thread can process commands while a thread is invoking a method, it is possible for the debugger to detach (by sending a VirtualMachine.Dispose command) before the invocation completes. In that situation, we must not suspend threads again (including the event thread that executed the method) because they would all remain suspended forever. Also minor cleanup of the use of JDWP constants and update comments. Bug: 21515842 Bug: 18899981 Change-Id: I15e00fb068340f3d69dc9225d8d2065246e68c58
Diffstat (limited to 'compiler/utils/assembler.cc')
0 files changed, 0 insertions, 0 deletions