Is it possible to stop a specific application thread?

David Holmes david.holmes at oracle.com
Mon Nov 11 17:25:04 PST 2013


On 12/11/2013 11:16 AM, Keith Chapman wrote:
> Hi David,
>
> On Mon, Nov 11, 2013 at 7:26 PM, David Holmes <david.holmes at oracle.com
> <mailto:david.holmes at oracle.com>> wrote:
>
>     Hi Keith,
>
>
>     On 12/11/2013 6:29 AM, Keith Chapman wrote:
>
>         Hi,
>
>         I'm playing around with some research ideas on hotspot.
>
>         One of my runtime services of the VM needs to stop a specific
>         application
>         thread (I have a handle to the pthread of the application
>         thread). How can
>         the VM stop such a thread? Is there any mechanism in place to do
>         this?
>
>
>     There is no general purpose mechanism currently in place.
>
>
> Thats a bummer, having such a mechanism would have been useful for
> numerous VM services like biased locking revocation, concurrent GC.

For which safepoints are generally used so a per-thread safepoint 
mechanism is what you are looking for.

>
>     You could use the deprecated and inherently dangerous Thread.suspend
>     mechanism (either directly or via the JVMTI suspension interface).
>
>     Or if you are more adventurous with your VM hacking you could
>     introduce a per-thread safepoint operation to cause it to stop.
>
>
> I actually thought about that and explored the way safepoints are
> implemented. The place that I had most trouble was getting threads
> running compiled code to stop. The way it currently works is by
> allocating a polling page (at startup) and drilling in that address into
> the compiled code. Hence i I am to do it per thread I would have to make
> a call to the runtime to get the address of the polling page for that
> particular thread. I presume this would be too expensive (Making a VM
> call at the end of each method and through some loop iterations).
>
> Is there any insight you could offer on how this could be done?

Two basic options I can think of:

1. Use a single shared page and have other threads simply ignore the 
safepoint request. This might incur some overhead as not-wanted threads 
could hit this multiple times.

2. Use a per-thread page accessed via the current thread. There would be 
a little overhead for the indirection but the compiler knows how to 
access the current JavaThread object. No need for runtime calls that I 
can see.

Good luck.

David

> Thanks,
> Keith.
>
>     Or you could hack in a special "magic exception" type the processing
>     of which simply blocks the thread until "resumed" somehow (not sure
>     how ??). Or ...
>
>     Cheers,
>     David
>
>         Thanks,
>         Keith.
>
>
>
>
> --
>
> Keith Chapman
> blog: http://www.keith-chapman.org


More information about the hotspot-dev mailing list