From 123b4ca460aec74a72d1bc2507b5870bb19e95d8 Mon Sep 17 00:00:00 2001
From: zab2 <zab2@mail.i2p>
Date: Mon, 9 Nov 2015 17:48:19 +0000
Subject: [PATCH] Fix locking on _nextExpire field

---
 .../transport/OutboundMessageRegistry.java     | 18 ++++++++++++------
 1 file changed, 12 insertions(+), 6 deletions(-)

diff --git a/router/java/src/net/i2p/router/transport/OutboundMessageRegistry.java b/router/java/src/net/i2p/router/transport/OutboundMessageRegistry.java
index 9c04f52b63..9a5661b5f2 100644
--- a/router/java/src/net/i2p/router/transport/OutboundMessageRegistry.java
+++ b/router/java/src/net/i2p/router/transport/OutboundMessageRegistry.java
@@ -258,6 +258,7 @@ public class OutboundMessageRegistry {
     public void renderStatusHTML(Writer out) throws IOException {}
     
     private class CleanupTask extends SimpleTimer2.TimedEvent {
+        /** LOCKING: _selectors */
         private long _nextExpire;
 
         public CleanupTask() {
@@ -325,23 +326,28 @@ public class OutboundMessageRegistry {
 
             if (log) {
                 int e = removing.size();
-                int r = _selectors.size();
+                int r;
+                synchronized(_selectors) {
+                    r = _selectors.size();
+                }
                 int a = _activeMessages.size();
                 if (r > 0 || e > 0 || a > 0)
                     _log.debug("Expired: " + e + " remaining: " + r + " active: " + a);
             }
-            synchronized(this) {
+            synchronized(_selectors) {
                 if (_nextExpire <= now)
                     _nextExpire = now + 10*1000;
                 schedule(_nextExpire - now);
             }
         }
 
-        public synchronized void scheduleExpiration(MessageSelector sel) {
+        public void scheduleExpiration(MessageSelector sel) {
             long now = _context.clock().now();
-            if ( (_nextExpire <= now) || (sel.getExpiration() < _nextExpire) ) {
-                _nextExpire = sel.getExpiration();
-                reschedule(_nextExpire - now);
+            synchronized(_selectors) {
+                if ( (_nextExpire <= now) || (sel.getExpiration() < _nextExpire) ) {
+                    _nextExpire = sel.getExpiration();
+                    reschedule(_nextExpire - now);
+                }
             }
         }
     }
-- 
GitLab