Author: nextgens
Date: 2008-02-15 07:33:49 +0000 (Fri, 15 Feb 2008)
New Revision: 17919
Modified:
trunk/freenet/src/freenet/node/NodeStarter.java
trunk/freenet/src/freenet/node/NodeStats.java
trunk/freenet/src/freenet/support/Executor.java
trunk/freenet/src/freenet/support/PooledExecutor.java
trunk/freenet/src/freenet/support/io/NativeThread.java
Log:
Basic implementation of NativeThread in the Executor
Modified: trunk/freenet/src/freenet/node/NodeStarter.java
===================================================================
--- trunk/freenet/src/freenet/node/NodeStarter.java 2008-02-15 06:22:08 UTC
(rev 17918)
+++ trunk/freenet/src/freenet/node/NodeStarter.java 2008-02-15 07:33:49 UTC
(rev 17919)
@@ -76,6 +76,8 @@
return new Integer(-1);
}
+ getExtBuild();
+
File configFilename;
if(args.length == 0) {
System.out.println("Using default config filename freenet.ini");
@@ -111,8 +113,6 @@
executor.start();
- getExtBuild();
-
// Setup RNG
RandomSource random = new Yarrow();
Modified: trunk/freenet/src/freenet/node/NodeStats.java
===================================================================
--- trunk/freenet/src/freenet/node/NodeStats.java 2008-02-15 06:22:08 UTC
(rev 17918)
+++ trunk/freenet/src/freenet/node/NodeStats.java 2008-02-15 07:33:49 UTC
(rev 17919)
@@ -773,7 +773,12 @@
}
public int getActiveThreadCount() {
- return rootThreadGroup.activeCount() -
node.executor.waitingThreads();
+ int waitingThreads = 0;
+ int[] toCount = node.executor.waitingThreads();
+ for(int i=0; i<toCount.length; i++)
+ waitingThreads += toCount[i];
+
+ return rootThreadGroup.activeCount() - waitingThreads;
}
public int getThreadLimit() {
Modified: trunk/freenet/src/freenet/support/Executor.java
===================================================================
--- trunk/freenet/src/freenet/support/Executor.java 2008-02-15 06:22:08 UTC
(rev 17918)
+++ trunk/freenet/src/freenet/support/Executor.java 2008-02-15 07:33:49 UTC
(rev 17919)
@@ -12,5 +12,5 @@
public void execute(Runnable job, String jobName);
/** Count the number of threads waiting for work */
- public int waitingThreads();
+ public int[] waitingThreads();
}
Modified: trunk/freenet/src/freenet/support/PooledExecutor.java
===================================================================
--- trunk/freenet/src/freenet/support/PooledExecutor.java 2008-02-15
06:22:08 UTC (rev 17918)
+++ trunk/freenet/src/freenet/support/PooledExecutor.java 2008-02-15
07:33:49 UTC (rev 17919)
@@ -3,6 +3,7 @@
* http://www.gnu.org/ for further details of the GPL. */
package freenet.support;
+import freenet.support.io.NativeThread;
import java.util.ArrayList;
/**
@@ -12,9 +13,9 @@
*/
public class PooledExecutor implements Executor {
- private final ArrayList runningThreads /* <MyThread> */ = new
ArrayList();
- private final ArrayList waitingThreads /* <MyThread> */ = new
ArrayList();
- long threadCounter = 0;
+ private final ArrayList[] runningThreads /* <MyThread> */ = new
ArrayList[NativeThread.JAVA_PRIO_RANGE];
+ private final ArrayList[] waitingThreads /* <MyThread> */ = new
ArrayList[NativeThread.JAVA_PRIO_RANGE];
+ long[] threadCounter;
private long jobCount;
private long jobMisses;
private static boolean logMINOR;
@@ -27,17 +28,21 @@
}
public void execute(Runnable job, String jobName) {
+ execute(job, jobName, Thread.NORM_PRIORITY);
+ }
+
+ public void execute(Runnable job, String jobName, int prio) {
while(true) {
MyThread t;
boolean mustStart = false;
boolean miss = false;
synchronized(this) {
jobCount++;
- if(!waitingThreads.isEmpty()) {
- t = (MyThread)
waitingThreads.remove(waitingThreads.size()-1);
+ if(!waitingThreads[prio].isEmpty()) {
+ t = (MyThread)
waitingThreads[prio].remove(waitingThreads[prio].size()-1);
} else {
// Will be coalesced by thread count
listings if we use "@" or "for"
- t = new MyThread("Pooled thread
awaiting work @"+(threadCounter++), threadCounter);
+ t = new MyThread("Pooled thread
awaiting work @"+(threadCounter[prio]++), threadCounter[prio], prio);
t.setDaemon(true);
mustStart = true;
miss = true;
@@ -57,7 +62,7 @@
if(mustStart) {
t.start();
synchronized(this) {
- runningThreads.add(t);
+ runningThreads[prio].add(t);
if(miss)
jobMisses++;
if(logMINOR)
@@ -68,25 +73,29 @@
}
}
- public synchronized int waitingThreads() {
- return waitingThreads.size();
+ public synchronized int[] waitingThreads() {
+ int[] result = new int[waitingThreads.length];
+ for(int i=0; i<result.length; i++)
+ result[i] = waitingThreads[i].size();
+ return result;
}
- class MyThread extends Thread {
+ class MyThread extends NativeThread {
final String defaultName;
boolean alive = true;
Runnable nextJob;
final long threadNo;
- public MyThread(String defaultName, long threadCounter) {
- super(defaultName);
+ public MyThread(String defaultName, long threadCounter, int
prio) {
+ super(defaultName, prio);
this.defaultName = defaultName;
threadNo = threadCounter;
}
public void run() {
long ranJobs = 0;
+ int nativePriority = getNativePriority();
while(true) {
Runnable job;
@@ -97,7 +106,7 @@
if(job == null) {
synchronized(PooledExecutor.this) {
- waitingThreads.add(this);
+
waitingThreads[nativePriority].add(this);
}
synchronized(this) {
if(nextJob == null) {
@@ -116,9 +125,9 @@
}
}
synchronized(PooledExecutor.this) {
- waitingThreads.remove(this);
+
waitingThreads[nativePriority].remove(this);
if(!alive) {
-
runningThreads.remove(this);
+
runningThreads[nativePriority].remove(this);
if(logMINOR)
Logger.minor(this, "Exiting having executed "+ranJobs+" jobs : "+this);
return;
Modified: trunk/freenet/src/freenet/support/io/NativeThread.java
===================================================================
--- trunk/freenet/src/freenet/support/io/NativeThread.java 2008-02-15
06:22:08 UTC (rev 17918)
+++ trunk/freenet/src/freenet/support/io/NativeThread.java 2008-02-15
07:33:49 UTC (rev 17919)
@@ -14,9 +14,9 @@
*/
public class NativeThread extends Thread {
private static boolean _loadNative;
- private static final int JAVA_PRIO_RANGE = MAX_PRIORITY - MIN_PRIORITY;
+ public static final int JAVA_PRIO_RANGE = MAX_PRIORITY - MIN_PRIORITY;
private static final int NATIVE_PRIORITY_BASE;
- private static final int NATIVE_PRIORITY_RANGE;
+ public static final int NATIVE_PRIORITY_RANGE;
private int currentPriority = Thread.MAX_PRIORITY;
public static final boolean HAS_THREE_NICE_LEVELS;
@@ -86,6 +86,11 @@
}
}
+ public NativeThread(String name, int priority) {
+ super(name);
+ this.currentPriority = priority;
+ }
+
public NativeThread(Runnable r, String name, int priority) {
super(r, name);
this.currentPriority = priority;
@@ -139,4 +144,8 @@
+currentPriority+':'+NATIVE_PRIORITY_BASE+")
SHOUDLN'T HAPPEN, please report!");
return setLinuxPriority(linuxPriority);
}
+
+ public int getNativePriority() {
+ return currentPriority;
+ }
}