* Matthew Toseland <toad at amphibian.dyndns.org> [2008-04-04 19:26:56]:
> Grrrr, indenting and sync fixes in the same commit.
>
Sorry about that one...
Oh and btw, Grrrr, top-posting!
> On Friday 04 April 2008 07:16, nextgens at freenetproject.org wrote:
> > Author: nextgens
> > Date: 2008-04-04 06:16:23 +0000 (Fri, 04 Apr 2008)
> > New Revision: 18977
> >
> > Modified:
> > trunk/freenet/src/freenet/support/PooledExecutor.java
> > Log:
> > More sync. fixes
> >
> > Modified: trunk/freenet/src/freenet/support/PooledExecutor.java
> > ===================================================================
> > --- trunk/freenet/src/freenet/support/PooledExecutor.java 2008-04-04
> 06:12:05 UTC (rev 18976)
> > +++ trunk/freenet/src/freenet/support/PooledExecutor.java 2008-04-04
> 06:16:23 UTC (rev 18977)
> > @@ -23,48 +23,48 @@
> > private static boolean logMINOR;
> > // Ticker thread that runs at maximum priority.
> > private Ticker ticker;
> > -
> > - public void setTicker(Ticker ticker) {
> > +
> > + public synchronized void setTicker(Ticker ticker) {
> > this.ticker = ticker;
> > }
> > -
> > +
> > public PooledExecutor() {
> > - for(int i=0; i<runningThreads.length; i++) {
> > + for(int i = 0; i < runningThreads.length; i++) {
> > runningThreads[i] = new ArrayList();
> > waitingThreads[i] = new ArrayList();
> > threadCounter[i] = 0;
> > }
> > }
> > -
> > /** Maximum time a thread will wait for a job */
> > - static final int TIMEOUT = 5*60*1000;
> > -
> > + static final int TIMEOUT = 5 * 60 * 1000;
> > +
> > public void start() {
> > logMINOR = Logger.shouldLog(Logger.MINOR, this);
> > }
> > -
> > +
> > public void execute(Runnable job, String jobName) {
> > execute(job, jobName, false);
> > }
> > -
> > +
> > public void execute(Runnable job, String jobName, boolean fromTicker) {
> > int prio = NativeThread.NORM_PRIORITY;
> > - if(job instanceof PrioRunnable) {
> > - prio = ((PrioRunnable)job).getPriority();
> > - }
> > -
> > - if(logMINOR) Logger.minor(this, "Executing "+job+" as
> > "+jobName+" at
> prio "+prio);
> > + if(job instanceof PrioRunnable)
> > + prio = ((PrioRunnable) job).getPriority();
> > +
> > + if(logMINOR)
> > + Logger.minor(this, "Executing " + job + " as " +
> > jobName + " at prio " +
> prio);
> > if(prio < NativeThread.MIN_PRIORITY || prio >
> > NativeThread.MAX_PRIORITY)
> > - throw new IllegalArgumentException("Unreconized
> > priority
> level : "+prio+'!');
> > + throw new IllegalArgumentException("Unreconized
> > priority level : " +
> prio + '!');
> > while(true) {
> > MyThread t;
> > boolean mustStart = false;
> > boolean miss = false;
> > synchronized(this) {
> > jobCount++;
> > - if(!waitingThreads[prio-1].isEmpty()) {
> > - t = (MyThread)
> waitingThreads[prio-1].remove(waitingThreads[prio-1].size()-1);
> > - if(logMINOR) Logger.minor(this,
> > "Reusing thread "+t);
> > + if(!waitingThreads[prio - 1].isEmpty()) {
> > + t = (MyThread) waitingThreads[prio -
> > 1].remove(waitingThreads[prio -
> 1].size() - 1);
> > + if(logMINOR)
> > + Logger.minor(this, "Reusing
> > thread " + t);
> > } else {
> > // Must create new thread
> > if((!fromTicker) &&
> > NativeThread.usingNativeCode() && prio >
> Thread.currentThread().getPriority()) {
> > @@ -73,16 +73,18 @@
> > return;
> > }
> > // 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);
> > - threadCounter[prio-1]++;
> > + t = new MyThread("Pooled thread
> > awaiting work @" +
> (threadCounter[prio - 1]), threadCounter[prio - 1], prio, !fromTicker);
> > + threadCounter[prio - 1]++;
> > t.setDaemon(true);
> > mustStart = true;
> > miss = true;
> > }
> > }
> > synchronized(t) {
> > - if(!t.alive) continue;
> > - if(t.nextJob != null) continue;
> > + 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
> > @@ -90,44 +92,46 @@
> > // level code. So we'd best use
> > notifyAll().
> > t.notifyAll();
> > }
> > - t.setName(jobName+"("+t.threadNo+")");
> > + t.setName(jobName + "(" + t.threadNo + ")");
> > if(mustStart) {
> > t.start();
> > synchronized(this) {
> > - runningThreads[prio-1].add(t);
> > + runningThreads[prio - 1].add(t);
> > if(miss)
> > jobMisses++;
> > if(logMINOR)
> > - Logger.minor(this, "Jobs:
> > "+jobMisses+" misses of "+jobCount+"
> starting urgently "+jobName);
> > + Logger.minor(this, "Jobs: " +
> > jobMisses + " misses of " + jobCount
> + " starting urgently " + jobName);
> > }
> > - } else {
> > + } else
> > if(logMINOR)
> > - Logger.minor(this, "Not starting: Jobs:
> > "+jobMisses+" misses
> of "+jobCount+" starting urgently "+jobName);
> > - }
> > + synchronized(this) {
> > + Logger.minor(this, "Not
> > starting: Jobs: " + jobMisses + " misses of "
> + jobCount + " starting urgently " + jobName);
> > + }
> > return;
> > }
> > }
> >
> > public synchronized int[] runningThreads() {
> > int[] result = new int[runningThreads.length];
> > - for(int i=0; i<result.length; i++)
> > + for(int i = 0; i < result.length; i++)
> > result[i] = runningThreads[i].size();
> > return result;
> > }
> > -
> > +
> > public synchronized int[] waitingThreads() {
> > int[] result = new int[waitingThreads.length];
> > - for(int i=0; i<result.length; i++)
> > + for(int i = 0; i < result.length; i++)
> > result[i] = waitingThreads[i].size();
> > return result;
> > }
> > -
> > +
> > class MyThread extends NativeThread {
> > +
> > final String defaultName;
> > boolean alive = true;
> > Runnable nextJob;
> > final long threadNo;
> > -
> > +
> > public MyThread(String defaultName, long threadCounter, int
> > prio, boolean
> dontCheckRenice) {
> > super(defaultName, prio, dontCheckRenice);
> > this.defaultName = defaultName;
> > @@ -140,53 +144,49 @@
> > int nativePriority = getNativePriority();
> > while(true) {
> > Runnable job;
> > -
> > +
> > synchronized(this) {
> > job = nextJob;
> > nextJob = null;
> > }
> > -
> > +
> > if(job == null) {
> > synchronized(PooledExecutor.this) {
> > -
> > waitingThreads[nativePriority-1].add(this);
> > + waitingThreads[nativePriority -
> > 1].add(this);
> > }
> > synchronized(this) {
> > if(nextJob == null) {
> >
> > this.setName(defaultName);
> > try {
> > wait(TIMEOUT);
> > - } catch
> > (InterruptedException e) {
> > - // Ignore
> > + }
> > catch(InterruptedException e) {
> > + // Ignore
> > }
> > }
> > job = nextJob;
> > nextJob = null;
> > - if(job == null) {
> > + if(job == null)
> > alive = false;
> > - // execute() won't give
> > us another job if alive = false
> > - }
> > }
> > synchronized(PooledExecutor.this) {
> > -
> > waitingThreads[nativePriority-1].remove(this);
> > + waitingThreads[nativePriority -
> > 1].remove(this);
> > if(!alive) {
> > -
> > runningThreads[nativePriority-1].remove(this);
> > +
> > runningThreads[nativePriority - 1].remove(this);
> > if(logMINOR)
> > -
> > Logger.minor(this, "Exiting having executed "+ranJobs+"
> jobs : "+this);
> > +
> > Logger.minor(this, "Exiting having executed " + ranJobs + "
> jobs : " + this);
> > return;
> > }
> > }
> > }
> > -
> > +
> > // Run the job
> > try {
> > job.run();
> > - } catch (Throwable t) {
> > - Logger.error(this, "Caught "+t+"
> > running job "+job, t);
> > + } catch(Throwable t) {
> > + Logger.error(this, "Caught " + t + "
> > running job " + job, t);
> > }
> > ranJobs++;
> > }
> > }
> > -
> > }
> > -
> > }
> >
> > _______________________________________________
> > cvs mailing list
> > cvs at freenetproject.org
> > http://emu.freenetproject.org/cgi-bin/mailman/listinfo/cvs
> >
> >
> _______________________________________________
> Devl mailing list
> Devl at freenetproject.org
> http://emu.freenetproject.org/cgi-bin/mailman/listinfo/devl
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 189 bytes
Desc: Digital signature
URL:
<https://emu.freenetproject.org/pipermail/devl/attachments/20080405/9de4eb29/attachment.pgp>