Grrrr, indenting and sync fixes in the same commit.
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 > > -------------- next part -------------- A non-text attachment was scrubbed... Name: not available Type: application/pgp-signature Size: 189 bytes Desc: not available URL: <https://emu.freenetproject.org/pipermail/devl/attachments/20080404/12fd3ab3/attachment.pgp>