forked from I2P_Developers/i2p.i2p
2009-04-07 sponge
* SimpleTimer2, SimpleScheduler fixed so that the threads all run from The main threadgroup, not in the current possible child threadgroup. So long as any SimpleTimer2/SimpleScheduler is started *BEFORE* any child threadgroups, the constructors are threadgroup safe. What would be super cool is if they were to be all jailed within thier very own threadgroup too, but, I2P isn't up to the task of this yet. * Fixes to BOB to ensure the above is true.
This commit is contained in:
@ -34,6 +34,8 @@ import java.util.Properties;
|
|||||||
import net.i2p.client.I2PClient;
|
import net.i2p.client.I2PClient;
|
||||||
import net.i2p.client.streaming.RetransmissionTimer;
|
import net.i2p.client.streaming.RetransmissionTimer;
|
||||||
import net.i2p.util.Log;
|
import net.i2p.util.Log;
|
||||||
|
import net.i2p.util.SimpleScheduler;
|
||||||
|
import net.i2p.util.SimpleTimer2;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* <span style="font-size:8px;font-family:courier;color:#EEEEEE;background-color:#000000">
|
* <span style="font-size:8px;font-family:courier;color:#EEEEEE;background-color:#000000">
|
||||||
@ -159,9 +161,10 @@ public class BOB {
|
|||||||
// Set up all defaults to be passed forward to other threads.
|
// Set up all defaults to be passed forward to other threads.
|
||||||
// Re-reading the config file in each thread is pretty damn stupid.
|
// Re-reading the config file in each thread is pretty damn stupid.
|
||||||
String configLocation = System.getProperty(PROP_CONFIG_LOCATION, "bob.config");
|
String configLocation = System.getProperty(PROP_CONFIG_LOCATION, "bob.config");
|
||||||
|
|
||||||
// This is here just to ensure there is no interference with our threadgroups.
|
// This is here just to ensure there is no interference with our threadgroups.
|
||||||
RetransmissionTimer Y = RetransmissionTimer.getInstance();
|
RetransmissionTimer Y = RetransmissionTimer.getInstance();
|
||||||
|
SimpleScheduler Y1 = SimpleScheduler.getInstance();
|
||||||
|
SimpleTimer2 Y2 = SimpleTimer2.getInstance();
|
||||||
i = Y.hashCode();
|
i = Y.hashCode();
|
||||||
|
|
||||||
{
|
{
|
||||||
|
@ -25,6 +25,7 @@ package net.i2p.BOB;
|
|||||||
|
|
||||||
import net.i2p.client.streaming.RetransmissionTimer;
|
import net.i2p.client.streaming.RetransmissionTimer;
|
||||||
import net.i2p.util.SimpleScheduler;
|
import net.i2p.util.SimpleScheduler;
|
||||||
|
import net.i2p.util.SimpleTimer2;
|
||||||
/**
|
/**
|
||||||
* Start from command line
|
* Start from command line
|
||||||
*
|
*
|
||||||
@ -39,10 +40,13 @@ public class Main {
|
|||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
// THINK THINK THINK THINK THINK THINK
|
// THINK THINK THINK THINK THINK THINK
|
||||||
RetransmissionTimer Y = RetransmissionTimer.getInstance();
|
RetransmissionTimer Y = RetransmissionTimer.getInstance();
|
||||||
// needs SimpleScheduler
|
SimpleScheduler Y1 = SimpleScheduler.getInstance();
|
||||||
// no way to stop the scheduler?!?
|
SimpleTimer2 Y2 = SimpleTimer2.getInstance();
|
||||||
SimpleScheduler.getInstance();
|
|
||||||
BOB.main(args);
|
BOB.main(args);
|
||||||
|
|
||||||
|
Y2.stop();
|
||||||
|
Y1.stop();
|
||||||
Y.stop();
|
Y.stop();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -42,6 +42,7 @@ public class SimpleScheduler {
|
|||||||
_name = name;
|
_name = name;
|
||||||
_count = 0;
|
_count = 0;
|
||||||
_executor = new ScheduledThreadPoolExecutor(THREADS, new CustomThreadFactory());
|
_executor = new ScheduledThreadPoolExecutor(THREADS, new CustomThreadFactory());
|
||||||
|
_executor.prestartAllCoreThreads();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -90,10 +91,11 @@ public class SimpleScheduler {
|
|||||||
public Thread newThread(Runnable r) {
|
public Thread newThread(Runnable r) {
|
||||||
Thread rv = Executors.defaultThreadFactory().newThread(r);
|
Thread rv = Executors.defaultThreadFactory().newThread(r);
|
||||||
rv.setName(_name + ' ' + (++_count) + '/' + THREADS);
|
rv.setName(_name + ' ' + (++_count) + '/' + THREADS);
|
||||||
String name = rv.getThreadGroup().getName();
|
// Uncomment this to test threadgrouping, but we should be all safe now that the constructor preallocates!
|
||||||
if(!(name.isEmpty() || name.equals("Main") || name.equals("main"))) {
|
// String name = rv.getThreadGroup().getName();
|
||||||
(new Exception("OWCH! DAMN! Wrong ThreadGroup `" + name +"', `" + rv.getName() + "'")).printStackTrace();
|
// if(!name.equals("main")) {
|
||||||
}
|
// (new Exception("OWCH! DAMN! Wrong ThreadGroup `" + name +"', `" + rv.getName() + "'")).printStackTrace();
|
||||||
|
// }
|
||||||
rv.setDaemon(true);
|
rv.setDaemon(true);
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
@ -41,6 +41,7 @@ public class SimpleTimer2 {
|
|||||||
_name = name;
|
_name = name;
|
||||||
_count = 0;
|
_count = 0;
|
||||||
_executor = new CustomScheduledThreadPoolExecutor(THREADS, new CustomThreadFactory());
|
_executor = new CustomScheduledThreadPoolExecutor(THREADS, new CustomThreadFactory());
|
||||||
|
_executor.prestartAllCoreThreads();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -67,10 +68,11 @@ public class SimpleTimer2 {
|
|||||||
public Thread newThread(Runnable r) {
|
public Thread newThread(Runnable r) {
|
||||||
Thread rv = Executors.defaultThreadFactory().newThread(r);
|
Thread rv = Executors.defaultThreadFactory().newThread(r);
|
||||||
rv.setName(_name + ' ' + (++_count) + '/' + THREADS);
|
rv.setName(_name + ' ' + (++_count) + '/' + THREADS);
|
||||||
String name = rv.getThreadGroup().getName();
|
// Uncomment this to test threadgrouping, but we should be all safe now that the constructor preallocates!
|
||||||
if(!(name.isEmpty() || name.equals("Main") || name.equals("main"))) {
|
// String name = rv.getThreadGroup().getName();
|
||||||
(new Exception("OWCH! DAMN! Wrong ThreadGroup `" + name +"', `" + rv.getName() + "'")).printStackTrace();
|
// if(!name.equals("main")) {
|
||||||
}
|
// (new Exception("OWCH! DAMN! Wrong ThreadGroup `" + name +"', `" + rv.getName() + "'")).printStackTrace();
|
||||||
|
// }
|
||||||
rv.setDaemon(true);
|
rv.setDaemon(true);
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
@ -1,3 +1,12 @@
|
|||||||
|
2009-04-07 sponge
|
||||||
|
* SimpleTimer2, SimpleScheduler fixed so that the threads all run from
|
||||||
|
The main threadgroup, not in the current possible child threadgroup.
|
||||||
|
So long as any SimpleTimer2/SimpleScheduler is started *BEFORE* any
|
||||||
|
child threadgroups, the constructors are threadgroup safe. What would
|
||||||
|
be super cool is if they were to be all jailed within thier very own
|
||||||
|
threadgroup too, but, I2P isn't up to the task of this yet.
|
||||||
|
* Fixes to BOB to ensure the above is true.
|
||||||
|
|
||||||
2009-04-06 sponge
|
2009-04-06 sponge
|
||||||
* Debugging to make SimpleTimer2 and SimpleScheduler easier to debug.
|
* Debugging to make SimpleTimer2 and SimpleScheduler easier to debug.
|
||||||
* Fix for the config files in the GUI from mathiasdm
|
* Fix for the config files in the GUI from mathiasdm
|
||||||
|
@ -17,7 +17,7 @@ import net.i2p.CoreVersion;
|
|||||||
public class RouterVersion {
|
public class RouterVersion {
|
||||||
public final static String ID = "$Revision: 1.548 $ $Date: 2008-06-07 23:00:00 $";
|
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 String VERSION = CoreVersion.VERSION;
|
||||||
public final static long BUILD = 9;
|
public final static long BUILD = 10;
|
||||||
public static void main(String args[]) {
|
public static void main(String args[]) {
|
||||||
System.out.println("I2P Router version: " + VERSION + "-" + BUILD);
|
System.out.println("I2P Router version: " + VERSION + "-" + BUILD);
|
||||||
System.out.println("Router ID: " + RouterVersion.ID);
|
System.out.println("Router ID: " + RouterVersion.ID);
|
||||||
|
Reference in New Issue
Block a user