From f16927f316a990e79dcb3362caef7ade8b3aca59 Mon Sep 17 00:00:00 2001
From: zzz <zzz@mail.i2p>
Date: Tue, 28 Apr 2015 21:57:13 +0000
Subject: [PATCH] JobQueueRunner: Don't call System.exit() on OOM, let the
 shutdown progress normally; Make it an I2PThread instead of a Runner so we
 can call fireOOM() for consistent logging (ticket #1549) Router: Don't add
 OOM listener on Android so we don't hang onto the context

---
 router/java/src/net/i2p/router/JobQueue.java  |  5 ++-
 .../src/net/i2p/router/JobQueueRunner.java    | 32 ++++++++-----------
 router/java/src/net/i2p/router/Router.java    |  3 +-
 3 files changed, 17 insertions(+), 23 deletions(-)

diff --git a/router/java/src/net/i2p/router/JobQueue.java b/router/java/src/net/i2p/router/JobQueue.java
index 0b0f84fd27..bebd9c6e12 100644
--- a/router/java/src/net/i2p/router/JobQueue.java
+++ b/router/java/src/net/i2p/router/JobQueue.java
@@ -493,9 +493,8 @@ public class JobQueue {
                 for (int i = _queueRunners.size(); i < numThreads; i++) {
                     JobQueueRunner runner = new JobQueueRunner(_context, i);
                     _queueRunners.put(Integer.valueOf(i), runner);
-                    Thread t = new I2PThread(runner, "JobQueue " + _runnerId.incrementAndGet() + '/' + numThreads, false);
-                    //t.setPriority(I2PThread.MAX_PRIORITY-1);
-                    t.start();
+                    runner.setName("JobQueue " + _runnerId.incrementAndGet() + '/' + numThreads);
+                    runner.start();
                 }
             } else if (_queueRunners.size() == numThreads) {
                 for (JobQueueRunner runner : _queueRunners.values()) {
diff --git a/router/java/src/net/i2p/router/JobQueueRunner.java b/router/java/src/net/i2p/router/JobQueueRunner.java
index 4fa3307620..a3ed2da14c 100644
--- a/router/java/src/net/i2p/router/JobQueueRunner.java
+++ b/router/java/src/net/i2p/router/JobQueueRunner.java
@@ -1,9 +1,11 @@
 package net.i2p.router;
 
+import net.i2p.util.I2PThread;
 import net.i2p.util.Log;
+import net.i2p.util.SystemVersion;
 
 /** a do run run run a do run run */
-class JobQueueRunner implements Runnable {
+class JobQueueRunner extends I2PThread {
     private final Log _log;
     private final RouterContext _context;
     private volatile boolean _keepRunning;
@@ -12,7 +14,7 @@ class JobQueueRunner implements Runnable {
     private volatile Job _lastJob;
     private volatile long _lastBegin;
     private volatile long _lastEnd;
-    private volatile int _state;
+    //private volatile int _state;
     
     public JobQueueRunner(RouterContext context, int id) {
         _context = context;
@@ -23,7 +25,7 @@ class JobQueueRunner implements Runnable {
         //_state = 1;
     }
     
-    final int getState() { return _state; }
+    //final int getState() { return _state; }
     
     public Job getCurrentJob() { return _currentJob; }
     public Job getLastJob() { return _lastJob; }
@@ -115,14 +117,12 @@ class JobQueueRunner implements Runnable {
                 //if ( (jobNum % 10) == 0)
                 //    System.gc();
             } catch (Throwable t) {
-                if (_log.shouldLog(Log.CRIT))
-                    _log.log(Log.CRIT, "WTF, error running?", t);
+                _log.log(Log.CRIT, "WTF, error running?", t);
             }
         }
         //_state = 16;
         if (_context.router().isAlive())
-            if (_log.shouldLog(Log.CRIT))
-                _log.log(Log.CRIT, "Queue runner " + _id + " exiting");
+            _log.log(Log.CRIT, "Queue runner " + _id + " exiting");
         _context.jobQueue().removeRunner(_id);
         //_state = 17;
     }
@@ -134,21 +134,15 @@ class JobQueueRunner implements Runnable {
             _currentJob.runJob();
             //_state = 19;
         } catch (OutOfMemoryError oom) {
-            //_state = 20;
             try {
-                if (_log.shouldLog(Log.CRIT))
-                    _log.log(Log.CRIT, "Router ran out of memory, shutting down", oom);
-                _log.log(Log.CRIT, _currentJob.getClass().getName());
-                _context.router().shutdown(Router.EXIT_OOM);
-            } catch (Throwable t) {	
-                System.err.println("***Router ran out of memory, shutting down hard");
-            }
-            try { Thread.sleep(1000); } catch (InterruptedException ie) {}
-            System.exit(-1);
+                if (SystemVersion.isAndroid())
+                    _context.router().shutdown(Router.EXIT_OOM);
+                else
+                    fireOOM(oom);
+            } catch (Throwable t) {}
         } catch (Throwable t) {
             //_state = 21;
-            if (_log.shouldLog(Log.CRIT))
-                _log.log(Log.CRIT, "Error processing job [" + _currentJob.getName() 
+            _log.log(Log.CRIT, "Error processing job [" + _currentJob.getName() 
                                    + "] on thread " + _id + ": " + t.getMessage(), t);
             //if (_log.shouldLog(Log.ERROR))
             //    _log.error("The above job was enqueued by: ", _currentJob.getAddedBy());
diff --git a/router/java/src/net/i2p/router/Router.java b/router/java/src/net/i2p/router/Router.java
index 1462c6ac67..a3951dd2b6 100644
--- a/router/java/src/net/i2p/router/Router.java
+++ b/router/java/src/net/i2p/router/Router.java
@@ -559,7 +559,8 @@ public class Router implements RouterClock.ClockShiftListener {
         try {
             Runtime.getRuntime().addShutdownHook(_shutdownHook);
         } catch (IllegalStateException ise) {}
-        I2PThread.addOOMEventListener(_oomListener);
+        if (!SystemVersion.isAndroid())
+            I2PThread.addOOMEventListener(_oomListener);
         
         _context.keyManager().startup();
         
-- 
GitLab