diff --git a/apps/BOB/src/net/i2p/BOB/I2Plistener.java b/apps/BOB/src/net/i2p/BOB/I2Plistener.java index 813bb5d34..2dfa4bbb2 100644 --- a/apps/BOB/src/net/i2p/BOB/I2Plistener.java +++ b/apps/BOB/src/net/i2p/BOB/I2Plistener.java @@ -48,17 +48,18 @@ public class I2Plistener implements Runnable { /** * Constructor + * @param SS * @param S * @param info * @param database * @param _log */ - I2Plistener(I2PSocketManager S, NamedDB info, NamedDB database, Log _log) { + I2Plistener(I2PServerSocket SS, I2PSocketManager S, NamedDB info, NamedDB database, Log _log) { this.database = database; this.info = info; this._log = _log; this.socketManager = S; - serverSocket = this.socketManager.getServerSocket(); + serverSocket = SS; tgwatch = 1; } @@ -72,16 +73,6 @@ public class I2Plistener implements Runnable { info.releaseReadLock(); } - private void wlock() throws Exception { - database.getWriteLock(); - info.getWriteLock(); - } - - private void wunlock() throws Exception { - info.releaseWriteLock(); - database.releaseWriteLock(); - } - /** * Simply listen on I2P port, and thread connections * diff --git a/apps/BOB/src/net/i2p/BOB/MUXlisten.java b/apps/BOB/src/net/i2p/BOB/MUXlisten.java index 879cf9a64..1987fbf6b 100644 --- a/apps/BOB/src/net/i2p/BOB/MUXlisten.java +++ b/apps/BOB/src/net/i2p/BOB/MUXlisten.java @@ -28,7 +28,10 @@ import java.io.IOException; import java.net.InetAddress; import java.net.ServerSocket; import java.util.Properties; +import java.util.logging.Level; +import java.util.logging.Logger; import net.i2p.I2PException; +import net.i2p.client.streaming.I2PServerSocket; import net.i2p.client.streaming.I2PSocketManager; import net.i2p.client.streaming.I2PSocketManagerFactory; import net.i2p.util.Log; @@ -73,9 +76,9 @@ public class MUXlisten implements Runnable { this.database.getReadLock(); this.info.getReadLock(); N = this.info.get("NICKNAME").toString(); - prikey = new ByteArrayInputStream((byte[])info.get("KEYS")); + prikey = new ByteArrayInputStream((byte[]) info.get("KEYS")); // Make a new copy so that anything else won't muck with our database. - Properties R = (Properties)info.get("PROPERTIES"); + Properties R = (Properties) info.get("PROPERTIES"); Properties Q = new Properties(); Lifted.copyProperties(R, Q); this.database.releaseReadLock(); @@ -85,7 +88,7 @@ public class MUXlisten implements Runnable { this.info.getReadLock(); this.go_out = info.exists("OUTPORT"); this.come_in = info.exists("INPORT"); - if(this.come_in) { + if (this.come_in) { port = Integer.parseInt(info.get("INPORT").toString()); host = InetAddress.getByName(info.get("INHOST").toString()); } @@ -93,7 +96,7 @@ public class MUXlisten implements Runnable { this.info.releaseReadLock(); socketManager = I2PSocketManagerFactory.createManager(prikey, Q); - if(this.come_in) { + if (this.come_in) { this.listener = new ServerSocket(port, backlog, host); } @@ -130,40 +133,44 @@ public class MUXlisten implements Runnable { * */ public void run() { - + I2PServerSocket SS = null; try { wlock(); try { info.add("RUNNING", new Boolean(true)); info.add("STARTING", new Boolean(false)); - } catch(Exception e) { + } catch (Exception e) { wunlock(); return; } - } catch(Exception e) { + } catch (Exception e) { return; } try { wunlock(); - } catch(Exception e) { + } catch (Exception e) { return; } +// socketManager.addDisconnectListener(new DisconnectListener()); -quit: { +quit: + { try { tg = new ThreadGroup(N); -die: { +die: + { // toss the connections to a new threads. // will wrap with TCP and UDP when UDP works - if(go_out) { + if (go_out) { // I2P -> TCP - I2Plistener conn = new I2Plistener(socketManager, info, database, _log); + SS = socketManager.getServerSocket(); + I2Plistener conn = new I2Plistener(SS, socketManager, info, database, _log); Thread t = new Thread(tg, conn, "BOBI2Plistener " + N); t.start(); } - if(come_in) { + if (come_in) { // TCP -> I2P TCPlistener conn = new TCPlistener(listener, socketManager, info, database, _log); Thread q = new Thread(tg, conn, "BOBTCPlistener" + N); @@ -171,26 +178,26 @@ die: { } boolean spin = true; - while(spin) { + while (spin) { try { Thread.sleep(200); //sleep for 200 ms (Two thenths second) - } catch(InterruptedException e) { + } catch (InterruptedException e) { // nop } try { rlock(); try { spin = info.get("STOPPING").equals(Boolean.FALSE); - } catch(Exception e) { + } catch (Exception e) { runlock(); break die; } - } catch(Exception e) { + } catch (Exception e) { break die; } try { runlock(); - } catch(Exception e) { + } catch (Exception e) { break die; } } @@ -199,80 +206,62 @@ die: { wlock(); try { info.add("RUNNING", new Boolean(false)); - } catch(Exception e) { + } catch (Exception e) { wunlock(); break die; } - } catch(Exception e) { + } catch (Exception e) { break die; } try { wunlock(); - } catch(Exception e) { + } catch (Exception e) { break die; } } // die - try { - Thread.sleep(500); //sleep for 500 ms (One half second) - } catch(InterruptedException ex) { - // nop - } +// try { +// Thread.sleep(500); //sleep for 500 ms (One half second) +// } catch (InterruptedException ex) { +// // nop +// } // wait for child threads and thread groups to die // System.out.println("MUXlisten: waiting for children"); - if(tg.activeCount() + tg.activeGroupCount() != 0) { - tg.interrupt(); // unwedge any blocking threads. - while(tg.activeCount() + tg.activeGroupCount() != 0) { + if (tg.activeCount() + tg.activeGroupCount() != 0) { + while (tg.activeCount() + tg.activeGroupCount() != 0) { + tg.interrupt(); // unwedge any blocking threads. try { Thread.sleep(100); //sleep for 100 ms (One tenth second) - } catch(InterruptedException ex) { - // nop + } catch (InterruptedException ex) { + // NOP } } } tg.destroy(); // Zap reference to the ThreadGroup so the JVM can GC it. tg = null; - } catch(Exception e) { + } catch (Exception e) { // System.out.println("MUXlisten: Caught an exception" + e); break quit; } } // quit // This is here to catch when something fucks up REALLY bad. - if(tg != null) { + if (tg != null) { System.out.println("BOB: MUXlisten: Something fucked up REALLY bad!"); System.out.println("BOB: MUXlisten: Please email the following dump to sponge@mail.i2p"); WrapperManager.requestThreadDump(); System.out.println("BOB: MUXlisten: Something fucked up REALLY bad!"); System.out.println("BOB: MUXlisten: Please email the above dump to sponge@mail.i2p"); } - // zero out everything, just incase. - try { - socketManager.destroySocketManager(); - } catch(Exception e) { - // nop - } - try { - wlock(); - try { - info.add("STARTING", new Boolean(false)); - info.add("STOPPING", new Boolean(false)); - info.add("RUNNING", new Boolean(false)); - } catch(Exception e) { - wunlock(); - return; - } - wunlock(); - } catch(Exception e) { - } + // This is here to catch when something fucks up REALLY bad. - if(tg != null) { - if(tg.activeCount() + tg.activeGroupCount() != 0) { - tg.interrupt(); // unwedge any blocking threads. - while(tg.activeCount() + tg.activeGroupCount() != 0) { + if (tg != null) { + if (tg.activeCount() + tg.activeGroupCount() != 0) { + tg.interrupt(); // unwedge any blocking threads. + while (tg.activeCount() + tg.activeGroupCount() != 0) { try { Thread.sleep(100); //sleep for 100 ms (One tenth second) - } catch(InterruptedException ex) { + } catch (InterruptedException ex) { // nop } } @@ -282,18 +271,49 @@ die: { tg = null; } + if (SS != null) { + try { + SS.close(); + } catch (I2PException ex) { + //Logger.getLogger(MUXlisten.class.getName()).log(Level.SEVERE, null, ex); + } + } // Lastly try to close things again. - if(this.come_in) { + if (this.come_in) { try { listener.close(); - } catch(IOException e) { + } catch (IOException e) { } } try { socketManager.destroySocketManager(); - } catch(Exception e) { + } catch (Exception e) { // nop } + // zero out everything. + try { + wlock(); + try { + info.add("STARTING", new Boolean(false)); + info.add("STOPPING", new Boolean(false)); + info.add("RUNNING", new Boolean(false)); + } catch (Exception e) { + wunlock(); + return; + } + wunlock(); + } catch (Exception e) { + } } + +// private class DisconnectListener implements I2PSocketManager.DisconnectListener { +// +// public void sessionDisconnected() { +// close(); +// } +// } +// public void close() { +// socketManager.destroySocketManager(); +// } } diff --git a/build.xml b/build.xml index 0283acdc4..f306a71b3 100644 --- a/build.xml +++ b/build.xml @@ -510,6 +510,8 @@ + + diff --git a/history.txt b/history.txt index 8c3f607ca..1e88a8c7d 100644 --- a/history.txt +++ b/history.txt @@ -1,3 +1,6 @@ +2009-04-08 sponge + * More hopeful fixups to the infamous orpahned tunnel problem. *Sigh* + 2009-04-08 zzz * IPV6/localhost: - Enable IPv6 stack in the JVM, hopefully won't break anything diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java index f99f19ada..fe47169bc 100644 --- a/router/java/src/net/i2p/router/RouterVersion.java +++ b/router/java/src/net/i2p/router/RouterVersion.java @@ -17,7 +17,7 @@ import net.i2p.CoreVersion; public class RouterVersion { public final static String ID = "$Revision: 1.548 $ $Date: 2008-06-07 23:00:00 $"; public final static String VERSION = CoreVersion.VERSION; - public final static long BUILD = 13; + public final static long BUILD = 14; public static void main(String args[]) { System.out.println("I2P Router version: " + VERSION + "-" + BUILD); System.out.println("Router ID: " + RouterVersion.ID);