jtulach@114: package org.apidesign.reentrant; jtulach@114: jtulach@114: import java.util.Collection; jtulach@114: import java.util.concurrent.atomic.AtomicInteger; jtulach@114: jtulach@114: public class CriticalSectionReentrantImmutable> implements CriticalSection { jtulach@114: private ImmutableData data = new ImmutableData(); jtulach@114: jtulach@114: public void assignPilot(T pilot) { jtulach@114: data = data.newPilot(pilot); jtulach@114: } jtulach@114: jtulach@114: // BEGIN: reentrant.merge.immutable jtulach@114: public int sumBigger(Collection args) { jtulach@114: for (;;) { jtulach@210: ImmutableData previous; jtulach@210: synchronized (this) { jtulach@210: previous = this.data; jtulach@210: } jtulach@114: int[] ret = { 0 }; jtulach@114: ImmutableData now = doCriticalSection(args, previous, ret); jtulach@114: jtulach@114: synchronized (this) { jtulach@114: // if there was no parallel or reentrant change, jtulach@114: // apply and return. Otherwise try once more. jtulach@114: if (previous == this.data) { jtulach@114: this.data = now; jtulach@114: return ret[0]; jtulach@114: } jtulach@114: } jtulach@114: } jtulach@114: } jtulach@114: // END: reentrant.merge.immutable jtulach@114: jtulach@114: private ImmutableData doCriticalSection(Collection args, ImmutableData data, int[] result) { jtulach@114: result[0] = 0; jtulach@114: for (T cmp : args) { jtulach@114: if (data.pilot.compareTo(cmp) < 0) { jtulach@114: result[0]++; jtulach@114: } jtulach@114: } jtulach@114: return data.newCnt(data.cnt + result[0]); jtulach@114: } jtulach@114: jtulach@114: public int getCount() { jtulach@114: return data.cnt; jtulach@114: } jtulach@114: jtulach@114: private static final class ImmutableData { jtulach@114: final T pilot; jtulach@114: final int cnt; jtulach@114: jtulach@114: public ImmutableData() { jtulach@114: pilot = null; jtulach@114: cnt = 0; jtulach@114: } jtulach@114: private ImmutableData(T pilot, int cnt) { jtulach@114: this.pilot = pilot; jtulach@114: this.cnt = cnt; jtulach@114: } jtulach@114: jtulach@114: public ImmutableData newPilot(T pilot) { jtulach@114: return new ImmutableData(pilot, this.cnt); jtulach@114: } jtulach@114: public ImmutableData newCnt(int cnt) { jtulach@114: return new ImmutableData(this.pilot, cnt); jtulach@114: } jtulach@114: } jtulach@114: }