Author: j16sdiz
Date: 2009-04-21 06:04:43 +0000 (Tue, 21 Apr 2009)
New Revision: 27128

Modified:
   trunk/freenet/src/freenet/support/PooledExecutor.java
Log:
Pass first job to MyThread with constructor

Modified: trunk/freenet/src/freenet/support/PooledExecutor.java
===================================================================
--- trunk/freenet/src/freenet/support/PooledExecutor.java       2009-04-21 
00:23:44 UTC (rev 27127)
+++ trunk/freenet/src/freenet/support/PooledExecutor.java       2009-04-21 
06:04:43 UTC (rev 27128)
@@ -63,8 +63,7 @@
                if(prio < NativeThread.MIN_PRIORITY || prio > 
NativeThread.MAX_PRIORITY)
                        throw new IllegalArgumentException("Unreconized 
priority level : " + prio + '!');
                while(true) {
-                       MyThread t;
-                       boolean mustStart = false;
+                       MyThread t = null;
                        boolean miss = false;
                        synchronized(this) {
                                jobCount++;
@@ -80,37 +79,44 @@
                                                ticker.queueTimedJob(job, 
jobName, 0, true);
                                                return;
                                        }
+                                       miss = true;
+                               }
+                       }
+                       
+                       // miss
+                       if (miss) {
+                               synchronized(this) {
                                        // Will be coalesced by thread count 
listings if we use "@" or "for"
-                                       t = new MyThread("Pooled thread 
awaiting work @" + (threadCounter[prio - 1]), threadCounter[prio - 1], prio, 
!fromTicker);
+                                       t = new MyThread("Pooled thread 
awaiting work @" + (threadCounter[prio - 1]), job, threadCounter[prio - 1], 
prio, !fromTicker);
                                        threadCounter[prio - 1]++;
+                                       runningThreads[prio - 1].add(t);
                                        t.setDaemon(true);
-                                       mustStart = true;
-                                       miss = true;
+                                       t.setName(jobName + "(" + t.threadNo + 
")");
+                                       jobMisses++;
+                                       
+                                       if(logMINOR)
+                                               Logger.minor(this, "Jobs: " + 
jobMisses + " misses of " + jobCount + " starting urgently " + jobName);
                                }
+                               
+                               t.start();
+                               return;
                        }
+                       
+                       // use existing thread
                        synchronized(t) {
                                if(!t.alive)
                                        continue;
                                if(t.nextJob != null)
                                        continue;
                                t.nextJob = job;
-                               if(!mustStart)
+                               
                                        // It is possible that we could get a 
wierd race condition with
                                        // notify()/wait() signalling on a 
thread being used by higher
                                        // level code. So we'd best use 
notifyAll().
                                        t.notifyAll();
                        }
                        t.setName(jobName + "(" + t.threadNo + ")");
-                       if(mustStart) {
-                               t.start();
-                               synchronized(this) {
-                                       runningThreads[prio - 1].add(t);
-                                       if(miss)
-                                               jobMisses++;
-                                       if(logMINOR)
-                                               Logger.minor(this, "Jobs: " + 
jobMisses + " misses of " + jobCount + " starting urgently " + jobName);
-                               }
-                       } else
+                       
                                if(logMINOR)
                                        synchronized(this) {
                                                Logger.minor(this, "Not 
starting: Jobs: " + jobMisses + " misses of " + jobCount + " starting urgently 
" + jobName);
@@ -144,10 +150,11 @@
                Runnable nextJob;
                final long threadNo;
 
-               public MyThread(String defaultName, long threadCounter, int 
prio, boolean dontCheckRenice) {
+               public MyThread(String defaultName, Runnable firstJob, long 
threadCounter, int prio, boolean dontCheckRenice) {
                        super(defaultName, prio, dontCheckRenice);
                        this.defaultName = defaultName;
                        threadNo = threadCounter;
+                       nextJob = firstJob;
                }
 
                @Override

_______________________________________________
cvs mailing list
[email protected]
http://emu.freenetproject.org/cgi-bin/mailman/listinfo/cvs

Reply via email to