diff --git a/src/helma/framework/core/RequestEvaluator.java b/src/helma/framework/core/RequestEvaluator.java index 1937f7b4..dc66bc35 100644 --- a/src/helma/framework/core/RequestEvaluator.java +++ b/src/helma/framework/core/RequestEvaluator.java @@ -140,7 +140,8 @@ public class RequestEvaluator implements Runnable { do { // make sure there is only one thread running per instance of this class - if (Thread.currentThread () != rtx) + Transactor tx = rtx; + if (Thread.currentThread () != tx) return; // IServer.getLogger().log ("got request "+reqtype); @@ -159,9 +160,9 @@ public class RequestEvaluator implements Runnable { String requestPath = app.getName()+"/"+req.path; // set Timer to get some profiling data - rtx.timer.reset (); - rtx.timer.beginEvent (requestPath+" init"); - rtx.begin (requestPath); + tx.timer.reset (); + tx.timer.beginEvent (requestPath+" init"); + tx.begin (requestPath); Action action = null; @@ -276,25 +277,27 @@ public class RequestEvaluator implements Runnable { current = getNodeWrapper (root); } - rtx.timer.endEvent (requestPath+" init"); + tx.timer.endEvent (requestPath+" init"); try { - rtx.timer.beginEvent (requestPath+" execute"); + tx.timer.beginEvent (requestPath+" execute"); current.doIndirectCall (evaluator, current, action.getFunctionName (), new ESValue[0]); - rtx.timer.endEvent (requestPath+" execute"); + tx.timer.endEvent (requestPath+" execute"); done = true; } catch (RedirectException redirect) { res.redirect = redirect.getMessage (); done = true; } - rtx.commit (); + // check if we're still on track + if (tx == rtx) + tx.commit (); + else + throw new TimeoutException (); done = true; - // if (app.debug) - // ((Transactor) Thread.currentThread ()).timer.dump (System.err); } catch (ConcurrencyException x) { - try { rtx.abort (); } catch (Exception ignore) {} + try { tx.abort (); } catch (Exception ignore) {} res.reset (); if (++tries < 8) { try { @@ -309,7 +312,7 @@ public class RequestEvaluator implements Runnable { done = true; } catch (FrameworkException x) { - try { rtx.abort (); } catch (Exception ignore) {} + try { tx.abort (); } catch (Exception ignore) {} app.errorCount += 1; res.reset (); res.write ("Error in application '"+app.getName()+"':

" + x.getMessage () + "
"); @@ -318,7 +321,7 @@ public class RequestEvaluator implements Runnable { done = true; } catch (Exception x) { - try { rtx.abort (); } catch (Exception ignore) {} + try { tx.abort (); } catch (Exception ignore) {} app.errorCount += 1; System.err.println ("### Exception in "+app.getName()+"/"+req.path+": current = "+currentNode); System.err.println (x); @@ -329,7 +332,7 @@ public class RequestEvaluator implements Runnable { // If the transactor thread has been killed by the invoker thread we don't have to // bother for the error message, just quit. - if (rtx != Thread.currentThread()) + if (rtx != tx) return; res.reset (); @@ -340,7 +343,7 @@ public class RequestEvaluator implements Runnable { break; case XMLRPC: try { - rtx.begin (app.getName()+":xmlrpc/"+method); + tx.begin (app.getName()+":xmlrpc/"+method); root = app.getDataRoot (); @@ -380,9 +383,9 @@ public class RequestEvaluator implements Runnable { } result = FesiRpcUtil.convertE2J (current.doIndirectCall (evaluator, current, method, esa)); - rtx.commit (); + tx.commit (); } catch (Exception wrong) { - try { rtx.abort (); } catch (Exception ignore) {} + try { tx.abort (); } catch (Exception ignore) {} // If the transactor thread has been killed by the invoker thread we don't have to // bother for the error message, just quit. @@ -398,7 +401,7 @@ public class RequestEvaluator implements Runnable { // Just a human readable descriptor of this invocation String funcdesc = app.getName()+":internal/"+method; try { - rtx.begin (funcdesc); + tx.begin (funcdesc); root = app.getDataRoot (); @@ -419,9 +422,9 @@ public class RequestEvaluator implements Runnable { } } esresult = current.doIndirectCall (evaluator, current, method, new ESValue[0]); - rtx.commit (); + tx.commit (); } catch (Throwable wrong) { - try { rtx.abort (); } catch (Exception ignore) {} + try { tx.abort (); } catch (Exception ignore) {} // If the transactor thread has been killed by the invoker thread we don't have to // bother for the error message, just quit. @@ -561,6 +564,7 @@ public class RequestEvaluator implements Runnable { rtx = null; if (t != null) { if (reqtype != NONE) { + try { t.abort (); } catch (Exception ignore) {} t.kill (); } else { notifyAll ();