--- a/corba/src/share/classes/com/sun/corba/se/impl/orb/ORBImpl.java Wed Jul 05 18:14:56 2017 +0200
+++ b/corba/src/share/classes/com/sun/corba/se/impl/orb/ORBImpl.java Wed Jun 27 21:09:29 2012 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 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
@@ -23,35 +23,37 @@
* questions.
*/
-package com.sun.corba.se.impl.orb ;
+package com.sun.corba.se.impl.orb;
import java.applet.Applet;
-import java.io.IOException ;
+import java.io.IOException;
import java.lang.reflect.Constructor;
-import java.lang.reflect.Field ;
-import java.lang.reflect.Modifier ;
-import java.lang.reflect.InvocationTargetException ;
+import java.lang.reflect.Field;
+import java.lang.reflect.Modifier;
+import java.lang.reflect.InvocationTargetException;
-import java.util.ArrayList ;
-import java.util.Iterator ;
-import java.util.Properties ;
-import java.util.Vector ;
-import java.util.Hashtable ;
-import java.util.Map ;
-import java.util.HashMap ;
-import java.util.LinkedList ;
-import java.util.Collection ;
-import java.util.Collections ;
-import java.util.StringTokenizer ;
-import java.util.Enumeration ;
-import java.util.WeakHashMap ;
+import java.util.Set;
+import java.util.HashSet;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.Properties;
+import java.util.Vector;
+import java.util.Hashtable;
+import java.util.Map;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.StringTokenizer;
+import java.util.Enumeration;
+import java.util.WeakHashMap;
-import java.net.InetAddress ;
+import java.net.InetAddress;
import java.security.PrivilegedAction;
-import java.security.AccessController ;
+import java.security.AccessController;
import javax.rmi.CORBA.Util;
import javax.rmi.CORBA.ValueHandler;
@@ -82,18 +84,18 @@
import com.sun.org.omg.SendingContext.CodeBase;
import com.sun.corba.se.pept.broker.Broker;
-import com.sun.corba.se.pept.protocol.ClientInvocationInfo ;
+import com.sun.corba.se.pept.protocol.ClientInvocationInfo;
import com.sun.corba.se.pept.transport.ContactInfo;
import com.sun.corba.se.pept.transport.ConnectionCache;
import com.sun.corba.se.pept.transport.TransportManager;
import com.sun.corba.se.spi.ior.IOR;
-import com.sun.corba.se.spi.ior.IdentifiableFactoryFinder ;
+import com.sun.corba.se.spi.ior.IdentifiableFactoryFinder;
import com.sun.corba.se.spi.ior.TaggedComponentFactoryFinder;
-import com.sun.corba.se.spi.ior.IORFactories ;
-import com.sun.corba.se.spi.ior.ObjectKey ;
-import com.sun.corba.se.spi.ior.ObjectKeyFactory ;
-import com.sun.corba.se.spi.ior.iiop.IIOPFactories ;
+import com.sun.corba.se.spi.ior.IORFactories;
+import com.sun.corba.se.spi.ior.ObjectKey;
+import com.sun.corba.se.spi.ior.ObjectKeyFactory;
+import com.sun.corba.se.spi.ior.iiop.IIOPFactories;
import com.sun.corba.se.spi.ior.iiop.GIOPVersion;
import com.sun.corba.se.spi.oa.OAInvocationInfo;
import com.sun.corba.se.spi.oa.ObjectAdapterFactory;
@@ -122,10 +124,10 @@
import com.sun.corba.se.spi.transport.CorbaContactInfoListFactory;
import com.sun.corba.se.spi.transport.CorbaTransportManager;
import com.sun.corba.se.spi.legacy.connection.LegacyServerSocketManager;
-import com.sun.corba.se.spi.copyobject.CopierManager ;
-import com.sun.corba.se.spi.presentation.rmi.PresentationDefaults ;
-import com.sun.corba.se.spi.presentation.rmi.PresentationManager ;
-import com.sun.corba.se.spi.presentation.rmi.StubAdapter ;
+import com.sun.corba.se.spi.copyobject.CopierManager;
+import com.sun.corba.se.spi.presentation.rmi.PresentationDefaults;
+import com.sun.corba.se.spi.presentation.rmi.PresentationManager;
+import com.sun.corba.se.spi.presentation.rmi.StubAdapter;
import com.sun.corba.se.spi.servicecontext.ServiceContextRegistry;
import com.sun.corba.se.impl.corba.TypeCodeFactory;
@@ -140,6 +142,7 @@
import com.sun.corba.se.impl.corba.RequestImpl;
import com.sun.corba.se.impl.dynamicany.DynAnyFactoryImpl;
import com.sun.corba.se.impl.encoding.EncapsOutputStream;
+import com.sun.corba.se.impl.encoding.CachedCodeBase;
import com.sun.corba.se.impl.interceptors.PIHandlerImpl;
import com.sun.corba.se.impl.interceptors.PINoOpHandlerImpl;
import com.sun.corba.se.impl.ior.TaggedComponentFactoryFinderImpl;
@@ -185,6 +188,7 @@
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;
@@ -193,6 +197,7 @@
// 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).
@@ -220,8 +225,6 @@
private int transientServerId ;
- private ThreadGroup threadGroup ;
-
private ServiceContextRegistry serviceContextRegistry ;
// Needed here to implement connect/disconnect
@@ -265,6 +268,7 @@
private final Object urlOperationLock = new java.lang.Object() ;
private CorbaServerRequestDispatcher insNamingDelegate ;
+
// resolverLock must be used for all access to either resolver or
// localResolver, since it is possible for the resolver to indirectly
// refer to the localResolver. Also used to protect access to
@@ -279,6 +283,8 @@
private ObjectKeyFactory objectKeyFactory ;
+ private boolean orbOwnsThreadPoolManager = false ;
+
private ThreadPoolManager threadpoolMgr;
private void dprint( String msg )
@@ -322,11 +328,17 @@
public ORBVersion getORBVersion()
{
+ synchronized (this) {
+ checkShutdownState();
+ }
return (ORBVersion)(orbVersionThreadLocal.get()) ;
}
public void setORBVersion(ORBVersion verObj)
{
+ synchronized (this) {
+ checkShutdownState();
+ }
orbVersionThreadLocal.set(verObj);
}
@@ -347,46 +359,6 @@
// end of this method.
pihandler = new PINoOpHandlerImpl( );
- // See bugs 4916766 and 4936203
- // We intend to create new threads in a reliable thread group.
- // This avoids problems if the application/applet
- // creates a thread group, makes JavaIDL calls which create a new
- // connection and ReaderThread, and then destroys the thread
- // group. If our ReaderThreads were to be part of such destroyed thread
- // group then it might get killed and cause other invoking threads
- // sharing the same connection to get a non-restartable
- // CommunicationFailure. We'd like to avoid that.
- //
- // Our solution is to create all of our threads in the highest thread
- // group that we have access to, given our own security clearance.
- //
- try {
- // try to get a thread group that's as high in the threadgroup
- // parent-child hierarchy, as we can get to.
- // this will prevent an ORB thread created during applet-init from
- // being killed when an applet dies.
- threadGroup = (ThreadGroup) AccessController.doPrivileged(
- new PrivilegedAction() {
- public Object run() {
- ThreadGroup tg = Thread.currentThread().getThreadGroup() ;
- ThreadGroup ptg = tg ;
- try {
- while (ptg != null) {
- tg = ptg;
- ptg = tg.getParent();
- }
- } catch (SecurityException se) {
- // Discontinue going higher on a security exception.
- }
- return new ThreadGroup(tg, "ORB ThreadGroup");
- }
- }
- );
- } catch (SecurityException e) {
- // something wrong, we go back to the original code
- threadGroup = Thread.currentThread().getThreadGroup();
- }
-
// This is the unique id of this server (JVM). Multiple incarnations
// of this server will get different ids.
// Compute transientServerId = milliseconds since Jan 1, 1970
@@ -547,6 +519,9 @@
public void set_parameters( Properties props )
{
+ synchronized (this) {
+ checkShutdownState();
+ }
preInit( null, props ) ;
DataCollector dataCollector =
DataCollectorFactory.create( props, getLocalHostName() ) ;
@@ -788,6 +763,9 @@
*/
public void notifyORB()
{
+ synchronized (this) {
+ checkShutdownState();
+ }
synchronized (this.svResponseReceived) {
this.svResponseReceived.set();
this.svResponseReceived.notify();
@@ -854,6 +832,8 @@
// Note that we connect this if we have not already done so.
public synchronized IOR getFVDCodeBaseIOR()
{
+ checkShutdownState();
+
if (codeBaseIOR != null) // i.e. We are already connected to it
return codeBaseIOR;
@@ -1118,6 +1098,8 @@
public synchronized void setTypeCodeForClass(Class c, TypeCodeImpl tci)
{
+ checkShutdownState();
+
if (typeCodeForClassMap == null)
typeCodeForClassMap = Collections.synchronizedMap(
new WeakHashMap(64));
@@ -1128,6 +1110,8 @@
public synchronized TypeCodeImpl getTypeCodeForClass(Class c)
{
+ checkShutdownState();
+
if (typeCodeForClassMap == null)
return null;
return (TypeCodeImpl)typeCodeForClassMap.get(c);
@@ -1210,6 +1194,10 @@
{
CorbaServerRequestDispatcher insnd ;
+ synchronized (this) {
+ checkShutdownState();
+ }
+
if ((id == null) || (id.length() == 0))
throw new InvalidName() ;
@@ -1253,66 +1241,88 @@
}
}
- public void shutdown(boolean wait_for_completion)
- {
- // to wait for completion, we would deadlock, so throw a standard
- // OMG exception.
- if (wait_for_completion && ((Boolean)isProcessingInvocation.get()).booleanValue()) {
- throw omgWrapper.shutdownWaitForCompletionDeadlock() ;
- }
-
- boolean doShutdown = false ;
+ public void shutdown(boolean wait_for_completion) {
+ boolean wait = false;
synchronized (this) {
- checkShutdownState() ;
+ checkShutdownState();
+
+ // This is to avoid deadlock: don't allow a thread that is
+ // processing a request to call shutdown( true ), because
+ // the shutdown would block waiting for the request to complete,
+ // while the request would block waiting for shutdown to complete.
+ if (wait_for_completion &&
+ isProcessingInvocation.get() == Boolean.TRUE) {
+ throw omgWrapper.shutdownWaitForCompletionDeadlock();
+ }
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 ;
+ if (wait_for_completion) {
+ wait = true;
+ } else {
+ return;
+ }
}
+
+ status = STATUS_SHUTTING_DOWN;
}
- // 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.
+ // Avoid more than one thread performing shutdown at a time.
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.
+ // At this point, the ORB status is certainly STATUS_SHUTTING_DOWN.
+ // If wait is true, another thread already called shutdown( true ),
+ // and so we wait for completion
+ if (wait) {
+ while (true) {
+ synchronized (this) {
+ if (status == STATUS_SHUTDOWN)
+ break;
+ }
+
+ try {
+ shutdownObj.wait();
+ } catch (InterruptedException exc) {
+ // NOP: just loop and wait until state is changed
+ }
+ }
+ } else {
+ // perform the actual shutdown
shutdownServants(wait_for_completion);
+ if (wait_for_completion) {
+ synchronized ( waitForCompletionObj ) {
+ while (numInvocations > 0) {
+ try {
+ waitForCompletionObj.wait();
+ } catch (InterruptedException ex) {}
+ }
+ }
+ }
+
synchronized (runObj) {
runObj.notifyAll();
}
- synchronized (this) {
- status = STATUS_SHUTDOWN;
- }
+ status = STATUS_SHUTDOWN;
+
+ shutdownObj.notifyAll();
}
}
}
- /** This method shuts down the ORB and causes orb.run() to return.
- * It will cause all POAManagers to be deactivated, which in turn
- * will cause all POAs to be deactivated.
- */
+ // Cause all ObjectAdapaterFactories to clean up all of their internal state, which
+ // may include activated objects that have associated state and callbacks that must
+ // complete in order to shutdown. This will cause new request to be rejected.
protected void shutdownServants(boolean wait_for_completion) {
- Iterator iter = requestDispatcherRegistry.getObjectAdapterFactories().iterator() ;
- while (iter.hasNext()) {
- ObjectAdapterFactory oaf = (ObjectAdapterFactory)iter.next() ;
- oaf.shutdown( wait_for_completion ) ;
+ Set<ObjectAdapterFactory> oaset;
+ synchronized (this) {
+ oaset = new HashSet<>(requestDispatcherRegistry.getObjectAdapterFactories());
}
+
+ for (ObjectAdapterFactory oaf : oaset)
+ oaf.shutdown(wait_for_completion);
}
- // REVISIT: was protected - made public for framework
// Note that the caller must hold the ORBImpl lock.
public void checkShutdownState()
{
@@ -1327,21 +1337,40 @@
public boolean isDuringDispatch()
{
+ synchronized (this) {
+ checkShutdownState();
+ }
Boolean value = (Boolean)(isProcessingInvocation.get()) ;
return value.booleanValue() ;
}
public void startingDispatch()
{
+ synchronized (this) {
+ checkShutdownState();
+ }
synchronized (invocationObj) {
isProcessingInvocation.set(Boolean.TRUE);
+ numInvocations++;
}
}
public void finishedDispatch()
{
+ synchronized (this) {
+ checkShutdownState();
+ }
synchronized (invocationObj) {
- isProcessingInvocation.set(Boolean.FALSE);
+ numInvocations--;
+ isProcessingInvocation.set(false);
+ if (numInvocations == 0) {
+ synchronized (waitForCompletionObj) {
+ waitForCompletionObj.notifyAll();
+ }
+ } else if (numInvocations < 0) {
+ throw wrapper.numInvocationsAlreadyZero(
+ CompletionStatus.COMPLETED_YES);
+ }
}
}
@@ -1350,12 +1379,12 @@
* not been shut down, it will start the shutdown process and block until
* the ORB has shut down before it destroys the ORB."
*/
- public synchronized void destroy()
+ public void destroy()
{
- boolean shutdownFirst = false ;
+ boolean shutdownFirst = false;
synchronized (this) {
- shutdownFirst = (status == STATUS_OPERATING) ;
+ shutdownFirst = (status == STATUS_OPERATING);
}
if (shutdownFirst) {
@@ -1365,11 +1394,76 @@
synchronized (this) {
if (status < STATUS_DESTROYED) {
getCorbaTransportManager().close();
- getPIHandler().destroyInterceptors() ;
+ getPIHandler().destroyInterceptors();
status = STATUS_DESTROYED;
}
}
+ synchronized (threadPoolManagerAccessLock) {
+ if (orbOwnsThreadPoolManager) {
+ try {
+ threadpoolMgr.close();
+ threadpoolMgr = null;
+ } catch (IOException exc) {
+ wrapper.ioExceptionOnClose(exc);
+ }
+ }
+ }
+ try {
+ monitoringManager.close();
+ monitoringManager = null;
+ } catch (IOException exc) {
+ wrapper.ioExceptionOnClose(exc);
+ }
+
+ CachedCodeBase.cleanCache(this);
+ try {
+ pihandler.close();
+ } catch (IOException exc) {
+ wrapper.ioExceptionOnClose(exc);
+ }
+
+ super.destroy();
+
+ badServerIdHandlerAccessLock = null;
+ clientDelegateFactoryAccessorLock = null;
+ corbaContactInfoListFactoryAccessLock = null;
+
+ objectKeyFactoryAccessLock = null;
+ legacyServerSocketManagerAccessLock = null;
+ threadPoolManagerAccessLock = null;
+ transportManager = null;
+ legacyServerSocketManager = null;
+ OAInvocationInfoStack = null;
+ clientInvocationInfoStack = null;
+ codeBaseIOR = null;
+ dynamicRequests = null;
+ svResponseReceived = null;
+ runObj = null;
+ shutdownObj = null;
+ waitForCompletionObj = null;
+ invocationObj = null;
+ isProcessingInvocation = null;
+ typeCodeForClassMap = null;
+ valueFactoryCache = null;
+ orbVersionThreadLocal = null;
+ requestDispatcherRegistry = null;
+ copierManager = null;
+ toaFactory = null;
+ poaFactory = null;
+ pihandler = null;
+ configData = null;
+ badServerIdHandler = null;
+ clientDelegateFactory = null;
+ corbaContactInfoListFactory = null;
+ resolver = null;
+ localResolver = null;
+ insNamingDelegate = null;
+ urlOperation = null;
+ taggedComponentFactoryFinder = null;
+ taggedProfileFactoryFinder = null;
+ taggedProfileTemplateFactoryFinder = null;
+ objectKeyFactory = null;
}
/**
@@ -1434,18 +1528,27 @@
public OAInvocationInfo peekInvocationInfo()
{
+ synchronized (this) {
+ checkShutdownState();
+ }
StackImpl stack = (StackImpl)(OAInvocationInfoStack.get()) ;
return (OAInvocationInfo)(stack.peek()) ;
}
public void pushInvocationInfo( OAInvocationInfo info )
{
+ synchronized (this) {
+ checkShutdownState();
+ }
StackImpl stack = (StackImpl)(OAInvocationInfoStack.get()) ;
stack.push( info ) ;
}
public OAInvocationInfo popInvocationInfo()
{
+ synchronized (this) {
+ checkShutdownState();
+ }
StackImpl stack = (StackImpl)(OAInvocationInfoStack.get()) ;
return (OAInvocationInfo)(stack.pop()) ;
}
@@ -1459,6 +1562,9 @@
public void initBadServerIdHandler()
{
+ synchronized (this) {
+ checkShutdownState();
+ }
synchronized (badServerIdHandlerAccessLock) {
Class cls = configData.getBadServerIdHandler() ;
if (cls != null) {
@@ -1477,6 +1583,9 @@
public void setBadServerIdHandler( BadServerIdHandler handler )
{
+ synchronized (this) {
+ checkShutdownState();
+ }
synchronized (badServerIdHandlerAccessLock) {
badServerIdHandler = handler;
}
@@ -1484,6 +1593,9 @@
public void handleBadServerId( ObjectKey okey )
{
+ synchronized (this) {
+ checkShutdownState();
+ }
synchronized (badServerIdHandlerAccessLock) {
if (badServerIdHandler == null)
throw wrapper.badServerId() ;
@@ -1532,6 +1644,9 @@
public int getTransientServerId()
{
+ synchronized (this) {
+ checkShutdownState();
+ }
if( configData.getORBServerIdPropertySpecified( ) ) {
// ORBServerId is specified then use that value
return configData.getPersistentServerId( );
@@ -1541,11 +1656,17 @@
public RequestDispatcherRegistry getRequestDispatcherRegistry()
{
+ synchronized (this) {
+ checkShutdownState();
+ }
return requestDispatcherRegistry;
}
public ServiceContextRegistry getServiceContextRegistry()
{
+ synchronized (this) {
+ checkShutdownState();
+ }
return serviceContextRegistry ;
}
@@ -1563,12 +1684,18 @@
// XXX What about multi-homed host?
public boolean isLocalHost( String hostName )
{
+ synchronized (this) {
+ checkShutdownState();
+ }
return hostName.equals( configData.getORBServerHost() ) ||
hostName.equals( getLocalHostName() ) ;
}
public boolean isLocalServerId( int subcontractId, int serverId )
{
+ synchronized (this) {
+ checkShutdownState();
+ }
if ((subcontractId < ORBConstants.FIRST_POA_SCID) ||
(subcontractId > ORBConstants.MAX_POA_SCID))
return serverId == getTransientServerId( ) ;
@@ -1659,6 +1786,9 @@
public ClientInvocationInfo createOrIncrementInvocationInfo()
{
+ synchronized (this) {
+ checkShutdownState();
+ }
StackImpl invocationInfoStack =
(StackImpl) clientInvocationInfoStack.get();
ClientInvocationInfo clientInvocationInfo = null;
@@ -1682,10 +1812,13 @@
public void releaseOrDecrementInvocationInfo()
{
+ synchronized (this) {
+ checkShutdownState();
+ }
+ int entryCount = -1;
+ ClientInvocationInfo clientInvocationInfo = null;
StackImpl invocationInfoStack =
(StackImpl)clientInvocationInfoStack.get();
- int entryCount = -1;
- ClientInvocationInfo clientInvocationInfo = null;
if (!invocationInfoStack.empty()) {
clientInvocationInfo =
(ClientInvocationInfo)invocationInfoStack.peek();
@@ -1705,6 +1838,9 @@
public ClientInvocationInfo getInvocationInfo()
{
+ synchronized (this) {
+ checkShutdownState();
+ }
StackImpl invocationInfoStack =
(StackImpl) clientInvocationInfoStack.get();
return (ClientInvocationInfo) invocationInfoStack.peek();
@@ -1719,6 +1855,9 @@
public void setClientDelegateFactory( ClientDelegateFactory factory )
{
+ synchronized (this) {
+ checkShutdownState();
+ }
synchronized (clientDelegateFactoryAccessorLock) {
clientDelegateFactory = factory ;
}
@@ -1726,6 +1865,9 @@
public ClientDelegateFactory getClientDelegateFactory()
{
+ synchronized (this) {
+ checkShutdownState();
+ }
synchronized (clientDelegateFactoryAccessorLock) {
return clientDelegateFactory ;
}
@@ -1735,6 +1877,9 @@
public void setCorbaContactInfoListFactory( CorbaContactInfoListFactory factory )
{
+ synchronized (this) {
+ checkShutdownState();
+ }
synchronized (corbaContactInfoListFactoryAccessLock) {
corbaContactInfoListFactory = factory ;
}
@@ -1742,6 +1887,7 @@
public synchronized CorbaContactInfoListFactory getCorbaContactInfoListFactory()
{
+ checkShutdownState();
return corbaContactInfoListFactory ;
}
@@ -1750,6 +1896,9 @@
*/
public void setResolver( Resolver resolver )
{
+ synchronized (this) {
+ checkShutdownState();
+ }
synchronized (resolverLock) {
this.resolver = resolver ;
}
@@ -1760,6 +1909,9 @@
*/
public Resolver getResolver()
{
+ synchronized (this) {
+ checkShutdownState();
+ }
synchronized (resolverLock) {
return resolver ;
}
@@ -1770,6 +1922,9 @@
*/
public void setLocalResolver( LocalResolver resolver )
{
+ synchronized (this) {
+ checkShutdownState();
+ }
synchronized (resolverLock) {
this.localResolver = resolver ;
}
@@ -1780,6 +1935,9 @@
*/
public LocalResolver getLocalResolver()
{
+ synchronized (this) {
+ checkShutdownState();
+ }
synchronized (resolverLock) {
return localResolver ;
}
@@ -1790,6 +1948,9 @@
*/
public void setURLOperation( Operation stringToObject )
{
+ synchronized (this) {
+ checkShutdownState();
+ }
synchronized (urlOperationLock) {
urlOperation = stringToObject ;
}
@@ -1800,6 +1961,9 @@
*/
public Operation getURLOperation()
{
+ synchronized (this) {
+ checkShutdownState();
+ }
synchronized (urlOperationLock) {
return urlOperation ;
}
@@ -1807,6 +1971,9 @@
public void setINSDelegate( CorbaServerRequestDispatcher sdel )
{
+ synchronized (this) {
+ checkShutdownState();
+ }
synchronized (resolverLock) {
insNamingDelegate = sdel ;
}
@@ -1814,16 +1981,25 @@
public TaggedComponentFactoryFinder getTaggedComponentFactoryFinder()
{
+ synchronized (this) {
+ checkShutdownState();
+ }
return taggedComponentFactoryFinder ;
}
public IdentifiableFactoryFinder getTaggedProfileFactoryFinder()
{
+ synchronized (this) {
+ checkShutdownState();
+ }
return taggedProfileFactoryFinder ;
}
public IdentifiableFactoryFinder getTaggedProfileTemplateFactoryFinder()
{
+ synchronized (this) {
+ checkShutdownState();
+ }
return taggedProfileTemplateFactoryFinder ;
}
@@ -1831,6 +2007,9 @@
public ObjectKeyFactory getObjectKeyFactory()
{
+ synchronized (this) {
+ checkShutdownState();
+ }
synchronized (objectKeyFactoryAccessLock) {
return objectKeyFactory ;
}
@@ -1838,6 +2017,9 @@
public void setObjectKeyFactory( ObjectKeyFactory factory )
{
+ synchronized (this) {
+ checkShutdownState();
+ }
synchronized (objectKeyFactoryAccessLock) {
objectKeyFactory = factory ;
}
@@ -1864,6 +2046,9 @@
public LegacyServerSocketManager getLegacyServerSocketManager()
{
+ synchronized (this) {
+ checkShutdownState();
+ }
synchronized (legacyServerSocketManagerAccessLock) {
if (legacyServerSocketManager == null) {
legacyServerSocketManager = new LegacyServerSocketManagerImpl(this);
@@ -1876,6 +2061,9 @@
public void setThreadPoolManager(ThreadPoolManager mgr)
{
+ synchronized (this) {
+ checkShutdownState();
+ }
synchronized (threadPoolManagerAccessLock) {
threadpoolMgr = mgr;
}
@@ -1883,9 +2071,13 @@
public ThreadPoolManager getThreadPoolManager()
{
+ synchronized (this) {
+ checkShutdownState();
+ }
synchronized (threadPoolManagerAccessLock) {
if (threadpoolMgr == null) {
- threadpoolMgr = new ThreadPoolManagerImpl( threadGroup );
+ threadpoolMgr = new ThreadPoolManagerImpl();
+ orbOwnsThreadPoolManager = true;
}
return threadpoolMgr;
}
@@ -1893,6 +2085,9 @@
public CopierManager getCopierManager()
{
+ synchronized (this) {
+ checkShutdownState();
+ }
return copierManager ;
}
} // Class ORBImpl