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);


Reply via email to