[ 
https://issues.apache.org/jira/browse/JEXL-205?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15376351#comment-15376351
 ] 

Dmitri Blinov commented on JEXL-205:
------------------------------------

I'm afraid this won't help eigher, it's the midlle of the 
TestContext.runForever() while loop that the thread is stuck in.

{code}
        public int runForever() {
            boolean x = false;

            while (true) {
                // This is where we are stuck eating up CPU cycles for the rest 
of all tests
                if (x) {
                    break;
                }
            }
            ...
        }
{code}

No way out unitl 'x' becomes true, but it won't, sincle it's local var nobody 
can change from outside.

> testCancelForever() is not terminated properly
> ----------------------------------------------
>
>                 Key: JEXL-205
>                 URL: https://issues.apache.org/jira/browse/JEXL-205
>             Project: Commons JEXL
>          Issue Type: Task
>    Affects Versions: 3.0
>            Reporter: Dmitri Blinov
>
> After runnning Jexl tests I have noticed that the thread from 
> testCancelForever() test is still executing, and its stack trace is as 
> follows:
> {code}
> org.apache.commons.jexl3.ScriptCallableTest$TestContext.runForever(ScriptCallableTest.java:159)
> sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
> java.lang.reflect.Method.invoke(Method.java:606)
> org.apache.commons.jexl3.internal.introspection.MethodExecutor.invoke(MethodExecutor.java:93)
> org.apache.commons.jexl3.internal.Interpreter.call(Interpreter.java:1816)
> org.apache.commons.jexl3.internal.Interpreter.visit(Interpreter.java:1535)
> org.apache.commons.jexl3.parser.ASTFunctionNode.jjtAccept(ASTFunctionNode.java:18)
> org.apache.commons.jexl3.internal.Interpreter.visit(Interpreter.java:1119)
> org.apache.commons.jexl3.parser.ASTJexlScript.jjtAccept(ASTJexlScript.java:55)
> org.apache.commons.jexl3.internal.Interpreter.interpret(Interpreter.java:210)
> org.apache.commons.jexl3.internal.Script$Callable.interpret(Script.java:364)
> org.apache.commons.jexl3.internal.Script$Callable.call(Script.java:372)
>    - locked org.apache.commons.jexl3.internal.Script$Callable@35595365
> java.util.concurrent.FutureTask.run(FutureTask.java:262)
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
> java.lang.Thread.run(Thread.java:745)
> {code}
> may be its worth rewriting the test to something like this
> {code}
>     public static class TestContext extends MapContext implements 
> JexlContext.NamespaceResolver {
>         protected volatile boolean x = false;
>         public int runForever() {
>             while (true) {
>                 if (x) {
>                     break;
>                 }
>             }
>             return 1;
>         }
> ...
>     @Test
>     public void testCancelForever() throws Exception {
>         JexlScript e = JEXL.createScript("runForever()");
>         TestContext tctx = new TestContext();
>         Callable<Object> c = e.callable(tctx);
>         ExecutorService executor = Executors.newFixedThreadPool(1);
>         Future<?> future = executor.submit(c);
>         Object t = 42;
>         try {
>             t = future.get(100, TimeUnit.MILLISECONDS);
>             Assert.fail("should have timed out");
>         } catch (TimeoutException xtimeout) {
>             // ok, ignore
>             future.cancel(true);
>             tctx.x = true;
>         } finally {
>             executor.shutdown();
>         }
> {code}



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to