Author: toad
Date: 2008-02-15 16:17:56 +0000 (Fri, 15 Feb 2008)
New Revision: 17946
Modified:
trunk/freenet/src/freenet/node/Node.java
trunk/freenet/src/freenet/support/PooledExecutor.java
Log:
Run on ticker if need to boost priority
Modified: trunk/freenet/src/freenet/node/Node.java
===================================================================
--- trunk/freenet/src/freenet/node/Node.java 2008-02-15 16:12:53 UTC (rev
17945)
+++ trunk/freenet/src/freenet/node/Node.java 2008-02-15 16:17:56 UTC (rev
17946)
@@ -104,6 +104,7 @@
import freenet.support.LRUQueue;
import freenet.support.Logger;
import freenet.support.OOMHandler;
+import freenet.support.PooledExecutor;
import freenet.support.ShortBuffer;
import freenet.support.SimpleFieldSet;
import freenet.support.api.BooleanCallback;
@@ -850,6 +851,8 @@
// Must be created after darknetCrypto
dnsr = new DNSRequester(this);
ps = new PacketSender(this);
+ if(executor instanceof PooledExecutor)
+ ((PooledExecutor)executor).setTicker(ps);
Logger.normal(Node.class, "Creating node...");
Modified: trunk/freenet/src/freenet/support/PooledExecutor.java
===================================================================
--- trunk/freenet/src/freenet/support/PooledExecutor.java 2008-02-15
16:12:53 UTC (rev 17945)
+++ trunk/freenet/src/freenet/support/PooledExecutor.java 2008-02-15
16:17:56 UTC (rev 17946)
@@ -3,6 +3,7 @@
* http://www.gnu.org/ for further details of the GPL. */
package freenet.support;
+import freenet.node.Ticker;
import freenet.support.io.NativeThread;
import java.util.ArrayList;
@@ -19,7 +20,13 @@
private long jobCount;
private long jobMisses;
private static boolean logMINOR;
+ // Ticker thread that runs at maximum priority.
+ private Ticker ticker;
+ public void setTicker(Ticker ticker) {
+ this.ticker = ticker;
+ }
+
public PooledExecutor() {
for(int i=0; i<runningThreads.length; i++) {
runningThreads[i] = new ArrayList();
@@ -40,6 +47,7 @@
}
public void execute(Runnable job, String jobName, int prio) {
+ if(logMINOR) Logger.minor(this, "Executing "+job+" as
"+jobName+" at prio "+prio);
while(true) {
MyThread t;
boolean mustStart = false;
@@ -49,6 +57,11 @@
if(!waitingThreads[prio].isEmpty()) {
t = (MyThread)
waitingThreads[prio].remove(waitingThreads[prio].size()-1);
} else {
+ // Must create new thread
+ if(NativeThread.usingNativeCode() &&
prio < Thread.currentThread().getPriority()) {
+ // Run on ticker
+ ticker.queueTimedJob(job, 0);
+ }
// Will be coalesced by thread count
listings if we use "@" or "for"
t = new MyThread("Pooled thread
awaiting work @"+(threadCounter[prio]++), threadCounter[prio], prio);
t.setDaemon(true);