001: /*
002: * All content copyright (c) 2003-2006 Terracotta, Inc., except as may otherwise be noted in a separate copyright notice. All rights reserved.
003: */
004: package com.tctest;
005:
006: import EDU.oswego.cs.dl.util.concurrent.CyclicBarrier;
007:
008: import com.tc.object.config.ConfigVisitor;
009: import com.tc.object.config.DSOClientConfigHelper;
010: import com.tc.object.config.TransparencyClassSpec;
011: import com.tc.simulator.app.ApplicationConfig;
012: import com.tc.simulator.listener.ListenerProvider;
013: import com.tc.util.Assert;
014: import com.tctest.runner.AbstractTransparentApp;
015:
016: import java.util.concurrent.atomic.AtomicLong;
017:
018: public class AtomicLongTestApp extends AbstractTransparentApp {
019:
020: private final CyclicBarrier barrier;
021:
022: private final DataRoot root = new DataRoot();
023:
024: public AtomicLongTestApp(String appId, ApplicationConfig cfg,
025: ListenerProvider listenerProvider) {
026: super (appId, cfg, listenerProvider);
027: barrier = new CyclicBarrier(getParticipantCount());
028: }
029:
030: public void run() {
031: try {
032: atomicIntegerTesting();
033: } catch (Throwable t) {
034: notifyError(t);
035: }
036: }
037:
038: private void atomicIntegerTesting() throws Exception {
039: basicSetTesting();
040: basicGetTesting();
041: addAndGetTesting();
042: compareAndSetTesting();
043: weakCompareAndSetTesting();
044: getAndIncrementTesting();
045: getAndDecrementTesting();
046: getAndSetTesting();
047: getAndAddTesting();
048: incrementAndGetTesting();
049: decrementAndGetTesting();
050: }
051:
052: private void clear() throws Exception {
053: synchronized (root) {
054: root.clear();
055: }
056:
057: barrier.barrier();
058: }
059:
060: private void initialize() throws Exception {
061:
062: int index = barrier.barrier();
063: if (index == 0) {
064: root.getLongValue().set(10);
065: }
066:
067: barrier.barrier();
068: }
069:
070: private void basicSetTesting() throws Exception {
071: clear();
072: initialize();
073:
074: Assert.assertEquals(10, root.getLongValue().get());
075:
076: barrier.barrier();
077: }
078:
079: private void basicGetTesting() throws Exception {
080: clear();
081: initialize();
082:
083: Assert.assertEquals(10, root.getLongValue().get());
084: Assert.assertEquals(10.0D, root.getLongValue().doubleValue());
085: Assert.assertEquals((byte) 10, root.getLongValue().byteValue());
086: Assert.assertEquals(10.0f, root.getLongValue().floatValue());
087: Assert.assertEquals(10, root.getLongValue().intValue());
088: Assert.assertEquals(10L, root.getLongValue().longValue());
089: Assert.assertEquals(10, root.getLongValue().shortValue());
090:
091: barrier.barrier();
092: }
093:
094: private void addAndGetTesting() throws Exception {
095: clear();
096: initialize();
097:
098: int index = barrier.barrier();
099: if (index == 0) {
100: long val = root.getLongValue().addAndGet(4);
101: Assert.assertEquals(14, val);
102: }
103:
104: barrier.barrier();
105:
106: Assert.assertEquals(14, root.getLongValue().get());
107:
108: barrier.barrier();
109: }
110:
111: private void compareAndSetTesting() throws Exception {
112: clear();
113: initialize();
114:
115: int index = barrier.barrier();
116: if (index == 0) {
117: root.getLongValue().compareAndSet(10, 18);
118: }
119:
120: barrier.barrier();
121:
122: Assert.assertEquals(18, root.getLongValue().get());
123:
124: barrier.barrier();
125: }
126:
127: private void weakCompareAndSetTesting() throws Exception {
128: clear();
129: initialize();
130:
131: int index = barrier.barrier();
132: if (index == 0) {
133: root.getLongValue().weakCompareAndSet(10, 20);
134: }
135:
136: barrier.barrier();
137:
138: Assert.assertEquals(20, root.getLongValue().get());
139:
140: barrier.barrier();
141: }
142:
143: private void getAndIncrementTesting() throws Exception {
144: clear();
145: initialize();
146:
147: int index = barrier.barrier();
148: if (index == 0) {
149: long val = root.getLongValue().getAndIncrement();
150: Assert.assertEquals(10, val);
151: }
152:
153: barrier.barrier();
154:
155: Assert.assertEquals(11, root.getLongValue().get());
156:
157: barrier.barrier();
158: }
159:
160: private void getAndDecrementTesting() throws Exception {
161: clear();
162: initialize();
163:
164: int index = barrier.barrier();
165: if (index == 0) {
166: long val = root.getLongValue().getAndDecrement();
167: Assert.assertEquals(10, val);
168: }
169:
170: barrier.barrier();
171:
172: Assert.assertEquals(9, root.getLongValue().get());
173:
174: barrier.barrier();
175: }
176:
177: private void getAndSetTesting() throws Exception {
178: clear();
179: initialize();
180:
181: int index = barrier.barrier();
182: if (index == 0) {
183: long val = root.getLongValue().getAndSet(200);
184: Assert.assertEquals(10, val);
185: }
186:
187: barrier.barrier();
188:
189: Assert.assertEquals(200, root.getLongValue().get());
190:
191: barrier.barrier();
192: }
193:
194: private void getAndAddTesting() throws Exception {
195: clear();
196: initialize();
197:
198: int index = barrier.barrier();
199: if (index == 0) {
200: long val = root.getLongValue().getAndAdd(5);
201: Assert.assertEquals(10, val);
202: }
203:
204: barrier.barrier();
205:
206: Assert.assertEquals(15, root.getLongValue().get());
207:
208: barrier.barrier();
209: }
210:
211: private void incrementAndGetTesting() throws Exception {
212: clear();
213: initialize();
214:
215: int index = barrier.barrier();
216: if (index == 0) {
217: long val = root.getLongValue().incrementAndGet();
218: Assert.assertEquals(11, val);
219: }
220:
221: barrier.barrier();
222:
223: Assert.assertEquals(11, root.getLongValue().get());
224:
225: barrier.barrier();
226: }
227:
228: private void decrementAndGetTesting() throws Exception {
229: clear();
230: initialize();
231:
232: int index = barrier.barrier();
233: if (index == 0) {
234: long val = root.getLongValue().decrementAndGet();
235: Assert.assertEquals(9, val);
236: }
237:
238: barrier.barrier();
239:
240: Assert.assertEquals(9, root.getLongValue().get());
241:
242: barrier.barrier();
243: }
244:
245: public static void visitL1DSOConfig(ConfigVisitor visitor,
246: DSOClientConfigHelper config) {
247: TransparencyClassSpec spec = config
248: .getOrCreateSpec(CyclicBarrier.class.getName());
249: config.addWriteAutolock("* " + CyclicBarrier.class.getName()
250: + "*.*(..)");
251:
252: String testClass = AtomicLongTestApp.class.getName();
253: spec = config.getOrCreateSpec(testClass);
254:
255: config.addIncludePattern(testClass + "$*");
256:
257: String methodExpression = "* " + testClass + "*.*(..)";
258: config.addWriteAutolock(methodExpression);
259:
260: spec.addRoot("barrier", "barrier");
261: spec.addRoot("root", "root");
262: }
263:
264: private static class DataRoot {
265: private AtomicLong longValue = new AtomicLong(0);
266:
267: public DataRoot() {
268: super ();
269: }
270:
271: public AtomicLong getLongValue() {
272: return longValue;
273: }
274:
275: public void setLongValue(AtomicLong longValue) {
276: this .longValue = longValue;
277: }
278:
279: public void clear() {
280: longValue.set(0);
281: }
282: }
283: }
|