1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.transaction.util;
18
19
20
21
22
23
24
25 public class RendezvousBarrier {
26
27 public static final int DEFAULT_TIMEOUT = 20000;
28
29 protected final int parties;
30 protected final String name;
31 protected int count = 0;
32 protected long timeout;
33 protected LoggerFacade logger;
34
35 public RendezvousBarrier(String name, LoggerFacade logger) {
36 this(name, DEFAULT_TIMEOUT, logger);
37 }
38
39 public RendezvousBarrier(String name, long timeout, LoggerFacade logger) {
40 this(name, 2, timeout, logger);
41 }
42
43 public RendezvousBarrier(String name, int parties, long timeout, LoggerFacade logger) {
44 this.parties = parties;
45 this.name = name;
46 this.timeout = timeout;
47 this.logger = logger;
48 }
49
50
51
52
53
54 public synchronized void call() {
55 count++;
56 if (count >= parties) {
57 if (logger.isFineEnabled())
58 logger.logFine("Thread " + Thread.currentThread().getName() + " by CALL COMPLETING barrier " + name);
59 notifyAll();
60 }
61 }
62
63
64
65
66
67
68
69
70 public synchronized void meet() throws InterruptedException {
71 count++;
72 if (count >= parties) {
73 if (logger.isFineEnabled())
74 logger.logFine("Thread " + Thread.currentThread().getName() + " by MEET COMPLETING barrier " + name);
75 notifyAll();
76 } else {
77 if (logger.isFineEnabled()) {
78 logger.logFine(
79 "At barrier "
80 + name
81 + " thread "
82 + Thread.currentThread().getName()
83 + " WAITING for "
84 + (parties - count)
85 + " of "
86 + parties
87 + " parties");
88 }
89 wait(timeout);
90 if (count == 0) {
91
92 } else if (count >= parties) {
93 if (logger.isFineEnabled())
94 logger.logFine("Thread " + Thread.currentThread().getName() + " CONTINUING at barrier " + name);
95 } else {
96 if (logger.isFineEnabled())
97 logger.logFine("Thread " + Thread.currentThread().getName() + " FAILING at barrier " + name);
98 notifyAll();
99 }
100 }
101 }
102
103
104
105
106 public synchronized void reset() {
107 if (logger.isFineEnabled()) logger.logFine("Resetting barrier " + name);
108 count = 0;
109 notifyAll();
110 }
111
112 }