/* -*- tab-width: 4 -*-
*
* Electric(tm) VLSI Design System
*
* File: SimpleWorker.java
*
* Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* Electric(tm) is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Electric(tm); see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
* Boston, Mass 02111-1307, USA.
*/
package com.sun.electric.tool.util.concurrent.runtime.taskParallel;
import java.util.concurrent.Semaphore;
import com.sun.electric.tool.util.concurrent.datastructures.IStructure;
import com.sun.electric.tool.util.concurrent.patterns.PTask;
import com.sun.electric.tool.util.concurrent.runtime.ThreadID;
/**
*
* Synchronized thread pool worker
*
* Some algorithms requires that the calculation of different steps should run
* step-by-step in parallel. This worker implements the PRAM aspect that in one
* time unit one instruction could be executed in parallel. This worker uses a
* bigger grain size. N (#threads) tasks could be implemented in parallel. After
* the parallel execution is a barrier which could be release by a timer or the
* client application (ThreadPool.getThreadPool().trigger()).
*
* @author Felix Schmidt
*
*/
public class SynchronizedWorker extends PoolWorkerStrategy {
protected IStructure<PTask> taskPool = null;
protected Semaphore sem;
public SynchronizedWorker(IStructure<PTask> taskPool, Semaphore sem) {
super();
this.taskPool = taskPool;
this.abort = false;
this.sem = sem;
}
public void trigger() {
sem.release();
}
/**
* This function iterates while the flag abort is false. <br>
* <b>Algorithm:</b>
* <ul>
* <li>wait for trigger</li>
* <li>pick one task from thread pool's task queue</li>
* <li>if task not equal to null, then set threadId and do some
* initialization work on the task object</li>
* <li>execute the task</li>
* <li>finalize work on the task object</li>
* <li>do it again ...</li>
* </ul>
*/
@Override
public void execute() {
this.threadId = ThreadID.get();
this.executed = 0;
while (!abort) {
this.checkForWait();
sem.acquireUninterruptibly();
// retrieve a new task
PTask task = taskPool.remove();
if (task != null) {
try {
// set the current thread id
task.setThreadID(ThreadID.get());
// do something before execution
task.before();
// execute the task
task.execute();
this.executed++;
} finally {
// do some clean up work etc. after execution of the task
task.after();
// Debug
}
} else {
Thread.yield();
}
}
}
}