From 723cf90dd29cfafd8f3129034e7ca980fd08a3f8 Mon Sep 17 00:00:00 2001 From: Arndt Brenschede Date: Fri, 23 Oct 2015 19:18:37 +0200 Subject: [PATCH] changed thread-kill logic --- .../java/btools/router/RoutingEngine.java | 13 +++++-- .../main/java/btools/server/RouteServer.java | 35 ++++++++++++++++++- 2 files changed, 44 insertions(+), 4 deletions(-) diff --git a/brouter-core/src/main/java/btools/router/RoutingEngine.java b/brouter-core/src/main/java/btools/router/RoutingEngine.java index a6b0105..7cd05fc 100644 --- a/brouter-core/src/main/java/btools/router/RoutingEngine.java +++ b/brouter-core/src/main/java/btools/router/RoutingEngine.java @@ -158,7 +158,7 @@ public class RoutingEngine extends Thread OsmTrack[] lastTracks = new OsmTrack[nsections]; OsmTrack track = null; ArrayList messageList = new ArrayList(); - for( int i=0; !terminated; i++ ) + for( int i=0;; i++ ) { track = findTrack( refTracks, lastTracks ); track.message = "track-length = " + track.distance + " filtered ascend = " + track.ascend @@ -516,6 +516,8 @@ public class RoutingEngine extends Thread } catch( IllegalArgumentException iae ) { + if ( terminated ) throw iae; + // fast partial recalcs: if that timed out, but we had a match, // build the concatenation from the partial and the nearby track if ( matchPath != null ) @@ -530,7 +532,7 @@ public class RoutingEngine extends Thread if ( track == null ) { - for( int cfi = 0; cfi < airDistanceCostFactors.length && !terminated; cfi++ ) + for( int cfi = 0; cfi < airDistanceCostFactors.length; cfi++ ) { airDistanceCostFactor = airDistanceCostFactors[cfi]; @@ -775,8 +777,13 @@ public class RoutingEngine extends Thread addToOpenset( startPath1 ); addToOpenset( startPath2 ); } - while(!terminated) + for(;;) { + if ( terminated ) + { + throw new IllegalArgumentException( "operation killed by thread-priority-watchdog after " + ( System.currentTimeMillis() - startTime)/1000 + " seconds" ); + } + if ( maxRunningTime > 0 ) { long timeout = ( matchPath == null && fastPartialRecalc ) ? maxRunningTime/3 : maxRunningTime; diff --git a/brouter-server/src/main/java/btools/server/RouteServer.java b/brouter-server/src/main/java/btools/server/RouteServer.java index 4fc6e5c..2e3dd12 100644 --- a/brouter-server/src/main/java/btools/server/RouteServer.java +++ b/brouter-server/src/main/java/btools/server/RouteServer.java @@ -8,10 +8,15 @@ import java.io.OutputStreamWriter; import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; +import java.util.Map; import java.util.HashMap; import java.util.List; import java.util.StringTokenizer; import java.util.TreeMap; +import java.util.Date; +import java.util.Locale; +import java.text.DateFormat; +import java.text.SimpleDateFormat; import btools.router.OsmNodeNamed; import btools.router.OsmTrack; @@ -29,6 +34,7 @@ public class RouteServer extends Thread private Socket clientSocket = null; private RoutingEngine cr = null; + private volatile boolean terminated; public void stopRouter() { @@ -36,6 +42,16 @@ public class RouteServer extends Thread if ( e != null ) e.terminate(); } + private static DateFormat tsFormat = new SimpleDateFormat( "dd.MM.yy HH:mm", new Locale( "en", "US" ) ); + + private static String formattedTimestamp() + { + synchronized( tsFormat ) + { + return tsFormat.format( new Date( System.currentTimeMillis() ) ); + } + } + public void run() { BufferedReader br = null; @@ -53,7 +69,7 @@ public class RouteServer extends Thread } InetAddress ip = clientSocket.getInetAddress(); - System.out.println( "ip=" + (ip==null ? "null" : ip.toString() ) + " -> " + getline ); + System.out.println( formattedTimestamp() + " ip=" + (ip==null ? "null" : ip.toString() ) + " -> " + getline ); String url = getline.split(" ")[1]; HashMap params = getUrlParams(url); @@ -133,6 +149,7 @@ public class RouteServer extends Thread if ( br != null ) try { br.close(); } catch( Exception e ) {} if ( bw != null ) try { bw.close(); } catch( Exception e ) {} if ( clientSocket != null ) try { clientSocket.close(); } catch( Exception e ) {} + terminated = true; } } @@ -165,6 +182,22 @@ public class RouteServer extends Thread server.serviceContext = serviceContext; server.clientSocket = clientSocket; + // cleanup thread list + for(;;) + { + boolean removedItem = false; + for (Map.Entry e : threadMap.entrySet()) + { + if ( e.getValue().terminated ) + { + threadMap.remove( e.getKey() ); + removedItem = true; + break; + } + } + if ( !removedItem ) break; + } + // kill thread if limit reached if ( threadMap.size() >= maxthreads ) {