~ubuntu-branches/ubuntu/raring/libjboss-remoting-java/raring

« back to all changes in this revision

Viewing changes to src/main/org/jboss/remoting/samples/chat/utility/ReadWriteArrayList.java

  • Committer: Package Import Robot
  • Author(s): Torsten Werner
  • Date: 2011-09-09 14:01:03 UTC
  • mto: This revision was merged to the branch mainline in revision 9.
  • Revision ID: package-import@ubuntu.com-20110909140103-o8ucrolqt5g25k57
Tags: upstream-2.5.3.SP1
ImportĀ upstreamĀ versionĀ 2.5.3.SP1

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
package org.jboss.remoting.samples.chat.utility;
 
2
 
 
3
/**
 
4
 * <p>Title: Chat4</p>
 
5
 * <p>Description: </p>
 
6
 * <p>Copyright: Copyright (c) 2003</p>
 
7
 * <p>Company: </p>
 
8
 * @author not attributable
 
9
 * @version 1.0
 
10
 */
 
11
 
 
12
import java.util.*;
 
13
import java.io.*;
 
14
 
 
15
public class ReadWriteArrayList implements Serializable
 
16
{
 
17
  private ArrayList arrayList;
 
18
  private static final long serialVersionUID = 6;
 
19
  private Gate gate = new Gate();
 
20
 
 
21
  public ReadWriteArrayList()
 
22
  {
 
23
      arrayList = new ArrayList();
 
24
  }
 
25
 
 
26
  public boolean add(Object o)
 
27
  {
 
28
    gate.enterWrite();
 
29
    arrayList.add(o);
 
30
    gate.leaveWrite();
 
31
    return true;
 
32
  }
 
33
 
 
34
  public Object get(int i)
 
35
  {
 
36
    gate.enterRead(i);
 
37
    Object o = arrayList.get(i);
 
38
    gate.leaveRead();
 
39
    return o;
 
40
  }
 
41
 
 
42
  public ArrayList copy()
 
43
  {
 
44
    return (ArrayList) subList(0, arrayList.size());
 
45
  }
 
46
 
 
47
  public List subList(int from, int to)
 
48
  {
 
49
    gate.enterRead(to - 1);
 
50
    List list = new ArrayList(arrayList.subList(from, to));
 
51
    gate.leaveRead();
 
52
    return list;
 
53
  }
 
54
 
 
55
  public Object firstElement()
 
56
  {
 
57
    return get(0);
 
58
  }
 
59
 
 
60
  public Object remove(int i)
 
61
  {
 
62
    gate.enterRead(i);
 
63
    Object o = arrayList.remove(i);
 
64
    gate.leaveRead();
 
65
    return o;
 
66
  }
 
67
 
 
68
  public int size()
 
69
  {
 
70
    return arrayList.size();
 
71
  }
 
72
 
 
73
  public Object[] toArray()
 
74
  {
 
75
    return arrayList.toArray();
 
76
  }
 
77
 
 
78
  public Object[] toArray(Object[] a)
 
79
  {
 
80
    return arrayList.toArray(a);
 
81
  }
 
82
 
 
83
  public ArrayList toArrayList()
 
84
  {
 
85
    return arrayList;
 
86
  }
 
87
 
 
88
 
 
89
////////////////////////////////////////////////////////////////////////////////
 
90
  class Gate implements Serializable
 
91
  {
 
92
    private static final long serialVersionUID = 7;
 
93
 
 
94
    private int numberOfReaders;
 
95
    private int numberOfWriters;
 
96
 
 
97
    public synchronized void enterRead(int i)
 
98
    {
 
99
      while (numberOfWriters > 0 || i > arrayList.size() - 1)
 
100
      {
 
101
        try {
 
102
          wait();
 
103
        }
 
104
        catch (InterruptedException ie) { }
 
105
      }
 
106
 
 
107
      numberOfReaders++;
 
108
    }
 
109
 
 
110
    public synchronized void enterWrite()
 
111
    {
 
112
      while (numberOfWriters > 0 || numberOfReaders > 0)
 
113
      {
 
114
        try {
 
115
          wait();
 
116
        }
 
117
        catch (InterruptedException ie) { }
 
118
      }
 
119
 
 
120
      numberOfWriters++;
 
121
    }
 
122
 
 
123
    public synchronized void leaveRead()
 
124
    {
 
125
      if (numberOfReaders <= 0)
 
126
        throw new Error("number of readers <= 0");
 
127
 
 
128
      numberOfReaders--;
 
129
      notifyAll();
 
130
    }
 
131
 
 
132
    public synchronized void leaveWrite()
 
133
    {
 
134
      if (numberOfWriters <= 0)
 
135
        throw new Error("number of writers <= 0");
 
136
 
 
137
      numberOfWriters--;
 
138
      notifyAll();
 
139
    }
 
140
  }
 
141
////////////////////////////////////////////////////////////////////////////////
 
142
 
 
143
}
 
 
b'\\ No newline at end of file'