// // Only for use by Ice.CommunicatorI // public Instance(Ice.Communicator communicator, Ice.InitializationData initData) { _state = StateActive; _initData = initData; try { if(_initData.properties == null) { _initData.properties = Ice.Util.createProperties(); } #if !SILVERLIGHT && !UNITY lock(_staticLock) { if(!_oneOfDone) { string stdOut = _initData.properties.getProperty("Ice.StdOut"); string stdErr = _initData.properties.getProperty("Ice.StdErr"); System.IO.StreamWriter outStream = null; if(stdOut.Length > 0) { try { outStream = System.IO.File.AppendText(stdOut); } catch(System.IO.IOException ex) { Ice.FileException fe = new Ice.FileException(ex); fe.path = stdOut; throw fe; } outStream.AutoFlush = true; System.Console.Out.Close(); System.Console.SetOut(outStream); } if(stdErr.Length > 0) { if(stdErr.Equals(stdOut)) { System.Console.SetError(outStream); } else { System.IO.StreamWriter errStream = null; try { errStream = System.IO.File.AppendText(stdErr); } catch(System.IO.IOException ex) { Ice.FileException fe = new Ice.FileException(ex); fe.path = stdErr; throw fe; } errStream.AutoFlush = true; System.Console.Error.Close(); System.Console.SetError(errStream); } } _oneOfDone = true; } } #endif if(_initData.logger == null) { #if !SILVERLIGHT && !UNITY string logfile = _initData.properties.getProperty("Ice.LogFile"); if(_initData.properties.getPropertyAsInt("Ice.UseSyslog") > 0 && AssemblyUtil.platform_ != AssemblyUtil.Platform.Windows) { if(logfile.Length != 0) { throw new Ice.InitializationException("Ice.LogFile and Ice.UseSyslog cannot both be set."); } _initData.logger = new Ice.SysLoggerI(_initData.properties.getProperty("Ice.ProgramName"), _initData.properties.getPropertyWithDefault("Ice.SyslogFacility", "LOG_USER")); } else if(logfile.Length != 0) { _initData.logger = new Ice.FileLoggerI(_initData.properties.getProperty("Ice.ProgramName"), logfile); } else if(Ice.Util.getProcessLogger() is Ice.LoggerI) { // // Ice.ConsoleListener is enabled by default. // # if COMPACT _initData.logger = new Ice.ConsoleLoggerI(_initData.properties.getProperty("Ice.ProgramName")); # else bool console = _initData.properties.getPropertyAsIntWithDefault("Ice.ConsoleListener", 1) > 0; _initData.logger = new Ice.TraceLoggerI(_initData.properties.getProperty("Ice.ProgramName"), console); # endif } #else if(Ice.Util.getProcessLogger() is Ice.LoggerI) { _initData.logger = new Ice.ConsoleLoggerI(_initData.properties.getProperty("Ice.ProgramName")); } #endif else { _initData.logger = Ice.Util.getProcessLogger(); } } _traceLevels = new TraceLevels(_initData.properties); _defaultsAndOverrides = new DefaultsAndOverrides(_initData.properties, _initData.logger); _clientACM = new ACMConfig(_initData.properties, _initData.logger, "Ice.ACM.Client", new ACMConfig(_initData.properties, _initData.logger, "Ice.ACM", new ACMConfig(false))); _serverACM = new ACMConfig(_initData.properties, _initData.logger, "Ice.ACM.Server", new ACMConfig(_initData.properties, _initData.logger, "Ice.ACM", new ACMConfig(true))); #if COMPACT || SILVERLIGHT char[] separators = { ' ', '\t', '\n', '\r' }; _factoryAssemblies = _initData.properties.getProperty("Ice.FactoryAssemblies").Split(separators); #endif { const int defaultMessageSizeMax = 1024; int num = _initData.properties.getPropertyAsIntWithDefault("Ice.MessageSizeMax", defaultMessageSizeMax); if(num < 1 || num > 0x7fffffff / 1024) { _messageSizeMax = 0x7fffffff; } else { _messageSizeMax = num * 1024; // Property is in kilobytes, _messageSizeMax in bytes } } if(_initData.properties.getProperty("Ice.BatchAutoFlushSize").Length == 0 && _initData.properties.getProperty("Ice.BatchAutoFlush").Length > 0) { if(_initData.properties.getPropertyAsInt("Ice.BatchAutoFlush") > 0) { _batchAutoFlushSize = _messageSizeMax; } } else { int num = _initData.properties.getPropertyAsIntWithDefault("Ice.BatchAutoFlushSize", 1024); // 1MB if(num < 1) { _batchAutoFlushSize = num; } else if(num > 0x7fffffff / 1024) { _batchAutoFlushSize = 0x7fffffff; } else { _batchAutoFlushSize = num * 1024; // Property is in kilobytes, _batchAutoFlushSize in bytes } } _cacheMessageBuffers = _initData.properties.getPropertyAsIntWithDefault("Ice.CacheMessageBuffers", 2); _implicitContext = Ice.ImplicitContextI.create(_initData.properties.getProperty("Ice.ImplicitContext")); _routerManager = new RouterManager(); _locatorManager = new LocatorManager(_initData.properties); _referenceFactory = new ReferenceFactory(this, communicator); _proxyFactory = new ProxyFactory(this); _requestHandlerFactory = new RequestHandlerFactory(this); bool isIPv6Supported = Network.isIPv6Supported(); bool ipv4 = _initData.properties.getPropertyAsIntWithDefault("Ice.IPv4", 1) > 0; bool ipv6 = _initData.properties.getPropertyAsIntWithDefault("Ice.IPv6", isIPv6Supported ? 1 : 0) > 0; if(!ipv4 && !ipv6) { throw new Ice.InitializationException("Both IPV4 and IPv6 support cannot be disabled."); } else if(ipv4 && ipv6) { _protocolSupport = Network.EnableBoth; } else if(ipv4) { _protocolSupport = Network.EnableIPv4; } else { _protocolSupport = Network.EnableIPv6; } _preferIPv6 = _initData.properties.getPropertyAsInt("Ice.PreferIPv6Address") > 0; _networkProxy = createNetworkProxy(_initData.properties, _protocolSupport); _endpointFactoryManager = new EndpointFactoryManager(this); ProtocolInstance tcpProtocolInstance = new ProtocolInstance(this, Ice.TCPEndpointType.value, "tcp"); EndpointFactory tcpEndpointFactory = new TcpEndpointFactory(tcpProtocolInstance); _endpointFactoryManager.add(tcpEndpointFactory); ProtocolInstance udpProtocolInstance = new ProtocolInstance(this, Ice.UDPEndpointType.value, "udp"); EndpointFactory udpEndpointFactory = new UdpEndpointFactory(udpProtocolInstance); _endpointFactoryManager.add(udpEndpointFactory); ProtocolInstance wsProtocolInstance = new ProtocolInstance(this, Ice.WSEndpointType.value, "ws"); _endpointFactoryManager.add(new WSEndpointFactory(wsProtocolInstance, tcpEndpointFactory.clone(wsProtocolInstance))); #if !SILVERLIGHT _pluginManager = new Ice.PluginManagerI(communicator); #endif _outgoingConnectionFactory = new OutgoingConnectionFactory(communicator, this); _servantFactoryManager = new ObjectFactoryManager(); _objectAdapterFactory = new ObjectAdapterFactory(this, communicator); _retryQueue = new RetryQueue(this); }
// // Only for use by Ice.CommunicatorI // public void destroy() { lock(this) { // // If destroy is in progress, wait for it to be done. This // is necessary in case destroy() is called concurrently // by multiple threads. // while(_state == StateDestroyInProgress) { Monitor.Wait(this); } if(_state == StateDestroyed) { return; } _state = StateDestroyInProgress; } // // Shutdown and destroy all the incoming and outgoing Ice // connections and wait for the connections to be finished. // if(_objectAdapterFactory != null) { _objectAdapterFactory.shutdown(); } if(_outgoingConnectionFactory != null) { _outgoingConnectionFactory.destroy(); } if(_objectAdapterFactory != null) { _objectAdapterFactory.destroy(); } if(_outgoingConnectionFactory != null) { _outgoingConnectionFactory.waitUntilFinished(); } if(_retryQueue != null) { _retryQueue.destroy(); // Must be called before destroying thread pools. } if(_initData.observer != null) { _initData.observer.setObserverUpdater(null); } LoggerAdminLogger logger = _initData.logger as LoggerAdminLogger; if(logger != null) { logger.destroy(); } // // Now, destroy the thread pools. This must be done *only* after // all the connections are finished (the connections destruction // can require invoking callbacks with the thread pools). // if(_serverThreadPool != null) { _serverThreadPool.destroy(); } if(_clientThreadPool != null) { _clientThreadPool.destroy(); } if(_asyncIOThread != null) { _asyncIOThread.destroy(); } if(_endpointHostResolver != null) { _endpointHostResolver.destroy(); } // // Wait for all the threads to be finished. // if(_timer != null) { _timer.destroy(); } if(_clientThreadPool != null) { _clientThreadPool.joinWithAllThreads(); } if(_serverThreadPool != null) { _serverThreadPool.joinWithAllThreads(); } if(_asyncIOThread != null) { _asyncIOThread.joinWithThread(); } if(_endpointHostResolver != null) { _endpointHostResolver.joinWithThread(); } foreach(Ice.ObjectFactory factory in _objectFactoryMap.Values) { // Disable Obsolete warning/error #pragma warning disable 612, 618 factory.destroy(); #pragma warning restore 612, 618 } _objectFactoryMap.Clear(); if(_routerManager != null) { _routerManager.destroy(); } if(_locatorManager != null) { _locatorManager.destroy(); } if(_endpointFactoryManager != null) { _endpointFactoryManager.destroy(); } if(_initData.properties.getPropertyAsInt("Ice.Warn.UnusedProperties") > 0) { List<string> unusedProperties = ((Ice.PropertiesI)_initData.properties).getUnusedProperties(); if (unusedProperties.Count != 0) { StringBuilder message = new StringBuilder("The following properties were set but never read:"); foreach (string s in unusedProperties) { message.Append("\n "); message.Append(s); } _initData.logger.warning(message.ToString()); } } // // Destroy last so that a Logger plugin can receive all log/traces before its destruction. // if(_pluginManager != null) { _pluginManager.destroy(); } lock(this) { _objectAdapterFactory = null; _outgoingConnectionFactory = null; _retryQueue = null; _serverThreadPool = null; _clientThreadPool = null; _asyncIOThread = null; _endpointHostResolver = null; _timer = null; _referenceFactory = null; _requestHandlerFactory = null; _proxyFactory = null; _routerManager = null; _locatorManager = null; _endpointFactoryManager = null; _pluginManager = null; _adminAdapter = null; _adminFacets.Clear(); _state = StateDestroyed; Monitor.PulseAll(this); } }