1 //******************************************************************************
2 //
3 // File: IORequestList.java
4 // Package: edu.rit.mp
5 // Unit: Class edu.rit.mp.IORequestList
6 //
7 // This Java source file is copyright (C) 2006 by Alan Kaminsky. All rights
8 // reserved. For further information, contact the author, Alan Kaminsky, at
9 // ark@cs.rit.edu.
10 //
11 // This Java source file is part of the Parallel Java Library ("PJ"). PJ is free
12 // software; you can redistribute it and/or modify it under the terms of the GNU
13 // General Public License as published by the Free Software Foundation; either
14 // version 3 of the License, or (at your option) any later version.
15 //
16 // PJ is distributed in the hope that it will be useful, but WITHOUT ANY
17 // WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
18 // A PARTICULAR PURPOSE. See the GNU General Public License for more details.
19 //
20 // Linking this library statically or dynamically with other modules is making a
21 // combined work based on this library. Thus, the terms and conditions of the GNU
22 // General Public License cover the whole combination.
23 //
24 // As a special exception, the copyright holders of this library give you
25 // permission to link this library with independent modules to produce an
26 // executable, regardless of the license terms of these independent modules, and
27 // to copy and distribute the resulting executable under terms of your choice,
28 // provided that you also meet, for each linked independent module, the terms
29 // and conditions of the license of that module. An independent module is a module
30 // which is not derived from or based on this library. If you modify this library,
31 // you may extend this exception to your version of the library, but you are not
32 // obligated to do so. If you do not wish to do so, delete this exception
33 // statement from your version.
34 //
35 // A copy of the GNU General Public License is provided in the file gpl.txt. You
36 // may also obtain a copy of the GNU General Public License on the World Wide
37 // Web at http://www.gnu.org/licenses/gpl.html.
38 //
39 //******************************************************************************
40 package edu.rit.mp;
41
42 import java.io.IOException;
43 import java.io.PrintStream;
44 import java.util.Iterator;
45 import java.util.LinkedList;
46
47 /**
48 * Class IORequestList provides a list of pending I/O requests in the Message
49 * Protocol (MP).
50 *
51 * @author Alan Kaminsky
52 * @version 26-Oct-2006
53 */
54 class IORequestList {
55
56 // Hidden data members.
57 LinkedList<IORequest> myList = new LinkedList<IORequest>();
58
59 // Exported constructors.
60 /**
61 * Construct a new I/O request list.
62 */
63 public IORequestList() {
64 }
65
66 // Exported operations.
67 /**
68 * Add the given I/O request to this list. This list maintains the I/O
69 * requests in FIFO order.
70 *
71 * @param theIORequest I/O request.
72 */
73 public synchronized void add(IORequest theIORequest) {
74 myList.add(theIORequest);
75 notifyAll();
76 }
77
78 /**
79 * Remove an I/O request from this list that matches the given I/O request.
80 * The first matching I/O request, if any, is returned.
81 *
82 * @param theIORequest I/O request.
83 * @return Matching I/O request removed from this list, or null if there was
84 * no match.
85 */
86 public synchronized IORequest removeMatch(IORequest theIORequest) {
87 Iterator<IORequest> iter = myList.iterator();
88 while (iter.hasNext()) {
89 IORequest iorequest = iter.next();
90 if (iorequest.match(theIORequest)) {
91 iter.remove();
92 return iorequest;
93 }
94 }
95 return null;
96 }
97
98 /**
99 * Remove an I/O request from this list that matches the given channel,
100 * message tag, and message type. The first matching I/O request, if any, is
101 * returned.
102 *
103 * @param channel Channel.
104 * @param tag Message tag.
105 * @param type Message type.
106 * @return Matching I/O request removed from this list, or null if there was
107 * no match.
108 */
109 public synchronized IORequest removeMatch(Channel channel,
110 Integer tag,
111 byte type) {
112 Iterator<IORequest> iter = myList.iterator();
113 while (iter.hasNext()) {
114 IORequest iorequest = iter.next();
115 if (iorequest.match(channel, tag, type)) {
116 iter.remove();
117 return iorequest;
118 }
119 }
120 return null;
121 }
122
123 /**
124 * Wait for an I/O request that matches the given I/O request to be added to
125 * this list, then remove it. The first matching I/O request is returned.
126 *
127 * @param theIORequest I/O request.
128 * @return Matching I/O request removed from this list.
129 * @exception InterruptedException Thrown if the calling thread was
130 * interrupted while blocked in this method.
131 * @throws java.lang.InterruptedException if any.
132 */
133 public synchronized IORequest waitForMatch(IORequest theIORequest)
134 throws InterruptedException {
135 IORequest iorequest;
136 while ((iorequest = removeMatch(theIORequest)) == null) {
137 //System.out.println ("IORequest.waitForMatch("+theIORequest+") waiting, myList="+this);
138 wait();
139 }
140 return iorequest;
141 }
142
143 /**
144 * Wait for an I/O request that matches the given channel, message tag, and
145 * message type to be added to this list, then remove it. The first matching
146 * I/O request is returned.
147 *
148 * @return Matching I/O request removed from this list.
149 * @exception InterruptedException Thrown if the calling thread was
150 * interrupted while blocked in this method.
151 * @param channel a {@link edu.rit.mp.Channel} object.
152 * @param tag a {@link java.lang.Integer} object.
153 * @param type a byte.
154 * @throws java.lang.InterruptedException if any.
155 */
156 public synchronized IORequest waitForMatch(Channel channel,
157 Integer tag,
158 byte type)
159 throws InterruptedException {
160 IORequest iorequest;
161 while ((iorequest = removeMatch(channel, tag, type)) == null) {
162 //System.out.println ("IORequest.waitForMatch("+channel+","+tag+","+type+") waiting, myList="+this);
163 wait();
164 }
165 return iorequest;
166 }
167
168 /**
169 * Report that every I/O request in this list failed with an I/O exception.
170 *
171 * @param theIOException I/O exception.
172 */
173 public synchronized void reportFailure(IOException theIOException) {
174 IORequest iorequest = null;
175 while (!myList.isEmpty()) {
176 iorequest = myList.remove(0);
177 iorequest.reportFailure(theIOException);
178 }
179 }
180
181 /**
182 * Dump the state of this I/O request list on the given print stream. For
183 * debugging.
184 *
185 * @param out Print stream.
186 * @param prefix String to print at the beginning of each line.
187 */
188 public synchronized void dump(PrintStream out,
189 String prefix) {
190 out.println(prefix + getClass().getName() + "@" + Integer.toHexString(System.identityHashCode(this)));
191 out.println(prefix + "\t" + myList.size() + " entries");
192 for (IORequest r : myList) {
193 out.println(prefix + "\t" + r);
194 }
195 }
196
197 }