aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorlana <none@none>2012-08-30 20:10:29 -0700
committerlana <none@none>2012-08-30 20:10:29 -0700
commit8d5a997d87e7b733084248cc0395e81954a7d40a (patch)
treed31216cf3ac7e9bc1c7c448d5aa443f14687a456
parent01e46101aceb3935c99ccd24f540794a79e9dbe6 (diff)
parente8c429a8194352eb9889a6f1c57ecbfabe050498 (diff)
-rw-r--r--src/share/classes/com/sun/corba/se/impl/transport/CorbaResponseWaitingRoomImpl.java75
-rw-r--r--src/share/classes/com/sun/corba/se/impl/transport/SocketOrChannelConnectionImpl.java5
2 files changed, 47 insertions, 33 deletions
diff --git a/src/share/classes/com/sun/corba/se/impl/transport/CorbaResponseWaitingRoomImpl.java b/src/share/classes/com/sun/corba/se/impl/transport/CorbaResponseWaitingRoomImpl.java
index ce0752d..57104f2 100644
--- a/src/share/classes/com/sun/corba/se/impl/transport/CorbaResponseWaitingRoomImpl.java
+++ b/src/share/classes/com/sun/corba/se/impl/transport/CorbaResponseWaitingRoomImpl.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2001, 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -25,7 +25,10 @@
package com.sun.corba.se.impl.transport;
-import java.util.Hashtable;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
import org.omg.CORBA.CompletionStatus;
import org.omg.CORBA.SystemException;
@@ -68,7 +71,7 @@ public class CorbaResponseWaitingRoomImpl
private CorbaConnection connection;
// Maps requestId to an OutCallDesc.
- private Hashtable out_calls = null; // REVISIT - use int hastable/map
+ final private Map<Integer, OutCallDesc> out_calls;
public CorbaResponseWaitingRoomImpl(ORB orb, CorbaConnection connection)
{
@@ -76,7 +79,8 @@ public class CorbaResponseWaitingRoomImpl
wrapper = ORBUtilSystemException.get( orb,
CORBALogDomains.RPC_TRANSPORT ) ;
this.connection = connection;
- out_calls = new Hashtable();
+ out_calls =
+ Collections.synchronizedMap(new HashMap<Integer, OutCallDesc>());
}
////////////////////////////////////////////////////
@@ -139,7 +143,7 @@ public class CorbaResponseWaitingRoomImpl
return null;
}
- OutCallDesc call = (OutCallDesc)out_calls.get(requestId);
+ OutCallDesc call = out_calls.get(requestId);
if (call == null) {
throw wrapper.nullOutCall(CompletionStatus.COMPLETED_MAYBE);
}
@@ -197,7 +201,7 @@ public class CorbaResponseWaitingRoomImpl
LocateReplyOrReplyMessage header = (LocateReplyOrReplyMessage)
inputObject.getMessageHeader();
Integer requestId = new Integer(header.getRequestId());
- OutCallDesc call = (OutCallDesc) out_calls.get(requestId);
+ OutCallDesc call = out_calls.get(requestId);
if (orb.transportDebugFlag) {
dprint(".responseReceived: id/"
@@ -248,7 +252,6 @@ public class CorbaResponseWaitingRoomImpl
public int numberRegistered()
{
- // Note: Hashtable.size() is not synchronized
return out_calls.size();
}
@@ -264,29 +267,41 @@ public class CorbaResponseWaitingRoomImpl
dprint(".signalExceptionToAllWaiters: " + systemException);
}
- OutCallDesc call;
- java.util.Enumeration e = out_calls.elements();
- while(e.hasMoreElements()) {
- call = (OutCallDesc) e.nextElement();
-
- synchronized(call.done){
- // anything waiting for BufferManagerRead's fragment queue
- // needs to be cancelled
- CorbaMessageMediator corbaMsgMediator =
- (CorbaMessageMediator)call.messageMediator;
- CDRInputObject inputObject =
- (CDRInputObject)corbaMsgMediator.getInputObject();
- // IMPORTANT: If inputObject is null, then no need to tell
- // BufferManagerRead to cancel request processing.
- if (inputObject != null) {
- BufferManagerReadStream bufferManager =
- (BufferManagerReadStream)inputObject.getBufferManager();
- int requestId = corbaMsgMediator.getRequestId();
- bufferManager.cancelProcessing(requestId);
+ synchronized (out_calls) {
+ if (orb.transportDebugFlag) {
+ dprint(".signalExceptionToAllWaiters: out_calls size :" +
+ out_calls.size());
+ }
+
+ for (OutCallDesc call : out_calls.values()) {
+ if (orb.transportDebugFlag) {
+ dprint(".signalExceptionToAllWaiters: signaling " +
+ call);
+ }
+ synchronized(call.done) {
+ try {
+ // anything waiting for BufferManagerRead's fragment queue
+ // needs to be cancelled
+ CorbaMessageMediator corbaMsgMediator =
+ (CorbaMessageMediator)call.messageMediator;
+ CDRInputObject inputObject =
+ (CDRInputObject)corbaMsgMediator.getInputObject();
+ // IMPORTANT: If inputObject is null, then no need to tell
+ // BufferManagerRead to cancel request processing.
+ if (inputObject != null) {
+ BufferManagerReadStream bufferManager =
+ (BufferManagerReadStream)inputObject.getBufferManager();
+ int requestId = corbaMsgMediator.getRequestId();
+ bufferManager.cancelProcessing(requestId);
+ }
+ } catch (Exception e) {
+ } finally {
+ // attempt to wake up waiting threads in all cases
+ call.inputObject = null;
+ call.exception = systemException;
+ call.done.notifyAll();
+ }
}
- call.inputObject = null;
- call.exception = systemException;
- call.done.notify();
}
}
}
@@ -294,7 +309,7 @@ public class CorbaResponseWaitingRoomImpl
public MessageMediator getMessageMediator(int requestId)
{
Integer id = new Integer(requestId);
- OutCallDesc call = (OutCallDesc) out_calls.get(id);
+ OutCallDesc call = out_calls.get(id);
if (call == null) {
// This can happen when getting early reply fragments for a
// request which has completed (e.g., client marshaling error).
diff --git a/src/share/classes/com/sun/corba/se/impl/transport/SocketOrChannelConnectionImpl.java b/src/share/classes/com/sun/corba/se/impl/transport/SocketOrChannelConnectionImpl.java
index 277657e..39fb4fe 100644
--- a/src/share/classes/com/sun/corba/se/impl/transport/SocketOrChannelConnectionImpl.java
+++ b/src/share/classes/com/sun/corba/se/impl/transport/SocketOrChannelConnectionImpl.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2001, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -1521,7 +1521,7 @@ public class SocketOrChannelConnectionImpl
// connection and give them the SystemException;
responseWaitingRoom.signalExceptionToAllWaiters(systemException);
-
+ } finally {
if (contactInfo != null) {
((OutboundConnectionCache)getConnectionCache()).remove(contactInfo);
} else if (acceptor != null) {
@@ -1542,7 +1542,6 @@ public class SocketOrChannelConnectionImpl
writeUnlock();
- } finally {
if (orb.transportDebugFlag) {
dprint(".purgeCalls<-: "
+ minor_code + "/" + die + "/" + lockHeld