@Override public void cleanEvents() { eventQueue.clear(); }
boolean hasEvent() { return !eventQueue.isEmpty(); }
@Override public void enqueue(KompicsEvent event) { eventQueue.offer(event); }
KompicsEvent pickFirstEvent() { return eventQueue.poll(); }
/** * Instantiates a new worker. * * @param scheduler * the scheduler * @param wid * the wid */ public Worker(WorkStealingScheduler scheduler, int wid) { super(); this.scheduler = scheduler; this.wid = wid; this.workQueue = new SpinlockQueue<ComponentCore>(); this.workCount = new AtomicInteger(0); this.shouldQuit = new AtomicBoolean(false); super.setName("Kompics worker-" + wid); }
final ComponentCore getWork() { ComponentCore core = workQueue.poll(); if (core != null) { workCount.decrementAndGet(); } return core; }
/** * Instantiates a new scheduler. * * @param wc the wc */ public WorkStealingScheduler(int wc) { workerCount = wc; workers = new Worker[workerCount]; sleepingWorkers = new SpinlockQueue<Worker>(); sleepingWorkerCount = new AtomicInteger(0); on = new boolean[workerCount]; for (int i = 0; i < workers.length; i++) { workers[i] = new Worker(this, i); on[i] = true; } }
final void addWork(ComponentCore core) { workQueue.offer(core); workCount.incrementAndGet(); workAvailable.set(true); }
public final void schedule(Component component, int wid) { ComponentCore core = (ComponentCore) component; // check if any worker need waking up int swc = sleepingWorkerCount.get(); Worker toAwake = null; if (swc > 0) { swc = sleepingWorkerCount.getAndDecrement(); if (swc > 0) { toAwake = sleepingWorkers.poll(); } } if (toAwake == null) { // add new work to the queue of the worker who generated it workers[wid].addWork(core); } else { // add new work to the queue of the worker to be awaken workers[toAwake.getWid()].addWork(core); // wake up sleeping worker synchronized (toAwake) { toAwake.notify(); } } }
public void eventReceived(PortCore<?> port, KompicsEvent event, int wid) { //System.err.println("Received event " + event + " on " + port.getPortType().portTypeClass + " work " + workCount.get()); port.enqueue(event); readyPorts.offer(port); int wc = workCount.getAndIncrement(); if (wc == 0) { schedule(wid); } }
private final boolean executeComponent() { ComponentCore core = null; do { // try to do local work core = workQueue.poll(); if (core == null) { // got no more work; should I quit? if (shouldQuit.get()) { return false; } // try to steal work from other workers workStealingCount++; core = scheduler.stealWork(wid); if (core == null) { // there is no work in the system sleepCount++; scheduler.waitForWork(this); } } else { workCount.decrementAndGet(); } } while (core == null); executionCount++; scheduler.execute(core, wid); // core.execute(wid); return true; }
final void waitForWork(Worker w) { synchronized (w) { sleepingWorkers.offer(w); sleepingWorkerCount.incrementAndGet(); // try { // // Kompics.logger.debug("{} sleeping.", w.getWid()); // if (!on[w.getWid()]) { // // do not wait when the worker is supposed to quit // return; // } // // w.wait(); // } catch (InterruptedException e) { // } // Kompics.logger.debug("{} sleeping.", w.getWid()); if (!on[w.getWid()]) { // do not wait when the worker is supposed to quit return; } w.waitForWork(); // Kompics.logger.debug("{} woke up.", w.getWid()); } }