On 05/10/2013 06:03 PM, Charles Oliver Nutter wrote: > This isn't strictly language-related, but I thought I'd post here > before I start pinging hotspot folks directly... > > We are looking at adding interrupt checking to our regex engine, Joni, > so that long-running (or never-terminating) expressions could be > terminated early. To do this we're using Thread.interrupt. > > Unfortunately our first experiments with it have shown that interrupt > checking is rather expensive; having it in the main instruction loop > slowed down a 16s benchmark to 68s. We're reducing that checking by > only doing it every N instructions now, but I figured I'd look into > why it's so slow. > > Thread.isInterrupted does currentThread().interrupted(), both of which > are native calls. They end up as intrinsics and/or calling > JVM_CurrentThread and JVM_IsInterrupted. The former is not a > problem...accesses threadObj off the current thread (presumably from > env) and twiddles handle lifetime a bit. The latter, however, has to > acquire a lock to ensure retrieval and clearing are atomic. > > So then it occurred to me...why does it have to acquire a lock at all? > It seems like a get + CAS to clear would prevent accidentally clearing > another thread's re-interrupt. Some combination of CAS operations > could avoid the case where two threads both check interrupt status at > the same time. > > I would expect the CAS version would have lower overhead than the hard > mutex acquisition. > > Does this seem reasonable? > > - Charlie
Hi Charles, if a long-running expression is an exception, I think it's better to use a SwitchPoint (or a MutableCallsite stored in a static final field for that). Each regex being parsed first register itself in a queue, a thread wait on the first item of the queue, it the time is elapsed, the SwitchPoint is switch-off, so each thread Joni parsers knows that something goes wrong and check the first item. The parser which timeout, remove itself from the queue and create a new SwitchPoint. So the check is done only when a parser run too long. RĂ©mi _______________________________________________ mlvm-dev mailing list mlvm-dev@openjdk.java.net http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev