// Decompiled by DJ v3.11.11.95 Copyright 2009 Atanas Neshkov Date: 26/10/2010 13:51:27 // Home Page: http://members.fortunecity.com/neshkov/dj.html http://www.neshkov.com/dj.html - Check often for new version! // Decompiler options: packimports(3) package jcircus.classesdescompiladas; // Referenced classes of package org.jcsp.lang: // Guard, AltingBarrierBase, AltingBarrierError, Alternative, // CSTimer, MultiwaySynchronisation public class AltingBarrier extends Guard implements MultiwaySynchronisation { AltingBarrier(AltingBarrierBase altingbarrierbase, AltingBarrier altingbarrier) { next = null; alt = null; myThread = null; enrolled = true; singleAlt = null; pollAlt = null; pollTime = null; base = altingbarrierbase; next = altingbarrier; } public static AltingBarrier[] create(int i) { if(i <= 0) throw new IllegalArgumentException("\n*** An AltingBarrier must have at least one process enrolled, not " + i); else return (new AltingBarrierBase()).expand(i); } public static AltingBarrier create() { return (new AltingBarrierBase()).expand(); } public AltingBarrier[] expand(int i) { if(i <= 0) throw new IllegalArgumentException("\n*** Expanding an AltingBarrier must be by at least one, not " + i); AltingBarrierBase altingbarrierbase = base; JVM INSTR monitorenter ; if(myThread == null) myThread = Thread.currentThread(); else if(myThread != Thread.currentThread()) throw new AltingBarrierError("\n*** AltingBarrier expand attempted by non-owner."); if(!enrolled) throw new AltingBarrierError("\n*** AltingBarrier expand attempted whilst resigned."); return base.expand(i); Exception exception; exception; throw exception; } public AltingBarrier expand() { AltingBarrierBase altingbarrierbase = base; JVM INSTR monitorenter ; if(myThread == null) myThread = Thread.currentThread(); else if(myThread != Thread.currentThread()) throw new AltingBarrierError("\n*** AltingBarrier expand attempted by non-owner."); if(!enrolled) throw new AltingBarrierError("\n*** AltingBarrier expand attempted whilst resigned."); return base.expand(); Exception exception; exception; throw exception; } public void contract(AltingBarrier aaltingbarrier[]) { if(aaltingbarrier == null) throw new IllegalArgumentException("\n*** AltingBarrier contract given a null array."); if(aaltingbarrier.length == 0) throw new IllegalArgumentException("\n*** AltingBarrier contract given an empty array."); synchronized(base) { if(myThread != Thread.currentThread()) throw new AltingBarrierError("\n*** AltingBarrier contract attempted by non-owner."); if(!enrolled) throw new AltingBarrierError("\n*** AltingBarrier contract attempted whilst resigned."); base.contract(aaltingbarrier); } } public void contract() { synchronized(base) { if(myThread != Thread.currentThread()) throw new AltingBarrierError("\n*** AltingBarrier contract attempted by non-owner."); if(!enrolled) throw new AltingBarrierError("\n*** AltingBarrier contract attempted whilst resigned."); base.contract(this); } } boolean enable(Alternative alternative) { AltingBarrierBase altingbarrierbase = base; JVM INSTR monitorenter ; if(myThread == null) myThread = Thread.currentThread(); else if(myThread != Thread.currentThread()) throw new AltingBarrierError("\n*** AltingBarrier front-end enable by more than one Thread."); if(!enrolled) throw new AltingBarrierError("\n*** AltingBarrier front-end enable whilst resigned."); if(alt != null) return false; if(!base.enable()) goto _L2; else goto _L1 _L1: alternative.setBarrierTrigger(); true; altingbarrierbase; JVM INSTR monitorexit ; return; _L2: alt = alternative; false; altingbarrierbase; JVM INSTR monitorexit ; return; Exception exception; exception; throw exception; } boolean disable() { AltingBarrierBase altingbarrierbase = base; JVM INSTR monitorenter ; if(alt == null) return false; if(!base.disable()) goto _L2; else goto _L1 _L1: alt.setBarrierTrigger(); alt = null; true; altingbarrierbase; JVM INSTR monitorexit ; return; _L2: alt = null; false; altingbarrierbase; JVM INSTR monitorexit ; return; Exception exception; exception; throw exception; } void schedule() { if(alt != null) alt.schedule(); } public void resign() { synchronized(base) { if(!enrolled) throw new AltingBarrierError("\n*** AltingBarrier.resign() whilst not enrolled."); enrolled = false; base.resign(); } } public void enroll() { synchronized(base) { if(enrolled) throw new AltingBarrierError("\n*** AltingBarrier.enroll() whilst not resigned."); enrolled = true; base.enroll(); } } public void mark() { synchronized(base) { if(!enrolled) throw new AltingBarrierError("\n*** Attempt to AltingBarrier.mark() a resigned front-end."); myThread = Thread.currentThread(); } } public void reset() { synchronized(base) { if(!enrolled) { enrolled = true; base.enroll(); } myThread = null; } } public void sync() { if(singleAlt == null) singleAlt = new Alternative(new Guard[] { this }); singleAlt.priSelect(); } public boolean poll(long l) { if(pollAlt == null) { pollTime = new CSTimer(); pollAlt = new Alternative(new Guard[] { this, pollTime }); } pollTime.setAlarm(pollTime.read() + l); return pollAlt.priSelect() == 0; } AltingBarrierBase base; AltingBarrier next; private Alternative alt; private Thread myThread; boolean enrolled; private Alternative singleAlt; private Alternative pollAlt; private CSTimer pollTime; }