24 */ |
24 */ |
25 |
25 |
26 package com.sun.corba.se.impl.transport; |
26 package com.sun.corba.se.impl.transport; |
27 |
27 |
28 import java.io.IOException; |
28 import java.io.IOException; |
|
29 import java.net.ServerSocket; |
29 import java.nio.channels.ClosedChannelException; |
30 import java.nio.channels.ClosedChannelException; |
30 import java.nio.channels.SelectableChannel; |
31 import java.nio.channels.SelectableChannel; |
|
32 import java.nio.channels.ServerSocketChannel; |
31 import java.nio.channels.SelectionKey; |
33 import java.nio.channels.SelectionKey; |
32 import java.nio.channels.Selector; |
34 import java.nio.channels.Selector; |
|
35 import java.nio.channels.ClosedSelectorException; |
33 import java.util.ArrayList; |
36 import java.util.ArrayList; |
34 import java.util.HashMap; |
37 import java.util.HashMap; |
35 import java.util.Map; |
38 import java.util.Map; |
36 import java.util.Iterator; |
39 import java.util.Iterator; |
37 import java.util.List; |
40 import java.util.List; |
|
41 |
38 |
42 |
39 import com.sun.corba.se.pept.broker.Broker; |
43 import com.sun.corba.se.pept.broker.Broker; |
40 import com.sun.corba.se.pept.transport.Acceptor; |
44 import com.sun.corba.se.pept.transport.Acceptor; |
41 import com.sun.corba.se.pept.transport.Connection; |
45 import com.sun.corba.se.pept.transport.Connection; |
42 import com.sun.corba.se.pept.transport.EventHandler; |
46 import com.sun.corba.se.pept.transport.EventHandler; |
109 SelectionKeyAndOp keyAndOp = new SelectionKeyAndOp(selectionKey, ehOps); |
113 SelectionKeyAndOp keyAndOp = new SelectionKeyAndOp(selectionKey, ehOps); |
110 synchronized(interestOpsList) { |
114 synchronized(interestOpsList) { |
111 interestOpsList.add(keyAndOp); |
115 interestOpsList.add(keyAndOp); |
112 } |
116 } |
113 // tell Selector Thread there's an update to a SelectorKey's Ops |
117 // tell Selector Thread there's an update to a SelectorKey's Ops |
114 selector.wakeup(); |
118 try { |
|
119 if (selector != null) { |
|
120 // wakeup Selector thread to process close request |
|
121 selector.wakeup(); |
|
122 } |
|
123 } catch (Throwable t) { |
|
124 if (orb.transportDebugFlag) { |
|
125 dprint(".registerInterestOps: selector.wakeup: ", t); |
|
126 } |
|
127 } |
115 } |
128 } |
116 else { |
129 else { |
117 wrapper.selectionKeyInvalid(eventHandler.toString()); |
130 wrapper.selectionKeyInvalid(eventHandler.toString()); |
118 if (orb.transportDebugFlag) { |
131 if (orb.transportDebugFlag) { |
119 dprint(".registerInterestOps: EventHandler SelectionKey not valid " + eventHandler); |
132 dprint(".registerInterestOps: EventHandler SelectionKey not valid " + eventHandler); |
184 selectionKey = eventHandler.getSelectionKey(); |
197 selectionKey = eventHandler.getSelectionKey(); |
185 } |
198 } |
186 if (selectionKey != null) { |
199 if (selectionKey != null) { |
187 selectionKey.cancel(); |
200 selectionKey.cancel(); |
188 } |
201 } |
189 selector.wakeup(); |
202 if (selector != null) { |
|
203 selector.wakeup(); |
|
204 } |
190 return; |
205 return; |
191 } |
206 } |
192 |
207 |
193 switch (eventHandler.getInterestOps()) { |
208 switch (eventHandler.getInterestOps()) { |
194 case SelectionKey.OP_ACCEPT : |
209 case SelectionKey.OP_ACCEPT : |
237 while (i.hasNext()) { |
252 while (i.hasNext()) { |
238 ReaderThread readerThread = (ReaderThread) i.next(); |
253 ReaderThread readerThread = (ReaderThread) i.next(); |
239 readerThread.close(); |
254 readerThread.close(); |
240 } |
255 } |
241 |
256 |
|
257 clearDeferredRegistrations(); |
|
258 |
242 // Selector |
259 // Selector |
243 |
260 |
244 try { |
261 try { |
245 if (selector != null) { |
262 if (selector != null) { |
246 // wakeup Selector thread to process close request |
263 // wakeup Selector thread to process close request |
247 selector.wakeup(); |
264 selector.wakeup(); |
248 } |
265 } |
249 } catch (Throwable t) { |
266 } catch (Throwable t) { |
250 if (orb.transportDebugFlag) { |
267 if (orb.transportDebugFlag) { |
251 dprint(".close: selector.close: " + t); |
268 dprint(".close: selector.wakeup: ", t); |
252 } |
269 } |
253 } |
270 } |
254 } |
271 } |
255 |
272 |
256 /////////////////////////////////////////////////// |
273 /////////////////////////////////////////////////// |
271 enableInterestOps(); |
288 enableInterestOps(); |
272 try { |
289 try { |
273 n = selector.select(timeout); |
290 n = selector.select(timeout); |
274 } catch (IOException e) { |
291 } catch (IOException e) { |
275 if (orb.transportDebugFlag) { |
292 if (orb.transportDebugFlag) { |
276 dprint(".run: selector.select: " + e); |
293 dprint(".run: selector.select: ", e); |
277 } |
294 } |
|
295 } catch (ClosedSelectorException csEx) { |
|
296 if (orb.transportDebugFlag) { |
|
297 dprint(".run: selector.select: ", csEx); |
|
298 } |
|
299 break; |
278 } |
300 } |
279 if (closed) { |
301 if (closed) { |
280 selector.close(); |
302 break; |
281 if (orb.transportDebugFlag) { |
|
282 dprint(".run: closed - .run return"); |
|
283 } |
|
284 return; |
|
285 } |
303 } |
286 /* |
304 /* |
287 if (timeout == 0 && orb.transportDebugFlag) { |
305 if (timeout == 0 && orb.transportDebugFlag) { |
288 dprint(".run: selector.select() returned: " + n); |
306 dprint(".run: selector.select() returned: " + n); |
289 } |
307 } |
319 if (orb.transportDebugFlag) { |
337 if (orb.transportDebugFlag) { |
320 dprint(".run: ignoring", t); |
338 dprint(".run: ignoring", t); |
321 } |
339 } |
322 } |
340 } |
323 } |
341 } |
|
342 try { |
|
343 if (selector != null) { |
|
344 if (orb.transportDebugFlag) { |
|
345 dprint(".run: selector.close "); |
|
346 } |
|
347 selector.close(); |
|
348 } |
|
349 } catch (Throwable t) { |
|
350 if (orb.transportDebugFlag) { |
|
351 dprint(".run: selector.close: ", t); |
|
352 } |
|
353 } |
324 } |
354 } |
325 |
355 |
326 ///////////////////////////////////////////////////// |
356 ///////////////////////////////////////////////////// |
327 // |
357 // |
328 // Implementation. |
358 // Implementation. |
329 // |
359 // |
330 |
360 |
|
361 private void clearDeferredRegistrations() { |
|
362 synchronized (deferredRegistrations) { |
|
363 int deferredListSize = deferredRegistrations.size(); |
|
364 if (orb.transportDebugFlag) { |
|
365 dprint(".clearDeferredRegistrations:deferred list size == " + deferredListSize); |
|
366 } |
|
367 for (int i = 0; i < deferredListSize; i++) { |
|
368 EventHandler eventHandler = |
|
369 (EventHandler)deferredRegistrations.get(i); |
|
370 if (orb.transportDebugFlag) { |
|
371 dprint(".clearDeferredRegistrations: " + eventHandler); |
|
372 } |
|
373 SelectableChannel channel = eventHandler.getChannel(); |
|
374 SelectionKey selectionKey = null; |
|
375 |
|
376 try { |
|
377 if (orb.transportDebugFlag) { |
|
378 dprint(".clearDeferredRegistrations:close channel == " |
|
379 + channel); |
|
380 dprint(".clearDeferredRegistrations:close channel class == " |
|
381 + channel.getClass().getName()); |
|
382 } |
|
383 channel.close(); |
|
384 selectionKey = eventHandler.getSelectionKey(); |
|
385 if (selectionKey != null) { |
|
386 selectionKey.cancel(); |
|
387 selectionKey.attach(null); |
|
388 } |
|
389 } catch (IOException ioEx) { |
|
390 if (orb.transportDebugFlag) { |
|
391 dprint(".clearDeferredRegistrations: ", ioEx); |
|
392 } |
|
393 } |
|
394 } |
|
395 deferredRegistrations.clear(); |
|
396 } |
|
397 } |
|
398 |
331 private synchronized boolean isClosed () |
399 private synchronized boolean isClosed () |
332 { |
400 { |
333 return closed; |
401 return closed; |
334 } |
402 } |
335 |
403 |
342 { |
410 { |
343 try { |
411 try { |
344 selector = Selector.open(); |
412 selector = Selector.open(); |
345 } catch (IOException e) { |
413 } catch (IOException e) { |
346 if (orb.transportDebugFlag) { |
414 if (orb.transportDebugFlag) { |
347 dprint(".startSelector: Selector.open: IOException: " + e); |
415 dprint(".startSelector: Selector.open: IOException: ", e); |
348 } |
416 } |
349 // REVISIT - better handling/reporting |
417 // REVISIT - better handling/reporting |
350 RuntimeException rte = |
418 RuntimeException rte = |
351 new RuntimeException(".startSelector: Selector.open exception"); |
419 new RuntimeException(".startSelector: Selector.open exception"); |
352 rte.initCause(e); |
420 rte.initCause(e); |
377 channel.register(selector, |
445 channel.register(selector, |
378 eventHandler.getInterestOps(), |
446 eventHandler.getInterestOps(), |
379 (Object)eventHandler); |
447 (Object)eventHandler); |
380 } catch (ClosedChannelException e) { |
448 } catch (ClosedChannelException e) { |
381 if (orb.transportDebugFlag) { |
449 if (orb.transportDebugFlag) { |
382 dprint(".handleDeferredRegistrations: " + e); |
450 dprint(".handleDeferredRegistrations: ", e); |
383 } |
451 } |
384 } |
452 } |
385 eventHandler.setSelectionKey(selectionKey); |
453 eventHandler.setSelectionKey(selectionKey); |
386 } |
454 } |
387 deferredRegistrations.clear(); |
455 deferredRegistrations.clear(); |