Hi David,

On 9/4/17 21:43, David Holmes wrote:
Hi Serguei,

This looks good to me. One not below.

On 2/09/2017 6:30 PM, [email protected] wrote:
Please, review a fix for:
https://bugs.openjdk.java.net/browse/JDK-8177901

Webrev:
http://cr.openjdk.java.net/~sspitsyn/webrevs/2017/hotspot/8177901-jdi-wrong_phase.1

src/jdk.jdwp.agent/share/native/libjdwp/debugInit.c

+     // Release commandLoop vmDeathLock if necessary
+     void commandLoop_exitVmDeathLockOnError(void);
+     commandLoop_exitVmDeathLockOnError();

The declaration should be in the eventHelper.h header file. It looks really odd to declare the function then call it.

Ok, I'll move it to the header.

Thank you a lot for he review!
Serguei


Thanks,
David
-----


Summary:

   The approach to fix this is to introduce a new lock vmDeathLock in eventHelper.c    and use it to sync the commandLoop with the JVMTI event callback cbVMDeath
   the same way as it was done for debugLoop_run.
   (see the fix of: https://bugs.openjdk.java.net/browse/JDK-8134103)

   One potential issue with it is that the commandLoop() transitively uses some helper    functions (e.g. from util.c) that use the macro EXIT_ERROR, and so, can abort.
   It seems, in such a case the vmDeathLock will remain locked, and so,
   the cbVMDeath() will block on it causing a deadlock.
   Note, that these helper functions can be also called from different contexts/threads    (not from the commandLoop thread only). In such contexts the commandLoop vmDeathLock
   is not being entered, and so, should not be exited.

   To fix this potential issue, new function, commandLoop_exitVmDeathLockOnError(),
   is introduced, and it is called from the debugInit_exit().
The commandLoop_exitVmDeathLockOnError() always checks if current thread is    the commandLoop thread and only in such a case unlocks the vmDeathLock.

Testing:
   Ran the nsk.jdi, nsk.jdwp and jtreg jdk_jdi for both release and fastdebug builds.
   All tests are passed.

Thanks,
Serguei


Reply via email to