This commit is contained in:
Tim Bell 2009-04-23 21:29:53 -07:00
commit a17987f7b4
12 changed files with 114 additions and 97 deletions

@ -1,5 +1,5 @@
/*
* Copyright 2000-2003 Sun Microsystems, Inc. All Rights Reserved.
* Copyright 2000-2008 Sun Microsystems, Inc. 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
@ -44,6 +44,7 @@ public class BufferManagerReadStream
// We should convert endOfStream to a final static dummy end node
private boolean endOfStream = true;
private BufferQueue fragmentQueue = new BufferQueue();
private long FRAGMENT_TIMEOUT = 60000;
// REVISIT - This should go in BufferManagerRead. But, since
// BufferManagerRead is an interface. BufferManagerRead
@ -111,9 +112,16 @@ public class BufferManagerReadStream
throw wrapper.endOfStream() ;
}
boolean interrupted = false;
try {
fragmentQueue.wait();
} catch (InterruptedException e) {}
fragmentQueue.wait(FRAGMENT_TIMEOUT);
} catch (InterruptedException e) {
interrupted = true;
}
if (!interrupted && fragmentQueue.size() == 0) {
throw wrapper.bufferReadManagerTimeout();
}
if (receivedCancel) {
throw new RequestCanceledException(cancelReqId);

@ -1,5 +1,5 @@
/*
* Copyright 1998-2004 Sun Microsystems, Inc. All Rights Reserved.
* Copyright 1998-2008 Sun Microsystems, Inc. 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
@ -153,22 +153,22 @@ public class ObjectStreamClass implements java.io.Serializable {
desc = new ObjectStreamClass(cl, superdesc,
serializable, externalizable);
}
// Must always call init. See bug 4488137. This code was
// incorrectly changed to return immediately on a non-null
// cache result. That allowed threads to gain access to
// unintialized instances.
//
// History: Note, the following init() call was originally within
// the synchronization block, as it currently is now. Later, the
// init() call was moved outside the synchronization block, and
// the init() method used a private member variable lock, to
// avoid performance problems. See bug 4165204. But that lead to
// a deadlock situation, see bug 5104239. Hence, the init() method
// has now been moved back into the synchronization block. The
// right approach to solving these problems would be to rewrite
// this class, based on the latest java.io.ObjectStreamClass.
desc.init();
}
// Must always call init. See bug 4488137. This code was
// incorrectly changed to return immediately on a non-null
// cache result. That allowed threads to gain access to
// unintialized instances.
//
// All threads must sync on the member variable lock
// and check the initialization state.
//
// Another possibility is to continue to synchronize on the
// descriptorFor array, but that leads to poor performance
// (see bug 4165204 "ObjectStreamClass can hold global lock
// for a very long time").
desc.init();
return desc;
}

@ -1,5 +1,5 @@
/*
* Copyright 2002-2004 Sun Microsystems, Inc. All Rights Reserved.
* Copyright 2002-2007 Sun Microsystems, Inc. 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
@ -76,6 +76,7 @@ public class POAFactory implements ObjectAdapterFactory
private ORB orb ;
private POASystemException wrapper ;
private OMGSystemException omgWrapper ;
private boolean isShuttingDown = false;
public POASystemException getWrapper()
{
@ -166,6 +167,7 @@ public class POAFactory implements ObjectAdapterFactory
// pm.deactivate removes itself from poaManagers!
Iterator managers = null ;
synchronized (this) {
isShuttingDown = true ;
managers = (new HashSet(poaManagers)).iterator();
}
@ -208,9 +210,15 @@ public class POAFactory implements ObjectAdapterFactory
ClosureFactory.makeFuture( rpClosure ) ) ;
}
public synchronized POA getRootPOA()
{
if (rootPOA == null) {
// See if we are trying to getRootPOA while shutting down the ORB.
if (isShuttingDown) {
throw omgWrapper.noObjectAdaptor( ) ;
}
try {
Object obj = orb.resolve_initial_references(
ORBConstants.ROOT_POA_NAME ) ;

@ -1,5 +1,5 @@
/*
* Copyright 2002-2006 Sun Microsystems, Inc. All Rights Reserved.
* Copyright 2002-2007 Sun Microsystems, Inc. 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
@ -185,7 +185,6 @@ public class ORBImpl extends com.sun.corba.se.spi.orb.ORB
private java.lang.Object runObj = new java.lang.Object();
private java.lang.Object shutdownObj = new java.lang.Object();
private java.lang.Object waitForCompletionObj = new java.lang.Object();
private static final byte STATUS_OPERATING = 1;
private static final byte STATUS_SHUTTING_DOWN = 2;
private static final byte STATUS_SHUTDOWN = 3;
@ -194,7 +193,6 @@ public class ORBImpl extends com.sun.corba.se.spi.orb.ORB
// XXX Should we move invocation tracking to the first level server dispatcher?
private java.lang.Object invocationObj = new java.lang.Object();
private int numInvocations = 0;
// thread local variable to store a boolean to detect deadlock in
// ORB.shutdown(true).
@ -1245,37 +1243,48 @@ public class ORBImpl extends com.sun.corba.se.spi.orb.ORB
public void shutdown(boolean wait_for_completion)
{
synchronized (this) {
checkShutdownState();
// to wait for completion, we would deadlock, so throw a standard
// OMG exception.
if (wait_for_completion && ((Boolean)isProcessingInvocation.get()).booleanValue()) {
throw omgWrapper.shutdownWaitForCompletionDeadlock() ;
}
// Avoid more than one thread performing shutdown at a time.
synchronized (shutdownObj) {
checkShutdownState();
// This is to avoid deadlock
if (wait_for_completion &&
isProcessingInvocation.get() == Boolean.TRUE) {
throw omgWrapper.shutdownWaitForCompletionDeadlock() ;
}
boolean doShutdown = false ;
status = STATUS_SHUTTING_DOWN;
// XXX access to requestDispatcherRegistry should be protected
// by the ORBImpl instance monitor, but is not here in the
// shutdownServants call.
shutdownServants(wait_for_completion);
if (wait_for_completion) {
synchronized ( waitForCompletionObj ) {
while (numInvocations > 0) {
try {
waitForCompletionObj.wait();
} catch (InterruptedException ex) {}
}
synchronized (this) {
checkShutdownState() ;
if (status == STATUS_SHUTTING_DOWN) {
if (!wait_for_completion)
// If we are already shutting down and don't want
// to wait, nothing to do: return.
return ;
} else {
// The ORB status was STATUS_OPERATING, so start the shutdown.
status = STATUS_SHUTTING_DOWN ;
doShutdown = true ;
}
}
// At this point, status is SHUTTING_DOWN.
// All shutdown calls with wait_for_completion == true must synchronize
// here. Only the first call will be made with doShutdown == true.
synchronized (shutdownObj) {
if (doShutdown) {
// shutdownServants will set all POAManagers into the
// INACTIVE state, causing request to be rejected.
// If wait_for_completion is true, this will not return until
// all invocations have completed.
shutdownServants(wait_for_completion);
synchronized (runObj) {
runObj.notifyAll();
}
synchronized (this) {
status = STATUS_SHUTDOWN;
}
}
synchronized ( runObj ) {
runObj.notifyAll();
}
status = STATUS_SHUTDOWN;
}
}
@ -1314,23 +1323,13 @@ public class ORBImpl extends com.sun.corba.se.spi.orb.ORB
{
synchronized (invocationObj) {
isProcessingInvocation.set(Boolean.TRUE);
numInvocations++;
}
}
public void finishedDispatch()
{
synchronized (invocationObj) {
numInvocations--;
isProcessingInvocation.set(Boolean.FALSE);
if (numInvocations == 0) {
synchronized (waitForCompletionObj) {
waitForCompletionObj.notifyAll();
}
} else if (numInvocations < 0) {
throw wrapper.numInvocationsAlreadyZero(
CompletionStatus.COMPLETED_YES ) ;
}
}
}
@ -1341,12 +1340,24 @@ public class ORBImpl extends com.sun.corba.se.spi.orb.ORB
*/
public synchronized void destroy()
{
if (status == STATUS_OPERATING) {
boolean shutdownFirst = false ;
synchronized (this) {
shutdownFirst = (status == STATUS_OPERATING) ;
}
if (shutdownFirst) {
shutdown(true);
}
getCorbaTransportManager().close();
getPIHandler().destroyInterceptors() ;
status = STATUS_DESTROYED;
synchronized (this) {
if (status < STATUS_DESTROYED) {
getCorbaTransportManager().close();
getPIHandler().destroyInterceptors() ;
status = STATUS_DESTROYED;
}
}
}
/**

@ -1,5 +1,5 @@
/*
* Copyright 1997-2004 Sun Microsystems, Inc. All Rights Reserved.
* Copyright 1997-2006 Sun Microsystems, Inc. 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
@ -135,7 +135,7 @@ import com.sun.corba.se.spi.legacy.connection.LegacyServerSocketEndPointInfo;
public class ORBSingleton extends ORB
{
// This is used to support read_Object.
private static ORB fullORB;
private ORB fullORB;
private static PresentationManager.StubFactoryFactory staticStubFactoryFactory =
PresentationDefaults.getStaticStubFactoryFactory() ;

@ -1,5 +1,5 @@
/*
* Copyright 2000-2004 Sun Microsystems, Inc. All Rights Reserved.
* Copyright 2000-2006 Sun Microsystems, Inc. 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
@ -806,25 +806,6 @@ public final class ORBUtility {
return result ;
}
public static void setDaemon(Thread thread)
{
// Catch exceptions since setDaemon can cause a
// security exception to be thrown under netscape
// in the Applet mode
final Thread finalThread = thread;
try {
AccessController.doPrivileged(new PrivilegedAction() {
public java.lang.Object run() {
finalThread.setDaemon(true);
return null;
}
});
} catch (Exception e) {
// REVISIT: Object to get static method. Ignore it.
dprint(new Object(), "setDaemon: Exception: " + e);
}
}
public static String operationNameAndRequestId(CorbaMessageMediator m)
{
return "op/" + m.getOperationName() + " id/" + m.getRequestId();

@ -1,5 +1,5 @@
/*
* Copyright 1998-2004 Sun Microsystems, Inc. All Rights Reserved.
* Copyright 1998-2007 Sun Microsystems, Inc. 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
@ -53,7 +53,8 @@ import com.sun.corba.se.spi.orb.ORB;
import com.sun.corba.se.spi.resolver.Resolver;
import com.sun.corba.se.impl.encoding.EncapsInputStream;
import com.sun.corba.se.impl.logging.ORBUtilSystemException ;
import com.sun.corba.se.impl.logging.ORBUtilSystemException;
import com.sun.corba.se.impl.logging.OMGSystemException;
import com.sun.corba.se.impl.naming.namingutil.INSURLHandler;
import com.sun.corba.se.impl.naming.namingutil.IIOPEndpointInfo;
import com.sun.corba.se.impl.naming.namingutil.INSURL;
@ -76,6 +77,7 @@ public class INSURLOperationImpl implements Operation
{
ORB orb;
ORBUtilSystemException wrapper ;
OMGSystemException omgWrapper ;
Resolver bootstrapResolver ;
// Root Naming Context for default resolution of names.
@ -90,6 +92,8 @@ public class INSURLOperationImpl implements Operation
this.orb = orb ;
wrapper = ORBUtilSystemException.get( orb,
CORBALogDomains.ORB_RESOLVER ) ;
omgWrapper = OMGSystemException.get( orb,
CORBALogDomains.ORB_RESOLVER ) ;
this.bootstrapResolver = bootstrapResolver ;
}
@ -126,6 +130,8 @@ public class INSURLOperationImpl implements Operation
return getIORFromString( str ) ;
else {
INSURL insURL = insURLHandler.parseURL( str ) ;
if (insURL == null)
throw omgWrapper.soBadSchemeName() ;
return resolveINSURL( insURL ) ;
}
}

@ -1,5 +1,5 @@
/*
* Copyright 2001-2004 Sun Microsystems, Inc. All Rights Reserved.
* Copyright 2001-2007 Sun Microsystems, Inc. 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
@ -1057,7 +1057,9 @@ public class SocketOrChannelConnectionImpl
// IIOPOutputStream will cleanup the connection info when it
// sees this exception.
throw wrapper.writeErrorSend(e1) ;
SystemException exc = wrapper.writeErrorSend(e1);
purgeCalls(exc, false, true);
throw exc;
}
}

@ -1,6 +1,6 @@
;
; Copyright 2003-2006 Sun Microsystems, Inc. All Rights Reserved.
; Copyright 2003-2008 Sun Microsystems, Inc. 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
@ -144,6 +144,8 @@
15 WARNING "Read of full message failed : bytes requested = {0} bytes read = {1} max wait time = {2} total time spent waiting = {3}")
(CREATE_LISTENER_FAILED
16 SEVERE "Unable to create listener thread on the specified port: {0}")
(BUFFER_READ_MANAGER_TIMEOUT
17 WARNING "Timeout while reading data in buffer manager")
)
(DATA_CONVERSION
(BAD_STRINGIFIED_IOR_LEN 1 WARNING "A character did not map to the transmission code set")

@ -1,5 +1,5 @@
/*
* Copyright 1999-2004 Sun Microsystems, Inc. All Rights Reserved.
* Copyright 1999-2007 Sun Microsystems, Inc. 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
@ -2086,8 +2086,8 @@ class Parser
if (token.type == Token.LeftBrace) {
repIDStack.push(((IDLID)repIDStack.peek ()).clone ()) ;
((IDLID)repIDStack.peek ()).appendToName (name);
structEntry = makeStructEntry( name, entry, false ) ;
((IDLID)repIDStack.peek ()).appendToName (name);
prep.openScope (structEntry);
match (Token.LeftBrace) ;
member (structEntry) ;
@ -2174,8 +2174,8 @@ class Parser
if (token.type == Token.Switch) {
repIDStack.push (((IDLID)repIDStack.peek ()).clone ());
((IDLID)repIDStack.peek ()).appendToName (name);
unionEntry = makeUnionEntry( name, entry, false ) ;
((IDLID)repIDStack.peek ()).appendToName (name);
match (Token.Switch);
match (Token.LeftParen);
unionEntry.type (switchTypeSpec (unionEntry));
@ -2641,8 +2641,8 @@ class Parser
private void exceptDcl (SymtabEntry entry) throws IOException, ParseException
{
match (Token.Exception);
ExceptionEntry exceptEntry = stFactory.exceptionEntry (entry, (IDLID)repIDStack.peek ());
repIDStack.push (((IDLID)repIDStack.peek ()).clone ());
ExceptionEntry exceptEntry = stFactory.exceptionEntry (entry, (IDLID)repIDStack.peek ());
((IDLID)repIDStack.peek ()).appendToName (token.name);
exceptEntry.sourceFile (scanner.fileEntry ());
// Comment must immediately precede "exception" keyword

@ -91,4 +91,3 @@ public class InputException {
}
}

@ -1,5 +1,5 @@
/*
* Copyright 1995-2005 Sun Microsystems, Inc. All Rights Reserved.
* Copyright 1995-2006 Sun Microsystems, Inc. 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
@ -289,7 +289,7 @@ abstract public class ORB {
*
* @return the singleton ORB
*/
public static ORB init() {
public static synchronized ORB init() {
if (singleton == null) {
String className = getSystemProperty(ORBSingletonClassKey);
if (className == null)