summaryrefslogtreecommitdiff
path: root/cpp
diff options
context:
space:
mode:
Diffstat (limited to 'cpp')
-rw-r--r--cpp/CHANGES33
-rwxr-xr-xcpp/allTests.py1
-rw-r--r--cpp/demo/Freeze/casino/BetResolver.cpp2
-rw-r--r--cpp/include/Ice/Config.h4
-rw-r--r--cpp/include/Ice/EndpointIF.h8
-rw-r--r--cpp/include/Ice/Outgoing.h55
-rw-r--r--cpp/include/Ice/OutgoingAsync.h74
-rw-r--r--cpp/include/Ice/OutgoingAsyncF.h11
-rw-r--r--cpp/include/Ice/ProtocolPluginFacade.h11
-rw-r--r--cpp/include/Ice/Proxy.h26
-rw-r--r--cpp/include/Ice/RequestHandlerF.h25
-rw-r--r--cpp/include/IceUtil/Timer.h20
-rw-r--r--cpp/src/Glacier2/Blobject.cpp169
-rw-r--r--cpp/src/Glacier2/Blobject.h10
-rw-r--r--cpp/src/Glacier2/ClientBlobject.cpp12
-rw-r--r--cpp/src/Glacier2/ClientBlobject.h2
-rwxr-xr-xcpp/src/Glacier2/FilterManager.cpp31
-rwxr-xr-xcpp/src/Glacier2/FilterManager.h7
-rw-r--r--cpp/src/Glacier2/Glacier2Router.cpp32
-rw-r--r--cpp/src/Glacier2/Instance.cpp59
-rw-r--r--cpp/src/Glacier2/Instance.h55
-rw-r--r--cpp/src/Glacier2/Makefile1
-rw-r--r--cpp/src/Glacier2/Makefile.mak1
-rw-r--r--cpp/src/Glacier2/RequestQueue.cpp340
-rw-r--r--cpp/src/Glacier2/RequestQueue.h44
-rw-r--r--cpp/src/Glacier2/RouterI.cpp53
-rw-r--r--cpp/src/Glacier2/RouterI.h19
-rw-r--r--cpp/src/Glacier2/ServerBlobject.cpp4
-rw-r--r--cpp/src/Glacier2/ServerBlobject.h2
-rw-r--r--cpp/src/Glacier2/SessionRouterI.cpp944
-rw-r--r--cpp/src/Glacier2/SessionRouterI.h75
-rw-r--r--cpp/src/Ice/.depend173
-rw-r--r--cpp/src/Ice/ConnectRequestHandler.cpp412
-rw-r--r--cpp/src/Ice/ConnectRequestHandler.h88
-rw-r--r--cpp/src/Ice/ConnectionFactory.cpp1212
-rw-r--r--cpp/src/Ice/ConnectionFactory.h101
-rw-r--r--cpp/src/Ice/ConnectionI.cpp2569
-rw-r--r--cpp/src/Ice/ConnectionI.h116
-rw-r--r--cpp/src/Ice/ConnectionMonitor.cpp2
-rw-r--r--cpp/src/Ice/ConnectionMonitor.h2
-rw-r--r--cpp/src/Ice/ConnectionRequestHandler.cpp107
-rw-r--r--cpp/src/Ice/ConnectionRequestHandler.h48
-rw-r--r--cpp/src/Ice/Connector.h7
-rw-r--r--cpp/src/Ice/EndpointFactoryManager.cpp91
-rw-r--r--cpp/src/Ice/EndpointI.cpp105
-rw-r--r--cpp/src/Ice/EndpointI.h55
-rw-r--r--cpp/src/Ice/EventHandler.cpp1
-rw-r--r--cpp/src/Ice/EventHandler.h14
-rw-r--r--cpp/src/Ice/EventHandlerF.h4
-rw-r--r--cpp/src/Ice/Instance.cpp61
-rw-r--r--cpp/src/Ice/Instance.h5
-rw-r--r--cpp/src/Ice/LocatorInfo.cpp375
-rw-r--r--cpp/src/Ice/LocatorInfo.h16
-rw-r--r--cpp/src/Ice/Makefile5
-rw-r--r--cpp/src/Ice/Makefile.mak5
-rw-r--r--cpp/src/Ice/Network.cpp409
-rw-r--r--cpp/src/Ice/Network.h5
-rw-r--r--cpp/src/Ice/ObjectAdapterFactory.cpp2
-rw-r--r--cpp/src/Ice/ObjectAdapterI.cpp27
-rw-r--r--cpp/src/Ice/Outgoing.cpp211
-rw-r--r--cpp/src/Ice/OutgoingAsync.cpp344
-rw-r--r--cpp/src/Ice/PropertyNames.cpp2
-rw-r--r--cpp/src/Ice/PropertyNames.h2
-rw-r--r--cpp/src/Ice/ProtocolPluginFacade.cpp12
-rw-r--r--cpp/src/Ice/Proxy.cpp177
-rw-r--r--cpp/src/Ice/Reference.cpp626
-rw-r--r--cpp/src/Ice/Reference.h24
-rw-r--r--cpp/src/Ice/ReferenceFactory.cpp3
-rw-r--r--cpp/src/Ice/RequestHandler.cpp23
-rw-r--r--cpp/src/Ice/RequestHandler.h55
-rw-r--r--cpp/src/Ice/RouterInfo.cpp237
-rw-r--r--cpp/src/Ice/RouterInfo.h35
-rw-r--r--cpp/src/Ice/Selector.cpp497
-rw-r--r--cpp/src/Ice/Selector.h137
-rw-r--r--cpp/src/Ice/SelectorThread.cpp309
-rw-r--r--cpp/src/Ice/SelectorThread.h137
-rw-r--r--cpp/src/Ice/SelectorThreadF.h26
-rw-r--r--cpp/src/Ice/TcpAcceptor.cpp2
-rw-r--r--cpp/src/Ice/TcpConnector.cpp30
-rw-r--r--cpp/src/Ice/TcpConnector.h7
-rw-r--r--cpp/src/Ice/TcpEndpointI.cpp33
-rw-r--r--cpp/src/Ice/TcpEndpointI.h5
-rw-r--r--cpp/src/Ice/TcpTransceiver.cpp55
-rw-r--r--cpp/src/Ice/TcpTransceiver.h19
-rw-r--r--cpp/src/Ice/ThreadPool.cpp501
-rw-r--r--cpp/src/Ice/ThreadPool.h48
-rw-r--r--cpp/src/Ice/TraceUtil.cpp393
-rw-r--r--cpp/src/Ice/TraceUtil.h7
-rw-r--r--cpp/src/Ice/Transceiver.h9
-rw-r--r--cpp/src/Ice/UdpConnector.cpp15
-rw-r--r--cpp/src/Ice/UdpConnector.h3
-rw-r--r--cpp/src/Ice/UdpEndpointI.cpp35
-rw-r--r--cpp/src/Ice/UdpEndpointI.h5
-rw-r--r--cpp/src/Ice/UdpTransceiver.cpp66
-rw-r--r--cpp/src/Ice/UdpTransceiver.h6
-rw-r--r--cpp/src/Ice/UnknownEndpointI.cpp8
-rw-r--r--cpp/src/Ice/UnknownEndpointI.h3
-rw-r--r--cpp/src/IceGrid/Allocatable.cpp2
-rw-r--r--cpp/src/IceGrid/Allocatable.h2
-rw-r--r--cpp/src/IceGrid/NodeCache.h2
-rw-r--r--cpp/src/IceGrid/ServerI.cpp4
-rw-r--r--cpp/src/IceSSL/AcceptorI.cpp2
-rw-r--r--cpp/src/IceSSL/ConnectorI.cpp128
-rw-r--r--cpp/src/IceSSL/ConnectorI.h4
-rw-r--r--cpp/src/IceSSL/EndpointI.cpp33
-rw-r--r--cpp/src/IceSSL/EndpointI.h5
-rw-r--r--cpp/src/IceSSL/Instance.cpp6
-rw-r--r--cpp/src/IceSSL/Instance.h1
-rw-r--r--cpp/src/IceSSL/TransceiverI.cpp264
-rw-r--r--cpp/src/IceSSL/TransceiverI.h18
-rw-r--r--cpp/src/IceStorm/Subscriber.cpp3
-rwxr-xr-xcpp/src/IceUtil/Timer.cpp12
-rwxr-xr-xcpp/src/slice2cpp/Gen.cpp10
-rwxr-xr-xcpp/src/slice2cs/Gen.cpp16
-rw-r--r--cpp/src/slice2freezej/Main.cpp34
-rw-r--r--cpp/src/slice2java/Gen.cpp15
-rw-r--r--cpp/test/Freeze/oldevictor/Client.cpp1
-rw-r--r--cpp/test/Glacier2/router/Client.cpp14
-rwxr-xr-xcpp/test/Glacier2/router/run.py76
-rw-r--r--cpp/test/Ice/Makefile3
-rw-r--r--cpp/test/Ice/Makefile.mak3
-rw-r--r--cpp/test/Ice/background/.depend17
-rw-r--r--cpp/test/Ice/background/.gitignore7
-rw-r--r--cpp/test/Ice/background/Acceptor.cpp54
-rw-r--r--cpp/test/Ice/background/Acceptor.h34
-rw-r--r--cpp/test/Ice/background/AllTests.cpp1171
-rw-r--r--cpp/test/Ice/background/Client.cpp78
-rw-r--r--cpp/test/Ice/background/Configuration.cpp182
-rw-r--r--cpp/test/Ice/background/Configuration.h67
-rw-r--r--cpp/test/Ice/background/Connector.cpp69
-rw-r--r--cpp/test/Ice/background/Connector.h38
-rw-r--r--cpp/test/Ice/background/EndpointFactory.cpp53
-rw-r--r--cpp/test/Ice/background/EndpointFactory.h35
-rw-r--r--cpp/test/Ice/background/EndpointI.cpp266
-rw-r--r--cpp/test/Ice/background/EndpointI.h63
-rw-r--r--cpp/test/Ice/background/Makefile70
-rw-r--r--cpp/test/Ice/background/Makefile.mak73
-rw-r--r--cpp/test/Ice/background/PluginI.cpp86
-rw-r--r--cpp/test/Ice/background/PluginI.h23
-rw-r--r--cpp/test/Ice/background/Server.cpp171
-rw-r--r--cpp/test/Ice/background/Test.ice46
-rw-r--r--cpp/test/Ice/background/TestI.cpp117
-rw-r--r--cpp/test/Ice/background/TestI.h66
-rw-r--r--cpp/test/Ice/background/Transceiver.cpp143
-rw-r--r--cpp/test/Ice/background/Transceiver.h43
-rwxr-xr-xcpp/test/Ice/background/run.py29
-rw-r--r--cpp/test/Ice/operations/AllTests.cpp10
-rw-r--r--cpp/test/Ice/operations/BatchOneways.cpp1
-rw-r--r--cpp/test/Ice/operations/Makefile4
-rw-r--r--cpp/test/Ice/operations/Makefile.mak4
-rw-r--r--cpp/test/Ice/operations/Oneways.cpp39
-rw-r--r--cpp/test/Ice/operations/OnewaysAMI.cpp145
-rw-r--r--cpp/test/Ice/operations/TestAMDI.cpp10
-rw-r--r--cpp/test/Ice/operations/TestAMDI.h1
-rw-r--r--cpp/test/Ice/operations/TwowaysAMI.cpp25
-rw-r--r--cpp/test/Ice/timeout/AllTests.cpp6
-rw-r--r--cpp/test/Ice/timeout/Client.cpp5
-rwxr-xr-xcpp/test/IceStorm/federation2/run.py5
-rw-r--r--cpp/test/IceUtil/timer/Client.cpp16
159 files changed, 12068 insertions, 4116 deletions
diff --git a/cpp/CHANGES b/cpp/CHANGES
index 6ac8d5ad362..e83e48ab889 100644
--- a/cpp/CHANGES
+++ b/cpp/CHANGES
@@ -1,6 +1,39 @@
Changes since version 3.2.X (binary incompatible)
-------------------------------------------------
+- Improved Glacier2 to take advantage of the new non-blocking aspects
+ of Ice. Glacier2 now uses the thread pool concurrency model by
+ default and in buffered mode, Glacier2 only uses a single thread to
+ forward queued requests. As a result, Glacier2 now requires a fixed
+ number of threads regardless of the number of connected clients.
+
+- Modified the collocation optimization check to not perform DNS
+ lookups. Invocations on a direct proxy will use collocation
+ optimization only if the host and port of one of its endpoint
+ matches the host and port of one of the endpoint or published
+ endpoint of an object adapter from the same communicator.
+
+- Added proxy methods flushBatchRequests() and
+ flushBatchRequests_async() to respectively synchronously and
+ asynchronously flush the batch requests of the connection associated
+ with the proxy. Like AMI requests, flushBatchRequests_async() is
+ guaranteed to not block.
+
+- Added support for oneway AMI requests. The ice_response() method of
+ the AMI callback is never called for oneway requests sent with AMI.
+ Unlike regular oneway requests which might block until the request
+ is passed to the TCP/IP stack, oneway AMI requests can't block.
+
+- Added support for server-side non-blocking connection creation.
+ Accepting a connection from a client can no longer block a thread
+ from server thread pool. In particular, the connection validation
+ and the SSL handshake can't block anymore.
+
+- Added support for non-blocking AMI and batch requests. The DNS
+ lookup, endpoint resolution, connection establishment and sending
+ of the request is now done in the background by a separate thread
+ if necessary.
+
- Glacier2 filters are now disabled by default for IceGrid client
and administrative sessions created with the IceGrid session
managers. If you rely on these filters to be set, you now need
diff --git a/cpp/allTests.py b/cpp/allTests.py
index 019f7cb67eb..33bc0d41a0a 100755
--- a/cpp/allTests.py
+++ b/cpp/allTests.py
@@ -50,6 +50,7 @@ tests = [
"Ice/custom",
"Ice/retry",
"Ice/timeout",
+ "Ice/background",
"Ice/servantLocator",
"Ice/threads",
"Ice/interceptor",
diff --git a/cpp/demo/Freeze/casino/BetResolver.cpp b/cpp/demo/Freeze/casino/BetResolver.cpp
index 642164de96d..10def583101 100644
--- a/cpp/demo/Freeze/casino/BetResolver.cpp
+++ b/cpp/demo/Freeze/casino/BetResolver.cpp
@@ -42,7 +42,7 @@ BetResolver::add(const CasinoStore::PersistentBetPrx& bet, Ice::Long closeTime)
}
virtual void
- run()
+ runTimerTask()
{
try
{
diff --git a/cpp/include/Ice/Config.h b/cpp/include/Ice/Config.h
index be46f18545f..8563409cd9b 100644
--- a/cpp/include/Ice/Config.h
+++ b/cpp/include/Ice/Config.h
@@ -71,4 +71,8 @@ inline int getSystemErrno() { return GetLastError(); }
inline int getSystemErrno() { return errno; }
#endif
+#if defined(__linux) && !defined(ICE_NO_EPOLL)
+# define ICE_USE_EPOLL 1
+#endif
+
#endif
diff --git a/cpp/include/Ice/EndpointIF.h b/cpp/include/Ice/EndpointIF.h
index 841a6948e3d..1e530d1e75d 100644
--- a/cpp/include/Ice/EndpointIF.h
+++ b/cpp/include/Ice/EndpointIF.h
@@ -17,8 +17,12 @@ namespace IceInternal
{
class EndpointI;
-ICE_API Ice::LocalObject* upCast(IceInternal::EndpointI*);
-typedef IceInternal::Handle<EndpointI> EndpointIPtr;
+ICE_API Ice::LocalObject* upCast(EndpointI*);
+typedef Handle<EndpointI> EndpointIPtr;
+
+class EndpointHostResolver;
+ICE_API IceUtil::Shared* upCast(EndpointHostResolver*);
+typedef Handle<EndpointHostResolver> EndpointHostResolverPtr;
}
diff --git a/cpp/include/Ice/Outgoing.h b/cpp/include/Ice/Outgoing.h
index c2cdfc040b3..10f3db806e0 100644
--- a/cpp/include/Ice/Outgoing.h
+++ b/cpp/include/Ice/Outgoing.h
@@ -12,6 +12,8 @@
#include <IceUtil/Mutex.h>
#include <IceUtil/Monitor.h>
+#include <Ice/RequestHandlerF.h>
+#include <Ice/InstanceF.h>
#include <Ice/ConnectionIF.h>
#include <Ice/ReferenceF.h>
#include <Ice/BasicStream.h>
@@ -59,15 +61,26 @@ private:
bool _retry;
};
-class ICE_API Outgoing : private IceUtil::noncopyable
+class ICE_API OutgoingMessageCallback : private IceUtil::noncopyable
{
public:
- Outgoing(Ice::ConnectionI*, Reference*, const std::string&, Ice::OperationMode, const Ice::Context*, bool);
+ virtual ~OutgoingMessageCallback() { }
+
+ virtual void sent(bool) = 0;
+ virtual void finished(const Ice::LocalException&) = 0;
+};
+
+class ICE_API Outgoing : public OutgoingMessageCallback
+{
+public:
+
+ Outgoing(RequestHandler*, const std::string&, Ice::OperationMode, const Ice::Context*);
bool invoke(); // Returns true if ok, false if user exception.
void abort(const Ice::LocalException&);
- void finished(BasicStream&);
+ virtual void sent(bool);
+ virtual void finished(BasicStream&);
void finished(const Ice::LocalException&);
// Inlined for speed optimization.
@@ -77,11 +90,10 @@ public:
private:
//
- // Optimization. The connection and the reference may not be
+ // Optimization. The request handler and the reference may not be
// deleted while a stack-allocated Outgoing still holds it.
//
- Ice::ConnectionI* _connection;
- Reference* _reference;
+ RequestHandler* _handler;
std::auto_ptr<Ice::LocalException> _exception;
@@ -91,13 +103,13 @@ private:
StateInProgress,
StateOK,
StateUserException,
- StateLocalException
+ StateLocalException,
+ StateFailed
} _state;
BasicStream _is;
BasicStream _os;
-
- const bool _compress;
+ bool _sent;
//
// NOTE: we use an attribute for the monitor instead of inheriting
@@ -109,6 +121,31 @@ private:
IceUtil::Monitor<IceUtil::Mutex> _monitor;
};
+class BatchOutgoing : public OutgoingMessageCallback
+{
+public:
+
+ BatchOutgoing(RequestHandler*);
+ BatchOutgoing(Ice::ConnectionI*, Instance*);
+
+ void invoke();
+
+ virtual void sent(bool);
+ virtual void finished(const Ice::LocalException&);
+
+ BasicStream* os() { return &_os; }
+
+private:
+
+ IceUtil::Monitor<IceUtil::Mutex> _monitor;
+ RequestHandler* _handler;
+ Ice::ConnectionI* _connection;
+ bool _sent;
+ std::auto_ptr<Ice::LocalException> _exception;
+
+ BasicStream _os;
+};
+
}
#endif
diff --git a/cpp/include/Ice/OutgoingAsync.h b/cpp/include/Ice/OutgoingAsync.h
index ffcc03236e0..8871ba08a68 100644
--- a/cpp/include/Ice/OutgoingAsync.h
+++ b/cpp/include/Ice/OutgoingAsync.h
@@ -11,8 +11,10 @@
#define ICE_OUTGOING_ASYNC_H
#include <IceUtil/Monitor.h>
-#include <IceUtil/RecMutex.h>
+#include <IceUtil/Mutex.h>
+#include <IceUtil/Timer.h>
#include <Ice/OutgoingAsyncF.h>
+#include <Ice/InstanceF.h>
#include <Ice/ReferenceF.h>
#include <Ice/ConnectionIF.h>
#include <Ice/Current.h>
@@ -21,22 +23,43 @@ namespace IceInternal
{
class BasicStream;
+class LocalExceptionWrapper;
+class Outgoing;
+
+class ICE_API OutgoingAsyncMessageCallback : virtual public IceUtil::Shared
+{
+public:
+
+ virtual ~OutgoingAsyncMessageCallback() { }
+
+ virtual void __sent(Ice::ConnectionI*) = 0;
+ virtual void __finished(const Ice::LocalException&) = 0;
+};
//
// We need virtual inheritance from shared, because the user might use
// multiple inheritance from IceUtil::Shared.
//
-class ICE_API OutgoingAsync : virtual public IceUtil::Shared
+class ICE_API OutgoingAsync : public OutgoingAsyncMessageCallback, public IceUtil::TimerTask
{
public:
OutgoingAsync();
virtual ~OutgoingAsync();
+ void __sent(Ice::ConnectionI*);
+
+ BasicStream*
+ __getOs()
+ {
+ return __os;
+ }
+
virtual void ice_exception(const Ice::Exception&) = 0;
void __finished(BasicStream&);
void __finished(const Ice::LocalException&);
+ void __finished(const LocalExceptionWrapper&);
protected:
@@ -50,17 +73,51 @@ protected:
private:
+ void runTimerTask(); // Implementation of TimerTask::runTimerTask()
+
void warning(const std::exception&) const;
void warning() const;
void cleanup();
+ bool _sent;
+ bool _response;
::Ice::ObjectPrx _proxy;
- ::IceInternal::Handle< ::IceDelegate::Ice::Object> _delegate;
+ Handle< ::IceDelegate::Ice::Object> _delegate;
int _cnt;
Ice::OperationMode _mode;
- IceUtil::Monitor<IceUtil::RecMutex> _monitor;
+ Ice::ConnectionIPtr _timerTaskConnection;
+ IceUtil::Monitor<IceUtil::Mutex> _monitor;
+};
+
+class ICE_API BatchOutgoingAsync : public OutgoingAsyncMessageCallback
+{
+public:
+
+ BatchOutgoingAsync();
+
+ void __prepare(const InstancePtr&);
+ virtual void __sent(Ice::ConnectionI*);
+ virtual void __finished(const Ice::LocalException&);
+
+ BasicStream*
+ __getOs()
+ {
+ return _os;
+ }
+
+ virtual void ice_exception(const Ice::Exception&) = 0;
+
+private:
+
+ void warning(const std::exception&) const;
+ void warning() const;
+
+ void cleanup();
+
+ IceUtil::Monitor<IceUtil::Mutex> _monitor;
+ BasicStream* _os;
};
}
@@ -98,6 +155,15 @@ protected:
virtual void __response(bool);
};
+class ICE_API AMI_Object_ice_flushBatchRequests : public IceInternal::BatchOutgoingAsync
+{
+public:
+
+ void __invoke(const Ice::ObjectPrx&);
+
+ virtual void ice_exception(const Ice::Exception&) = 0;
+};
+
}
#endif
diff --git a/cpp/include/Ice/OutgoingAsyncF.h b/cpp/include/Ice/OutgoingAsyncF.h
index 21f9b5f4737..769c319db85 100644
--- a/cpp/include/Ice/OutgoingAsyncF.h
+++ b/cpp/include/Ice/OutgoingAsyncF.h
@@ -21,6 +21,14 @@ class OutgoingAsync;
ICE_API IceUtil::Shared* upCast(OutgoingAsync*);
typedef IceInternal::Handle<OutgoingAsync> OutgoingAsyncPtr;
+class OutgoingAsyncMessageCallback;
+ICE_API IceUtil::Shared* upCast(OutgoingAsyncMessageCallback*);
+typedef IceInternal::Handle<OutgoingAsyncMessageCallback> OutgoingAsyncMessageCallbackPtr;
+
+class BatchOutgoingAsync;
+ICE_API IceUtil::Shared* upCast(BatchOutgoingAsync*);
+typedef IceInternal::Handle<BatchOutgoingAsync> BatchOutgoingAsyncPtr;
+
}
namespace Ice
@@ -28,6 +36,7 @@ namespace Ice
class AMI_Object_ice_invoke;
class AMI_Array_Object_ice_invoke;
+class AMI_Object_ice_flushBatchRequests;
}
@@ -36,6 +45,7 @@ namespace IceInternal
ICE_API IceUtil::Shared* upCast(::Ice::AMI_Object_ice_invoke*);
ICE_API IceUtil::Shared* upCast(::Ice::AMI_Array_Object_ice_invoke*);
+ICE_API IceUtil::Shared* upCast(::Ice::AMI_Object_ice_flushBatchRequests*);
}
@@ -44,6 +54,7 @@ namespace Ice
typedef IceInternal::Handle<AMI_Object_ice_invoke> AMI_Object_ice_invokePtr;
typedef IceInternal::Handle<AMI_Array_Object_ice_invoke> AMI_Array_Object_ice_invokePtr;
+typedef IceInternal::Handle<AMI_Object_ice_flushBatchRequests> AMI_Object_ice_flushBatchRequestsPtr;
}
diff --git a/cpp/include/Ice/ProtocolPluginFacade.h b/cpp/include/Ice/ProtocolPluginFacade.h
index 7228cba5b48..31ff388284f 100644
--- a/cpp/include/Ice/ProtocolPluginFacade.h
+++ b/cpp/include/Ice/ProtocolPluginFacade.h
@@ -15,6 +15,7 @@
#include <Ice/CommunicatorF.h>
#include <Ice/EndpointFactoryF.h>
#include <Ice/InstanceF.h>
+#include <Ice/EndpointIF.h>
namespace IceInternal
{
@@ -51,10 +52,20 @@ public:
const char* getNetworkTraceCategory() const;
//
+ // Get the endpoint host resolver.
+ //
+ EndpointHostResolverPtr getEndpointHostResolver() const;
+
+ //
// Register an EndpointFactory.
//
void addEndpointFactory(const EndpointFactoryPtr&) const;
+ //
+ // Get an EndpointFactory.
+ //
+ EndpointFactoryPtr getEndpointFactory(Ice::Short) const;
+
private:
ProtocolPluginFacade(const Ice::CommunicatorPtr&);
diff --git a/cpp/include/Ice/Proxy.h b/cpp/include/Ice/Proxy.h
index 2e2696b0c86..c3112addc6a 100644
--- a/cpp/include/Ice/Proxy.h
+++ b/cpp/include/Ice/Proxy.h
@@ -15,6 +15,7 @@
#include <Ice/ProxyF.h>
#include <Ice/ProxyFactoryF.h>
#include <Ice/ConnectionIF.h>
+#include <Ice/RequestHandlerF.h>
#include <Ice/EndpointIF.h>
#include <Ice/Endpoint.h>
#include <Ice/ObjectF.h>
@@ -235,6 +236,9 @@ public:
::Ice::ConnectionPtr ice_getConnection();
::Ice::ConnectionPtr ice_getCachedConnection() const;
+ void ice_flushBatchRequests();
+ void ice_flushBatchRequests_async(const ::Ice::AMI_Object_ice_flushBatchRequestsPtr&);
+
::IceInternal::ReferencePtr __reference() const;
void __copyFrom(const ::Ice::ObjectPrx&);
void __handleException(const ::IceInternal::Handle< ::IceDelegate::Ice::Object>&,
@@ -246,7 +250,9 @@ public:
void __checkTwowayOnly(const char*) const;
void __checkTwowayOnly(const ::std::string&) const;
- ::IceInternal::Handle< ::IceDelegate::Ice::Object> __getDelegate();
+ ::IceInternal::Handle< ::IceDelegate::Ice::Object> __getDelegate(bool);
+ void __setRequestHandler(const ::IceInternal::Handle< ::IceDelegate::Ice::Object>&,
+ const ::IceInternal::RequestHandlerPtr&);
protected:
@@ -299,8 +305,10 @@ public:
virtual bool ice_invoke(const ::std::string&, ::Ice::OperationMode,
const ::std::pair<const ::Ice::Byte*, const ::Ice::Byte*>&,
::std::vector< ::Ice::Byte>&, const ::Ice::Context*) = 0;
+ virtual void ice_flushBatchRequests() = 0;
- virtual ::Ice::ConnectionIPtr __getConnection(bool&) const = 0;
+ virtual ::IceInternal::RequestHandlerPtr __getRequestHandler() const = 0;
+ virtual void __setRequestHandler(const ::IceInternal::RequestHandlerPtr&) = 0;
};
} }
@@ -321,20 +329,20 @@ public:
virtual bool ice_invoke(const ::std::string&, ::Ice::OperationMode,
const ::std::pair<const ::Ice::Byte*, const ::Ice::Byte*>&,
::std::vector< ::Ice::Byte>&, const ::Ice::Context*);
+ virtual void ice_flushBatchRequests();
- virtual ::Ice::ConnectionIPtr __getConnection(bool&) const;
+ virtual ::IceInternal::RequestHandlerPtr __getRequestHandler() const;
+ virtual void __setRequestHandler(const ::IceInternal::RequestHandlerPtr&);
void __copyFrom(const ::IceInternal::Handle< ::IceDelegateM::Ice::Object>&);
protected:
- ::IceInternal::ReferencePtr __reference;
- ::Ice::ConnectionIPtr __connection;
- bool __compress;
+ ::IceInternal::RequestHandlerPtr __handler;
private:
- void setup(const ::IceInternal::ReferencePtr&);
+ void setup(const ::IceInternal::ReferencePtr&, const ::Ice::ObjectPrx&, bool);
friend class ::IceProxy::Ice::Object;
};
@@ -354,8 +362,10 @@ public:
virtual bool ice_invoke(const ::std::string&, ::Ice::OperationMode,
const ::std::pair<const ::Ice::Byte*, const ::Ice::Byte*>&,
::std::vector< ::Ice::Byte>&, const ::Ice::Context*);
+ virtual void ice_flushBatchRequests();
- virtual ::Ice::ConnectionIPtr __getConnection(bool&) const;
+ virtual ::IceInternal::RequestHandlerPtr __getRequestHandler() const;
+ virtual void __setRequestHandler(const ::IceInternal::RequestHandlerPtr&);
void __copyFrom(const ::IceInternal::Handle< ::IceDelegateD::Ice::Object>&);
diff --git a/cpp/include/Ice/RequestHandlerF.h b/cpp/include/Ice/RequestHandlerF.h
new file mode 100644
index 00000000000..ee313002dae
--- /dev/null
+++ b/cpp/include/Ice/RequestHandlerF.h
@@ -0,0 +1,25 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2007 ZeroC, Inc. All rights reserved.
+//
+// This copy of Ice is licensed to you under the terms described in the
+// ICE_LICENSE file included in this distribution.
+//
+// **********************************************************************
+
+#ifndef ICE_REQUEST_HANDLER_F_H
+#define ICE_REQUEST_HANDLER_F_H
+
+#include <IceUtil/Shared.h>
+#include <Ice/Handle.h>
+
+namespace IceInternal
+{
+
+class RequestHandler;
+ICE_API IceUtil::Shared* upCast(RequestHandler*);
+typedef IceInternal::Handle<RequestHandler> RequestHandlerPtr;
+
+}
+
+#endif
diff --git a/cpp/include/IceUtil/Timer.h b/cpp/include/IceUtil/Timer.h
index 246d87dcb7a..3725f9e4d46 100644
--- a/cpp/include/IceUtil/Timer.h
+++ b/cpp/include/IceUtil/Timer.h
@@ -25,7 +25,7 @@ class Timer;
typedef IceUtil::Handle<Timer> TimerPtr;
//
-// Extend the TimerTask class and override the run() method to execute
+// Extend the TimerTask class and override the runTimerTask() method to execute
// code at a specific time or repeatedly.
//
class ICE_UTIL_API TimerTask : virtual public IceUtil::Shared
@@ -34,9 +34,7 @@ public:
virtual ~TimerTask() { }
- virtual bool operator<(const TimerTask& r) const;
-
- virtual void run() = 0;
+ virtual void runTimerTask() = 0;
};
typedef IceUtil::Handle<TimerTask> TimerTaskPtr;
@@ -95,7 +93,17 @@ private:
IceUtil::Monitor<IceUtil::Mutex> _monitor;
bool _destroyed;
std::set<Token> _tokens;
- std::map<TimerTaskPtr, IceUtil::Time> _tasks;
+
+ class TimerTaskCompare : public std::binary_function<TimerTaskPtr, TimerTaskPtr, bool>
+ {
+ public:
+
+ bool operator()(const TimerTaskPtr& lhs, const TimerTaskPtr& rhs) const
+ {
+ return lhs.get() < rhs.get();
+ }
+ };
+ std::map<TimerTaskPtr, IceUtil::Time, TimerTaskCompare> _tasks;
IceUtil::Time _wakeUpTime;
};
typedef IceUtil::Handle<Timer> TimerPtr;
@@ -118,7 +126,7 @@ Timer::Token::operator<(const Timer::Token& r) const
return false;
}
- return task < r.task;
+ return task.get() < r.task.get();
}
}
diff --git a/cpp/src/Glacier2/Blobject.cpp b/cpp/src/Glacier2/Blobject.cpp
index bc5995fb547..6ae716c5cfe 100644
--- a/cpp/src/Glacier2/Blobject.cpp
+++ b/cpp/src/Glacier2/Blobject.cpp
@@ -15,73 +15,77 @@ using namespace Glacier2;
static const string serverForwardContext = "Glacier2.Server.ForwardContext";
static const string clientForwardContext = "Glacier2.Client.ForwardContext";
-static const string serverBuffered = "Glacier2.Server.Buffered";
-static const string clientBuffered = "Glacier2.Client.Buffered";
static const string serverAlwaysBatch = "Glacier2.Server.AlwaysBatch";
static const string clientAlwaysBatch = "Glacier2.Client.AlwaysBatch";
static const string serverTraceRequest = "Glacier2.Server.Trace.Request";
static const string clientTraceRequest = "Glacier2.Client.Trace.Request";
static const string serverTraceOverride = "Glacier2.Server.Trace.Override";
static const string clientTraceOverride = "Glacier2.Client.Trace.Override";
-static const string serverSleepTime = "Glacier2.Server.SleepTime";
-static const string clientSleepTime = "Glacier2.Client.SleepTime";
-Glacier2::Blobject::Blobject(const CommunicatorPtr& communicator, bool reverse, const Ice::Context& sslContext) :
- _communicator(communicator),
- _properties(_communicator->getProperties()),
- _logger(_communicator->getLogger()),
+namespace
+{
+
+class AMI_Array_Object_ice_invokeI : public AMI_Array_Object_ice_invoke
+{
+public:
+
+ AMI_Array_Object_ice_invokeI(const AMD_Array_Object_ice_invokePtr& amdCB) :
+ _amdCB(amdCB)
+ {
+ }
+
+ virtual void
+ ice_response(bool ok, const pair<const Byte*, const Byte*>& outParams)
+ {
+ if(_amdCB)
+ {
+ _amdCB->ice_response(ok, outParams);
+ }
+ }
+
+ virtual void
+ ice_exception(const Exception& ex)
+ {
+ if(_amdCB)
+ {
+ _amdCB->ice_exception(ex);
+ }
+ }
+
+private:
+
+ const AMD_Array_Object_ice_invokePtr _amdCB;
+};
+
+}
+
+Glacier2::Blobject::Blobject(const InstancePtr& instance, bool reverse, const Ice::Context& sslContext) :
+ _instance(instance),
_reverse(reverse),
_forwardContext(_reverse ?
- _properties->getPropertyAsInt(serverForwardContext) > 0 :
- _properties->getPropertyAsInt(clientForwardContext) > 0),
- _buffered(_reverse ?
- _properties->getPropertyAsIntWithDefault(serverBuffered, 1) > 0 :
- _properties->getPropertyAsIntWithDefault(clientBuffered, 1) > 0),
+ _instance->properties()->getPropertyAsInt(serverForwardContext) > 0 :
+ _instance->properties()->getPropertyAsInt(clientForwardContext) > 0),
_alwaysBatch(_reverse ?
- _properties->getPropertyAsInt(serverAlwaysBatch) > 0 :
- _properties->getPropertyAsInt(clientAlwaysBatch) > 0),
+ _instance->properties()->getPropertyAsInt(serverAlwaysBatch) > 0 :
+ _instance->properties()->getPropertyAsInt(clientAlwaysBatch) > 0),
_requestTraceLevel(_reverse ?
- _properties->getPropertyAsInt(serverTraceRequest) :
- _properties->getPropertyAsInt(clientTraceRequest)),
+ _instance->properties()->getPropertyAsInt(serverTraceRequest) :
+ _instance->properties()->getPropertyAsInt(clientTraceRequest)),
_overrideTraceLevel(reverse ?
- _properties->getPropertyAsInt(serverTraceOverride) :
- _properties->getPropertyAsInt(clientTraceOverride)),
+ _instance->properties()->getPropertyAsInt(serverTraceOverride) :
+ _instance->properties()->getPropertyAsInt(clientTraceOverride)),
_sslContext(sslContext)
{
-
- if(_buffered)
+ RequestQueueThreadPtr t = _reverse ? _instance->serverRequestQueueThread() : _instance->clientRequestQueueThread();
+ if(t)
{
- try
+ if(reverse)
{
- IceUtil::Time sleepTime = _reverse ?
- IceUtil::Time::milliSeconds(_properties->getPropertyAsInt(serverSleepTime)) :
- IceUtil::Time::milliSeconds(_properties->getPropertyAsInt(clientSleepTime));
-
- const_cast<RequestQueuePtr&>(_requestQueue) = new RequestQueue(sleepTime);
-
- Int threadStackSize = _properties->getPropertyAsInt("Ice.ThreadPerConnection.StackSize");
-
- _requestQueue->start(static_cast<size_t>(threadStackSize));
-
- //
- // See the comment in Glacier2::RequestQueue::destroy()
- // for why we detach the thread.
- //
- _requestQueue->getThreadControl().detach();
+ const_cast<RequestQueuePtr&>(_requestQueue) = new RequestQueue(t);
}
- catch(const IceUtil::Exception& ex)
+ else
{
- {
- Error out(_logger);
- out << "cannot create thread for request queue:\n" << ex;
- }
-
- if(_requestQueue)
- {
- _requestQueue->destroy();
- }
-
- throw;
+ const_cast<RequestQueuePtr&>(_requestQueue) = new RequestQueue(t);
}
}
}
@@ -91,12 +95,6 @@ Glacier2::Blobject::~Blobject()
}
void
-Glacier2::Blobject::destroy()
-{
- _requestQueue->destroy();
-}
-
-void
Glacier2::Blobject::invoke(ObjectPrx& proxy, const AMD_Array_Object_ice_invokePtr& amdCB,
const std::pair<const Ice::Byte*, const Ice::Byte*>& inParams, const Current& current)
{
@@ -114,7 +112,7 @@ Glacier2::Blobject::invoke(ObjectPrx& proxy, const AMD_Array_Object_ice_invokePt
//
if(current.requestId == 0)
{
- if(_alwaysBatch && _buffered)
+ if(_alwaysBatch && _requestQueue)
{
proxy = proxy->ice_batchOneway();
}
@@ -147,7 +145,7 @@ Glacier2::Blobject::invoke(ObjectPrx& proxy, const AMD_Array_Object_ice_invokePt
case 'o':
{
- if(_alwaysBatch && _buffered)
+ if(_alwaysBatch && _requestQueue)
{
proxy = proxy->ice_batchOneway();
}
@@ -160,7 +158,7 @@ Glacier2::Blobject::invoke(ObjectPrx& proxy, const AMD_Array_Object_ice_invokePt
case 'd':
{
- if(_alwaysBatch && _buffered)
+ if(_alwaysBatch && _requestQueue)
{
proxy = proxy->ice_batchDatagram();
}
@@ -173,7 +171,7 @@ Glacier2::Blobject::invoke(ObjectPrx& proxy, const AMD_Array_Object_ice_invokePt
case 'O':
{
- if(_buffered)
+ if(_requestQueue)
{
proxy = proxy->ice_batchOneway();
}
@@ -186,7 +184,7 @@ Glacier2::Blobject::invoke(ObjectPrx& proxy, const AMD_Array_Object_ice_invokePt
case 'D':
{
- if(_buffered)
+ if(_requestQueue)
{
proxy = proxy->ice_batchDatagram();
}
@@ -211,7 +209,7 @@ Glacier2::Blobject::invoke(ObjectPrx& proxy, const AMD_Array_Object_ice_invokePt
default:
{
- Warning out(_logger);
+ Warning out(_instance->logger());
out << "unknown forward option `" << option << "'";
break;
}
@@ -221,13 +219,13 @@ Glacier2::Blobject::invoke(ObjectPrx& proxy, const AMD_Array_Object_ice_invokePt
if(_requestTraceLevel >= 1)
{
- Trace out(_logger, "Glacier2");
+ Trace out(_instance->logger(), "Glacier2");
if(_reverse)
{
out << "reverse ";
}
out << "routing";
- if(_buffered)
+ if(_requestQueue)
{
out << " (buffered)";
}
@@ -237,11 +235,11 @@ Glacier2::Blobject::invoke(ObjectPrx& proxy, const AMD_Array_Object_ice_invokePt
}
if(_reverse)
{
- out << "\nidentity = " << _communicator->identityToString(proxy->ice_getIdentity());
+ out << "\nidentity = " << _instance->communicator()->identityToString(proxy->ice_getIdentity());
}
else
{
- out << "\nproxy = " << _communicator->proxyToString(proxy);
+ out << "\nproxy = " << _instance->communicator()->proxyToString(proxy);
}
out << "\noperation = " << current.operation;
out << "\ncontext = ";
@@ -256,7 +254,7 @@ Glacier2::Blobject::invoke(ObjectPrx& proxy, const AMD_Array_Object_ice_invokePt
}
}
- if(_buffered)
+ if(_requestQueue)
{
//
// If we are in buffered mode, we create a new request and add
@@ -278,7 +276,7 @@ Glacier2::Blobject::invoke(ObjectPrx& proxy, const AMD_Array_Object_ice_invokePt
if(override && _overrideTraceLevel >= 1)
{
- Trace out(_logger, "Glacier2");
+ Trace out(_instance->logger(), "Glacier2");
if(_reverse)
{
out << "reverse ";
@@ -286,11 +284,11 @@ Glacier2::Blobject::invoke(ObjectPrx& proxy, const AMD_Array_Object_ice_invokePt
out << "routing override";
if(_reverse)
{
- out << "\nidentity = " << _communicator->identityToString(proxy->ice_getIdentity());
+ out << "\nidentity = " << _instance->communicator()->identityToString(proxy->ice_getIdentity());
}
else
{
- out << "\nproxy = " << _communicator->proxyToString(proxy);
+ out << "\nproxy = " << _instance->communicator()->proxyToString(proxy);
}
out << "\noperation = " << current.operation;
out << "\ncontext = ";
@@ -311,48 +309,49 @@ Glacier2::Blobject::invoke(ObjectPrx& proxy, const AMD_Array_Object_ice_invokePt
// If we are in not in buffered mode, we send the request
// directly.
//
-
- bool ok;
- ByteSeq outParams;
+ assert(!proxy->ice_isBatchOneway() && !proxy->ice_isBatchDatagram());
try
{
+ AMI_Array_Object_ice_invokePtr amiCB;
+ if(proxy->ice_isTwoway())
+ {
+ amiCB = new AMI_Array_Object_ice_invokeI(amdCB);
+ }
+ else
+ {
+ amiCB = new AMI_Array_Object_ice_invokeI(0);
+ }
+
if(_forwardContext)
{
if(_sslContext.size() > 0)
{
Ice::Context ctx = current.ctx;
ctx.insert(_sslContext.begin(), _sslContext.end());
- ok = proxy->ice_invoke(current.operation, current.mode, inParams, outParams, ctx);
+ proxy->ice_invoke_async(amiCB, current.operation, current.mode, inParams);
}
else
{
- ok = proxy->ice_invoke(current.operation, current.mode, inParams, outParams, current.ctx);
+ proxy->ice_invoke_async(amiCB, current.operation, current.mode, inParams, current.ctx);
}
}
else
{
if(_sslContext.size() > 0)
{
- ok = proxy->ice_invoke(current.operation, current.mode, inParams, outParams, _sslContext);
+ proxy->ice_invoke_async(amiCB, current.operation, current.mode, inParams, _sslContext);
}
else
{
- ok = proxy->ice_invoke(current.operation, current.mode, inParams, outParams);
+ proxy->ice_invoke_async(amiCB, current.operation, current.mode, inParams);
}
}
- pair<const Byte*, const Byte*> outPair;
- if(outParams.size() == 0)
- {
- outPair.first = outPair.second = 0;
- }
- else
+ if(!proxy->ice_isTwoway())
{
- outPair.first = &outParams[0];
- outPair.second = outPair.first + outParams.size();
+ amdCB->ice_response(true, pair<const Byte*, const Byte*>(0, 0));
}
- amdCB->ice_response(ok, outPair);
}
catch(const LocalException& ex)
{
diff --git a/cpp/src/Glacier2/Blobject.h b/cpp/src/Glacier2/Blobject.h
index afda9383a7e..ab6ebf8b3ff 100644
--- a/cpp/src/Glacier2/Blobject.h
+++ b/cpp/src/Glacier2/Blobject.h
@@ -12,6 +12,7 @@
#include <Ice/Ice.h>
#include <Glacier2/RequestQueue.h>
+#include <Glacier2/Instance.h>
namespace Glacier2
{
@@ -20,25 +21,20 @@ class Blobject : public Ice::BlobjectArrayAsync
{
public:
- Blobject(const Ice::CommunicatorPtr&, bool, const Ice::Context&);
+ Blobject(const InstancePtr&, bool, const Ice::Context&);
virtual ~Blobject();
- virtual void destroy();
-
protected:
void invoke(Ice::ObjectPrx&, const Ice::AMD_Array_Object_ice_invokePtr&,
const std::pair<const Ice::Byte*, const Ice::Byte*>&, const Ice::Current&);
- const Ice::CommunicatorPtr _communicator;
- const Ice::PropertiesPtr _properties;
- const Ice::LoggerPtr _logger;
+ const InstancePtr _instance;
private:
const bool _reverse;
const bool _forwardContext;
- const bool _buffered;
const bool _alwaysBatch;
const int _requestTraceLevel;
const int _overrideTraceLevel;
diff --git a/cpp/src/Glacier2/ClientBlobject.cpp b/cpp/src/Glacier2/ClientBlobject.cpp
index a1e32dca027..daf772c3c83 100644
--- a/cpp/src/Glacier2/ClientBlobject.cpp
+++ b/cpp/src/Glacier2/ClientBlobject.cpp
@@ -16,14 +16,14 @@ using namespace std;
using namespace Ice;
using namespace Glacier2;
-Glacier2::ClientBlobject::ClientBlobject(const CommunicatorPtr& communicator,
+Glacier2::ClientBlobject::ClientBlobject(const InstancePtr& instance,
const FilterManagerPtr& filters,
const Ice::Context& sslContext):
- Glacier2::Blobject(communicator, false, sslContext),
- _routingTable(new RoutingTable(communicator)),
+ Glacier2::Blobject(instance, false, sslContext),
+ _routingTable(new RoutingTable(_instance->communicator())),
_filters(filters),
- _rejectTraceLevel(_properties->getPropertyAsInt("Glacier2.Client.Trace.Reject"))
+ _rejectTraceLevel(_instance->properties()->getPropertyAsInt("Glacier2.Client.Trace.Reject"))
{
}
@@ -117,9 +117,9 @@ Glacier2::ClientBlobject::ice_invoke_async(const Ice::AMD_Array_Object_ice_invok
{
if(_rejectTraceLevel >= 1)
{
- Trace out(_logger, "Glacier2");
+ Trace out(_instance->logger(), "Glacier2");
out << "rejecting request: " << rejectedFilters << "\n";
- out << "identity: " << _communicator->identityToString(current.id);
+ out << "identity: " << _instance->communicator()->identityToString(current.id);
}
ObjectNotExistException ex(__FILE__, __LINE__);
diff --git a/cpp/src/Glacier2/ClientBlobject.h b/cpp/src/Glacier2/ClientBlobject.h
index 5385a0f2c0b..62824646190 100644
--- a/cpp/src/Glacier2/ClientBlobject.h
+++ b/cpp/src/Glacier2/ClientBlobject.h
@@ -31,7 +31,7 @@ class ClientBlobject : public Glacier2::Blobject
{
public:
- ClientBlobject(const Ice::CommunicatorPtr&, const FilterManagerPtr&, const Ice::Context&);
+ ClientBlobject(const InstancePtr&, const FilterManagerPtr&, const Ice::Context&);
virtual ~ClientBlobject();
virtual void ice_invoke_async(const Ice::AMD_Array_Object_ice_invokePtr&,
diff --git a/cpp/src/Glacier2/FilterManager.cpp b/cpp/src/Glacier2/FilterManager.cpp
index 48112725aa6..079dd964b14 100755
--- a/cpp/src/Glacier2/FilterManager.cpp
+++ b/cpp/src/Glacier2/FilterManager.cpp
@@ -109,13 +109,14 @@ Glacier2::FilterManager::~FilterManager()
void
Glacier2::FilterManager::destroy()
{
- if(_adapter)
+ Ice::ObjectAdapterPtr adapter = _instance->serverObjectAdapter();
+ if(adapter)
{
try
{
if(_categoriesPrx)
{
- _adapter->remove(_categoriesPrx->ice_getIdentity());
+ adapter->remove(_categoriesPrx->ice_getIdentity());
}
}
catch(const Exception&)
@@ -125,7 +126,7 @@ Glacier2::FilterManager::destroy()
{
if(_adapterIdsPrx)
{
- _adapter->remove(_adapterIdsPrx->ice_getIdentity());
+ adapter->remove(_adapterIdsPrx->ice_getIdentity());
}
}
catch(const Exception&)
@@ -135,7 +136,7 @@ Glacier2::FilterManager::destroy()
{
if(_identitiesPrx)
{
- _adapter->remove(_identitiesPrx->ice_getIdentity());
+ adapter->remove(_identitiesPrx->ice_getIdentity());
}
}
catch(const Exception&)
@@ -144,21 +145,22 @@ Glacier2::FilterManager::destroy()
}
}
-Glacier2::FilterManager::FilterManager(const ObjectAdapterPtr& adapter, const Glacier2::StringSetIPtr& categories,
+Glacier2::FilterManager::FilterManager(const InstancePtr& instance, const Glacier2::StringSetIPtr& categories,
const Glacier2::StringSetIPtr& adapters,
const Glacier2::IdentitySetIPtr& identities) :
_categories(categories),
_adapters(adapters),
_identities(identities),
- _adapter(adapter)
+ _instance(instance)
{
try
{
- if(_adapter)
+ Ice::ObjectAdapterPtr adapter = _instance->serverObjectAdapter();
+ if(adapter)
{
- _categoriesPrx = Glacier2::StringSetPrx::uncheckedCast(_adapter->addWithUUID(_categories));
- _adapterIdsPrx = Glacier2::StringSetPrx::uncheckedCast(_adapter->addWithUUID(_adapters));
- _identitiesPrx = Glacier2::IdentitySetPrx::uncheckedCast(_adapter->addWithUUID(_identities));
+ _categoriesPrx = Glacier2::StringSetPrx::uncheckedCast(adapter->addWithUUID(_categories));
+ _adapterIdsPrx = Glacier2::StringSetPrx::uncheckedCast(adapter->addWithUUID(_adapters));
+ _identitiesPrx = Glacier2::IdentitySetPrx::uncheckedCast(adapter->addWithUUID(_identities));
}
}
catch(...)
@@ -169,10 +171,9 @@ Glacier2::FilterManager::FilterManager(const ObjectAdapterPtr& adapter, const Gl
}
Glacier2::FilterManager*
-Glacier2::FilterManager::create(const CommunicatorPtr& communicator, const ObjectAdapterPtr& adapter, const string& userId,
- const bool allowAddUser)
+Glacier2::FilterManager::create(const InstancePtr& instance, const string& userId, const bool allowAddUser)
{
- PropertiesPtr props = communicator->getProperties();
+ PropertiesPtr props = instance->properties();
string allow = props->getProperty("Glacier2.Filter.Category.Accept");
vector<string> allowSeq;
stringToSeq(allow, allowSeq);
@@ -211,8 +212,8 @@ Glacier2::FilterManager::create(const CommunicatorPtr& communicator, const Objec
//
IdentitySeq allowIdSeq;
allow = props->getProperty("Glacier2.Filter.Identity.Accept");
- stringToSeq(communicator, allow, allowIdSeq);
+ stringToSeq(instance->communicator(), allow, allowIdSeq);
Glacier2::IdentitySetIPtr identityFilter = new Glacier2::IdentitySetI(allowIdSeq);
- return new Glacier2::FilterManager(adapter, categoryFilter, adapterIdFilter, identityFilter);
+ return new Glacier2::FilterManager(instance, categoryFilter, adapterIdFilter, identityFilter);
}
diff --git a/cpp/src/Glacier2/FilterManager.h b/cpp/src/Glacier2/FilterManager.h
index 71881846e81..db74035f80d 100755
--- a/cpp/src/Glacier2/FilterManager.h
+++ b/cpp/src/Glacier2/FilterManager.h
@@ -14,6 +14,7 @@
// It'd be better if we didn't have to include this everywhere, but
// this is the most expeditious approach for now.
//
+#include <Glacier2/Instance.h>
#include <Glacier2/FilterI.h>
#include <Ice/ObjectAdapter.h>
@@ -67,7 +68,7 @@ public:
}
static FilterManager*
- create(const Ice::CommunicatorPtr&, const Ice::ObjectAdapterPtr&, const std::string&, const bool);
+ create(const InstancePtr&, const std::string&, const bool);
private:
@@ -78,9 +79,9 @@ private:
const StringSetIPtr _categories;
const StringSetIPtr _adapters;
const IdentitySetIPtr _identities;
- const Ice::ObjectAdapterPtr _adapter;
+ const InstancePtr _instance;
- FilterManager(const Ice::ObjectAdapterPtr& , const StringSetIPtr&, const StringSetIPtr&, const IdentitySetIPtr&);
+ FilterManager(const InstancePtr& , const StringSetIPtr&, const StringSetIPtr&, const IdentitySetIPtr&);
};
};
diff --git a/cpp/src/Glacier2/Glacier2Router.cpp b/cpp/src/Glacier2/Glacier2Router.cpp
index 9cbeadab7a6..6745551c474 100644
--- a/cpp/src/Glacier2/Glacier2Router.cpp
+++ b/cpp/src/Glacier2/Glacier2Router.cpp
@@ -11,6 +11,7 @@
#include <IceUtil/UUID.h>
#include <IceUtil/Options.h>
#include <Ice/Service.h>
+#include <Glacier2/Instance.h>
#include <Glacier2/RouterI.h>
#include <Glacier2/Session.h>
#include <Glacier2/SessionRouterI.h>
@@ -60,6 +61,7 @@ private:
void usage(const std::string&);
+ InstancePtr _instance;
SessionRouterIPtr _sessionRouter;
};
@@ -428,12 +430,16 @@ Glacier2::RouterService::start(int argc, char* argv[])
}
//
+ // Create the instance object.
+ //
+ _instance = new Instance(communicator(), clientAdapter, serverAdapter);
+
+ //
// Create the session router. The session router registers itself
// and all required servant locators, so no registration has to be
// done here.
//
- _sessionRouter = new SessionRouterI(clientAdapter, serverAdapter, verifier, sessionManager, sslVerifier,
- sslSessionManager);
+ _sessionRouter = new SessionRouterI(_instance, verifier, sessionManager, sslVerifier, sslSessionManager);
//
// If we have an admin adapter, we add an admin object.
@@ -482,6 +488,12 @@ Glacier2::RouterService::stop()
_sessionRouter->destroy();
_sessionRouter = 0;
}
+
+ if(_instance)
+ {
+ _instance->destroy();
+ _instance = 0;
+ }
return true;
}
@@ -493,11 +505,6 @@ Glacier2::RouterService::initializeCommunicator(int& argc, char* argv[],
initData.properties = createProperties(argc, argv, initializationData.properties);
//
- // Glacier2 always runs in thread-per-connection mode.
- //
- initData.properties->setProperty("Ice.ThreadPerConnection", "1");
-
- //
// Make sure that Glacier2 doesn't use a router.
//
initData.properties->setProperty("Ice.Default.Router", "");
@@ -508,17 +515,6 @@ Glacier2::RouterService::initializeCommunicator(int& argc, char* argv[],
//
initData.properties->setProperty("Ice.ACM.Client", "0");
initData.properties->setProperty("Ice.ACM.Server", "0");
-
- //
- // Ice.MonitorConnections defaults to the smaller of Ice.ACM.Client
- // or Ice.ACM.Server, which we set to 0 above. However, we still want
- // the connection monitor thread for AMI timeouts. We only set
- // this value if it hasn't been set explicitly already.
- //
- if(initData.properties->getProperty("Ice.MonitorConnections").empty())
- {
- initData.properties->setProperty("Ice.MonitorConnections", "60");
- }
//
// We do not need to set Ice.RetryIntervals to -1, i.e., we do
diff --git a/cpp/src/Glacier2/Instance.cpp b/cpp/src/Glacier2/Instance.cpp
new file mode 100644
index 00000000000..00f3042d401
--- /dev/null
+++ b/cpp/src/Glacier2/Instance.cpp
@@ -0,0 +1,59 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2007 ZeroC, Inc. All rights reserved.
+//
+// This copy of Ice is licensed to you under the terms described in the
+// ICE_LICENSE file included in this distribution.
+//
+// **********************************************************************
+
+#include <Glacier2/Instance.h>
+
+using namespace std;
+using namespace Glacier2;
+
+static const string serverSleepTime = "Glacier2.Server.SleepTime";
+static const string clientSleepTime = "Glacier2.Client.SleepTime";
+static const string serverBuffered = "Glacier2.Server.Buffered";
+static const string clientBuffered = "Glacier2.Client.Buffered";
+
+Glacier2::Instance::Instance(const Ice::CommunicatorPtr& communicator, const Ice::ObjectAdapterPtr& clientAdapter,
+ const Ice::ObjectAdapterPtr& serverAdapter) :
+ _communicator(communicator),
+ _properties(communicator->getProperties()),
+ _logger(communicator->getLogger()),
+ _clientAdapter(clientAdapter),
+ _serverAdapter(serverAdapter)
+{
+ if(_properties->getPropertyAsIntWithDefault(serverBuffered, 1) > 0)
+ {
+ IceUtil::Time sleepTime = IceUtil::Time::milliSeconds(_properties->getPropertyAsInt(serverSleepTime));
+ const_cast<RequestQueueThreadPtr&>(_serverRequestQueueThread) = new RequestQueueThread(sleepTime);
+ _serverRequestQueueThread->start();
+ }
+
+ if(_properties->getPropertyAsIntWithDefault(clientBuffered, 1) > 0)
+ {
+ IceUtil::Time sleepTime = IceUtil::Time::milliSeconds(_properties->getPropertyAsInt(clientSleepTime));
+ const_cast<RequestQueueThreadPtr&>(_clientRequestQueueThread) = new RequestQueueThread(sleepTime);
+ _clientRequestQueueThread->start();
+ }
+}
+
+Glacier2::Instance::~Instance()
+{
+}
+
+void
+Glacier2::Instance::destroy()
+{
+ if(_clientRequestQueueThread)
+ {
+ _clientRequestQueueThread->destroy();
+ }
+
+ if(_serverRequestQueueThread)
+ {
+ _serverRequestQueueThread->destroy();
+ }
+}
diff --git a/cpp/src/Glacier2/Instance.h b/cpp/src/Glacier2/Instance.h
new file mode 100644
index 00000000000..dbe05d48e56
--- /dev/null
+++ b/cpp/src/Glacier2/Instance.h
@@ -0,0 +1,55 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2007 ZeroC, Inc. All rights reserved.
+//
+// This copy of Ice is licensed to you under the terms described in the
+// ICE_LICENSE file included in this distribution.
+//
+// **********************************************************************
+
+#ifndef GLACIER2_INSTANCE_H
+#define GLACIER2_INSTANCE_H
+
+#include <Ice/CommunicatorF.h>
+#include <Ice/ObjectAdapterF.h>
+#include <Ice/PropertiesF.h>
+#include <IceUtil/Time.h>
+
+#include <Glacier2/RequestQueue.h>
+
+namespace Glacier2
+{
+
+class Instance : public IceUtil::Shared
+{
+public:
+
+ Instance(const Ice::CommunicatorPtr&, const Ice::ObjectAdapterPtr&, const Ice::ObjectAdapterPtr&);
+ ~Instance();
+
+ Ice::CommunicatorPtr communicator() const { return _communicator; }
+ Ice::ObjectAdapterPtr clientObjectAdapter() const { return _clientAdapter; }
+ Ice::ObjectAdapterPtr serverObjectAdapter() const { return _serverAdapter; }
+ Ice::PropertiesPtr properties() const { return _properties; }
+ Ice::LoggerPtr logger() const { return _logger; }
+
+ RequestQueueThreadPtr clientRequestQueueThread() const { return _clientRequestQueueThread; }
+ RequestQueueThreadPtr serverRequestQueueThread() const { return _serverRequestQueueThread; }
+
+ void destroy();
+
+private:
+
+ const Ice::CommunicatorPtr _communicator;
+ const Ice::PropertiesPtr _properties;
+ const Ice::LoggerPtr _logger;
+ const Ice::ObjectAdapterPtr _clientAdapter;
+ const Ice::ObjectAdapterPtr _serverAdapter;
+ const RequestQueueThreadPtr _clientRequestQueueThread;
+ const RequestQueueThreadPtr _serverRequestQueueThread;
+};
+typedef IceUtil::Handle<Instance> InstancePtr;
+
+} // End namespace Glacier2
+
+#endif
diff --git a/cpp/src/Glacier2/Makefile b/cpp/src/Glacier2/Makefile
index 07f73a0be00..fab4fe99ae5 100644
--- a/cpp/src/Glacier2/Makefile
+++ b/cpp/src/Glacier2/Makefile
@@ -27,6 +27,7 @@ ROBJS = Blobject.o \
ClientBlobject.o \
CryptPermissionsVerifierI.o \
Glacier2Router.o \
+ Instance.o \
ProxyVerifier.o \
RequestQueue.o \
RouterI.o \
diff --git a/cpp/src/Glacier2/Makefile.mak b/cpp/src/Glacier2/Makefile.mak
index 8eda88543f4..88ed24437df 100644
--- a/cpp/src/Glacier2/Makefile.mak
+++ b/cpp/src/Glacier2/Makefile.mak
@@ -33,6 +33,7 @@ ROBJS = Blobject.obj \
ClientBlobject.obj \
CryptPermissionsVerifierI.obj \
Glacier2Router.obj \
+ Instance.obj \
ProxyVerifier.obj \
RequestQueue.obj \
RouterI.obj \
diff --git a/cpp/src/Glacier2/RequestQueue.cpp b/cpp/src/Glacier2/RequestQueue.cpp
index 399884cf2f2..e508fa1ad51 100644
--- a/cpp/src/Glacier2/RequestQueue.cpp
+++ b/cpp/src/Glacier2/RequestQueue.cpp
@@ -14,43 +14,40 @@ using namespace std;
using namespace Ice;
using namespace Glacier2;
-namespace Glacier2
+namespace
{
//
// AMI callback class for twoway requests
//
-// NOTE: the received response isn't sent back directly with the AMD
-// callback. Instead it's queued and the request queue thread is
-// responsible for sending back the response. It's necessary because
-// sending back the response might block.
-//
class AMI_Array_Object_ice_invokeI : public AMI_Array_Object_ice_invoke
{
public:
-
- AMI_Array_Object_ice_invokeI(const RequestQueuePtr& requestQueue, const AMD_Array_Object_ice_invokePtr& amdCB) :
- _requestQueue(requestQueue),
- _amdCB(amdCB)
+
+ AMI_Array_Object_ice_invokeI(const AMD_Array_Object_ice_invokePtr& amdCB) : _amdCB(amdCB)
{
- assert(_amdCB);
}
-
+
virtual void
ice_response(bool ok, const pair<const Byte*, const Byte*>& outParams)
{
- _requestQueue->addResponse(new Response(_amdCB, ok, outParams));
+ if(_amdCB)
+ {
+ _amdCB->ice_response(ok, outParams);
+ }
}
virtual void
ice_exception(const Exception& ex)
{
- _requestQueue->addResponse(new Response(_amdCB, ex));
+ if(_amdCB)
+ {
+ _amdCB->ice_exception(ex);
+ }
}
private:
- const RequestQueuePtr _requestQueue;
const AMD_Array_Object_ice_invokePtr _amdCB;
};
@@ -72,9 +69,7 @@ Glacier2::Request::Request(const ObjectPrx& proxy, const std::pair<const Byte*,
//
if(!_proxy->ice_isTwoway())
{
- bool ok = true;
- pair<const Byte*, const Byte*> outParams(0, 0);
- _amdCB->ice_response(ok, outParams);
+ _amdCB->ice_response(true, pair<const Byte*, const Byte*>(0, 0));
}
Context::const_iterator p = current.ctx.find("_ovrd");
@@ -86,7 +81,7 @@ Glacier2::Request::Request(const ObjectPrx& proxy, const std::pair<const Byte*,
bool
-Glacier2::Request::invoke(const RequestQueuePtr& requestQueue)
+Glacier2::Request::invoke()
{
pair<const Byte*, const Byte*> inPair;
if(_inParams.size() == 0)
@@ -98,69 +93,73 @@ Glacier2::Request::invoke(const RequestQueuePtr& requestQueue)
inPair.first = &_inParams[0];
inPair.second = inPair.first + _inParams.size();
}
- if(_proxy->ice_isTwoway())
+
+ if(_proxy->ice_isBatchOneway() || _proxy->ice_isBatchDatagram())
{
- AMI_Array_Object_ice_invokePtr cb = new AMI_Array_Object_ice_invokeI(requestQueue, _amdCB);
+ ByteSeq outParams;
if(_forwardContext)
- {
+ {
if(_sslContext.size() > 0)
{
Ice::Context ctx = _current.ctx;
ctx.insert(_sslContext.begin(), _sslContext.end());
- _proxy->ice_invoke_async(cb, _current.operation, _current.mode, inPair, ctx);
+ _proxy->ice_invoke(_current.operation, _current.mode, inPair, outParams, ctx);
}
else
{
- _proxy->ice_invoke_async(cb, _current.operation, _current.mode, inPair, _current.ctx);
+ _proxy->ice_invoke(_current.operation, _current.mode, inPair, outParams, _current.ctx);
}
}
else
{
if(_sslContext.size() > 0)
{
- _proxy->ice_invoke_async(cb, _current.operation, _current.mode, inPair, _sslContext);
+ _proxy->ice_invoke(_current.operation, _current.mode, inPair, outParams, _sslContext);
}
else
{
- _proxy->ice_invoke_async(cb, _current.operation, _current.mode, inPair);
+ _proxy->ice_invoke(_current.operation, _current.mode, inPair, outParams);
}
}
- return true; // A twoway method is being dispatched.
+ return true; // Batch invocation.
}
else
{
- try
+ AMI_Array_Object_ice_invokePtr amiCB;
+ if(_proxy->ice_isTwoway())
+ {
+ amiCB = new AMI_Array_Object_ice_invokeI(_amdCB);
+ }
+ else
{
- ByteSeq outParams;
- if(_forwardContext)
+ amiCB = new AMI_Array_Object_ice_invokeI(0);
+ }
+
+ if(_forwardContext)
+ {
+ if(_sslContext.size() > 0)
{
- if(_sslContext.size() > 0)
- {
- Ice::Context ctx = _current.ctx;
- ctx.insert(_sslContext.begin(), _sslContext.end());
- _proxy->ice_invoke(_current.operation, _current.mode, inPair, outParams, ctx);
- }
- else
- {
- _proxy->ice_invoke(_current.operation, _current.mode, inPair, outParams, _current.ctx);
- }
+ Ice::Context ctx = _current.ctx;
+ ctx.insert(_sslContext.begin(), _sslContext.end());
+ _proxy->ice_invoke_async(amiCB, _current.operation, _current.mode, inPair, ctx);
}
else
{
- if(_sslContext.size() > 0)
- {
- _proxy->ice_invoke(_current.operation, _current.mode, inPair, outParams, _sslContext);
- }
- else
- {
- _proxy->ice_invoke(_current.operation, _current.mode, inPair, outParams);
- }
+ _proxy->ice_invoke_async(amiCB, _current.operation, _current.mode, inPair, _current.ctx);
}
}
- catch(const LocalException&)
+ else
{
+ if(_sslContext.size() > 0)
+ {
+ _proxy->ice_invoke_async(amiCB, _current.operation, _current.mode, inPair, _sslContext);
+ }
+ else
+ {
+ _proxy->ice_invoke_async(amiCB, _current.operation, _current.mode, inPair);
+ }
}
- return false;
+ return false; // Not a batch invocation.
}
}
@@ -195,74 +194,68 @@ Glacier2::Request::override(const RequestPtr& other) const
return _override == other->_override;
}
-bool
-Glacier2::Request::isBatch() const
-{
- return _proxy->ice_isBatchOneway() || _proxy->ice_isBatchDatagram();
-}
-
-ConnectionPtr
-Glacier2::Request::getConnection() const
-{
- return _proxy->ice_getConnection();
-}
-
-Glacier2::Response::Response(const AMD_Array_Object_ice_invokePtr& amdCB, bool ok,
- const pair<const Byte*, const Byte*>& outParams) :
- _amdCB(amdCB),
- _ok(ok),
- _outParams(outParams.first, outParams.second)
+Glacier2::RequestQueue::RequestQueue(const RequestQueueThreadPtr& requestQueueThread) :
+ _requestQueueThread(requestQueueThread)
{
}
-Glacier2::Response::Response(const AMD_Array_Object_ice_invokePtr& amdCB, const Exception& ex) :
- _amdCB(amdCB),
- _ok(false),
- _exception(ex.ice_clone())
+bool
+Glacier2::RequestQueue::addRequest(const RequestPtr& request)
{
+ IceUtil::Mutex::Lock lock(*this);
+ for(vector<RequestPtr>::iterator p = _requests.begin(); p != _requests.end(); ++p)
+ {
+ //
+ // If the new request overrides an old one, then abort the old
+ // request and replace it with the new request.
+ //
+ if(request->override(*p))
+ {
+ *p = request;
+ return true;
+ }
+ }
+
+ //
+ // No override, we add the new request.
+ //
+ if(_requests.empty())
+ {
+ _requestQueueThread->flushRequestQueue(this); // This might throw if the thread is destroyed.
+ }
+ _requests.push_back(request);
+ return false;
}
void
-Glacier2::Response::invoke()
+Glacier2::RequestQueue::flushRequests(set<Ice::ObjectPrx>& batchProxies)
{
- if(_exception.get())
+ IceUtil::Mutex::Lock lock(*this);
+ for(vector<RequestPtr>::const_iterator p = _requests.begin(); p != _requests.end(); ++p)
{
- _amdCB->ice_exception(*_exception.get());
- }
- else
- {
- pair<const Byte*, const Byte*> outPair;
- if(_outParams.size() == 0)
- {
- outPair.first = outPair.second = 0;
- }
- else
+ if((*p)->invoke()) // If batch invocation, add the proxy to the batch proxy set.
{
- outPair.first = &_outParams[0];
- outPair.second = outPair.first + _outParams.size();
+ batchProxies.insert((*p)->getProxy());
}
- _amdCB->ice_response(_ok, outPair);
}
+ _requests.clear();
}
-Glacier2::RequestQueue::RequestQueue(const IceUtil::Time& sleepTime) :
+Glacier2::RequestQueueThread::RequestQueueThread(const IceUtil::Time& sleepTime) :
_sleepTime(sleepTime),
_destroy(false),
_sleep(false)
{
}
-Glacier2::RequestQueue::~RequestQueue()
+Glacier2::RequestQueueThread::~RequestQueueThread()
{
- IceUtil::Monitor<IceUtil::Mutex>::Lock lock(*this);
-
assert(_destroy);
- assert(_requests.empty());
- assert(_responses.empty());
+ assert(_queues.empty());
}
void
-Glacier2::RequestQueue::destroy()
+Glacier2::RequestQueueThread::destroy()
{
{
IceUtil::Monitor<IceUtil::Mutex>::Lock lock(*this);
@@ -273,82 +266,42 @@ Glacier2::RequestQueue::destroy()
notify();
}
- //
- // We don't want to wait for the RequestQueue thread, because this
- // destroy() operation is called when sessions expire or are
- // destroyed, in which case we do not want the session handler
- // thread to block here. Therefore we don't call join(), but
- // instead detach the thread right after we start it.
- //
- //getThreadControl().join();
+ getThreadControl().join();
}
-bool
-Glacier2::RequestQueue::addRequest(const RequestPtr& request)
+void
+Glacier2::RequestQueueThread::flushRequestQueue(const RequestQueuePtr& queue)
{
IceUtil::Monitor<IceUtil::Mutex>::Lock lock(*this);
-
if(_destroy)
{
- throw ObjectNotExistException(__FILE__, __LINE__);
- }
-
- for(vector<RequestPtr>::iterator p = _requests.begin(); p != _requests.end(); ++p)
- {
- //
- // If the new request overrides an old one, then abort the old
- // request and replace it with the new request.
- //
- if(request->override(*p))
- {
- *p = request;
- return true;
- }
+ throw Ice::ObjectNotExistException(__FILE__, __LINE__);
}
- //
- // No override, we add the new request.
- //
- _requests.push_back(request);
- if(!_sleep)
+ if(_queues.empty() && !_sleep)
{
- //
- // No need to notify if the request queue thread is sleeping,
- // once it wakes up it will check if there's requests to send.
- //
notify();
}
- return false;
+ _queues.push_back(queue);
}
void
-Glacier2::RequestQueue::addResponse(const ResponsePtr& response)
+Glacier2::RequestQueueThread::run()
{
- IceUtil::Monitor<IceUtil::Mutex>::Lock lock(*this);
- _responses.push_back(response);
- notify();
-}
-
-void
-Glacier2::RequestQueue::run()
-{
- RequestQueuePtr self = this; // This is to avoid creating a temporary Ptr for each call to Request::invoke()
- ptrdiff_t dispatchCount = 0; // The dispatch count keeps track of the number of outstanding twoway requests.
while(true)
{
- vector<RequestPtr> requests;
- vector<ResponsePtr> responses;
+ vector<RequestQueuePtr> queues;
{
IceUtil::Monitor<IceUtil::Mutex>::Lock lock(*this);
//
- // Wait indefinitely if there's no requests/responses to
+ // Wait indefinitely if there's no requests to
// send. If the queue is being destroyed we still need to
// wait until all the responses for twoway requests are
// received.
//
- while((!_destroy || dispatchCount != 0) && _responses.empty() && (_requests.empty() || _sleep))
+ while(!_destroy && (_queues.empty() || _sleep))
{
if(_sleep)
{
@@ -361,6 +314,7 @@ Glacier2::RequestQueue::run()
{
_sleepDuration -= IceUtil::Time::now(IceUtil::Time::Monotonic) - now;
}
+
if(_sleepDuration <= IceUtil::Time())
{
_sleep = false;
@@ -373,90 +327,54 @@ Glacier2::RequestQueue::run()
}
//
- // If the queue is being destroyed and there's no requests
- // or responses to send, we're done.
+ // If the queue is being destroyed and there's no requests or responses
+ // to send, we're done.
//
- if(_destroy && _requests.empty() && _responses.empty())
+ if(_destroy && _queues.empty())
{
- assert(dispatchCount == 0); // We would have blocked in the wait() above otherwise.
return;
}
- //
- // If there's requests to sent and we're not sleeping,
- // send the requests. If a sleep time is configured, we
- // set the sleep duration and set the sleep flag to make
- // sure we'll sleep again once we're done sending requests
- // and responses.
- //
- if(!_requests.empty() && !_sleep)
- {
- requests.swap(_requests);
- if(_sleepTime > IceUtil::Time())
- {
- _sleep = true;
- _sleepDuration = _sleepTime;
- }
- }
- if(!_responses.empty())
+ assert(!_queues.empty() && !_sleep);
+
+ queues.swap(_queues);
+
+ if(_sleepTime > IceUtil::Time())
{
- responses.swap(_responses);
+ _sleep = true;
+ _sleepDuration = _sleepTime;
}
}
- //
- // Send requests, flush batch requests, and sleep outside the
- // thread synchronization, so that new messages can be added
- // while this is being done.
- //
+ set<Ice::ObjectPrx> flushProxySet;
+ for(vector<RequestQueuePtr>::const_iterator p = queues.begin(); p != queues.end(); ++p)
+ {
+ (*p)->flushRequests(flushProxySet);
+ }
- set<ConnectionPtr> flushSet;
-
- for(vector<RequestPtr>::const_iterator p = requests.begin(); p != requests.end(); ++p)
+ set<Ice::ConnectionPtr> flushConnectionSet;
+ for(set<Ice::ObjectPrx>::const_iterator q = flushProxySet.begin(); q != flushProxySet.end(); ++q)
{
- if((*p)->isBatch())
- {
- try
- {
- flushSet.insert((*p)->getConnection());
- }
- catch(const LocalException&)
- {
- // Ignore.
- }
- }
-
//
- // Invoke returns true if the request expects a response.
- // If that's the case we increment the dispatch count to
- // ensure that the thread won't be destroyed before the
- // response is received.
+ // As an optimization, we only flush the proxy batch requests if we didn't
+ // already flush the requests of a proxy which is using the same connection.
//
- if((*p)->invoke(self)) // Exceptions are caught within invoke().
+ Ice::ConnectionPtr connection = (*q)->ice_getCachedConnection();
+ if(!connection || flushConnectionSet.find(connection) == flushConnectionSet.end())
{
- ++dispatchCount;
- }
- }
+ class FlushCB : public AMI_Object_ice_flushBatchRequests
+ {
+ public:
- for(set<ConnectionPtr>::const_iterator q = flushSet.begin(); q != flushSet.end(); ++q)
- {
- try
- {
- (*q)->flushBatchRequests();
- }
- catch(const LocalException&)
- {
- // Ignore.
- }
- }
+ virtual void ice_exception(const Ice::Exception&) { } // Ignore.
+ };
+ (*q)->ice_flushBatchRequests_async(new FlushCB());
- //
- // Send the responses and decrement the dispatch count.
- //
- for(vector<ResponsePtr>::const_iterator r = responses.begin(); r != responses.end(); ++r)
- {
- (*r)->invoke();
+ if(connection)
+ {
+ flushConnectionSet.insert(connection);
+ }
+ }
}
- dispatchCount -= responses.size();
}
}
diff --git a/cpp/src/Glacier2/RequestQueue.h b/cpp/src/Glacier2/RequestQueue.h
index 2599b24f7aa..1ecba68e343 100644
--- a/cpp/src/Glacier2/RequestQueue.h
+++ b/cpp/src/Glacier2/RequestQueue.h
@@ -20,8 +20,8 @@ namespace Glacier2
class Request;
typedef IceUtil::Handle<Request> RequestPtr;
-class RequestQueue;
-typedef IceUtil::Handle<RequestQueue> RequestQueuePtr;
+class RequestQueueThread;
+typedef IceUtil::Handle<RequestQueueThread> RequestQueueThreadPtr;
class Request : public IceUtil::Shared
{
@@ -30,10 +30,9 @@ public:
Request(const Ice::ObjectPrx&, const std::pair<const Ice::Byte*, const Ice::Byte*>&, const Ice::Current&, bool,
const Ice::Context&, const Ice::AMD_Array_Object_ice_invokePtr&);
- bool invoke(const RequestQueuePtr&);
+ bool invoke();
bool override(const RequestPtr&) const;
- bool isBatch() const;
- Ice::ConnectionPtr getConnection() const;
+ const Ice::ObjectPrx& getProxy() const { return _proxy; }
private:
@@ -46,47 +45,42 @@ private:
const Ice::AMD_Array_Object_ice_invokePtr _amdCB;
};
-class Response : public IceUtil::Shared
+class RequestQueue : public IceUtil::Mutex, public IceUtil::Shared
{
public:
- Response(const Ice::AMD_Array_Object_ice_invokePtr&, bool, const std::pair<const Ice::Byte*, const Ice::Byte*>&);
- Response(const Ice::AMD_Array_Object_ice_invokePtr&, const Ice::Exception&);
+ RequestQueue(const RequestQueueThreadPtr&);
- void invoke();
-
-private:
+ bool addRequest(const RequestPtr&);
+ void flushRequests(std::set<Ice::ObjectPrx>&);
- const Ice::AMD_Array_Object_ice_invokePtr _amdCB;
- const bool _ok;
- const Ice::ByteSeq _outParams;
- const std::auto_ptr<Ice::Exception> _exception;
+private:
+
+ const RequestQueueThreadPtr _requestQueueThread;
+ std::vector<RequestPtr> _requests;
};
+typedef IceUtil::Handle<RequestQueue> RequestQueuePtr;
-class Response;
-typedef IceUtil::Handle<Response> ResponsePtr;
-class RequestQueue : public IceUtil::Thread, public IceUtil::Monitor<IceUtil::Mutex>
+class RequestQueueThread : public IceUtil::Thread, public IceUtil::Monitor<IceUtil::Mutex>
{
public:
- RequestQueue(const IceUtil::Time&);
- virtual ~RequestQueue();
-
+ RequestQueueThread(const IceUtil::Time&);
+ virtual ~RequestQueueThread();
+
+ void flushRequestQueue(const RequestQueuePtr&);
void destroy();
- bool addRequest(const RequestPtr&);
- void addResponse(const ResponsePtr&);
virtual void run();
private:
const IceUtil::Time _sleepTime;
- std::vector<RequestPtr> _requests;
- std::vector<ResponsePtr> _responses;
bool _destroy;
bool _sleep;
IceUtil::Time _sleepDuration;
+ std::vector<RequestQueuePtr> _queues;
};
}
diff --git a/cpp/src/Glacier2/RouterI.cpp b/cpp/src/Glacier2/RouterI.cpp
index ee6dde8edd4..07431ee0389 100644
--- a/cpp/src/Glacier2/RouterI.cpp
+++ b/cpp/src/Glacier2/RouterI.cpp
@@ -18,13 +18,11 @@ using namespace std;
using namespace Ice;
using namespace Glacier2;
-Glacier2::RouterI::RouterI(const ObjectAdapterPtr& clientAdapter, const ObjectAdapterPtr& serverAdapter,
- const ConnectionPtr& connection, const string& userId, const SessionPrx& session,
- const Identity& controlId, const FilterManagerPtr& filters,
+Glacier2::RouterI::RouterI(const InstancePtr& instance, const ConnectionPtr& connection, const string& userId,
+ const SessionPrx& session, const Identity& controlId, const FilterManagerPtr& filters,
const Ice::Context& sslContext) :
- _communicator(clientAdapter->getCommunicator()),
- _clientBlobject(new ClientBlobject(_communicator, filters, sslContext)),
- _serverAdapter(serverAdapter),
+ _instance(instance),
+ _clientBlobject(new ClientBlobject(_instance, filters, sslContext)),
_connection(connection),
_userId(userId),
_session(session),
@@ -36,13 +34,13 @@ Glacier2::RouterI::RouterI(const ObjectAdapterPtr& clientAdapter, const ObjectAd
// If Glacier2 will be used with pre 3.2 clients, then the client proxy must be set.
// Otherwise getClientProxy just needs to return a nil proxy.
//
- if(_communicator->getProperties()->getPropertyAsInt("Glacier2.ReturnClientProxy") > 0)
+ if(_instance->properties()->getPropertyAsInt("Glacier2.ReturnClientProxy") > 0)
{
const_cast<Ice::ObjectPrx&>(_clientProxy) =
- clientAdapter->createProxy(_communicator->stringToIdentity("dummy"));
+ _instance->clientObjectAdapter()->createProxy(_instance->communicator()->stringToIdentity("dummy"));
}
- if(serverAdapter)
+ if(_instance->serverObjectAdapter())
{
ObjectPrx& serverProxy = const_cast<ObjectPrx&>(_serverProxy);
Identity ident;
@@ -55,10 +53,10 @@ Glacier2::RouterI::RouterI(const ObjectAdapterPtr& clientAdapter, const ObjectAd
const unsigned char c = static_cast<unsigned char>(buf[i]); // A value between 0-255
ident.category[i] = 33 + c % (127-33); // We use ASCII 33-126 (from ! to ~, w/o space).
}
- serverProxy = serverAdapter->createProxy(ident);
+ serverProxy = _instance->serverObjectAdapter()->createProxy(ident);
ServerBlobjectPtr& serverBlobject = const_cast<ServerBlobjectPtr&>(_serverBlobject);
- serverBlobject = new ServerBlobject(_communicator, _connection);
+ serverBlobject = new ServerBlobject(_instance, _connection);
}
}
@@ -67,27 +65,20 @@ Glacier2::RouterI::~RouterI()
}
void
-Glacier2::RouterI::destroy()
+Glacier2::RouterI::destroy(const AMI_Session_destroyPtr& amiCB)
{
_connection->close(true);
- _clientBlobject->destroy();
-
- if(_serverBlobject)
- {
- _serverBlobject->destroy();
- }
-
if(_session)
{
- if(_serverAdapter)
+ if(_instance->serverObjectAdapter())
{
try
{
//
// Remove the session control object.
//
- _serverAdapter->remove(_controlId);
+ _instance->serverObjectAdapter()->remove(_controlId);
}
catch(const NotRegisteredException&)
{
@@ -100,17 +91,13 @@ Glacier2::RouterI::destroy()
}
}
- //
- // This can raise an exception, therefore it must be the last
- // statement in this destroy() function.
- //
if(_sslContext.size() > 0)
{
- _session->destroy(_sslContext);
+ _session->destroy_async(amiCB, _sslContext);
}
else
{
- _session->destroy();
+ _session->destroy_async(amiCB);
}
}
}
@@ -154,18 +141,18 @@ Glacier2::RouterI::getCategoryForClient(const Ice::Current&) const
return 0;
}
-SessionPrx
-Glacier2::RouterI::createSession(const std::string&, const std::string&, const Current&)
+void
+Glacier2::RouterI::createSession_async(const AMD_Router_createSessionPtr&, const std::string&, const std::string&,
+ const Current&)
{
assert(false); // Must not be called in this router implementation.
- return 0;
}
-SessionPrx
-Glacier2::RouterI::createSessionFromSecureConnection(const Current&)
+void
+Glacier2::RouterI::createSessionFromSecureConnection_async(const AMD_Router_createSessionFromSecureConnectionPtr&,
+ const Current&)
{
assert(false); // Must not be called in this router implementation.
- return 0;
}
void
diff --git a/cpp/src/Glacier2/RouterI.h b/cpp/src/Glacier2/RouterI.h
index 64bccd5d50c..077161ee178 100644
--- a/cpp/src/Glacier2/RouterI.h
+++ b/cpp/src/Glacier2/RouterI.h
@@ -29,19 +29,21 @@ class RouterI : public Router, public IceUtil::Mutex
{
public:
- RouterI(const Ice::ObjectAdapterPtr&, const Ice::ObjectAdapterPtr&, const Ice::ConnectionPtr&, const std::string&,
- const SessionPrx&, const Ice::Identity&, const FilterManagerPtr&, const Ice::Context& sslContext);
+ RouterI(const InstancePtr&, const Ice::ConnectionPtr&, const std::string&, const SessionPrx&, const Ice::Identity&,
+ const FilterManagerPtr&, const Ice::Context&);
virtual ~RouterI();
- void destroy();
+ void destroy(const AMI_Session_destroyPtr&);
- virtual Ice::ObjectPrx getClientProxy(const Ice::Current&) const;
- virtual Ice::ObjectPrx getServerProxy(const Ice::Current&) const;
+ virtual Ice::ObjectPrx getClientProxy(const Ice::Current& = Ice::Current()) const;
+ virtual Ice::ObjectPrx getServerProxy(const Ice::Current& = Ice::Current()) const;
virtual void addProxy(const Ice::ObjectPrx&, const Ice::Current&);
virtual Ice::ObjectProxySeq addProxies(const Ice::ObjectProxySeq&, const Ice::Current&);
virtual std::string getCategoryForClient(const Ice::Current&) const;
- virtual SessionPrx createSession(const std::string&, const std::string&, const Ice::Current&);
- virtual SessionPrx createSessionFromSecureConnection(const Ice::Current&);
+ virtual void createSession_async(const AMD_Router_createSessionPtr&, const std::string&, const std::string&,
+ const Ice::Current&);
+ virtual void createSessionFromSecureConnection_async(const AMD_Router_createSessionFromSecureConnectionPtr&,
+ const Ice::Current&);
virtual void destroySession(const ::Ice::Current&);
virtual Ice::Long getSessionTimeout(const ::Ice::Current&) const;
@@ -56,12 +58,11 @@ public:
private:
- const Ice::CommunicatorPtr _communicator;
+ const InstancePtr _instance;
const Ice::ObjectPrx _clientProxy;
const Ice::ObjectPrx _serverProxy;
const ClientBlobjectPtr _clientBlobject;
const ServerBlobjectPtr _serverBlobject;
- const Ice::ObjectAdapterPtr _serverAdapter;
const Ice::ConnectionPtr _connection;
const std::string _userId;
const SessionPrx _session;
diff --git a/cpp/src/Glacier2/ServerBlobject.cpp b/cpp/src/Glacier2/ServerBlobject.cpp
index aafc1c8429f..0915655ebed 100644
--- a/cpp/src/Glacier2/ServerBlobject.cpp
+++ b/cpp/src/Glacier2/ServerBlobject.cpp
@@ -13,8 +13,8 @@ using namespace std;
using namespace Ice;
using namespace Glacier2;
-Glacier2::ServerBlobject::ServerBlobject(const CommunicatorPtr& communicator, const ConnectionPtr& connection) :
- Glacier2::Blobject(communicator, true, Ice::Context()),
+Glacier2::ServerBlobject::ServerBlobject(const InstancePtr& instance, const ConnectionPtr& connection) :
+ Glacier2::Blobject(instance, true, Ice::Context()),
_connection(connection)
{
}
diff --git a/cpp/src/Glacier2/ServerBlobject.h b/cpp/src/Glacier2/ServerBlobject.h
index 200a951cc59..4dda0036748 100644
--- a/cpp/src/Glacier2/ServerBlobject.h
+++ b/cpp/src/Glacier2/ServerBlobject.h
@@ -22,7 +22,7 @@ class ServerBlobject : public Glacier2::Blobject
{
public:
- ServerBlobject(const Ice::CommunicatorPtr&, const Ice::ConnectionPtr&);
+ ServerBlobject(const InstancePtr&, const Ice::ConnectionPtr&);
virtual ~ServerBlobject();
virtual void ice_invoke_async(const Ice::AMD_Array_Object_ice_invokePtr&,
diff --git a/cpp/src/Glacier2/SessionRouterI.cpp b/cpp/src/Glacier2/SessionRouterI.cpp
index 95945659800..9e05665ce3c 100644
--- a/cpp/src/Glacier2/SessionRouterI.cpp
+++ b/cpp/src/Glacier2/SessionRouterI.cpp
@@ -28,12 +28,11 @@ class SessionControlI : public SessionControl
{
public:
- SessionControlI(const SessionRouterIPtr& sessionRouter, const ConnectionPtr& connection,
- const FilterManagerPtr& filterManager, IceUtil::Time timeout) :
+ SessionControlI(const SessionRouterIPtr& sessionRouter, const ConnectionPtr& connection,
+ const FilterManagerPtr& filterManager) :
_sessionRouter(sessionRouter),
_connection(connection),
- _filters(filterManager),
- _timeout(static_cast<int>(timeout.toSeconds()))
+ _filters(filterManager)
{
}
@@ -56,9 +55,9 @@ public:
}
virtual int
- getSessionTimeout(const Current&)
+ getSessionTimeout(const Current& current)
{
- return _timeout;
+ return static_cast<int>(_sessionRouter->getSessionTimeout(current));
}
virtual void
@@ -73,7 +72,6 @@ private:
const SessionRouterIPtr _sessionRouter;
const ConnectionPtr _connection;
const FilterManagerPtr _filters;
- const int _timeout;
};
class ClientLocator : public ServantLocator
@@ -136,123 +134,494 @@ private:
const SessionRouterIPtr _sessionRouter;
};
-class UserPasswordAuthorizer : public Authorizer
+class UserPasswordCreateSession : public CreateSession
{
public:
- UserPasswordAuthorizer(const PermissionsVerifierPrx& verifier, const string& user, const string& password) :
- _verifier(verifier), _user(user), _password(password)
+ UserPasswordCreateSession(const AMD_Router_createSessionPtr& amdCB, const string& user, const string& password,
+ const Ice::Current& current, const SessionRouterIPtr& sessionRouter) :
+ CreateSession(sessionRouter, user, current, Ice::Context()),
+ _amdCB(amdCB),
+ _password(password)
{
}
- virtual bool
- authorize(string& reason, const Ice::Context& ctx)
+ virtual void
+ authorize()
{
- if(_verifier)
+ assert(_sessionRouter->_verifier);
+
+ class CheckPermissionsCB : public AMI_PermissionsVerifier_checkPermissions
{
- return _verifier->checkPermissions(_user, _password, reason, ctx);
+ public:
+
+ CheckPermissionsCB(const UserPasswordCreateSessionPtr& session, bool hasSessionManager) :
+ _session(session),
+ _hasSessionManager(hasSessionManager)
+ {
+ }
+
+ virtual void
+ ice_response(bool ok, const string& reason)
+ {
+ if(ok)
+ {
+ _session->authorized(_hasSessionManager);
+ }
+ else
+ {
+ _session->exception(PermissionDeniedException(reason.empty() ? "permission denied" : reason));
+ }
+ }
+
+ virtual void
+ ice_exception(const Ice::Exception& ex)
+ {
+ if(dynamic_cast<const CollocationOptimizationException*>(&ex))
+ {
+ _session->authorizeCollocated();
+ }
+ else
+ {
+ _session->unexpectedAuthorizeException(ex);
+ }
+ }
+
+ private:
+
+ const UserPasswordCreateSessionPtr _session;
+ const bool _hasSessionManager;
+ };
+
+ AMI_PermissionsVerifier_checkPermissionsPtr cb = new CheckPermissionsCB(this, _sessionRouter->_sessionManager);
+ _sessionRouter->_verifier->checkPermissions_async(cb, _user, _password, _current.ctx);
+ }
+
+ virtual void
+ authorizeCollocated()
+ {
+ try
+ {
+ string reason;
+ if(_sessionRouter->_verifier->checkPermissions(_user, _password, reason, _current.ctx))
+ {
+ authorized(_sessionRouter->_sessionManager);
+ }
+ else
+ {
+ exception(PermissionDeniedException(reason.empty() ? "permission denied" : reason));
+ }
+ }
+ catch(const Ice::Exception& ex)
+ {
+ unexpectedAuthorizeException(ex);
}
- reason = "No PermissionsVerifier is available";
- return false;
+ }
+
+ virtual FilterManagerPtr
+ createFilterManager()
+ {
+ return FilterManager::create(_instance, _user, true);
+ }
+
+ virtual void
+ createSession()
+ {
+ class CreateCB : public AMI_SessionManager_create
+ {
+ public:
+
+ CreateCB(const CreateSessionPtr& session) : _session(session)
+ {
+ }
+
+ virtual void
+ ice_response(const SessionPrx& session)
+ {
+ _session->sessionCreated(session);
+ }
+
+ virtual void
+ ice_exception(const Ice::Exception& ex)
+ {
+ try
+ {
+ ex.ice_throw();
+ }
+ catch(const CannotCreateSessionException& ex)
+ {
+ _session->exception(ex);
+ }
+ catch(const Ice::Exception& ex)
+ {
+ _session->unexpectedCreateSessionException(ex);
+ }
+ }
+
+ private:
+
+ const CreateSessionPtr _session;
+ };
+ _sessionRouter->_sessionManager->create_async(new CreateCB(this), _user, _control, _current.ctx);
+ }
+
+ virtual void
+ finished(const SessionPrx& session)
+ {
+ _amdCB->ice_response(session);
+ }
+
+ virtual void
+ finished(const Ice::Exception& ex)
+ {
+ _amdCB->ice_exception(ex);
}
private:
- const PermissionsVerifierPrx _verifier;
- const string _user;
+ const AMD_Router_createSessionPtr _amdCB;
const string _password;
};
-class SSLPasswordAuthorizer : public Authorizer
+class SSLCreateSession : public CreateSession
{
public:
- SSLPasswordAuthorizer(const SSLPermissionsVerifierPrx& verifier, const SSLInfo& info) :
- _verifier(verifier), _info(info)
+ SSLCreateSession(const AMD_Router_createSessionFromSecureConnectionPtr& amdCB, const string& user,
+ const SSLInfo& sslInfo, const Ice::Current& current, const SessionRouterIPtr& sessionRouter,
+ const Ice::Context& sslContext) :
+ CreateSession(sessionRouter, user, current, sslContext),
+ _amdCB(amdCB),
+ _sslInfo(sslInfo)
+ {
+ }
+
+ virtual void
+ authorize()
{
+ assert(_sessionRouter->_verifier);
+
+ class AuthorizeCB : public AMI_SSLPermissionsVerifier_authorize
+ {
+ public:
+
+ AuthorizeCB(const SSLCreateSessionPtr& session, bool hasSessionManager) :
+ _session(session),
+ _hasSessionManager(hasSessionManager)
+ {
+ }
+
+ virtual void
+ ice_response(bool ok, const string& reason)
+ {
+ if(ok)
+ {
+ _session->authorized(_hasSessionManager);
+ }
+ else
+ {
+ _session->exception(PermissionDeniedException(reason.empty() ? "permission denied" : reason));
+ }
+ }
+
+ virtual void
+ ice_exception(const Ice::Exception& ex)
+ {
+ if(dynamic_cast<const CollocationOptimizationException*>(&ex))
+ {
+ _session->authorizeCollocated();
+ }
+ else
+ {
+ _session->unexpectedAuthorizeException(ex);
+ }
+ }
+
+ private:
+
+ const SSLCreateSessionPtr _session;
+ const bool _hasSessionManager;
+ };
+
+ AMI_SSLPermissionsVerifier_authorizePtr cb = new AuthorizeCB(this, _sessionRouter->_sessionManager);
+ _sessionRouter->_sslVerifier->authorize_async(cb, _sslInfo, _current.ctx);
}
- virtual bool
- authorize(string& reason, const Ice::Context& ctx)
+ virtual void
+ authorizeCollocated()
{
- if(_verifier)
+ try
+ {
+ string reason;
+ if(_sessionRouter->_sslVerifier->authorize(_sslInfo, reason, _current.ctx))
+ {
+ authorized(_sessionRouter->_sessionManager);
+ }
+ else
+ {
+ exception(PermissionDeniedException(reason.empty() ? "permission denied" : reason));
+ }
+ }
+ catch(const Ice::Exception& ex)
{
- return _verifier->authorize(_info, reason, ctx);
+ unexpectedAuthorizeException(ex);
}
+ }
- reason = "No SSLPermissionsVerifier is available";
- return false;
+ virtual FilterManagerPtr
+ createFilterManager()
+ {
+ return FilterManager::create(_instance, _user, false);
+ }
+
+ virtual void
+ createSession()
+ {
+ class CreateCB : public AMI_SSLSessionManager_create
+ {
+ public:
+
+ CreateCB(const CreateSessionPtr& session) : _session(session)
+ {
+ }
+
+ virtual void
+ ice_response(const SessionPrx& session)
+ {
+ _session->sessionCreated(session);
+ }
+
+ virtual void
+ ice_exception(const Ice::Exception& ex)
+ {
+ try
+ {
+ ex.ice_throw();
+ }
+ catch(const CannotCreateSessionException& ex)
+ {
+ _session->exception(ex);
+ }
+ catch(const Ice::Exception& ex)
+ {
+ _session->unexpectedCreateSessionException(ex);
+ }
+ }
+
+ private:
+
+ const CreateSessionPtr _session;
+ };
+ _sessionRouter->_sslSessionManager->create_async(new CreateCB(this), _sslInfo, _control, _current.ctx);
+ }
+
+ virtual void
+ finished(const SessionPrx& session)
+ {
+ _amdCB->ice_response(session);
+ }
+
+ virtual void
+ finished(const Ice::Exception& ex)
+ {
+ _amdCB->ice_exception(ex);
}
private:
- const SSLPermissionsVerifierPrx _verifier;
- const SSLInfo _info;
+ const AMD_Router_createSessionFromSecureConnectionPtr _amdCB;
+ const SSLInfo _sslInfo;
};
-class UserSessionFactory : public SessionFactory
+class DestroyCB : public AMI_Session_destroy
{
public:
- UserSessionFactory(const SessionManagerPrx& manager, const string& user) :
- _manager(manager), _user(user)
+ DestroyCB(int traceLevel, const LoggerPtr& logger) :
+ _logger(traceLevel > 0 ? logger : LoggerPtr())
+ {
+ }
+
+ virtual void
+ ice_response()
{
}
- virtual SessionPrx
- create(const SessionControlPrx& control, const Ice::Context& ctx)
+ virtual void
+ ice_exception(const Ice::Exception& ex)
{
- return _manager->create(_user, control, ctx);
+ if(_logger)
+ {
+ Trace out(_logger, "Glacier2");
+ out << "exception while destroying session\n" << ex;
+ }
}
private:
- const SessionManagerPrx _manager;
- const string _user;
+ LoggerPtr _logger;
};
-class SSLSessionFactory : public SessionFactory
+}
+
+using namespace Glacier2;
+
+Glacier2::CreateSession::CreateSession(const SessionRouterIPtr& sessionRouter, const string& user,
+ const Ice::Current& current, const Ice::Context& sslContext) :
+ _instance(sessionRouter->_instance),
+ _sessionRouter(sessionRouter),
+ _user(user),
+ _current(current),
+ _sslContext(sslContext)
{
-public:
+}
+
+void
+Glacier2::CreateSession::create()
+{
+ try
+ {
+ if(_sessionRouter->startCreateSession(this, _current.con))
+ {
+ authorize();
+ }
+ }
+ catch(const Ice::Exception& ex)
+ {
+ finished(ex);
+ }
+}
+
+void
+Glacier2::CreateSession::addPendingCallback(const CreateSessionPtr& callback)
+{
+ _pendingCallbacks.push_back(callback);
+}
- SSLSessionFactory(const SSLSessionManagerPrx& manager, const SSLInfo& info) :
- _manager(manager), _info(info)
+void
+Glacier2::CreateSession::authorized(bool createSession)
+{
+ //
+ // Create the filter manager now as it's required for the session control object.
+ //
+ _filterManager = createFilterManager();
+
+ //
+ // If we have a session manager configured, we create a client-visible session object,
+ // otherwise, we return a null session proxy.
+ //
+ if(createSession)
{
+ if(_instance->serverObjectAdapter())
+ {
+ Ice::ObjectPtr obj = new SessionControlI(_sessionRouter, _current.con, _filterManager);
+ _control = SessionControlPrx::uncheckedCast(_instance->serverObjectAdapter()->addWithUUID(obj));
+ }
+ this->createSession();
}
+ else
+ {
+ sessionCreated(0);
+ }
+}
- virtual SessionPrx
- create(const SessionControlPrx& control, const Ice::Context& ctx)
+void
+Glacier2::CreateSession::unexpectedAuthorizeException(const Ice::Exception& ex)
+{
+ if(_sessionRouter->sessionTraceLevel() >= 1)
{
- return _manager->create(_info, control, ctx);
+ Warning out(_instance->logger());
+ out << "exception while verifying permissions:\n" << ex;
}
+ exception(PermissionDeniedException("internal server error"));
+}
-private:
+void
+Glacier2::CreateSession::sessionCreated(const SessionPrx& session)
+{
+ //
+ // Create the session router object.
+ //
+ RouterIPtr router;
+ try
+ {
+ router = new RouterI(_instance, _current.con, _user, session,
+ _control ? _control->ice_getIdentity() : Ice::Identity(), _filterManager, _sslContext);
+ }
+ catch(const Ice::Exception& ex)
+ {
+ session->destroy_async(new DestroyCB(0, 0));
+ unexpectedCreateSessionException(ex);
+ return;
+ }
- const SSLSessionManagerPrx _manager;
- const SSLInfo _info;
-};
+ //
+ // Notify the router that the creation is finished.
+ //
+ try
+ {
+ _sessionRouter->finishCreateSession(_current.con, router);
+ finished(session);
+ }
+ catch(const Ice::Exception& ex)
+ {
+ finished(ex);
+ }
+ for(vector<CreateSessionPtr>::const_iterator p = _pendingCallbacks.begin(); p != _pendingCallbacks.end(); ++p)
+ {
+ (*p)->create();
+ }
}
-using namespace Glacier2;
+void
+Glacier2::CreateSession::unexpectedCreateSessionException(const Ice::Exception& ex)
+{
+ if(_sessionRouter->sessionTraceLevel() >= 1)
+ {
+ Trace out(_instance->logger(), "Glacier2");
+ out << "exception while creating session with session manager:\n" << ex;
+ }
+ exception(CannotCreateSessionException("internal server error"));
+}
+
+void
+Glacier2::CreateSession::exception(const Ice::Exception& ex)
+{
+ _sessionRouter->finishCreateSession(_current.con, 0);
+
+ finished(ex);
+
+ if(_control)
+ {
+ try
+ {
+ _instance->serverObjectAdapter()->remove(_control->ice_getIdentity());
+ }
+ catch(const Exception&)
+ {
+ }
+ }
-Glacier2::SessionRouterI::SessionRouterI(const ObjectAdapterPtr& clientAdapter,
- const ObjectAdapterPtr& serverAdapter,
+ for(vector<CreateSessionPtr>::const_iterator p = _pendingCallbacks.begin(); p != _pendingCallbacks.end(); ++p)
+ {
+ (*p)->create();
+ }
+}
+
+Glacier2::SessionRouterI::SessionRouterI(const InstancePtr& instance,
const PermissionsVerifierPrx& verifier,
const SessionManagerPrx& sessionManager,
const SSLPermissionsVerifierPrx& sslVerifier,
const SSLSessionManagerPrx& sslSessionManager) :
- _properties(clientAdapter->getCommunicator()->getProperties()),
- _logger(clientAdapter->getCommunicator()->getLogger()),
- _sessionTraceLevel(_properties->getPropertyAsInt("Glacier2.Trace.Session")),
- _rejectTraceLevel(_properties->getPropertyAsInt("Glacier2.Client.Trace.Reject")),
- _clientAdapter(clientAdapter),
- _serverAdapter(serverAdapter),
+ _instance(instance),
+ _sessionTraceLevel(_instance->properties()->getPropertyAsInt("Glacier2.Trace.Session")),
+ _rejectTraceLevel(_instance->properties()->getPropertyAsInt("Glacier2.Client.Trace.Reject")),
_verifier(verifier),
_sessionManager(sessionManager),
_sslVerifier(sslVerifier),
_sslSessionManager(sslSessionManager),
- _sessionTimeout(IceUtil::Time::seconds(_properties->getPropertyAsInt("Glacier2.SessionTimeout"))),
+ _sessionTimeout(IceUtil::Time::seconds(_instance->properties()->getPropertyAsInt("Glacier2.SessionTimeout"))),
_sessionThread(_sessionTimeout > IceUtil::Time() ? new SessionThread(this, _sessionTimeout) : 0),
_routersByConnectionHint(_routersByConnection.end()),
_routersByCategoryHint(_routersByCategory.end()),
@@ -263,24 +632,24 @@ Glacier2::SessionRouterI::SessionRouterI(const ObjectAdapterPtr& clientAdapter,
// Glacier2 router Ice object.
//
Identity routerId;
- routerId.category = _properties->getPropertyWithDefault("Glacier2.InstanceName", "Glacier2");
+ routerId.category = _instance->properties()->getPropertyWithDefault("Glacier2.InstanceName", "Glacier2");
routerId.name = "router";
- _clientAdapter->add(this, routerId);
+ _instance->clientObjectAdapter()->add(this, routerId);
//
// All other calls on the client object adapter are dispatched to
// a router servant based on connection information.
//
- _clientAdapter->addServantLocator(new ClientLocator(this), "");
+ _instance->clientObjectAdapter()->addServantLocator(new ClientLocator(this), "");
//
// If there is a server object adapter, all calls on this adapter
// are dispatched to a router servant based on the category field
// of the identity.
//
- if(_serverAdapter)
+ if(_instance->serverObjectAdapter())
{
- _serverAdapter->addServantLocator(new ServerLocator(this), "");
+ _instance->serverObjectAdapter()->addServantLocator(new ServerLocator(this), "");
}
if(_sessionThread)
@@ -329,20 +698,7 @@ Glacier2::SessionRouterI::destroy()
//
for(map<ConnectionPtr, RouterIPtr>::iterator p = routers.begin(); p != routers.end(); ++p)
{
- RouterIPtr router = p->second;
-
- try
- {
- router->destroy();
- }
- catch(const Exception& ex)
- {
- if(_sessionTraceLevel >= 1)
- {
- Trace out(_logger, "Glacier2");
- out << "exception while destroying session\n" << ex;
- }
- }
+ p->second->destroy(new DestroyCB(_sessionTraceLevel, _instance->logger()));
}
if(sessionThread)
@@ -388,26 +744,28 @@ Glacier2::SessionRouterI::getCategoryForClient(const Ice::Current& current) cons
return getRouter(current.con, current.id)->getServerProxy(current)->ice_getIdentity().category;
}
-SessionPrx
-Glacier2::SessionRouterI::createSession(const std::string& userId, const std::string& password, const Current& current)
+void
+Glacier2::SessionRouterI::createSession_async(const AMD_Router_createSessionPtr& amdCB, const std::string& userId,
+ const std::string& password, const Current& current)
{
- SessionFactoryPtr factory;
- if(_sessionManager)
+ if(!_verifier)
{
- factory = new UserSessionFactory(_sessionManager, userId);
+ amdCB->ice_exception(PermissionDeniedException("no configured permissions verifier"));
+ return;
}
- return createSessionInternal(userId, true, new UserPasswordAuthorizer(_verifier, userId, password), factory,
- Ice::Context(), current);
+
+ CreateSessionPtr session = new UserPasswordCreateSession(amdCB, userId, password, current, this);
+ session->create();
}
-SessionPrx
-Glacier2::SessionRouterI::createSessionFromSecureConnection(const Current& current)
+void
+Glacier2::SessionRouterI::createSessionFromSecureConnection_async(
+ const AMD_Router_createSessionFromSecureConnectionPtr& amdCB, const Current& current)
{
if(!_sslVerifier)
{
- PermissionDeniedException exc;
- exc.reason = "no configured ssl permissions verifier";
- throw exc;
+ amdCB->ice_exception(PermissionDeniedException("no configured ssl permissions verifier"));
+ return;
}
string userDN;
@@ -437,7 +795,7 @@ Glacier2::SessionRouterI::createSessionFromSecureConnection(const Current& curre
userDN = info.certs[0]->getSubjectDN();
}
- if(_properties->getPropertyAsInt("Glacier2.AddSSLContext") > 0)
+ if(_instance->properties()->getPropertyAsInt("Glacier2.AddSSLContext") > 0)
{
sslCtx["SSL.Active"] = "1";
sslCtx["SSL.Cipher"] = sslinfo.cipher;
@@ -457,24 +815,17 @@ Glacier2::SessionRouterI::createSessionFromSecureConnection(const Current& curre
}
catch(const IceSSL::ConnectionInvalidException&)
{
- PermissionDeniedException exc;
- exc.reason = "not ssl connection";
- throw exc;
+ amdCB->ice_exception(PermissionDeniedException("not ssl connection"));
+ return;
}
catch(const IceSSL::CertificateEncodingException&)
{
- PermissionDeniedException exc;
- exc.reason = "certificate encoding exception";
- throw exc;
+ amdCB->ice_exception(PermissionDeniedException("certificate encoding exception"));
+ return;
}
- SessionFactoryPtr factory;
- if(_sslSessionManager)
- {
- factory = new SSLSessionFactory(_sslSessionManager, sslinfo);
- }
- return createSessionInternal(userDN, false, new SSLPasswordAuthorizer(_sslVerifier, sslinfo), factory, sslCtx,
- current);
+ CreateSessionPtr session = new SSLCreateSession(amdCB, userDN, sslinfo, current, this, sslCtx);
+ session->create();
}
void
@@ -519,7 +870,7 @@ Glacier2::SessionRouterI::destroySession(const ConnectionPtr& connection)
_routersByConnection.erase(p++);
_routersByConnectionHint = p;
- if(_serverAdapter)
+ if(_instance->serverObjectAdapter())
{
string category = router->getServerProxy(Current())->ice_getIdentity().category;
assert(!category.empty());
@@ -532,25 +883,13 @@ Glacier2::SessionRouterI::destroySession(const ConnectionPtr& connection)
// We destroy the router outside the thread synchronization, to
// avoid deadlocks.
//
- try
+ if(_sessionTraceLevel >= 1)
{
- if(_sessionTraceLevel >= 1)
- {
- Trace out(_logger, "Glacier2");
- out << "destroying session\n";
- out << router->toString();
- }
-
- router->destroy();
- }
- catch(const Exception& ex)
- {
- if(_sessionTraceLevel >= 1)
- {
- Trace out(_logger, "Glacier2");
- out << "exception while destroying session\n" << ex;
- }
+ Trace out(_instance->logger(), "Glacier2");
+ out << "destroying session\n" << router->toString();
}
+
+ router->destroy(new DestroyCB(_sessionTraceLevel, _instance->logger()));
}
Ice::Long
@@ -588,9 +927,9 @@ Glacier2::SessionRouterI::getRouter(const ConnectionPtr& connection, const Ice::
{
if(_rejectTraceLevel >= 1)
{
- Trace out(_logger, "Glacier2");
+ Trace out(_instance->logger(), "Glacier2");
out << "rejecting request. no session is associated with the connection.\n";
- out << "identity: " << _clientAdapter->getCommunicator()->identityToString(id);
+ out << "identity: " << _instance->communicator()->identityToString(id);
}
connection->close(true);
throw ObjectNotExistException(__FILE__, __LINE__);
@@ -655,7 +994,7 @@ Glacier2::SessionRouterI::expireSessions()
_routersByConnection.erase(p++);
_routersByConnectionHint = p;
- if(_serverAdapter)
+ if(_instance->serverObjectAdapter())
{
string category = router->getServerProxy(Current())->ice_getIdentity().category;
assert(!category.empty());
@@ -676,319 +1015,114 @@ Glacier2::SessionRouterI::expireSessions()
//
for(vector<RouterIPtr>::iterator p = routers.begin(); p != routers.end(); ++p)
{
- RouterIPtr router = *p;
-
- try
- {
- if(_sessionTraceLevel >= 1)
- {
- Trace out(_logger, "Glacier2");
- out << "expiring session\n";
- out << router->toString();
- }
-
- router->destroy();
- }
- catch(const Exception& ex)
+ if(_sessionTraceLevel >= 1)
{
- if(_sessionTraceLevel >= 1)
- {
- Trace out(_logger, "Glacier2");
- out << "exception while expiring session\n" << ex;
- }
+ Trace out(_instance->logger(), "Glacier2");
+ out << "expiring session\n" << (*p)->toString();
}
+
+ (*p)->destroy(new DestroyCB(_sessionTraceLevel, _instance->logger()));
}
}
-SessionPrx
-Glacier2::SessionRouterI::createSessionInternal(const string& userId, bool allowAddUserMode,
- const AuthorizerPtr& authorizer, const SessionFactoryPtr& factory,
- const Ice::Context& sslContext, const Current& current)
+bool
+Glacier2::SessionRouterI::startCreateSession(const CreateSessionPtr& cb, const ConnectionPtr& connection)
{
- {
- IceUtil::Monitor<IceUtil::Mutex>::Lock lock(*this);
-
- if(_destroy)
- {
- current.con->close(true);
- throw ObjectNotExistException(__FILE__, __LINE__);
- }
-
- //
- // Check whether a session already exists for the connection.
- //
- {
- map<ConnectionPtr, RouterIPtr>::iterator p;
- if(_routersByConnectionHint != _routersByConnection.end() &&
- _routersByConnectionHint->first == current.con)
- {
- p = _routersByConnectionHint;
- }
- else
- {
- p = _routersByConnection.find(current.con);
- }
-
- if(p != _routersByConnection.end())
- {
- CannotCreateSessionException exc;
- exc.reason = "session exists";
- throw exc;
- }
- }
+ IceUtil::Monitor<IceUtil::Mutex>::Lock lock(*this);
- //
- // If some other thread is currently trying to create a
- // session, we wait until this thread is finished.
- //
- bool searchAgain = false;
- while(_pending.find(current.con) != _pending.end())
- {
- wait();
-
- if(_destroy)
- {
- current.con->close(true);
- throw ObjectNotExistException(__FILE__, __LINE__);
- }
-
- searchAgain = true;
- }
-
- //
- // Check for existing sessions again if we waited above, as
- // new sessions have been added in the meantime.
- //
- if(searchAgain)
- {
- map<ConnectionPtr, RouterIPtr>::iterator p;
- if(_routersByConnectionHint != _routersByConnection.end() &&
- _routersByConnectionHint->first == current.con)
- {
- p = _routersByConnectionHint;
- }
- else
- {
- p = _routersByConnection.find(current.con);
- }
-
- if(p != _routersByConnection.end())
- {
- CannotCreateSessionException exc;
- exc.reason = "session exists";
- throw exc;
- }
- }
-
- //
- // No session exists yet, so we will try to create one. To
- // avoid that other threads try to create sessions for the
- // same connection, we add our endpoints to _pending.
- //
- _pending.insert(current.con);
+ if(_destroy)
+ {
+ connection->close(true);
+ throw ObjectNotExistException(__FILE__, __LINE__);
}
- try
+ //
+ // Check whether a session already exists for the connection.
+ //
{
- //
- // Authorize.
- //
- string reason;
- bool ok;
-
- try
+ map<ConnectionPtr, RouterIPtr>::iterator p;
+ if(_routersByConnectionHint != _routersByConnection.end() &&
+ _routersByConnectionHint->first == connection)
{
- ok = authorizer->authorize(reason, current.ctx);
+ p = _routersByConnectionHint;
}
- catch(const Exception& ex)
+ else
{
- if(_sessionTraceLevel >= 1)
- {
- Warning out(_logger);
- out << "exception while verifying password:\n" << ex;
- }
-
- PermissionDeniedException exc;
- exc.reason = "internal server error";
- throw exc;
+ p = _routersByConnection.find(connection);
}
-
- if(!ok)
+
+ if(p != _routersByConnection.end())
{
- PermissionDeniedException exc;
- if(reason.empty())
- {
- exc.reason = "permission denied";
- }
- else
- {
- exc.reason = reason;
- }
+ CannotCreateSessionException exc;
+ exc.reason = "session exists";
throw exc;
}
}
- catch(const Exception& ex)
- {
- IceUtil::Monitor<IceUtil::Mutex>::Lock lock(*this);
+ map<ConnectionPtr, CreateSessionPtr>::iterator p = _pending.find(connection);
+ if(p != _pending.end())
+ {
//
- // Signal other threads that we are done with trying to
- // establish a session for our connection;
+ // If some other thread is currently trying to create a
+ // session, we wait until this thread is finished.
//
- _pending.erase(current.con);
- notify();
-
- ex.ice_throw();
+ p->second->addPendingCallback(cb);
+ return false;
}
-
-
- SessionPrx session;
- Identity controlId;
- RouterIPtr router;
-
- try
+ else
{
//
- // The client blobject requires direct access to the full filter
- // servant, but proliferating the implementation of the servant
- // throughout the router code is undesirable. To avoid lots of
- // physical interdependencies, we create the filters and
- // clientblobject together and pass the clientblobject to the
- // router. We create the clientblobject here since it is
- // responsible for creating the filters and we want them to be
- // accessible during session creation.
+ // No session exists yet, so we will try to create one. To
+ // avoid that other threads try to create sessions for the
+ // same connection, we add our endpoints to _pending.
//
- FilterManagerPtr filterManager = FilterManager::create(_clientAdapter->getCommunicator(), _serverAdapter,
- userId, allowAddUserMode);
+ _pending.insert(make_pair(connection, cb));
+ return true;
+ }
+}
- //
- // If we have a session manager configured, we create a
- // client-visible session object.
- //
- if(factory)
- {
- SessionControlPrx control;
- if(_serverAdapter)
- {
- control = SessionControlPrx::uncheckedCast(
- _serverAdapter->addWithUUID(
- new SessionControlI(this, current.con, filterManager, _sessionTimeout)));
- controlId = control->ice_getIdentity();
- }
- session = factory->create(control, current.ctx);
- }
+void
+Glacier2::SessionRouterI::finishCreateSession(const ConnectionPtr& connection, const RouterIPtr& router)
+{
+ IceUtil::Monitor<IceUtil::Mutex>::Lock lock(*this);
- //
- // Add a new per-client router.
- //
- router = new RouterI(_clientAdapter, _serverAdapter, current.con, userId,
- session, controlId, filterManager, sslContext);
- }
- catch(const Exception& ex)
+ //
+ // Signal other threads that we are done with trying to
+ // establish a session for our connection;
+ //
+ _pending.erase(connection);
+ notify();
+
+ if(!router)
{
- IceUtil::Monitor<IceUtil::Mutex>::Lock lock(*this);
-
- //
- // Signal other threads that we are done with trying to
- // establish a session for our connection;
- //
- _pending.erase(current.con);
- notify();
-
- assert(!router);
-
- if(session)
- {
- if(_serverAdapter)
- {
- try
- {
- _serverAdapter->remove(controlId);
- }
- catch(const Exception&)
- {
- // Ignore all exceptions here.
- }
- }
- try
- {
- session->destroy();
- }
- catch(const Exception&)
- {
- // Ignore all exceptions here.
- }
- }
-
- try
- {
- ex.ice_throw();
- }
- catch(const Glacier2::CannotCreateSessionException&)
- {
- throw;
- }
- catch(const Exception&)
- {
- if(_sessionTraceLevel >= 1)
- {
- Trace out(_logger, "Glacier2");
- out << "exception while creating session with session manager:\n" << ex;
- }
-
- CannotCreateSessionException exc;
- exc.reason = "internal server error";
- throw exc;
- }
+ return;
}
+ if(_destroy)
{
- IceUtil::Monitor<IceUtil::Mutex>::Lock lock(*this);
-
- //
- // Signal other threads that we are done with trying to
- // establish a session for our connection;
- //
- _pending.erase(current.con);
- notify();
-
- if(_destroy)
- {
- try
- {
- router->destroy();
- }
- catch(const Exception&)
- {
- // Ignore all exceptions here.
- }
-
- current.con->close(true);
- throw ObjectNotExistException(__FILE__, __LINE__);
- }
-
- _routersByConnectionHint = _routersByConnection.insert(
- _routersByConnectionHint, pair<const ConnectionPtr, RouterIPtr>(current.con, router));
-
- if(_serverAdapter)
- {
- string category = router->getServerProxy(current)->ice_getIdentity().category;
- assert(!category.empty());
- pair<map<string, RouterIPtr>::iterator, bool> rc =
- _routersByCategory.insert(pair<const string, RouterIPtr>(category, router));
- assert(rc.second);
- _routersByCategoryHint = rc.first;
- }
-
- if(_sessionTraceLevel >= 1)
- {
- Trace out(_logger, "Glacier2");
- out << "created session\n";
- out << router->toString();
- }
+ router->destroy(new DestroyCB(0, 0));
+ connection->close(true);
+ throw ObjectNotExistException(__FILE__, __LINE__);
+ }
+
+ _routersByConnectionHint = _routersByConnection.insert(
+ _routersByConnectionHint, pair<const ConnectionPtr, RouterIPtr>(connection, router));
+
+ if(_instance->serverObjectAdapter())
+ {
+ string category = router->getServerProxy()->ice_getIdentity().category;
+ assert(!category.empty());
+ pair<map<string, RouterIPtr>::iterator, bool> rc =
+ _routersByCategory.insert(pair<const string, RouterIPtr>(category, router));
+ assert(rc.second);
+ _routersByCategoryHint = rc.first;
+ }
+
+ if(_sessionTraceLevel >= 1)
+ {
+ Trace out(_instance->logger(), "Glacier2");
+ out << "created session\n" << router->toString();
}
-
- return session;
}
Glacier2::SessionRouterI::SessionThread::SessionThread(const SessionRouterIPtr& sessionRouter,
diff --git a/cpp/src/Glacier2/SessionRouterI.h b/cpp/src/Glacier2/SessionRouterI.h
index 9be3f25e2b0..6ab526ffbd0 100644
--- a/cpp/src/Glacier2/SessionRouterI.h
+++ b/cpp/src/Glacier2/SessionRouterI.h
@@ -15,6 +15,7 @@
#include <Ice/Ice.h>
#include <Glacier2/PermissionsVerifierF.h>
#include <Glacier2/Router.h>
+#include <Glacier2/Instance.h>
#include <set>
#include <IceUtil/DisableWarnings.h>
@@ -27,28 +28,58 @@ typedef IceUtil::Handle<RouterI> RouterIPtr;
class SessionRouterI;
typedef IceUtil::Handle<SessionRouterI> SessionRouterIPtr;
-class Authorizer : public IceUtil::Shared
+class FilterManager;
+typedef IceUtil::Handle<FilterManager> FilterManagerPtr;
+
+class CreateSession;
+typedef IceUtil::Handle<CreateSession> CreateSessionPtr;
+
+class CreateSession : public IceUtil::Shared
{
public:
- virtual bool authorize(std::string&, const Ice::Context&) = 0;
-};
-typedef IceUtil::Handle<Authorizer> AuthorizerPtr;
+ CreateSession(const SessionRouterIPtr&, const std::string&, const Ice::Current&, const Ice::Context&);
-class SessionFactory : public IceUtil::Shared
-{
-public:
+ void create();
+ void addPendingCallback(const CreateSessionPtr&);
+
+ void authorized(bool);
+ void unexpectedAuthorizeException(const Ice::Exception&);
+
+ void sessionCreated(const SessionPrx&);
+ void unexpectedCreateSessionException(const Ice::Exception&);
- virtual SessionPrx create(const SessionControlPrx&, const Ice::Context&) = 0;
+ void exception(const Ice::Exception&);
+
+ virtual void authorize() = 0;
+ virtual void createSession() = 0;
+ virtual FilterManagerPtr createFilterManager() = 0;
+ virtual void finished(const SessionPrx&) = 0;
+ virtual void finished(const Ice::Exception&) = 0;
+
+protected:
+
+ const InstancePtr _instance;
+ const SessionRouterIPtr _sessionRouter;
+ const std::string _user;
+ const Ice::Current _current;
+ Ice::Context _sslContext;
+ std::vector<CreateSessionPtr> _pendingCallbacks;
+ SessionControlPrx _control;
+ FilterManagerPtr _filterManager;
};
-typedef IceUtil::Handle<SessionFactory> SessionFactoryPtr;
+
+class UserPasswordCreateSession;
+typedef IceUtil::Handle<UserPasswordCreateSession> UserPasswordCreateSessionPtr;
+
+class SSLCreateSession;
+typedef IceUtil::Handle<SSLCreateSession> SSLCreateSessionPtr;
class SessionRouterI : public Router, public IceUtil::Monitor<IceUtil::Mutex>
{
public:
- SessionRouterI(const Ice::ObjectAdapterPtr&, const Ice::ObjectAdapterPtr&,
- const PermissionsVerifierPrx&, const SessionManagerPrx&,
+ SessionRouterI(const InstancePtr&, const PermissionsVerifierPrx&, const SessionManagerPrx&,
const SSLPermissionsVerifierPrx&, const SSLSessionManagerPrx&);
virtual ~SessionRouterI();
void destroy();
@@ -58,8 +89,10 @@ public:
virtual void addProxy(const Ice::ObjectPrx&, const Ice::Current&);
virtual Ice::ObjectProxySeq addProxies(const Ice::ObjectProxySeq&, const Ice::Current&);
virtual std::string getCategoryForClient(const Ice::Current&) const;
- virtual SessionPrx createSession(const std::string&, const std::string&, const Ice::Current&);
- virtual SessionPrx createSessionFromSecureConnection(const Ice::Current&);
+ virtual void createSession_async(const AMD_Router_createSessionPtr&, const std::string&, const std::string&,
+ const Ice::Current&);
+ virtual void createSessionFromSecureConnection_async(const AMD_Router_createSessionFromSecureConnectionPtr&,
+ const Ice::Current&);
virtual void destroySession(const ::Ice::Current&);
virtual Ice::Long getSessionTimeout(const ::Ice::Current&) const;
@@ -70,17 +103,19 @@ public:
void destroySession(const ::Ice::ConnectionPtr&);
+ int sessionTraceLevel() const { return _sessionTraceLevel; }
+
private:
- SessionPrx createSessionInternal(const std::string&, bool, const AuthorizerPtr&, const SessionFactoryPtr&,
- const Ice::Context&, const Ice::Current&);
+ bool startCreateSession(const CreateSessionPtr&, const Ice::ConnectionPtr&);
+ void finishCreateSession(const Ice::ConnectionPtr&, const RouterIPtr&);
+ friend class Glacier2::CreateSession;
+ friend class Glacier2::UserPasswordCreateSession;
+ friend class Glacier2::SSLCreateSession;
- const Ice::PropertiesPtr _properties;
- const Ice::LoggerPtr _logger;
+ const InstancePtr _instance;
const int _sessionTraceLevel;
const int _rejectTraceLevel;
- const Ice::ObjectAdapterPtr _clientAdapter;
- const Ice::ObjectAdapterPtr _serverAdapter;
const PermissionsVerifierPrx _verifier;
const SessionManagerPrx _sessionManager;
const SSLPermissionsVerifierPrx _sslVerifier;
@@ -111,7 +146,7 @@ private:
std::map<std::string, RouterIPtr> _routersByCategory;
mutable std::map<std::string, RouterIPtr>::iterator _routersByCategoryHint;
- std::set<Ice::ConnectionPtr> _pending;
+ std::map<Ice::ConnectionPtr, CreateSessionPtr> _pending;
bool _destroy;
};
diff --git a/cpp/src/Ice/.depend b/cpp/src/Ice/.depend
index 569597da8fb..d4cede0d2a0 100644
--- a/cpp/src/Ice/.depend
+++ b/cpp/src/Ice/.depend
@@ -1,92 +1,97 @@
-Acceptor$(OBJEXT): Acceptor.cpp ../Ice/Acceptor.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../Ice/AcceptorF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../Ice/TransceiverF.h
-Application$(OBJEXT): Application.cpp ../../include/Ice/Application.h ../../include/Ice/Ice.h ../../include/Ice/Initialize.h ../../include/Ice/CommunicatorF.h ../../include/Ice/LocalObjectF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/PropertiesF.h ../../include/Ice/Proxy.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/InstanceF.h ../../include/Ice/LoggerF.h ../../include/Ice/StatsF.h ../../include/Ice/StringConverter.h ../../include/Ice/BuiltinSequences.h ../../include/Ice/LocalException.h ../../include/Ice/Properties.h ../../include/Ice/Outgoing.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/Ice/BasicStream.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/IceUtil/Unicode.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/ServantManagerF.h ../../include/Ice/Direct.h ../../include/Ice/Logger.h ../../include/Ice/LoggerUtil.h ../../include/Ice/Stats.h ../../include/Ice/Communicator.h ../../include/Ice/RouterF.h ../../include/Ice/LocatorF.h ../../include/Ice/PluginF.h ../../include/Ice/ImplicitContextF.h ../../include/Ice/ObjectFactory.h ../../include/Ice/ObjectAdapter.h ../../include/Ice/FacetMap.h ../../include/Ice/ServantLocator.h ../../include/Ice/OutgoingAsync.h ../../include/IceUtil/RecMutex.h ../../include/Ice/IncomingAsync.h ../../include/Ice/Process.h ../../include/Ice/Connection.h ../../include/Ice/Functional.h ../../include/IceUtil/Functional.h ../../include/Ice/Stream.h ../../include/Ice/ImplicitContext.h ../../include/Ice/Locator.h ../../include/Ice/UserExceptionFactory.h ../../include/Ice/FactoryTable.h ../../include/Ice/FactoryTableDef.h ../../include/IceUtil/StaticMutex.h ../../include/Ice/UserExceptionFactoryF.h ../../include/Ice/ProcessF.h ../../include/Ice/Router.h ../../include/Ice/DispatchInterceptor.h ../../include/Ice/IconvStringConverter.h ../../include/IceUtil/CtrlCHandler.h ../../include/IceUtil/ArgVector.h ../Ice/GC.h ../../include/IceUtil/Thread.h
-Buffer$(OBJEXT): Buffer.cpp ../../include/Ice/Buffer.h ../../include/Ice/Config.h ../../include/IceUtil/Config.h ../../include/Ice/LocalException.h ../../include/Ice/LocalObjectF.h ../../include/IceUtil/Shared.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/Proxy.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/CommunicatorF.h ../../include/Ice/BuiltinSequences.h
-BasicStream$(OBJEXT): BasicStream.cpp ../../include/IceUtil/DisableWarnings.h ../../include/Ice/BasicStream.h ../../include/Ice/InstanceF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/LocalObjectF.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/Ice/StringConverter.h ../../include/IceUtil/Unicode.h ../Ice/Instance.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/RecMutex.h ../../include/IceUtil/Timer.h ../../include/IceUtil/Thread.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/Ice/CommunicatorF.h ../../include/Ice/StatsF.h ../Ice/TraceLevelsF.h ../Ice/DefaultsAndOverridesF.h ../Ice/RouterInfoF.h ../Ice/LocatorInfoF.h ../Ice/ReferenceFactoryF.h ../../include/Ice/ProxyFactoryF.h ../Ice/ThreadPoolF.h ../../include/Ice/ConnectionFactoryF.h ../../include/Ice/ConnectionMonitorF.h ../Ice/ObjectFactoryManagerF.h ../../include/Ice/ObjectAdapterFactoryF.h ../Ice/EndpointFactoryManagerF.h ../../include/Ice/DynamicLibraryF.h ../../include/Ice/PluginF.h ../../include/Ice/Initialize.h ../../include/Ice/PropertiesF.h ../../include/Ice/Proxy.h ../../include/Ice/ConnectionIF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/LoggerF.h ../../include/Ice/BuiltinSequences.h ../Ice/SharedContext.h ../Ice/ImplicitContextI.h ../../include/Ice/ImplicitContext.h ../../include/Ice/LocalException.h ../../include/Ice/FacetMap.h ../../include/Ice/Process.h ../../include/Ice/Outgoing.h ../../include/Ice/OutgoingAsync.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/ServantManagerF.h ../../include/Ice/Direct.h ../Ice/ProxyFactory.h ../../include/Ice/ObjectFactory.h ../Ice/ObjectFactoryManager.h ../../include/Ice/UserExceptionFactory.h ../../include/Ice/FactoryTable.h ../../include/Ice/FactoryTableDef.h ../../include/IceUtil/StaticMutex.h ../../include/Ice/UserExceptionFactoryF.h ../Ice/TraceUtil.h ../Ice/TraceLevels.h ../../include/Ice/LoggerUtil.h
-BuiltinSequences$(OBJEXT): BuiltinSequences.cpp ../../include/Ice/BuiltinSequences.h ../../include/Ice/LocalObjectF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/Proxy.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/CommunicatorF.h ../../include/Ice/BasicStream.h ../../include/Ice/InstanceF.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/Ice/StringConverter.h ../../include/IceUtil/Unicode.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/IceUtil/Iterator.h ../../include/IceUtil/ScopedArray.h ../../include/IceUtil/DisableWarnings.h
-CommunicatorI$(OBJEXT): CommunicatorI.cpp ../../include/IceUtil/DisableWarnings.h ../Ice/CommunicatorI.h ../../include/IceUtil/RecMutex.h ../../include/IceUtil/Config.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/IceUtil/StaticMutex.h ../../include/Ice/DynamicLibraryF.h ../../include/IceUtil/Shared.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/Initialize.h ../../include/Ice/CommunicatorF.h ../../include/Ice/LocalObjectF.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/PropertiesF.h ../../include/Ice/Proxy.h ../../include/IceUtil/Mutex.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/InstanceF.h ../../include/Ice/LoggerF.h ../../include/Ice/StatsF.h ../../include/Ice/StringConverter.h ../../include/Ice/BuiltinSequences.h ../../include/Ice/Communicator.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/RouterF.h ../../include/Ice/LocatorF.h ../../include/Ice/PluginF.h ../../include/Ice/ImplicitContextF.h ../Ice/Instance.h ../../include/IceUtil/Timer.h ../../include/IceUtil/Thread.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../Ice/TraceLevelsF.h ../Ice/DefaultsAndOverridesF.h ../Ice/RouterInfoF.h ../Ice/LocatorInfoF.h ../Ice/ReferenceFactoryF.h ../Ice/ThreadPoolF.h ../../include/Ice/ConnectionFactoryF.h ../../include/Ice/ConnectionMonitorF.h ../Ice/ObjectFactoryManagerF.h ../../include/Ice/ObjectAdapterFactoryF.h ../Ice/EndpointFactoryManagerF.h ../Ice/SharedContext.h ../Ice/ImplicitContextI.h ../../include/Ice/ImplicitContext.h ../../include/Ice/LocalException.h ../../include/Ice/FacetMap.h ../../include/Ice/Process.h ../../include/Ice/Outgoing.h ../../include/Ice/BasicStream.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/IceUtil/Unicode.h ../../include/Ice/OutgoingAsync.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/ServantManagerF.h ../../include/Ice/Direct.h ../../include/Ice/Properties.h ../Ice/ReferenceFactory.h ../Ice/Reference.h ../Ice/ProxyFactory.h ../Ice/ObjectFactoryManager.h ../Ice/ObjectAdapterFactory.h ../Ice/ObjectAdapterI.h ../../include/Ice/ObjectAdapter.h ../Ice/ConnectorF.h ../../include/Ice/LoggerUtil.h ../Ice/DefaultsAndOverrides.h ../Ice/TraceLevels.h ../Ice/GC.h
-Communicator$(OBJEXT): Communicator.cpp ../../include/Ice/Communicator.h ../../include/Ice/LocalObjectF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/Proxy.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/CommunicatorF.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/LoggerF.h ../../include/Ice/StatsF.h ../../include/Ice/PropertiesF.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/RouterF.h ../../include/Ice/LocatorF.h ../../include/Ice/PluginF.h ../../include/Ice/ImplicitContextF.h ../../include/Ice/BasicStream.h ../../include/Ice/InstanceF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/Ice/StringConverter.h ../../include/IceUtil/Unicode.h ../../include/IceUtil/Iterator.h ../../include/IceUtil/ScopedArray.h ../../include/IceUtil/DisableWarnings.h
-ConnectionFactory$(OBJEXT): ConnectionFactory.cpp ../Ice/ConnectionFactory.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Config.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/IceUtil/Thread.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Handle.h ../../include/Ice/ConnectionFactoryF.h ../../include/Ice/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ConnectionIF.h ../../include/Ice/LocalObject.h ../../include/Ice/LocalObjectF.h ../../include/Ice/InstanceF.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../Ice/ConnectorF.h ../Ice/AcceptorF.h ../Ice/TransceiverF.h ../Ice/RouterInfoF.h ../Ice/EventHandler.h ../Ice/EventHandlerF.h ../Ice/ThreadPoolF.h ../../include/Ice/BasicStream.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/Ice/StringConverter.h ../../include/IceUtil/Unicode.h ../Ice/ConnectionI.h ../../include/Ice/Connection.h ../../include/Ice/Proxy.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/CommunicatorF.h ../../include/Ice/ServantManagerF.h ../../include/Ice/LoggerF.h ../Ice/TraceLevelsF.h ../Ice/Instance.h ../../include/IceUtil/RecMutex.h ../../include/IceUtil/Timer.h ../../include/Ice/StatsF.h ../Ice/DefaultsAndOverridesF.h ../Ice/LocatorInfoF.h ../Ice/ReferenceFactoryF.h ../../include/Ice/ConnectionMonitorF.h ../Ice/ObjectFactoryManagerF.h ../../include/Ice/ObjectAdapterFactoryF.h ../Ice/EndpointFactoryManagerF.h ../../include/Ice/DynamicLibraryF.h ../../include/Ice/PluginF.h ../../include/Ice/Initialize.h ../../include/Ice/PropertiesF.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/BuiltinSequences.h ../Ice/SharedContext.h ../Ice/ImplicitContextI.h ../../include/Ice/ImplicitContext.h ../../include/Ice/LocalException.h ../../include/Ice/FacetMap.h ../../include/Ice/Process.h ../../include/Ice/Outgoing.h ../../include/Ice/OutgoingAsync.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/Direct.h ../../include/Ice/LoggerUtil.h ../Ice/TraceLevels.h ../Ice/DefaultsAndOverrides.h ../../include/Ice/Properties.h ../Ice/Transceiver.h ../Ice/Connector.h ../Ice/Acceptor.h ../Ice/ThreadPool.h ../Ice/ObjectAdapterI.h ../../include/Ice/ObjectAdapter.h ../../include/Ice/RouterF.h ../../include/Ice/LocatorF.h ../Ice/Reference.h ../Ice/EndpointI.h ../Ice/RouterInfo.h ../../include/Ice/Functional.h ../../include/IceUtil/Functional.h ../../include/IceUtil/Random.h
-ConnectionI$(OBJEXT): ConnectionI.cpp ../../include/IceUtil/DisableWarnings.h ../Ice/ConnectionI.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Config.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/IceUtil/Thread.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Handle.h ../../include/Ice/Connection.h ../../include/Ice/LocalObjectF.h ../../include/Ice/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/Proxy.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/CommunicatorF.h ../../include/Ice/ConnectionFactoryF.h ../../include/Ice/InstanceF.h ../Ice/TransceiverF.h ../../include/Ice/ServantManagerF.h ../../include/Ice/LoggerF.h ../Ice/TraceLevelsF.h ../Ice/EventHandler.h ../Ice/EventHandlerF.h ../Ice/ThreadPoolF.h ../../include/Ice/BasicStream.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/Ice/StringConverter.h ../../include/IceUtil/Unicode.h ../Ice/Instance.h ../../include/IceUtil/RecMutex.h ../../include/IceUtil/Timer.h ../../include/Ice/StatsF.h ../Ice/DefaultsAndOverridesF.h ../Ice/RouterInfoF.h ../Ice/LocatorInfoF.h ../Ice/ReferenceFactoryF.h ../../include/Ice/ConnectionMonitorF.h ../Ice/ObjectFactoryManagerF.h ../../include/Ice/ObjectAdapterFactoryF.h ../Ice/EndpointFactoryManagerF.h ../../include/Ice/DynamicLibraryF.h ../../include/Ice/PluginF.h ../../include/Ice/Initialize.h ../../include/Ice/PropertiesF.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/BuiltinSequences.h ../Ice/SharedContext.h ../Ice/ImplicitContextI.h ../../include/Ice/ImplicitContext.h ../../include/Ice/LocalException.h ../../include/Ice/FacetMap.h ../../include/Ice/Process.h ../../include/Ice/Outgoing.h ../../include/Ice/OutgoingAsync.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/Direct.h ../../include/Ice/LoggerUtil.h ../../include/Ice/Properties.h ../Ice/TraceUtil.h ../Ice/DefaultsAndOverrides.h ../Ice/Transceiver.h ../Ice/ThreadPool.h ../Ice/ConnectionMonitor.h ../Ice/ObjectAdapterI.h ../../include/Ice/ObjectAdapter.h ../../include/Ice/RouterF.h ../../include/Ice/LocatorF.h ../Ice/ConnectorF.h ../Ice/EndpointI.h ../Ice/AcceptorF.h ../Ice/ReferenceFactory.h ../Ice/Reference.h ../Ice/ProxyFactory.h
-ConnectionMonitor$(OBJEXT): ConnectionMonitor.cpp ../Ice/ConnectionMonitor.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Config.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/IceUtil/Timer.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Thread.h ../../include/IceUtil/Handle.h ../../include/Ice/ConnectionMonitorF.h ../../include/Ice/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ConnectionIF.h ../../include/Ice/LocalObject.h ../../include/Ice/LocalObjectF.h ../../include/Ice/InstanceF.h ../Ice/ConnectionI.h ../../include/Ice/Connection.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/Proxy.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/CommunicatorF.h ../../include/Ice/ConnectionFactoryF.h ../Ice/TransceiverF.h ../../include/Ice/ServantManagerF.h ../../include/Ice/LoggerF.h ../Ice/TraceLevelsF.h ../Ice/EventHandler.h ../Ice/EventHandlerF.h ../Ice/ThreadPoolF.h ../../include/Ice/BasicStream.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/Ice/StringConverter.h ../../include/IceUtil/Unicode.h ../../include/Ice/LocalException.h ../../include/Ice/BuiltinSequences.h ../../include/Ice/LoggerUtil.h ../Ice/Instance.h ../../include/IceUtil/RecMutex.h ../../include/Ice/StatsF.h ../Ice/DefaultsAndOverridesF.h ../Ice/RouterInfoF.h ../Ice/LocatorInfoF.h ../Ice/ReferenceFactoryF.h ../Ice/ObjectFactoryManagerF.h ../../include/Ice/ObjectAdapterFactoryF.h ../Ice/EndpointFactoryManagerF.h ../../include/Ice/DynamicLibraryF.h ../../include/Ice/PluginF.h ../../include/Ice/Initialize.h ../../include/Ice/PropertiesF.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../Ice/SharedContext.h ../Ice/ImplicitContextI.h ../../include/Ice/ImplicitContext.h ../../include/Ice/FacetMap.h ../../include/Ice/Process.h ../../include/Ice/Outgoing.h ../../include/Ice/OutgoingAsync.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/Direct.h
-Connection$(OBJEXT): Connection.cpp ../../include/Ice/Connection.h ../../include/Ice/LocalObjectF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/Proxy.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/CommunicatorF.h ../../include/Ice/BasicStream.h ../../include/Ice/InstanceF.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/Ice/StringConverter.h ../../include/IceUtil/Unicode.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/IceUtil/Iterator.h ../../include/IceUtil/ScopedArray.h ../../include/IceUtil/DisableWarnings.h
-Connector$(OBJEXT): Connector.cpp ../Ice/Connector.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../Ice/ConnectorF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../Ice/TransceiverF.h
-Current$(OBJEXT): Current.cpp ../../include/Ice/Current.h ../../include/Ice/LocalObjectF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/BasicStream.h ../../include/Ice/InstanceF.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/Ice/StringConverter.h ../../include/IceUtil/Unicode.h ../../include/Ice/Object.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/StreamF.h ../../include/IceUtil/Iterator.h ../../include/IceUtil/ScopedArray.h ../../include/IceUtil/DisableWarnings.h
-DefaultsAndOverrides$(OBJEXT): DefaultsAndOverrides.cpp ../Ice/DefaultsAndOverrides.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../Ice/DefaultsAndOverridesF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/PropertiesF.h ../../include/Ice/LocalObjectF.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/Proxy.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/CommunicatorF.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/Properties.h ../../include/Ice/Outgoing.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/Ice/BasicStream.h ../../include/Ice/InstanceF.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/Ice/StringConverter.h ../../include/IceUtil/Unicode.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/ServantManagerF.h ../../include/Ice/Direct.h ../../include/Ice/BuiltinSequences.h ../Ice/Network.h ../../include/Ice/LoggerF.h ../../include/Ice/LocalException.h
-Direct$(OBJEXT): Direct.cpp ../../include/Ice/Direct.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/LocalObjectF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/ReferenceF.h ../../include/Ice/Object.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../Ice/ObjectAdapterI.h ../../include/IceUtil/RecMutex.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/Ice/ObjectAdapter.h ../../include/Ice/Proxy.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/CommunicatorF.h ../../include/Ice/RouterF.h ../../include/Ice/LocatorF.h ../../include/Ice/FacetMap.h ../../include/Ice/InstanceF.h ../../include/Ice/ObjectAdapterFactoryF.h ../../include/Ice/ConnectionFactoryF.h ../../include/Ice/ServantManagerF.h ../Ice/RouterInfoF.h ../Ice/ConnectorF.h ../Ice/LocatorInfoF.h ../Ice/ThreadPoolF.h ../../include/Ice/BuiltinSequences.h ../Ice/ServantManager.h ../../include/Ice/ServantLocator.h ../Ice/Reference.h ../Ice/ReferenceFactoryF.h ../Ice/SharedContext.h ../../include/Ice/LocalException.h
-DispatchInterceptor$(OBJEXT): DispatchInterceptor.cpp ../../include/Ice/DispatchInterceptor.h ../../include/Ice/Object.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Config.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/IceUtil/Shared.h ../../include/Ice/GCShared.h ../../include/Ice/Config.h ../../include/Ice/GCCountMap.h ../../include/Ice/ObjectF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/LocalObjectF.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../Ice/IncomingRequest.h ../../include/Ice/Incoming.h ../../include/Ice/InstanceF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/ServantManagerF.h ../../include/Ice/BasicStream.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/Ice/StringConverter.h ../../include/IceUtil/Unicode.h ../../include/Ice/Direct.h ../../include/Ice/ReferenceF.h ../../include/Ice/LocalException.h ../../include/Ice/Proxy.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/CommunicatorF.h ../../include/Ice/BuiltinSequences.h
-DynamicLibrary$(OBJEXT): DynamicLibrary.cpp ../../include/Ice/DynamicLibrary.h ../../include/Ice/DynamicLibraryF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h
-EndpointFactoryManager$(OBJEXT): EndpointFactoryManager.cpp ../Ice/EndpointFactoryManager.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/Ice/InstanceF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/EndpointIF.h ../../include/Ice/LocalObject.h ../../include/Ice/LocalObjectF.h ../../include/Ice/EndpointFactoryF.h ../Ice/EndpointFactoryManagerF.h ../../include/Ice/Endpoint.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/UndefSysMacros.h ../Ice/UnknownEndpointI.h ../Ice/EndpointI.h ../Ice/TransceiverF.h ../Ice/ConnectorF.h ../Ice/AcceptorF.h ../../include/Ice/EndpointFactory.h ../../include/Ice/BasicStream.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/Ice/StringConverter.h ../../include/IceUtil/Unicode.h ../../include/Ice/LocalException.h ../../include/Ice/Proxy.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/CommunicatorF.h ../../include/Ice/BuiltinSequences.h ../Ice/Instance.h ../../include/IceUtil/RecMutex.h ../../include/IceUtil/Timer.h ../../include/IceUtil/Thread.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/Ice/StatsF.h ../Ice/TraceLevelsF.h ../Ice/DefaultsAndOverridesF.h ../Ice/RouterInfoF.h ../Ice/LocatorInfoF.h ../Ice/ReferenceFactoryF.h ../Ice/ThreadPoolF.h ../../include/Ice/ConnectionFactoryF.h ../../include/Ice/ConnectionMonitorF.h ../Ice/ObjectFactoryManagerF.h ../../include/Ice/ObjectAdapterFactoryF.h ../../include/Ice/DynamicLibraryF.h ../../include/Ice/PluginF.h ../../include/Ice/Initialize.h ../../include/Ice/PropertiesF.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/LoggerF.h ../Ice/SharedContext.h ../Ice/ImplicitContextI.h ../../include/Ice/ImplicitContext.h ../../include/Ice/FacetMap.h ../../include/Ice/Process.h ../../include/Ice/Outgoing.h ../../include/Ice/OutgoingAsync.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/ServantManagerF.h ../../include/Ice/Direct.h ../../include/Ice/Properties.h ../Ice/DefaultsAndOverrides.h
-EndpointFactory$(OBJEXT): EndpointFactory.cpp ../../include/Ice/EndpointFactory.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/Ice/EndpointIF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/LocalObject.h ../../include/Ice/LocalObjectF.h ../../include/Ice/EndpointFactoryF.h
-Endpoint$(OBJEXT): Endpoint.cpp ../../include/Ice/Endpoint.h ../../include/Ice/LocalObjectF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/BasicStream.h ../../include/Ice/InstanceF.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/Ice/StringConverter.h ../../include/IceUtil/Unicode.h ../../include/Ice/Object.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/IceUtil/Iterator.h ../../include/IceUtil/ScopedArray.h ../../include/IceUtil/DisableWarnings.h
-EndpointI$(OBJEXT): EndpointI.cpp ../Ice/EndpointI.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/Ice/Endpoint.h ../../include/Ice/LocalObjectF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/EndpointIF.h ../../include/Ice/InstanceF.h ../Ice/TransceiverF.h ../Ice/ConnectorF.h ../Ice/AcceptorF.h
-EventHandler$(OBJEXT): EventHandler.cpp ../Ice/EventHandler.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../Ice/EventHandlerF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/InstanceF.h ../Ice/ThreadPoolF.h ../../include/Ice/BasicStream.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/LocalObjectF.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/Ice/StringConverter.h ../../include/IceUtil/Unicode.h ../Ice/Instance.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/RecMutex.h ../../include/IceUtil/Timer.h ../../include/IceUtil/Thread.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/Ice/CommunicatorF.h ../../include/Ice/StatsF.h ../Ice/TraceLevelsF.h ../Ice/DefaultsAndOverridesF.h ../Ice/RouterInfoF.h ../Ice/LocatorInfoF.h ../Ice/ReferenceFactoryF.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionFactoryF.h ../../include/Ice/ConnectionMonitorF.h ../Ice/ObjectFactoryManagerF.h ../../include/Ice/ObjectAdapterFactoryF.h ../Ice/EndpointFactoryManagerF.h ../../include/Ice/DynamicLibraryF.h ../../include/Ice/PluginF.h ../../include/Ice/Initialize.h ../../include/Ice/PropertiesF.h ../../include/Ice/Proxy.h ../../include/Ice/ConnectionIF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/LoggerF.h ../../include/Ice/BuiltinSequences.h ../Ice/SharedContext.h ../Ice/ImplicitContextI.h ../../include/Ice/ImplicitContext.h ../../include/Ice/LocalException.h ../../include/Ice/FacetMap.h ../../include/Ice/Process.h ../../include/Ice/Outgoing.h ../../include/Ice/OutgoingAsync.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/ServantManagerF.h ../../include/Ice/Direct.h
-Exception$(OBJEXT): Exception.cpp ../../include/Ice/Exception.h ../../include/IceUtil/Exception.h ../../include/IceUtil/Config.h ../../include/Ice/Config.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/ProxyHandle.h ../../include/Ice/LocalException.h ../../include/Ice/LocalObjectF.h ../../include/IceUtil/Shared.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/LocalObject.h ../../include/Ice/Proxy.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/CommunicatorF.h ../../include/Ice/BuiltinSequences.h ../Ice/Network.h ../../include/Ice/PropertiesF.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/LoggerF.h ../../include/Ice/Plugin.h ../../include/IceUtil/StringUtil.h
-FacetMap$(OBJEXT): FacetMap.cpp ../../include/Ice/FacetMap.h ../../include/Ice/LocalObjectF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/BasicStream.h ../../include/Ice/InstanceF.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/Ice/StringConverter.h ../../include/IceUtil/Unicode.h ../../include/Ice/Object.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/IceUtil/Iterator.h ../../include/IceUtil/ScopedArray.h ../../include/IceUtil/DisableWarnings.h
+Acceptor$(OBJEXT): Acceptor.cpp ../Ice/Acceptor.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../Ice/AcceptorF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../Ice/TransceiverF.h
+Application$(OBJEXT): Application.cpp ../../include/Ice/Application.h ../../include/Ice/Ice.h ../../include/Ice/Initialize.h ../../include/Ice/CommunicatorF.h ../../include/Ice/LocalObjectF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/PropertiesF.h ../../include/Ice/Proxy.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/RequestHandlerF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/InstanceF.h ../../include/Ice/LoggerF.h ../../include/Ice/StatsF.h ../../include/Ice/StringConverter.h ../../include/Ice/BuiltinSequences.h ../../include/Ice/LocalException.h ../../include/Ice/Properties.h ../../include/Ice/Outgoing.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/Ice/BasicStream.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/IceUtil/Unicode.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/ServantManagerF.h ../../include/Ice/Direct.h ../../include/Ice/Logger.h ../../include/Ice/LoggerUtil.h ../../include/Ice/Stats.h ../../include/Ice/Communicator.h ../../include/Ice/RouterF.h ../../include/Ice/LocatorF.h ../../include/Ice/PluginF.h ../../include/Ice/ImplicitContextF.h ../../include/Ice/ObjectFactory.h ../../include/Ice/ObjectAdapter.h ../../include/Ice/FacetMap.h ../../include/Ice/ServantLocator.h ../../include/Ice/OutgoingAsync.h ../../include/IceUtil/Timer.h ../../include/IceUtil/Thread.h ../../include/Ice/IncomingAsync.h ../../include/Ice/Process.h ../../include/Ice/Connection.h ../../include/Ice/Functional.h ../../include/IceUtil/Functional.h ../../include/Ice/Stream.h ../../include/Ice/ImplicitContext.h ../../include/Ice/Locator.h ../../include/Ice/UserExceptionFactory.h ../../include/Ice/FactoryTable.h ../../include/Ice/FactoryTableDef.h ../../include/IceUtil/StaticMutex.h ../../include/Ice/UserExceptionFactoryF.h ../../include/Ice/ProcessF.h ../../include/Ice/Router.h ../../include/Ice/DispatchInterceptor.h ../../include/Ice/IconvStringConverter.h ../../include/IceUtil/CtrlCHandler.h ../../include/IceUtil/ArgVector.h ../Ice/GC.h
+Buffer$(OBJEXT): Buffer.cpp ../../include/Ice/Buffer.h ../../include/Ice/Config.h ../../include/IceUtil/Config.h ../../include/Ice/LocalException.h ../../include/Ice/LocalObjectF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/Proxy.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/RequestHandlerF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/CommunicatorF.h ../../include/Ice/BuiltinSequences.h
+BasicStream$(OBJEXT): BasicStream.cpp ../../include/IceUtil/DisableWarnings.h ../../include/Ice/BasicStream.h ../../include/Ice/InstanceF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/LocalObjectF.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/Ice/StringConverter.h ../../include/IceUtil/Unicode.h ../Ice/Instance.h ../../include/IceUtil/RecMutex.h ../../include/IceUtil/Timer.h ../../include/IceUtil/Thread.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/Ice/CommunicatorF.h ../../include/Ice/StatsF.h ../Ice/TraceLevelsF.h ../Ice/DefaultsAndOverridesF.h ../Ice/RouterInfoF.h ../Ice/LocatorInfoF.h ../Ice/ReferenceFactoryF.h ../../include/Ice/ProxyFactoryF.h ../Ice/ThreadPoolF.h ../Ice/SelectorThreadF.h ../../include/Ice/ConnectionFactoryF.h ../../include/Ice/ConnectionMonitorF.h ../Ice/ObjectFactoryManagerF.h ../../include/Ice/ObjectAdapterFactoryF.h ../Ice/EndpointFactoryManagerF.h ../../include/Ice/DynamicLibraryF.h ../../include/Ice/PluginF.h ../../include/Ice/Initialize.h ../../include/Ice/PropertiesF.h ../../include/Ice/Proxy.h ../../include/Ice/ConnectionIF.h ../../include/Ice/RequestHandlerF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/LoggerF.h ../../include/Ice/BuiltinSequences.h ../Ice/SharedContext.h ../Ice/ImplicitContextI.h ../../include/Ice/ImplicitContext.h ../../include/Ice/LocalException.h ../../include/Ice/FacetMap.h ../../include/Ice/Process.h ../../include/Ice/Outgoing.h ../../include/Ice/OutgoingAsync.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/ServantManagerF.h ../../include/Ice/Direct.h ../Ice/ProxyFactory.h ../../include/Ice/ObjectFactory.h ../Ice/ObjectFactoryManager.h ../../include/Ice/UserExceptionFactory.h ../../include/Ice/FactoryTable.h ../../include/Ice/FactoryTableDef.h ../../include/IceUtil/StaticMutex.h ../../include/Ice/UserExceptionFactoryF.h ../Ice/TraceUtil.h ../Ice/TraceLevels.h ../../include/Ice/LoggerUtil.h
+BuiltinSequences$(OBJEXT): BuiltinSequences.cpp ../../include/Ice/BuiltinSequences.h ../../include/Ice/LocalObjectF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/Proxy.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/RequestHandlerF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/CommunicatorF.h ../../include/Ice/BasicStream.h ../../include/Ice/InstanceF.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/Ice/StringConverter.h ../../include/IceUtil/Unicode.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/IceUtil/Iterator.h ../../include/IceUtil/ScopedArray.h ../../include/IceUtil/DisableWarnings.h
+CommunicatorI$(OBJEXT): CommunicatorI.cpp ../../include/IceUtil/DisableWarnings.h ../Ice/CommunicatorI.h ../../include/IceUtil/RecMutex.h ../../include/IceUtil/Config.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/IceUtil/StaticMutex.h ../../include/Ice/DynamicLibraryF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Mutex.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/Initialize.h ../../include/Ice/CommunicatorF.h ../../include/Ice/LocalObjectF.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/PropertiesF.h ../../include/Ice/Proxy.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/RequestHandlerF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/InstanceF.h ../../include/Ice/LoggerF.h ../../include/Ice/StatsF.h ../../include/Ice/StringConverter.h ../../include/Ice/BuiltinSequences.h ../../include/Ice/Communicator.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/RouterF.h ../../include/Ice/LocatorF.h ../../include/Ice/PluginF.h ../../include/Ice/ImplicitContextF.h ../Ice/Instance.h ../../include/IceUtil/Timer.h ../../include/IceUtil/Thread.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../Ice/TraceLevelsF.h ../Ice/DefaultsAndOverridesF.h ../Ice/RouterInfoF.h ../Ice/LocatorInfoF.h ../Ice/ReferenceFactoryF.h ../Ice/ThreadPoolF.h ../Ice/SelectorThreadF.h ../../include/Ice/ConnectionFactoryF.h ../../include/Ice/ConnectionMonitorF.h ../Ice/ObjectFactoryManagerF.h ../../include/Ice/ObjectAdapterFactoryF.h ../Ice/EndpointFactoryManagerF.h ../Ice/SharedContext.h ../Ice/ImplicitContextI.h ../../include/Ice/ImplicitContext.h ../../include/Ice/LocalException.h ../../include/Ice/FacetMap.h ../../include/Ice/Process.h ../../include/Ice/Outgoing.h ../../include/Ice/BasicStream.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/IceUtil/Unicode.h ../../include/Ice/OutgoingAsync.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/ServantManagerF.h ../../include/Ice/Direct.h ../../include/Ice/Properties.h ../Ice/ReferenceFactory.h ../Ice/Reference.h ../Ice/ProxyFactory.h ../Ice/ObjectFactoryManager.h ../Ice/ObjectAdapterFactory.h ../Ice/ObjectAdapterI.h ../../include/Ice/ObjectAdapter.h ../Ice/ConnectorF.h ../../include/Ice/LoggerUtil.h ../Ice/DefaultsAndOverrides.h ../Ice/TraceLevels.h ../Ice/GC.h
+Communicator$(OBJEXT): Communicator.cpp ../../include/Ice/Communicator.h ../../include/Ice/LocalObjectF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/Proxy.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/RequestHandlerF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/CommunicatorF.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/LoggerF.h ../../include/Ice/StatsF.h ../../include/Ice/PropertiesF.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/RouterF.h ../../include/Ice/LocatorF.h ../../include/Ice/PluginF.h ../../include/Ice/ImplicitContextF.h ../../include/Ice/BasicStream.h ../../include/Ice/InstanceF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/Ice/StringConverter.h ../../include/IceUtil/Unicode.h ../../include/IceUtil/Iterator.h ../../include/IceUtil/ScopedArray.h ../../include/IceUtil/DisableWarnings.h
+ConnectRequestHandler$(OBJEXT): ConnectRequestHandler.cpp ../Ice/ConnectRequestHandler.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Config.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/IceUtil/Mutex.h ../Ice/RequestHandler.h ../../include/IceUtil/Shared.h ../../include/Ice/RequestHandlerF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/LocalObject.h ../../include/Ice/LocalObjectF.h ../Ice/Reference.h ../../include/IceUtil/RecMutex.h ../Ice/ReferenceFactoryF.h ../../include/Ice/EndpointIF.h ../../include/Ice/InstanceF.h ../../include/Ice/RouterF.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/Proxy.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/Endpoint.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/CommunicatorF.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/LocatorF.h ../Ice/RouterInfoF.h ../Ice/LocatorInfoF.h ../Ice/SharedContext.h ../Ice/RouterInfo.h ../../include/Ice/BuiltinSequences.h ../../include/Ice/BasicStream.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/Ice/StringConverter.h ../../include/IceUtil/Unicode.h ../Ice/ConnectionRequestHandler.h ../Ice/Instance.h ../../include/IceUtil/Timer.h ../../include/IceUtil/Thread.h ../../include/Ice/StatsF.h ../Ice/TraceLevelsF.h ../Ice/DefaultsAndOverridesF.h ../Ice/ThreadPoolF.h ../Ice/SelectorThreadF.h ../../include/Ice/ConnectionFactoryF.h ../../include/Ice/ConnectionMonitorF.h ../Ice/ObjectFactoryManagerF.h ../../include/Ice/ObjectAdapterFactoryF.h ../Ice/EndpointFactoryManagerF.h ../../include/Ice/DynamicLibraryF.h ../../include/Ice/PluginF.h ../../include/Ice/Initialize.h ../../include/Ice/PropertiesF.h ../../include/Ice/LoggerF.h ../Ice/ImplicitContextI.h ../../include/Ice/ImplicitContext.h ../../include/Ice/LocalException.h ../../include/Ice/FacetMap.h ../../include/Ice/Process.h ../../include/Ice/Outgoing.h ../../include/Ice/OutgoingAsync.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/ServantManagerF.h ../../include/Ice/Direct.h ../Ice/ConnectionI.h ../../include/Ice/Connection.h ../Ice/TransceiverF.h ../Ice/EventHandler.h ../Ice/EventHandlerF.h ../Ice/SelectorThread.h ../Ice/Selector.h ../../include/Ice/Properties.h
+ConnectionFactory$(OBJEXT): ConnectionFactory.cpp ../Ice/ConnectionFactory.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Config.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/IceUtil/Thread.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Handle.h ../../include/Ice/ConnectionFactoryF.h ../../include/Ice/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../Ice/ConnectionI.h ../../include/Ice/Connection.h ../../include/Ice/LocalObjectF.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/Proxy.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/RequestHandlerF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/CommunicatorF.h ../../include/Ice/InstanceF.h ../Ice/TransceiverF.h ../../include/Ice/ServantManagerF.h ../../include/Ice/LoggerF.h ../Ice/TraceLevelsF.h ../Ice/EventHandler.h ../Ice/EventHandlerF.h ../Ice/ThreadPoolF.h ../../include/Ice/BasicStream.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/Ice/StringConverter.h ../../include/IceUtil/Unicode.h ../Ice/SelectorThread.h ../../include/IceUtil/Timer.h ../Ice/SelectorThreadF.h ../Ice/Selector.h ../Ice/ConnectorF.h ../Ice/AcceptorF.h ../Ice/RouterInfoF.h ../Ice/EndpointI.h ../Ice/Instance.h ../../include/IceUtil/RecMutex.h ../../include/Ice/StatsF.h ../Ice/DefaultsAndOverridesF.h ../Ice/LocatorInfoF.h ../Ice/ReferenceFactoryF.h ../../include/Ice/ConnectionMonitorF.h ../Ice/ObjectFactoryManagerF.h ../../include/Ice/ObjectAdapterFactoryF.h ../Ice/EndpointFactoryManagerF.h ../../include/Ice/DynamicLibraryF.h ../../include/Ice/PluginF.h ../../include/Ice/Initialize.h ../../include/Ice/PropertiesF.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/BuiltinSequences.h ../Ice/SharedContext.h ../Ice/ImplicitContextI.h ../../include/Ice/ImplicitContext.h ../../include/Ice/LocalException.h ../../include/Ice/FacetMap.h ../../include/Ice/Process.h ../../include/Ice/Outgoing.h ../../include/Ice/OutgoingAsync.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/Direct.h ../../include/Ice/LoggerUtil.h ../Ice/TraceLevels.h ../Ice/DefaultsAndOverrides.h ../../include/Ice/Properties.h ../Ice/Transceiver.h ../Ice/Connector.h ../Ice/Acceptor.h ../Ice/ThreadPool.h ../Ice/ObjectAdapterI.h ../../include/Ice/ObjectAdapter.h ../../include/Ice/RouterF.h ../../include/Ice/LocatorF.h ../Ice/Reference.h ../Ice/RouterInfo.h ../../include/Ice/Functional.h ../../include/IceUtil/Functional.h ../../include/IceUtil/Random.h
+ConnectionI$(OBJEXT): ConnectionI.cpp ../../include/IceUtil/DisableWarnings.h ../Ice/ConnectionI.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Config.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/IceUtil/Thread.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Handle.h ../../include/Ice/Connection.h ../../include/Ice/LocalObjectF.h ../../include/Ice/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/Proxy.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/RequestHandlerF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/CommunicatorF.h ../../include/Ice/ConnectionFactoryF.h ../../include/Ice/InstanceF.h ../Ice/TransceiverF.h ../../include/Ice/ServantManagerF.h ../../include/Ice/LoggerF.h ../Ice/TraceLevelsF.h ../Ice/EventHandler.h ../Ice/EventHandlerF.h ../Ice/ThreadPoolF.h ../../include/Ice/BasicStream.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/Ice/StringConverter.h ../../include/IceUtil/Unicode.h ../Ice/SelectorThread.h ../../include/IceUtil/Timer.h ../Ice/SelectorThreadF.h ../Ice/Selector.h ../Ice/Instance.h ../../include/IceUtil/RecMutex.h ../../include/Ice/StatsF.h ../Ice/DefaultsAndOverridesF.h ../Ice/RouterInfoF.h ../Ice/LocatorInfoF.h ../Ice/ReferenceFactoryF.h ../../include/Ice/ConnectionMonitorF.h ../Ice/ObjectFactoryManagerF.h ../../include/Ice/ObjectAdapterFactoryF.h ../Ice/EndpointFactoryManagerF.h ../../include/Ice/DynamicLibraryF.h ../../include/Ice/PluginF.h ../../include/Ice/Initialize.h ../../include/Ice/PropertiesF.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/BuiltinSequences.h ../Ice/SharedContext.h ../Ice/ImplicitContextI.h ../../include/Ice/ImplicitContext.h ../../include/Ice/LocalException.h ../../include/Ice/FacetMap.h ../../include/Ice/Process.h ../../include/Ice/Outgoing.h ../../include/Ice/OutgoingAsync.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/Direct.h ../../include/Ice/LoggerUtil.h ../../include/Ice/Properties.h ../Ice/TraceUtil.h ../Ice/DefaultsAndOverrides.h ../Ice/Transceiver.h ../Ice/ThreadPool.h ../Ice/ConnectionMonitor.h ../Ice/ObjectAdapterI.h ../../include/Ice/ObjectAdapter.h ../../include/Ice/RouterF.h ../../include/Ice/LocatorF.h ../Ice/ConnectorF.h ../Ice/EndpointI.h ../Ice/AcceptorF.h ../Ice/ReferenceFactory.h ../Ice/Reference.h ../Ice/ProxyFactory.h
+ConnectionMonitor$(OBJEXT): ConnectionMonitor.cpp ../Ice/ConnectionMonitor.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Config.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/IceUtil/Timer.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Thread.h ../../include/IceUtil/Handle.h ../../include/Ice/ConnectionMonitorF.h ../../include/Ice/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ConnectionIF.h ../../include/Ice/LocalObject.h ../../include/Ice/LocalObjectF.h ../../include/Ice/InstanceF.h ../Ice/ConnectionI.h ../../include/Ice/Connection.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/Proxy.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/RequestHandlerF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/CommunicatorF.h ../../include/Ice/ConnectionFactoryF.h ../Ice/TransceiverF.h ../../include/Ice/ServantManagerF.h ../../include/Ice/LoggerF.h ../Ice/TraceLevelsF.h ../Ice/EventHandler.h ../Ice/EventHandlerF.h ../Ice/ThreadPoolF.h ../../include/Ice/BasicStream.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/Ice/StringConverter.h ../../include/IceUtil/Unicode.h ../Ice/SelectorThread.h ../Ice/SelectorThreadF.h ../Ice/Selector.h ../../include/Ice/LocalException.h ../../include/Ice/BuiltinSequences.h ../../include/Ice/LoggerUtil.h ../Ice/Instance.h ../../include/IceUtil/RecMutex.h ../../include/Ice/StatsF.h ../Ice/DefaultsAndOverridesF.h ../Ice/RouterInfoF.h ../Ice/LocatorInfoF.h ../Ice/ReferenceFactoryF.h ../Ice/ObjectFactoryManagerF.h ../../include/Ice/ObjectAdapterFactoryF.h ../Ice/EndpointFactoryManagerF.h ../../include/Ice/DynamicLibraryF.h ../../include/Ice/PluginF.h ../../include/Ice/Initialize.h ../../include/Ice/PropertiesF.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../Ice/SharedContext.h ../Ice/ImplicitContextI.h ../../include/Ice/ImplicitContext.h ../../include/Ice/FacetMap.h ../../include/Ice/Process.h ../../include/Ice/Outgoing.h ../../include/Ice/OutgoingAsync.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/Direct.h
+Connection$(OBJEXT): Connection.cpp ../../include/Ice/Connection.h ../../include/Ice/LocalObjectF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/Proxy.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/RequestHandlerF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/CommunicatorF.h ../../include/Ice/BasicStream.h ../../include/Ice/InstanceF.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/Ice/StringConverter.h ../../include/IceUtil/Unicode.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/IceUtil/Iterator.h ../../include/IceUtil/ScopedArray.h ../../include/IceUtil/DisableWarnings.h
+ConnectionRequestHandler$(OBJEXT): ConnectionRequestHandler.cpp ../Ice/ConnectionRequestHandler.h ../Ice/RequestHandler.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/Ice/RequestHandlerF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/LocalObject.h ../../include/Ice/LocalObjectF.h ../../include/Ice/ProxyF.h ../../include/Ice/Proxy.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/CommunicatorF.h ../Ice/Reference.h ../../include/IceUtil/RecMutex.h ../Ice/ReferenceFactoryF.h ../../include/Ice/InstanceF.h ../../include/Ice/RouterF.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/LocatorF.h ../Ice/RouterInfoF.h ../Ice/LocatorInfoF.h ../Ice/SharedContext.h ../Ice/ConnectionI.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/IceUtil/Thread.h ../../include/Ice/Connection.h ../../include/Ice/ConnectionFactoryF.h ../Ice/TransceiverF.h ../../include/Ice/ServantManagerF.h ../../include/Ice/LoggerF.h ../Ice/TraceLevelsF.h ../Ice/EventHandler.h ../Ice/EventHandlerF.h ../Ice/ThreadPoolF.h ../../include/Ice/BasicStream.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/Ice/StringConverter.h ../../include/IceUtil/Unicode.h ../Ice/SelectorThread.h ../../include/IceUtil/Timer.h ../Ice/SelectorThreadF.h ../Ice/Selector.h ../Ice/RouterInfo.h ../../include/Ice/BuiltinSequences.h ../../include/Ice/Outgoing.h ../../include/Ice/OutgoingAsync.h
+Connector$(OBJEXT): Connector.cpp ../Ice/Connector.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../Ice/ConnectorF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../Ice/TransceiverF.h
+Current$(OBJEXT): Current.cpp ../../include/Ice/Current.h ../../include/Ice/LocalObjectF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/BasicStream.h ../../include/Ice/InstanceF.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/Ice/StringConverter.h ../../include/IceUtil/Unicode.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/StreamF.h ../../include/IceUtil/Iterator.h ../../include/IceUtil/ScopedArray.h ../../include/IceUtil/DisableWarnings.h
+DefaultsAndOverrides$(OBJEXT): DefaultsAndOverrides.cpp ../Ice/DefaultsAndOverrides.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../Ice/DefaultsAndOverridesF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/PropertiesF.h ../../include/Ice/LocalObjectF.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/Proxy.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/RequestHandlerF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/CommunicatorF.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/Properties.h ../../include/Ice/Outgoing.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/Ice/InstanceF.h ../../include/Ice/BasicStream.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/Ice/StringConverter.h ../../include/IceUtil/Unicode.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/ServantManagerF.h ../../include/Ice/Direct.h ../../include/Ice/BuiltinSequences.h ../Ice/Network.h ../../include/Ice/LoggerF.h ../../include/Ice/LocalException.h
+Direct$(OBJEXT): Direct.cpp ../../include/Ice/Direct.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/LocalObjectF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/ReferenceF.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../Ice/ObjectAdapterI.h ../../include/IceUtil/RecMutex.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/Ice/ObjectAdapter.h ../../include/Ice/Proxy.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/RequestHandlerF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/CommunicatorF.h ../../include/Ice/RouterF.h ../../include/Ice/LocatorF.h ../../include/Ice/FacetMap.h ../../include/Ice/InstanceF.h ../../include/Ice/ObjectAdapterFactoryF.h ../../include/Ice/ConnectionFactoryF.h ../../include/Ice/ServantManagerF.h ../Ice/RouterInfoF.h ../Ice/ConnectorF.h ../Ice/LocatorInfoF.h ../Ice/ThreadPoolF.h ../../include/Ice/BuiltinSequences.h ../Ice/ServantManager.h ../../include/Ice/ServantLocator.h ../Ice/Reference.h ../Ice/ReferenceFactoryF.h ../Ice/SharedContext.h ../../include/Ice/LocalException.h
+DispatchInterceptor$(OBJEXT): DispatchInterceptor.cpp ../../include/Ice/DispatchInterceptor.h ../../include/Ice/Object.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Config.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/IceUtil/Shared.h ../../include/Ice/GCShared.h ../../include/Ice/Config.h ../../include/Ice/GCCountMap.h ../../include/Ice/ObjectF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/LocalObjectF.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../Ice/IncomingRequest.h ../../include/Ice/Incoming.h ../../include/Ice/InstanceF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/ServantManagerF.h ../../include/Ice/BasicStream.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/Ice/StringConverter.h ../../include/IceUtil/Unicode.h ../../include/Ice/Direct.h ../../include/Ice/ReferenceF.h ../../include/Ice/LocalException.h ../../include/Ice/Proxy.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/RequestHandlerF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/CommunicatorF.h ../../include/Ice/BuiltinSequences.h
+DynamicLibrary$(OBJEXT): DynamicLibrary.cpp ../../include/Ice/DynamicLibrary.h ../../include/Ice/DynamicLibraryF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h
+EndpointFactoryManager$(OBJEXT): EndpointFactoryManager.cpp ../Ice/EndpointFactoryManager.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/Ice/InstanceF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/EndpointIF.h ../../include/Ice/LocalObject.h ../../include/Ice/LocalObjectF.h ../../include/Ice/EndpointFactoryF.h ../Ice/EndpointFactoryManagerF.h ../../include/Ice/Endpoint.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/UndefSysMacros.h ../Ice/UnknownEndpointI.h ../Ice/EndpointI.h ../../include/IceUtil/Thread.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../Ice/TransceiverF.h ../Ice/ConnectorF.h ../Ice/AcceptorF.h ../../include/Ice/EndpointFactory.h ../../include/Ice/BasicStream.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/Ice/StringConverter.h ../../include/IceUtil/Unicode.h ../../include/Ice/LocalException.h ../../include/Ice/Proxy.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/RequestHandlerF.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/CommunicatorF.h ../../include/Ice/BuiltinSequences.h ../Ice/Instance.h ../../include/IceUtil/RecMutex.h ../../include/IceUtil/Timer.h ../../include/Ice/StatsF.h ../Ice/TraceLevelsF.h ../Ice/DefaultsAndOverridesF.h ../Ice/RouterInfoF.h ../Ice/LocatorInfoF.h ../Ice/ReferenceFactoryF.h ../Ice/ThreadPoolF.h ../Ice/SelectorThreadF.h ../../include/Ice/ConnectionFactoryF.h ../../include/Ice/ConnectionMonitorF.h ../Ice/ObjectFactoryManagerF.h ../../include/Ice/ObjectAdapterFactoryF.h ../../include/Ice/DynamicLibraryF.h ../../include/Ice/PluginF.h ../../include/Ice/Initialize.h ../../include/Ice/PropertiesF.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/LoggerF.h ../Ice/SharedContext.h ../Ice/ImplicitContextI.h ../../include/Ice/ImplicitContext.h ../../include/Ice/FacetMap.h ../../include/Ice/Process.h ../../include/Ice/Outgoing.h ../../include/Ice/OutgoingAsync.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/ServantManagerF.h ../../include/Ice/Direct.h ../../include/Ice/Properties.h ../Ice/DefaultsAndOverrides.h
+EndpointFactory$(OBJEXT): EndpointFactory.cpp ../../include/Ice/EndpointFactory.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/Ice/EndpointIF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/LocalObject.h ../../include/Ice/LocalObjectF.h ../../include/Ice/EndpointFactoryF.h
+Endpoint$(OBJEXT): Endpoint.cpp ../../include/Ice/Endpoint.h ../../include/Ice/LocalObjectF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/BasicStream.h ../../include/Ice/InstanceF.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/Ice/StringConverter.h ../../include/IceUtil/Unicode.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/IceUtil/Iterator.h ../../include/IceUtil/ScopedArray.h ../../include/IceUtil/DisableWarnings.h
+EndpointI$(OBJEXT): EndpointI.cpp ../Ice/EndpointI.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/IceUtil/Thread.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/Ice/Endpoint.h ../../include/Ice/LocalObjectF.h ../../include/Ice/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/EndpointIF.h ../../include/Ice/InstanceF.h ../Ice/TransceiverF.h ../Ice/ConnectorF.h ../Ice/AcceptorF.h ../Ice/Instance.h ../../include/IceUtil/RecMutex.h ../../include/IceUtil/Timer.h ../../include/Ice/CommunicatorF.h ../../include/Ice/StatsF.h ../Ice/TraceLevelsF.h ../Ice/DefaultsAndOverridesF.h ../Ice/RouterInfoF.h ../Ice/LocatorInfoF.h ../Ice/ReferenceFactoryF.h ../../include/Ice/ProxyFactoryF.h ../Ice/ThreadPoolF.h ../Ice/SelectorThreadF.h ../../include/Ice/ConnectionFactoryF.h ../../include/Ice/ConnectionMonitorF.h ../Ice/ObjectFactoryManagerF.h ../../include/Ice/ObjectAdapterFactoryF.h ../Ice/EndpointFactoryManagerF.h ../../include/Ice/DynamicLibraryF.h ../../include/Ice/PluginF.h ../../include/Ice/Initialize.h ../../include/Ice/PropertiesF.h ../../include/Ice/Proxy.h ../../include/Ice/ConnectionIF.h ../../include/Ice/RequestHandlerF.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/LoggerF.h ../../include/Ice/StringConverter.h ../../include/Ice/BuiltinSequences.h ../Ice/SharedContext.h ../Ice/ImplicitContextI.h ../../include/Ice/ImplicitContext.h ../../include/Ice/LocalException.h ../../include/Ice/FacetMap.h ../../include/Ice/Process.h ../../include/Ice/Outgoing.h ../../include/Ice/BasicStream.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/IceUtil/Unicode.h ../../include/Ice/OutgoingAsync.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/ServantManagerF.h ../../include/Ice/Direct.h ../Ice/Network.h
+EventHandler$(OBJEXT): EventHandler.cpp ../Ice/EventHandler.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../Ice/EventHandlerF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/InstanceF.h ../Ice/ThreadPoolF.h ../../include/Ice/BasicStream.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/LocalObjectF.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/Ice/StringConverter.h ../../include/IceUtil/Unicode.h ../Ice/Instance.h ../../include/IceUtil/RecMutex.h ../../include/IceUtil/Timer.h ../../include/IceUtil/Thread.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/Ice/CommunicatorF.h ../../include/Ice/StatsF.h ../Ice/TraceLevelsF.h ../Ice/DefaultsAndOverridesF.h ../Ice/RouterInfoF.h ../Ice/LocatorInfoF.h ../Ice/ReferenceFactoryF.h ../../include/Ice/ProxyFactoryF.h ../Ice/SelectorThreadF.h ../../include/Ice/ConnectionFactoryF.h ../../include/Ice/ConnectionMonitorF.h ../Ice/ObjectFactoryManagerF.h ../../include/Ice/ObjectAdapterFactoryF.h ../Ice/EndpointFactoryManagerF.h ../../include/Ice/DynamicLibraryF.h ../../include/Ice/PluginF.h ../../include/Ice/Initialize.h ../../include/Ice/PropertiesF.h ../../include/Ice/Proxy.h ../../include/Ice/ConnectionIF.h ../../include/Ice/RequestHandlerF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/LoggerF.h ../../include/Ice/BuiltinSequences.h ../Ice/SharedContext.h ../Ice/ImplicitContextI.h ../../include/Ice/ImplicitContext.h ../../include/Ice/LocalException.h ../../include/Ice/FacetMap.h ../../include/Ice/Process.h ../../include/Ice/Outgoing.h ../../include/Ice/OutgoingAsync.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/ServantManagerF.h ../../include/Ice/Direct.h
+Exception$(OBJEXT): Exception.cpp ../../include/Ice/Exception.h ../../include/IceUtil/Exception.h ../../include/IceUtil/Config.h ../../include/Ice/Config.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/ProxyHandle.h ../../include/Ice/LocalException.h ../../include/Ice/LocalObjectF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/LocalObject.h ../../include/Ice/Proxy.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/RequestHandlerF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/CommunicatorF.h ../../include/Ice/BuiltinSequences.h ../Ice/Network.h ../../include/Ice/PropertiesF.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/LoggerF.h ../../include/Ice/Plugin.h ../../include/IceUtil/StringUtil.h
+FacetMap$(OBJEXT): FacetMap.cpp ../../include/Ice/FacetMap.h ../../include/Ice/LocalObjectF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/BasicStream.h ../../include/Ice/InstanceF.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/Ice/StringConverter.h ../../include/IceUtil/Unicode.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/IceUtil/Iterator.h ../../include/IceUtil/ScopedArray.h ../../include/IceUtil/DisableWarnings.h
FactoryTableDef$(OBJEXT): FactoryTableDef.cpp ../../include/Ice/FactoryTableDef.h ../../include/IceUtil/StaticMutex.h ../../include/IceUtil/Config.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/IceUtil/Mutex.h ../../include/Ice/UserExceptionFactoryF.h ../../include/IceUtil/Handle.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/LocalObjectF.h ../../include/IceUtil/Shared.h ../../include/Ice/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/UserExceptionFactory.h
FactoryTable$(OBJEXT): FactoryTable.cpp ../../include/Ice/FactoryTable.h ../../include/Ice/FactoryTableDef.h ../../include/IceUtil/StaticMutex.h ../../include/IceUtil/Config.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/IceUtil/Mutex.h ../../include/Ice/UserExceptionFactoryF.h ../../include/IceUtil/Handle.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/LocalObjectF.h ../../include/IceUtil/Shared.h ../../include/Ice/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/UserExceptionFactory.h
-GC$(OBJEXT): GC.cpp ../../include/IceUtil/Time.h ../../include/IceUtil/Config.h ../../include/IceUtil/StaticMutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/IceUtil/RecMutex.h ../Ice/GC.h ../../include/Ice/Config.h ../../include/IceUtil/Thread.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/Ice/GCShared.h ../../include/Ice/GCCountMap.h
-Identity$(OBJEXT): Identity.cpp ../../include/Ice/Identity.h ../../include/Ice/LocalObjectF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/BasicStream.h ../../include/Ice/InstanceF.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/Ice/StringConverter.h ../../include/IceUtil/Unicode.h ../../include/Ice/Object.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ConnectionF.h ../../include/Ice/StreamF.h ../../include/IceUtil/Iterator.h ../../include/IceUtil/ScopedArray.h ../../include/IceUtil/DisableWarnings.h
-IdentityUtil$(OBJEXT): IdentityUtil.cpp ../../include/Ice/IdentityUtil.h ../../include/Ice/Identity.h ../../include/Ice/LocalObjectF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/LocalException.h ../../include/Ice/Proxy.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/StreamF.h ../../include/Ice/CommunicatorF.h ../../include/Ice/BuiltinSequences.h ../../include/IceUtil/StringUtil.h
-ImplicitContextI$(OBJEXT): ImplicitContextI.cpp ../Ice/ImplicitContextI.h ../../include/Ice/ImplicitContext.h ../../include/Ice/LocalObjectF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/Proxy.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/CommunicatorF.h ../../include/Ice/LocalException.h ../../include/Ice/BuiltinSequences.h ../../include/IceUtil/StaticMutex.h
-ImplicitContext$(OBJEXT): ImplicitContext.cpp ../../include/Ice/ImplicitContext.h ../../include/Ice/LocalObjectF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/Proxy.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/CommunicatorF.h ../../include/Ice/LocalException.h ../../include/Ice/BuiltinSequences.h ../../include/Ice/BasicStream.h ../../include/Ice/InstanceF.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/Ice/StringConverter.h ../../include/IceUtil/Unicode.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/IceUtil/Iterator.h ../../include/IceUtil/ScopedArray.h ../../include/IceUtil/DisableWarnings.h
-IncomingAsync$(OBJEXT): IncomingAsync.cpp ../../include/Ice/IncomingAsync.h ../../include/Ice/IncomingAsyncF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/Incoming.h ../../include/Ice/InstanceF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/LocalObject.h ../../include/Ice/LocalObjectF.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/ServantManagerF.h ../../include/Ice/BasicStream.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/Ice/StringConverter.h ../../include/IceUtil/Unicode.h ../../include/Ice/Object.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/Ice/Current.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/ServantLocator.h ../Ice/ConnectionI.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/IceUtil/Thread.h ../../include/Ice/Connection.h ../../include/Ice/Proxy.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/CommunicatorF.h ../../include/Ice/ConnectionFactoryF.h ../Ice/TransceiverF.h ../../include/Ice/LoggerF.h ../Ice/TraceLevelsF.h ../Ice/EventHandler.h ../Ice/EventHandlerF.h ../Ice/ThreadPoolF.h ../../include/Ice/LocalException.h ../../include/Ice/BuiltinSequences.h ../Ice/Instance.h ../../include/IceUtil/RecMutex.h ../../include/IceUtil/Timer.h ../../include/Ice/StatsF.h ../Ice/DefaultsAndOverridesF.h ../Ice/RouterInfoF.h ../Ice/LocatorInfoF.h ../Ice/ReferenceFactoryF.h ../../include/Ice/ConnectionMonitorF.h ../Ice/ObjectFactoryManagerF.h ../../include/Ice/ObjectAdapterFactoryF.h ../Ice/EndpointFactoryManagerF.h ../../include/Ice/DynamicLibraryF.h ../../include/Ice/PluginF.h ../../include/Ice/Initialize.h ../../include/Ice/PropertiesF.h ../Ice/SharedContext.h ../Ice/ImplicitContextI.h ../../include/Ice/ImplicitContext.h ../../include/Ice/FacetMap.h ../../include/Ice/Process.h ../../include/Ice/Outgoing.h ../../include/Ice/OutgoingAsync.h ../../include/Ice/Direct.h ../../include/Ice/Properties.h ../Ice/ReplyStatus.h ../../include/IceUtil/StaticMutex.h
-Incoming$(OBJEXT): Incoming.cpp ../../include/Ice/Incoming.h ../../include/Ice/InstanceF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ConnectionIF.h ../../include/Ice/LocalObject.h ../../include/Ice/LocalObjectF.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/ServantManagerF.h ../../include/Ice/BasicStream.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/Ice/StringConverter.h ../../include/IceUtil/Unicode.h ../../include/Ice/Object.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/IncomingAsync.h ../Ice/IncomingRequest.h ../../include/Ice/ObjectAdapter.h ../../include/Ice/Proxy.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/CommunicatorF.h ../../include/Ice/RouterF.h ../../include/Ice/LocatorF.h ../../include/Ice/FacetMap.h ../../include/Ice/ServantLocator.h ../Ice/ServantManager.h ../Ice/ConnectionI.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/IceUtil/Thread.h ../../include/Ice/Connection.h ../../include/Ice/ConnectionFactoryF.h ../Ice/TransceiverF.h ../../include/Ice/LoggerF.h ../Ice/TraceLevelsF.h ../Ice/EventHandler.h ../Ice/EventHandlerF.h ../Ice/ThreadPoolF.h ../../include/Ice/LocalException.h ../../include/Ice/BuiltinSequences.h ../Ice/Instance.h ../../include/IceUtil/RecMutex.h ../../include/IceUtil/Timer.h ../../include/Ice/StatsF.h ../Ice/DefaultsAndOverridesF.h ../Ice/RouterInfoF.h ../Ice/LocatorInfoF.h ../Ice/ReferenceFactoryF.h ../../include/Ice/ConnectionMonitorF.h ../Ice/ObjectFactoryManagerF.h ../../include/Ice/ObjectAdapterFactoryF.h ../Ice/EndpointFactoryManagerF.h ../../include/Ice/DynamicLibraryF.h ../../include/Ice/PluginF.h ../../include/Ice/Initialize.h ../../include/Ice/PropertiesF.h ../Ice/SharedContext.h ../Ice/ImplicitContextI.h ../../include/Ice/ImplicitContext.h ../../include/Ice/Process.h ../../include/Ice/Outgoing.h ../../include/Ice/OutgoingAsync.h ../../include/Ice/Direct.h ../../include/Ice/Properties.h ../../include/Ice/LoggerUtil.h ../Ice/ReplyStatus.h ../../include/IceUtil/StringUtil.h
-Initialize$(OBJEXT): Initialize.cpp ../../include/IceUtil/DisableWarnings.h ../../include/IceUtil/ArgVector.h ../../include/IceUtil/Config.h ../Ice/GC.h ../../include/Ice/Config.h ../../include/IceUtil/Thread.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../Ice/CommunicatorI.h ../../include/IceUtil/RecMutex.h ../../include/IceUtil/StaticMutex.h ../../include/Ice/DynamicLibraryF.h ../../include/Ice/Handle.h ../../include/Ice/ProxyHandle.h ../../include/Ice/Initialize.h ../../include/Ice/CommunicatorF.h ../../include/Ice/LocalObjectF.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/PropertiesF.h ../../include/Ice/Proxy.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/InstanceF.h ../../include/Ice/LoggerF.h ../../include/Ice/StatsF.h ../../include/Ice/StringConverter.h ../../include/Ice/BuiltinSequences.h ../../include/Ice/Communicator.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/RouterF.h ../../include/Ice/LocatorF.h ../../include/Ice/PluginF.h ../../include/Ice/ImplicitContextF.h ../Ice/PropertiesI.h ../../include/Ice/Properties.h ../../include/Ice/Outgoing.h ../../include/Ice/BasicStream.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/IceUtil/Unicode.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/ServantManagerF.h ../../include/Ice/Direct.h ../../include/Ice/LocalException.h ../Ice/StreamI.h ../../include/Ice/Stream.h ../Ice/LoggerI.h ../../include/Ice/Logger.h
-Instance$(OBJEXT): Instance.cpp ../../include/IceUtil/DisableWarnings.h ../Ice/Instance.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/IceUtil/RecMutex.h ../../include/IceUtil/Timer.h ../../include/IceUtil/Thread.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/Ice/InstanceF.h ../../include/Ice/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/CommunicatorF.h ../../include/Ice/LocalObjectF.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/StatsF.h ../Ice/TraceLevelsF.h ../Ice/DefaultsAndOverridesF.h ../Ice/RouterInfoF.h ../Ice/LocatorInfoF.h ../Ice/ReferenceFactoryF.h ../../include/Ice/ProxyFactoryF.h ../Ice/ThreadPoolF.h ../../include/Ice/ConnectionFactoryF.h ../../include/Ice/ConnectionMonitorF.h ../Ice/ObjectFactoryManagerF.h ../../include/Ice/ObjectAdapterFactoryF.h ../Ice/EndpointFactoryManagerF.h ../../include/Ice/DynamicLibraryF.h ../../include/Ice/PluginF.h ../../include/Ice/Initialize.h ../../include/Ice/PropertiesF.h ../../include/Ice/Proxy.h ../../include/Ice/ConnectionIF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/LoggerF.h ../../include/Ice/StringConverter.h ../../include/Ice/BuiltinSequences.h ../Ice/SharedContext.h ../Ice/ImplicitContextI.h ../../include/Ice/ImplicitContext.h ../../include/Ice/LocalException.h ../../include/Ice/FacetMap.h ../../include/Ice/Process.h ../../include/Ice/Outgoing.h ../../include/Ice/BasicStream.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/IceUtil/Unicode.h ../../include/Ice/OutgoingAsync.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/ServantManagerF.h ../../include/Ice/Direct.h ../Ice/TraceLevels.h ../Ice/DefaultsAndOverrides.h ../Ice/RouterInfo.h ../../include/Ice/RouterF.h ../../include/Ice/Router.h ../Ice/LocatorInfo.h ../../include/Ice/LocatorF.h ../../include/Ice/Locator.h ../../include/Ice/IncomingAsync.h ../../include/Ice/UserExceptionFactory.h ../../include/Ice/FactoryTable.h ../../include/Ice/FactoryTableDef.h ../../include/IceUtil/StaticMutex.h ../../include/Ice/UserExceptionFactoryF.h ../../include/Ice/ProcessF.h ../Ice/ReferenceFactory.h ../Ice/Reference.h ../Ice/ProxyFactory.h ../Ice/ThreadPool.h ../Ice/EventHandlerF.h ../Ice/ConnectionFactory.h ../Ice/ConnectorF.h ../Ice/AcceptorF.h ../Ice/TransceiverF.h ../Ice/EventHandler.h ../Ice/ConnectionMonitor.h ../Ice/ObjectFactoryManager.h ../Ice/ObjectAdapterFactory.h ../Ice/ObjectAdapterI.h ../../include/Ice/ObjectAdapter.h ../Ice/PropertiesI.h ../../include/Ice/Properties.h ../Ice/LoggerI.h ../../include/Ice/Logger.h ../Ice/Network.h ../Ice/EndpointFactoryManager.h ../../include/Ice/EndpointFactoryF.h ../Ice/TcpEndpointI.h ../Ice/EndpointI.h ../../include/Ice/EndpointFactory.h ../Ice/UdpEndpointI.h ../../include/Ice/DynamicLibrary.h ../Ice/PluginManagerI.h ../../include/Ice/Plugin.h ../../include/Ice/LoggerUtil.h ../../include/IceUtil/StringUtil.h ../../include/IceUtil/UUID.h ../../include/Ice/Communicator.h ../../include/Ice/ImplicitContextF.h ../Ice/SysLoggerI.h
-LocalException$(OBJEXT): LocalException.cpp ../../include/Ice/LocalException.h ../../include/Ice/LocalObjectF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/Proxy.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/CommunicatorF.h ../../include/Ice/BuiltinSequences.h ../../include/Ice/BasicStream.h ../../include/Ice/InstanceF.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/Ice/StringConverter.h ../../include/IceUtil/Unicode.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/IceUtil/Iterator.h ../../include/IceUtil/ScopedArray.h ../../include/IceUtil/DisableWarnings.h
-LocalObject$(OBJEXT): LocalObject.cpp ../../include/Ice/LocalObject.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/Ice/LocalObjectF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h
-LocatorInfo$(OBJEXT): LocatorInfo.cpp ../Ice/LocatorInfo.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/IceUtil/Time.h ../Ice/LocatorInfoF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/LocatorF.h ../../include/Ice/LocalObjectF.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/Proxy.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/CommunicatorF.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/Locator.h ../../include/Ice/Outgoing.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/Ice/BasicStream.h ../../include/Ice/InstanceF.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/Ice/StringConverter.h ../../include/IceUtil/Unicode.h ../../include/Ice/OutgoingAsync.h ../../include/IceUtil/RecMutex.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/ServantManagerF.h ../../include/Ice/IncomingAsync.h ../../include/Ice/Direct.h ../../include/Ice/UserExceptionFactory.h ../../include/Ice/FactoryTable.h ../../include/Ice/FactoryTableDef.h ../../include/IceUtil/StaticMutex.h ../../include/Ice/UserExceptionFactoryF.h ../../include/Ice/ProcessF.h ../../include/Ice/LocalException.h ../../include/Ice/BuiltinSequences.h ../Ice/Instance.h ../../include/IceUtil/Timer.h ../../include/IceUtil/Thread.h ../../include/Ice/StatsF.h ../Ice/TraceLevelsF.h ../Ice/DefaultsAndOverridesF.h ../Ice/RouterInfoF.h ../Ice/ReferenceFactoryF.h ../Ice/ThreadPoolF.h ../../include/Ice/ConnectionFactoryF.h ../../include/Ice/ConnectionMonitorF.h ../Ice/ObjectFactoryManagerF.h ../../include/Ice/ObjectAdapterFactoryF.h ../Ice/EndpointFactoryManagerF.h ../../include/Ice/DynamicLibraryF.h ../../include/Ice/PluginF.h ../../include/Ice/Initialize.h ../../include/Ice/PropertiesF.h ../../include/Ice/LoggerF.h ../Ice/SharedContext.h ../Ice/ImplicitContextI.h ../../include/Ice/ImplicitContext.h ../../include/Ice/FacetMap.h ../../include/Ice/Process.h ../Ice/TraceLevels.h ../../include/Ice/LoggerUtil.h ../Ice/EndpointI.h ../Ice/TransceiverF.h ../Ice/ConnectorF.h ../Ice/AcceptorF.h ../Ice/Reference.h ../../include/Ice/RouterF.h ../../include/Ice/Functional.h ../../include/IceUtil/Functional.h
-Locator$(OBJEXT): Locator.cpp ../../include/Ice/Locator.h ../../include/Ice/LocalObjectF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/Proxy.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/CommunicatorF.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/Outgoing.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/Ice/BasicStream.h ../../include/Ice/InstanceF.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/Ice/StringConverter.h ../../include/IceUtil/Unicode.h ../../include/Ice/OutgoingAsync.h ../../include/IceUtil/RecMutex.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/ServantManagerF.h ../../include/Ice/IncomingAsync.h ../../include/Ice/Direct.h ../../include/Ice/UserExceptionFactory.h ../../include/Ice/FactoryTable.h ../../include/Ice/FactoryTableDef.h ../../include/IceUtil/StaticMutex.h ../../include/Ice/UserExceptionFactoryF.h ../../include/Ice/ProcessF.h ../../include/Ice/LocalException.h ../../include/Ice/BuiltinSequences.h ../../include/Ice/ObjectFactory.h ../../include/IceUtil/Iterator.h ../../include/IceUtil/ScopedArray.h ../../include/IceUtil/DisableWarnings.h
-LoggerI$(OBJEXT): LoggerI.cpp ../../include/IceUtil/Time.h ../../include/IceUtil/Config.h ../Ice/LoggerI.h ../../include/Ice/Logger.h ../../include/Ice/LocalObjectF.h ../../include/IceUtil/Shared.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/UndefSysMacros.h ../../include/IceUtil/StaticMutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h
-Logger$(OBJEXT): Logger.cpp ../../include/Ice/Logger.h ../../include/Ice/LocalObjectF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/UndefSysMacros.h ../../include/IceUtil/Iterator.h ../../include/IceUtil/ScopedArray.h ../../include/IceUtil/DisableWarnings.h
-LoggerUtil$(OBJEXT): LoggerUtil.cpp ../../include/Ice/LoggerUtil.h ../../include/Ice/LoggerF.h ../../include/Ice/LocalObjectF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/Logger.h
-Network$(OBJEXT): Network.cpp ../../include/IceUtil/StaticMutex.h ../../include/IceUtil/Config.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../Ice/Network.h ../../include/Ice/Config.h ../../include/Ice/PropertiesF.h ../../include/Ice/LocalObjectF.h ../../include/IceUtil/Shared.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/Proxy.h ../../include/IceUtil/Mutex.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/CommunicatorF.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/LoggerF.h ../../include/Ice/LocalException.h ../../include/Ice/BuiltinSequences.h ../../include/Ice/Properties.h ../../include/Ice/Outgoing.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/Ice/BasicStream.h ../../include/Ice/InstanceF.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/Ice/StringConverter.h ../../include/IceUtil/Unicode.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/ServantManagerF.h ../../include/Ice/Direct.h ../../include/Ice/LoggerUtil.h
-ObjectAdapterFactory$(OBJEXT): ObjectAdapterFactory.cpp ../Ice/ObjectAdapterFactory.h ../Ice/ObjectAdapterI.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/IceUtil/RecMutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/Ice/ObjectAdapter.h ../../include/Ice/LocalObjectF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/Proxy.h ../../include/IceUtil/Mutex.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/CommunicatorF.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/RouterF.h ../../include/Ice/LocatorF.h ../../include/Ice/FacetMap.h ../../include/Ice/InstanceF.h ../../include/Ice/ObjectAdapterFactoryF.h ../../include/Ice/ConnectionFactoryF.h ../../include/Ice/ServantManagerF.h ../Ice/RouterInfoF.h ../Ice/ConnectorF.h ../Ice/LocatorInfoF.h ../Ice/ThreadPoolF.h ../../include/Ice/BuiltinSequences.h ../../include/Ice/LocalException.h ../../include/Ice/Functional.h ../../include/IceUtil/Functional.h ../../include/IceUtil/UUID.h
-ObjectAdapterI$(OBJEXT): ObjectAdapterI.cpp ../../include/IceUtil/UUID.h ../../include/IceUtil/Config.h ../Ice/ObjectAdapterI.h ../../include/IceUtil/Shared.h ../../include/IceUtil/RecMutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/Ice/ObjectAdapter.h ../../include/Ice/LocalObjectF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/Proxy.h ../../include/IceUtil/Mutex.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/CommunicatorF.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/RouterF.h ../../include/Ice/LocatorF.h ../../include/Ice/FacetMap.h ../../include/Ice/InstanceF.h ../../include/Ice/ObjectAdapterFactoryF.h ../../include/Ice/ConnectionFactoryF.h ../../include/Ice/ServantManagerF.h ../Ice/RouterInfoF.h ../Ice/ConnectorF.h ../Ice/LocatorInfoF.h ../Ice/ThreadPoolF.h ../../include/Ice/BuiltinSequences.h ../Ice/ObjectAdapterFactory.h ../Ice/Instance.h ../../include/IceUtil/Timer.h ../../include/IceUtil/Thread.h ../../include/Ice/StatsF.h ../Ice/TraceLevelsF.h ../Ice/DefaultsAndOverridesF.h ../Ice/ReferenceFactoryF.h ../../include/Ice/ConnectionMonitorF.h ../Ice/ObjectFactoryManagerF.h ../Ice/EndpointFactoryManagerF.h ../../include/Ice/DynamicLibraryF.h ../../include/Ice/PluginF.h ../../include/Ice/Initialize.h ../../include/Ice/PropertiesF.h ../../include/Ice/LoggerF.h ../../include/Ice/StringConverter.h ../Ice/SharedContext.h ../Ice/ImplicitContextI.h ../../include/Ice/ImplicitContext.h ../../include/Ice/LocalException.h ../../include/Ice/Process.h ../../include/Ice/Outgoing.h ../../include/Ice/BasicStream.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/IceUtil/Unicode.h ../../include/Ice/OutgoingAsync.h ../../include/Ice/Incoming.h ../../include/Ice/Direct.h ../Ice/ProxyFactory.h ../Ice/ReferenceFactory.h ../Ice/Reference.h ../Ice/EndpointI.h ../Ice/TransceiverF.h ../Ice/AcceptorF.h ../Ice/EndpointFactoryManager.h ../../include/Ice/EndpointFactoryF.h ../Ice/ConnectionFactory.h ../Ice/EventHandler.h ../Ice/EventHandlerF.h ../Ice/ServantManager.h ../Ice/RouterInfo.h ../../include/Ice/Properties.h ../../include/Ice/Functional.h ../../include/IceUtil/Functional.h ../Ice/LocatorInfo.h ../../include/Ice/Locator.h ../../include/Ice/IncomingAsync.h ../../include/Ice/UserExceptionFactory.h ../../include/Ice/FactoryTable.h ../../include/Ice/FactoryTableDef.h ../../include/IceUtil/StaticMutex.h ../../include/Ice/UserExceptionFactoryF.h ../../include/Ice/ProcessF.h ../../include/Ice/LoggerUtil.h ../Ice/ThreadPool.h ../../include/Ice/Communicator.h ../../include/Ice/ImplicitContextF.h ../../include/Ice/Router.h ../Ice/DefaultsAndOverrides.h ../Ice/TraceLevels.h ../Ice/PropertyNames.h
-ObjectAdapter$(OBJEXT): ObjectAdapter.cpp ../../include/Ice/ObjectAdapter.h ../../include/Ice/LocalObjectF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/Proxy.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/CommunicatorF.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/RouterF.h ../../include/Ice/LocatorF.h ../../include/Ice/FacetMap.h ../../include/Ice/BasicStream.h ../../include/Ice/InstanceF.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/Ice/StringConverter.h ../../include/IceUtil/Unicode.h ../../include/IceUtil/Iterator.h ../../include/IceUtil/ScopedArray.h ../../include/IceUtil/DisableWarnings.h
-ObjectFactoryManager$(OBJEXT): ObjectFactoryManager.cpp ../Ice/ObjectFactoryManager.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../Ice/ObjectFactoryManagerF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/LocalObjectF.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/ObjectFactory.h ../../include/Ice/Functional.h ../../include/IceUtil/Functional.h ../../include/Ice/LocalException.h ../../include/Ice/Proxy.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/CommunicatorF.h ../../include/Ice/BuiltinSequences.h
-ObjectFactory$(OBJEXT): ObjectFactory.cpp ../../include/Ice/ObjectFactory.h ../../include/Ice/LocalObjectF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/BasicStream.h ../../include/Ice/InstanceF.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/Ice/StringConverter.h ../../include/IceUtil/Unicode.h ../../include/Ice/Object.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/IceUtil/Iterator.h ../../include/IceUtil/ScopedArray.h ../../include/IceUtil/DisableWarnings.h
-Object$(OBJEXT): Object.cpp ../../include/Ice/Object.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Config.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/IceUtil/Shared.h ../../include/Ice/GCShared.h ../../include/Ice/Config.h ../../include/Ice/GCCountMap.h ../../include/Ice/ObjectF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/LocalObjectF.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/Incoming.h ../../include/Ice/InstanceF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/ServantManagerF.h ../../include/Ice/BasicStream.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/Ice/StringConverter.h ../../include/IceUtil/Unicode.h ../../include/Ice/IncomingAsync.h ../Ice/IncomingRequest.h ../../include/Ice/Direct.h ../../include/Ice/ReferenceF.h ../../include/Ice/LocalException.h ../../include/Ice/Proxy.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/CommunicatorF.h ../../include/Ice/BuiltinSequences.h ../../include/Ice/Stream.h
-OutgoingAsync$(OBJEXT): OutgoingAsync.cpp ../../include/Ice/OutgoingAsync.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Config.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/IceUtil/RecMutex.h ../../include/Ice/OutgoingAsyncF.h ../../include/IceUtil/Shared.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ReferenceF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/LocalObject.h ../../include/Ice/LocalObjectF.h ../../include/Ice/Current.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/Object.h ../../include/IceUtil/Mutex.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/StreamF.h ../Ice/ConnectionI.h ../../include/IceUtil/Thread.h ../../include/Ice/Connection.h ../../include/Ice/Proxy.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/CommunicatorF.h ../../include/Ice/ConnectionFactoryF.h ../../include/Ice/InstanceF.h ../Ice/TransceiverF.h ../../include/Ice/ServantManagerF.h ../../include/Ice/LoggerF.h ../Ice/TraceLevelsF.h ../Ice/EventHandler.h ../Ice/EventHandlerF.h ../Ice/ThreadPoolF.h ../../include/Ice/BasicStream.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/Ice/StringConverter.h ../../include/IceUtil/Unicode.h ../Ice/Reference.h ../Ice/ReferenceFactoryF.h ../../include/Ice/RouterF.h ../../include/Ice/LocatorF.h ../Ice/RouterInfoF.h ../Ice/LocatorInfoF.h ../Ice/SharedContext.h ../Ice/Instance.h ../../include/IceUtil/Timer.h ../../include/Ice/StatsF.h ../Ice/DefaultsAndOverridesF.h ../../include/Ice/ConnectionMonitorF.h ../Ice/ObjectFactoryManagerF.h ../../include/Ice/ObjectAdapterFactoryF.h ../Ice/EndpointFactoryManagerF.h ../../include/Ice/DynamicLibraryF.h ../../include/Ice/PluginF.h ../../include/Ice/Initialize.h ../../include/Ice/PropertiesF.h ../../include/Ice/BuiltinSequences.h ../Ice/ImplicitContextI.h ../../include/Ice/ImplicitContext.h ../../include/Ice/LocalException.h ../../include/Ice/FacetMap.h ../../include/Ice/Process.h ../../include/Ice/Outgoing.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/Direct.h ../../include/Ice/Properties.h ../../include/Ice/LoggerUtil.h ../Ice/LocatorInfo.h ../Ice/ProxyFactory.h ../Ice/RouterInfo.h ../Ice/ReplyStatus.h
-Outgoing$(OBJEXT): Outgoing.cpp ../../include/Ice/Outgoing.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Config.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/Ice/ConnectionIF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/LocalObject.h ../../include/IceUtil/Shared.h ../../include/Ice/LocalObjectF.h ../../include/Ice/ReferenceF.h ../../include/Ice/BasicStream.h ../../include/Ice/InstanceF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Exception.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/Ice/StringConverter.h ../../include/IceUtil/Unicode.h ../../include/Ice/Current.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/StreamF.h ../Ice/ConnectionI.h ../../include/IceUtil/Thread.h ../../include/Ice/Connection.h ../../include/Ice/Proxy.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/CommunicatorF.h ../../include/Ice/ConnectionFactoryF.h ../Ice/TransceiverF.h ../../include/Ice/ServantManagerF.h ../../include/Ice/LoggerF.h ../Ice/TraceLevelsF.h ../Ice/EventHandler.h ../Ice/EventHandlerF.h ../Ice/ThreadPoolF.h ../Ice/Reference.h ../../include/IceUtil/RecMutex.h ../Ice/ReferenceFactoryF.h ../../include/Ice/RouterF.h ../../include/Ice/LocatorF.h ../Ice/RouterInfoF.h ../Ice/LocatorInfoF.h ../Ice/SharedContext.h ../../include/Ice/LocalException.h ../../include/Ice/BuiltinSequences.h ../Ice/Instance.h ../../include/IceUtil/Timer.h ../../include/Ice/StatsF.h ../Ice/DefaultsAndOverridesF.h ../../include/Ice/ConnectionMonitorF.h ../Ice/ObjectFactoryManagerF.h ../../include/Ice/ObjectAdapterFactoryF.h ../Ice/EndpointFactoryManagerF.h ../../include/Ice/DynamicLibraryF.h ../../include/Ice/PluginF.h ../../include/Ice/Initialize.h ../../include/Ice/PropertiesF.h ../Ice/ImplicitContextI.h ../../include/Ice/ImplicitContext.h ../../include/Ice/FacetMap.h ../../include/Ice/Process.h ../../include/Ice/OutgoingAsync.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/Direct.h ../Ice/ReplyStatus.h
-PluginManagerI$(OBJEXT): PluginManagerI.cpp ../Ice/PluginManagerI.h ../../include/Ice/Plugin.h ../../include/Ice/LocalObjectF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/LoggerF.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/InstanceF.h ../../include/Ice/CommunicatorF.h ../../include/Ice/DynamicLibraryF.h ../../include/Ice/BuiltinSequences.h ../../include/Ice/Proxy.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/DynamicLibrary.h ../../include/Ice/Communicator.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/StatsF.h ../../include/Ice/PropertiesF.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/RouterF.h ../../include/Ice/LocatorF.h ../../include/Ice/PluginF.h ../../include/Ice/ImplicitContextF.h ../../include/Ice/Properties.h ../../include/Ice/Outgoing.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/Ice/BasicStream.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/Ice/StringConverter.h ../../include/IceUtil/Unicode.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/ServantManagerF.h ../../include/Ice/Direct.h ../../include/Ice/LoggerUtil.h ../../include/Ice/Initialize.h ../../include/Ice/LocalException.h
-Plugin$(OBJEXT): Plugin.cpp ../../include/Ice/Plugin.h ../../include/Ice/LocalObjectF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/LoggerF.h ../../include/Ice/UndefSysMacros.h ../../include/IceUtil/Iterator.h ../../include/IceUtil/ScopedArray.h ../../include/IceUtil/DisableWarnings.h
-Process$(OBJEXT): Process.cpp ../../include/Ice/Process.h ../../include/Ice/LocalObjectF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/Proxy.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/CommunicatorF.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/Outgoing.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/Ice/BasicStream.h ../../include/Ice/InstanceF.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/Ice/StringConverter.h ../../include/IceUtil/Unicode.h ../../include/Ice/OutgoingAsync.h ../../include/IceUtil/RecMutex.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/ServantManagerF.h ../../include/Ice/Direct.h ../../include/Ice/LocalException.h ../../include/Ice/BuiltinSequences.h ../../include/Ice/ObjectFactory.h ../../include/IceUtil/Iterator.h ../../include/IceUtil/ScopedArray.h ../../include/IceUtil/DisableWarnings.h
-PropertiesI$(OBJEXT): PropertiesI.cpp ../../include/IceUtil/DisableWarnings.h ../../include/IceUtil/StringUtil.h ../../include/IceUtil/Config.h ../Ice/PropertiesI.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/Ice/Properties.h ../../include/Ice/LocalObjectF.h ../../include/IceUtil/Shared.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/Proxy.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/CommunicatorF.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/Outgoing.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/Ice/BasicStream.h ../../include/Ice/InstanceF.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/Ice/StringConverter.h ../../include/IceUtil/Unicode.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/ServantManagerF.h ../../include/Ice/Direct.h ../../include/Ice/BuiltinSequences.h ../../include/Ice/Initialize.h ../../include/Ice/PropertiesF.h ../../include/Ice/LoggerF.h ../../include/Ice/StatsF.h ../../include/Ice/LocalException.h ../Ice/PropertyNames.h ../../include/Ice/Logger.h ../../include/Ice/LoggerUtil.h ../../include/Ice/Communicator.h ../../include/Ice/RouterF.h ../../include/Ice/LocatorF.h ../../include/Ice/PluginF.h ../../include/Ice/ImplicitContextF.h
-Properties$(OBJEXT): Properties.cpp ../../include/Ice/Properties.h ../../include/Ice/LocalObjectF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/Proxy.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/CommunicatorF.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/Outgoing.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/Ice/BasicStream.h ../../include/Ice/InstanceF.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/Ice/StringConverter.h ../../include/IceUtil/Unicode.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/ServantManagerF.h ../../include/Ice/Direct.h ../../include/Ice/BuiltinSequences.h ../../include/Ice/LocalException.h ../../include/Ice/ObjectFactory.h ../../include/IceUtil/Iterator.h ../../include/IceUtil/ScopedArray.h ../../include/IceUtil/DisableWarnings.h
+GC$(OBJEXT): GC.cpp ../../include/IceUtil/Time.h ../../include/IceUtil/Config.h ../../include/IceUtil/StaticMutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/IceUtil/RecMutex.h ../Ice/GC.h ../../include/Ice/Config.h ../../include/IceUtil/Thread.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/Ice/GCShared.h ../../include/Ice/GCCountMap.h
+Identity$(OBJEXT): Identity.cpp ../../include/Ice/Identity.h ../../include/Ice/LocalObjectF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/BasicStream.h ../../include/Ice/InstanceF.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/Ice/StringConverter.h ../../include/IceUtil/Unicode.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ConnectionF.h ../../include/Ice/StreamF.h ../../include/IceUtil/Iterator.h ../../include/IceUtil/ScopedArray.h ../../include/IceUtil/DisableWarnings.h
+IdentityUtil$(OBJEXT): IdentityUtil.cpp ../../include/Ice/IdentityUtil.h ../../include/Ice/Identity.h ../../include/Ice/LocalObjectF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/LocalException.h ../../include/Ice/Proxy.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/RequestHandlerF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/StreamF.h ../../include/Ice/CommunicatorF.h ../../include/Ice/BuiltinSequences.h ../../include/IceUtil/StringUtil.h
+ImplicitContextI$(OBJEXT): ImplicitContextI.cpp ../Ice/ImplicitContextI.h ../../include/Ice/ImplicitContext.h ../../include/Ice/LocalObjectF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/Proxy.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/RequestHandlerF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/CommunicatorF.h ../../include/Ice/LocalException.h ../../include/Ice/BuiltinSequences.h ../../include/IceUtil/StaticMutex.h
+ImplicitContext$(OBJEXT): ImplicitContext.cpp ../../include/Ice/ImplicitContext.h ../../include/Ice/LocalObjectF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/Proxy.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/RequestHandlerF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/CommunicatorF.h ../../include/Ice/LocalException.h ../../include/Ice/BuiltinSequences.h ../../include/Ice/BasicStream.h ../../include/Ice/InstanceF.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/Ice/StringConverter.h ../../include/IceUtil/Unicode.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/IceUtil/Iterator.h ../../include/IceUtil/ScopedArray.h ../../include/IceUtil/DisableWarnings.h
+IncomingAsync$(OBJEXT): IncomingAsync.cpp ../../include/Ice/IncomingAsync.h ../../include/Ice/IncomingAsyncF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/Incoming.h ../../include/Ice/InstanceF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/LocalObject.h ../../include/Ice/LocalObjectF.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/ServantManagerF.h ../../include/Ice/BasicStream.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/Ice/StringConverter.h ../../include/IceUtil/Unicode.h ../../include/Ice/Object.h ../../include/Ice/Current.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/ServantLocator.h ../Ice/ConnectionI.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/IceUtil/Thread.h ../../include/Ice/Connection.h ../../include/Ice/Proxy.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/RequestHandlerF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/CommunicatorF.h ../../include/Ice/ConnectionFactoryF.h ../Ice/TransceiverF.h ../../include/Ice/LoggerF.h ../Ice/TraceLevelsF.h ../Ice/EventHandler.h ../Ice/EventHandlerF.h ../Ice/ThreadPoolF.h ../Ice/SelectorThread.h ../../include/IceUtil/Timer.h ../Ice/SelectorThreadF.h ../Ice/Selector.h ../../include/Ice/LocalException.h ../../include/Ice/BuiltinSequences.h ../Ice/Instance.h ../../include/IceUtil/RecMutex.h ../../include/Ice/StatsF.h ../Ice/DefaultsAndOverridesF.h ../Ice/RouterInfoF.h ../Ice/LocatorInfoF.h ../Ice/ReferenceFactoryF.h ../../include/Ice/ConnectionMonitorF.h ../Ice/ObjectFactoryManagerF.h ../../include/Ice/ObjectAdapterFactoryF.h ../Ice/EndpointFactoryManagerF.h ../../include/Ice/DynamicLibraryF.h ../../include/Ice/PluginF.h ../../include/Ice/Initialize.h ../../include/Ice/PropertiesF.h ../Ice/SharedContext.h ../Ice/ImplicitContextI.h ../../include/Ice/ImplicitContext.h ../../include/Ice/FacetMap.h ../../include/Ice/Process.h ../../include/Ice/Outgoing.h ../../include/Ice/OutgoingAsync.h ../../include/Ice/Direct.h ../../include/Ice/Properties.h ../Ice/ReplyStatus.h ../../include/IceUtil/StaticMutex.h
+Incoming$(OBJEXT): Incoming.cpp ../../include/Ice/Incoming.h ../../include/Ice/InstanceF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ConnectionIF.h ../../include/Ice/LocalObject.h ../../include/Ice/LocalObjectF.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/ServantManagerF.h ../../include/Ice/BasicStream.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/Ice/StringConverter.h ../../include/IceUtil/Unicode.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/IncomingAsync.h ../Ice/IncomingRequest.h ../../include/Ice/ObjectAdapter.h ../../include/Ice/Proxy.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/RequestHandlerF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/CommunicatorF.h ../../include/Ice/RouterF.h ../../include/Ice/LocatorF.h ../../include/Ice/FacetMap.h ../../include/Ice/ServantLocator.h ../Ice/ServantManager.h ../Ice/ConnectionI.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/IceUtil/Thread.h ../../include/Ice/Connection.h ../../include/Ice/ConnectionFactoryF.h ../Ice/TransceiverF.h ../../include/Ice/LoggerF.h ../Ice/TraceLevelsF.h ../Ice/EventHandler.h ../Ice/EventHandlerF.h ../Ice/ThreadPoolF.h ../Ice/SelectorThread.h ../../include/IceUtil/Timer.h ../Ice/SelectorThreadF.h ../Ice/Selector.h ../../include/Ice/LocalException.h ../../include/Ice/BuiltinSequences.h ../Ice/Instance.h ../../include/IceUtil/RecMutex.h ../../include/Ice/StatsF.h ../Ice/DefaultsAndOverridesF.h ../Ice/RouterInfoF.h ../Ice/LocatorInfoF.h ../Ice/ReferenceFactoryF.h ../../include/Ice/ConnectionMonitorF.h ../Ice/ObjectFactoryManagerF.h ../../include/Ice/ObjectAdapterFactoryF.h ../Ice/EndpointFactoryManagerF.h ../../include/Ice/DynamicLibraryF.h ../../include/Ice/PluginF.h ../../include/Ice/Initialize.h ../../include/Ice/PropertiesF.h ../Ice/SharedContext.h ../Ice/ImplicitContextI.h ../../include/Ice/ImplicitContext.h ../../include/Ice/Process.h ../../include/Ice/Outgoing.h ../../include/Ice/OutgoingAsync.h ../../include/Ice/Direct.h ../../include/Ice/Properties.h ../../include/Ice/LoggerUtil.h ../Ice/ReplyStatus.h ../../include/IceUtil/StringUtil.h
+Initialize$(OBJEXT): Initialize.cpp ../../include/IceUtil/DisableWarnings.h ../../include/IceUtil/ArgVector.h ../../include/IceUtil/Config.h ../Ice/GC.h ../../include/Ice/Config.h ../../include/IceUtil/Thread.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../Ice/CommunicatorI.h ../../include/IceUtil/RecMutex.h ../../include/IceUtil/StaticMutex.h ../../include/Ice/DynamicLibraryF.h ../../include/Ice/Handle.h ../../include/Ice/ProxyHandle.h ../../include/Ice/Initialize.h ../../include/Ice/CommunicatorF.h ../../include/Ice/LocalObjectF.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/PropertiesF.h ../../include/Ice/Proxy.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/RequestHandlerF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/InstanceF.h ../../include/Ice/LoggerF.h ../../include/Ice/StatsF.h ../../include/Ice/StringConverter.h ../../include/Ice/BuiltinSequences.h ../../include/Ice/Communicator.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/RouterF.h ../../include/Ice/LocatorF.h ../../include/Ice/PluginF.h ../../include/Ice/ImplicitContextF.h ../Ice/PropertiesI.h ../../include/Ice/Properties.h ../../include/Ice/Outgoing.h ../../include/Ice/BasicStream.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/IceUtil/Unicode.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/ServantManagerF.h ../../include/Ice/Direct.h ../../include/Ice/LocalException.h ../Ice/StreamI.h ../../include/Ice/Stream.h ../Ice/LoggerI.h ../../include/Ice/Logger.h
+Instance$(OBJEXT): Instance.cpp ../../include/IceUtil/DisableWarnings.h ../Ice/Instance.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/IceUtil/RecMutex.h ../../include/IceUtil/Timer.h ../../include/IceUtil/Thread.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/Ice/InstanceF.h ../../include/Ice/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/CommunicatorF.h ../../include/Ice/LocalObjectF.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/StatsF.h ../Ice/TraceLevelsF.h ../Ice/DefaultsAndOverridesF.h ../Ice/RouterInfoF.h ../Ice/LocatorInfoF.h ../Ice/ReferenceFactoryF.h ../../include/Ice/ProxyFactoryF.h ../Ice/ThreadPoolF.h ../Ice/SelectorThreadF.h ../../include/Ice/ConnectionFactoryF.h ../../include/Ice/ConnectionMonitorF.h ../Ice/ObjectFactoryManagerF.h ../../include/Ice/ObjectAdapterFactoryF.h ../Ice/EndpointFactoryManagerF.h ../../include/Ice/DynamicLibraryF.h ../../include/Ice/PluginF.h ../../include/Ice/Initialize.h ../../include/Ice/PropertiesF.h ../../include/Ice/Proxy.h ../../include/Ice/ConnectionIF.h ../../include/Ice/RequestHandlerF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/LoggerF.h ../../include/Ice/StringConverter.h ../../include/Ice/BuiltinSequences.h ../Ice/SharedContext.h ../Ice/ImplicitContextI.h ../../include/Ice/ImplicitContext.h ../../include/Ice/LocalException.h ../../include/Ice/FacetMap.h ../../include/Ice/Process.h ../../include/Ice/Outgoing.h ../../include/Ice/BasicStream.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/IceUtil/Unicode.h ../../include/Ice/OutgoingAsync.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/ServantManagerF.h ../../include/Ice/Direct.h ../Ice/TraceLevels.h ../Ice/DefaultsAndOverrides.h ../Ice/RouterInfo.h ../../include/Ice/RouterF.h ../../include/Ice/Router.h ../Ice/LocatorInfo.h ../../include/Ice/LocatorF.h ../../include/Ice/Locator.h ../../include/Ice/IncomingAsync.h ../../include/Ice/UserExceptionFactory.h ../../include/Ice/FactoryTable.h ../../include/Ice/FactoryTableDef.h ../../include/IceUtil/StaticMutex.h ../../include/Ice/UserExceptionFactoryF.h ../../include/Ice/ProcessF.h ../Ice/ReferenceFactory.h ../Ice/Reference.h ../Ice/ProxyFactory.h ../Ice/ThreadPool.h ../Ice/EventHandlerF.h ../Ice/Selector.h ../Ice/SelectorThread.h ../Ice/ConnectionFactory.h ../Ice/ConnectionI.h ../../include/Ice/Connection.h ../Ice/TransceiverF.h ../Ice/EventHandler.h ../Ice/ConnectorF.h ../Ice/AcceptorF.h ../Ice/EndpointI.h ../Ice/ConnectionMonitor.h ../Ice/ObjectFactoryManager.h ../Ice/ObjectAdapterFactory.h ../Ice/ObjectAdapterI.h ../../include/Ice/ObjectAdapter.h ../Ice/PropertiesI.h ../../include/Ice/Properties.h ../Ice/LoggerI.h ../../include/Ice/Logger.h ../Ice/Network.h ../Ice/EndpointFactoryManager.h ../../include/Ice/EndpointFactoryF.h ../Ice/TcpEndpointI.h ../../include/Ice/EndpointFactory.h ../Ice/UdpEndpointI.h ../../include/Ice/DynamicLibrary.h ../Ice/PluginManagerI.h ../../include/Ice/Plugin.h ../../include/Ice/LoggerUtil.h ../../include/IceUtil/StringUtil.h ../../include/IceUtil/UUID.h ../../include/Ice/Communicator.h ../../include/Ice/ImplicitContextF.h ../Ice/SysLoggerI.h
+LocalException$(OBJEXT): LocalException.cpp ../../include/Ice/LocalException.h ../../include/Ice/LocalObjectF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/Proxy.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/RequestHandlerF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/CommunicatorF.h ../../include/Ice/BuiltinSequences.h ../../include/Ice/BasicStream.h ../../include/Ice/InstanceF.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/Ice/StringConverter.h ../../include/IceUtil/Unicode.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/IceUtil/Iterator.h ../../include/IceUtil/ScopedArray.h ../../include/IceUtil/DisableWarnings.h
+LocalObject$(OBJEXT): LocalObject.cpp ../../include/Ice/LocalObject.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/Ice/LocalObjectF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h
+LocatorInfo$(OBJEXT): LocatorInfo.cpp ../Ice/LocatorInfo.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/IceUtil/Time.h ../Ice/LocatorInfoF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/LocatorF.h ../../include/Ice/LocalObjectF.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/Proxy.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/RequestHandlerF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/CommunicatorF.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/Locator.h ../../include/Ice/Outgoing.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/Ice/InstanceF.h ../../include/Ice/BasicStream.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/Ice/StringConverter.h ../../include/IceUtil/Unicode.h ../../include/Ice/OutgoingAsync.h ../../include/IceUtil/Timer.h ../../include/IceUtil/Thread.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/ServantManagerF.h ../../include/Ice/IncomingAsync.h ../../include/Ice/Direct.h ../../include/Ice/UserExceptionFactory.h ../../include/Ice/FactoryTable.h ../../include/Ice/FactoryTableDef.h ../../include/IceUtil/StaticMutex.h ../../include/Ice/UserExceptionFactoryF.h ../../include/Ice/ProcessF.h ../../include/Ice/LocalException.h ../../include/Ice/BuiltinSequences.h ../Ice/Instance.h ../../include/IceUtil/RecMutex.h ../../include/Ice/StatsF.h ../Ice/TraceLevelsF.h ../Ice/DefaultsAndOverridesF.h ../Ice/RouterInfoF.h ../Ice/ReferenceFactoryF.h ../Ice/ThreadPoolF.h ../Ice/SelectorThreadF.h ../../include/Ice/ConnectionFactoryF.h ../../include/Ice/ConnectionMonitorF.h ../Ice/ObjectFactoryManagerF.h ../../include/Ice/ObjectAdapterFactoryF.h ../Ice/EndpointFactoryManagerF.h ../../include/Ice/DynamicLibraryF.h ../../include/Ice/PluginF.h ../../include/Ice/Initialize.h ../../include/Ice/PropertiesF.h ../../include/Ice/LoggerF.h ../Ice/SharedContext.h ../Ice/ImplicitContextI.h ../../include/Ice/ImplicitContext.h ../../include/Ice/FacetMap.h ../../include/Ice/Process.h ../Ice/TraceLevels.h ../../include/Ice/LoggerUtil.h ../Ice/EndpointI.h ../Ice/TransceiverF.h ../Ice/ConnectorF.h ../Ice/AcceptorF.h ../Ice/Reference.h ../../include/Ice/RouterF.h ../../include/Ice/Functional.h ../../include/IceUtil/Functional.h
+Locator$(OBJEXT): Locator.cpp ../../include/Ice/Locator.h ../../include/Ice/LocalObjectF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/Proxy.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/RequestHandlerF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/CommunicatorF.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/Outgoing.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/Ice/InstanceF.h ../../include/Ice/BasicStream.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/Ice/StringConverter.h ../../include/IceUtil/Unicode.h ../../include/Ice/OutgoingAsync.h ../../include/IceUtil/Timer.h ../../include/IceUtil/Thread.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/ServantManagerF.h ../../include/Ice/IncomingAsync.h ../../include/Ice/Direct.h ../../include/Ice/UserExceptionFactory.h ../../include/Ice/FactoryTable.h ../../include/Ice/FactoryTableDef.h ../../include/IceUtil/StaticMutex.h ../../include/Ice/UserExceptionFactoryF.h ../../include/Ice/ProcessF.h ../../include/Ice/LocalException.h ../../include/Ice/BuiltinSequences.h ../../include/Ice/ObjectFactory.h ../../include/IceUtil/Iterator.h ../../include/IceUtil/ScopedArray.h ../../include/IceUtil/DisableWarnings.h
+LoggerI$(OBJEXT): LoggerI.cpp ../../include/IceUtil/Time.h ../../include/IceUtil/Config.h ../Ice/LoggerI.h ../../include/Ice/Logger.h ../../include/Ice/LocalObjectF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/UndefSysMacros.h ../../include/IceUtil/StaticMutex.h
+Logger$(OBJEXT): Logger.cpp ../../include/Ice/Logger.h ../../include/Ice/LocalObjectF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/UndefSysMacros.h ../../include/IceUtil/Iterator.h ../../include/IceUtil/ScopedArray.h ../../include/IceUtil/DisableWarnings.h
+LoggerUtil$(OBJEXT): LoggerUtil.cpp ../../include/Ice/LoggerUtil.h ../../include/Ice/LoggerF.h ../../include/Ice/LocalObjectF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/Logger.h
+Network$(OBJEXT): Network.cpp ../../include/IceUtil/StaticMutex.h ../../include/IceUtil/Config.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../Ice/Network.h ../../include/Ice/Config.h ../../include/Ice/PropertiesF.h ../../include/Ice/LocalObjectF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Mutex.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/Proxy.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/RequestHandlerF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/CommunicatorF.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/LoggerF.h ../../include/Ice/LocalException.h ../../include/Ice/BuiltinSequences.h ../../include/Ice/Properties.h ../../include/Ice/Outgoing.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/Ice/InstanceF.h ../../include/Ice/BasicStream.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/Ice/StringConverter.h ../../include/IceUtil/Unicode.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/ServantManagerF.h ../../include/Ice/Direct.h ../../include/Ice/LoggerUtil.h
+ObjectAdapterFactory$(OBJEXT): ObjectAdapterFactory.cpp ../Ice/ObjectAdapterFactory.h ../Ice/ObjectAdapterI.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/IceUtil/RecMutex.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/Ice/ObjectAdapter.h ../../include/Ice/LocalObjectF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/Proxy.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/RequestHandlerF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/CommunicatorF.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/RouterF.h ../../include/Ice/LocatorF.h ../../include/Ice/FacetMap.h ../../include/Ice/InstanceF.h ../../include/Ice/ObjectAdapterFactoryF.h ../../include/Ice/ConnectionFactoryF.h ../../include/Ice/ServantManagerF.h ../Ice/RouterInfoF.h ../Ice/ConnectorF.h ../Ice/LocatorInfoF.h ../Ice/ThreadPoolF.h ../../include/Ice/BuiltinSequences.h ../../include/Ice/LocalException.h ../../include/Ice/Functional.h ../../include/IceUtil/Functional.h ../../include/IceUtil/UUID.h
+ObjectAdapterI$(OBJEXT): ObjectAdapterI.cpp ../../include/IceUtil/UUID.h ../../include/IceUtil/Config.h ../Ice/ObjectAdapterI.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/IceUtil/RecMutex.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/Ice/ObjectAdapter.h ../../include/Ice/LocalObjectF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/Proxy.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/RequestHandlerF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/CommunicatorF.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/RouterF.h ../../include/Ice/LocatorF.h ../../include/Ice/FacetMap.h ../../include/Ice/InstanceF.h ../../include/Ice/ObjectAdapterFactoryF.h ../../include/Ice/ConnectionFactoryF.h ../../include/Ice/ServantManagerF.h ../Ice/RouterInfoF.h ../Ice/ConnectorF.h ../Ice/LocatorInfoF.h ../Ice/ThreadPoolF.h ../../include/Ice/BuiltinSequences.h ../Ice/ObjectAdapterFactory.h ../Ice/Instance.h ../../include/IceUtil/Timer.h ../../include/IceUtil/Thread.h ../../include/Ice/StatsF.h ../Ice/TraceLevelsF.h ../Ice/DefaultsAndOverridesF.h ../Ice/ReferenceFactoryF.h ../Ice/SelectorThreadF.h ../../include/Ice/ConnectionMonitorF.h ../Ice/ObjectFactoryManagerF.h ../Ice/EndpointFactoryManagerF.h ../../include/Ice/DynamicLibraryF.h ../../include/Ice/PluginF.h ../../include/Ice/Initialize.h ../../include/Ice/PropertiesF.h ../../include/Ice/LoggerF.h ../../include/Ice/StringConverter.h ../Ice/SharedContext.h ../Ice/ImplicitContextI.h ../../include/Ice/ImplicitContext.h ../../include/Ice/LocalException.h ../../include/Ice/Process.h ../../include/Ice/Outgoing.h ../../include/Ice/BasicStream.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/IceUtil/Unicode.h ../../include/Ice/OutgoingAsync.h ../../include/Ice/Incoming.h ../../include/Ice/Direct.h ../Ice/ProxyFactory.h ../Ice/ReferenceFactory.h ../Ice/Reference.h ../Ice/EndpointI.h ../Ice/TransceiverF.h ../Ice/AcceptorF.h ../Ice/EndpointFactoryManager.h ../../include/Ice/EndpointFactoryF.h ../Ice/ConnectionFactory.h ../Ice/ConnectionI.h ../../include/Ice/Connection.h ../Ice/EventHandler.h ../Ice/EventHandlerF.h ../Ice/SelectorThread.h ../Ice/Selector.h ../Ice/ServantManager.h ../Ice/RouterInfo.h ../../include/Ice/Properties.h ../../include/Ice/Functional.h ../../include/IceUtil/Functional.h ../Ice/LocatorInfo.h ../../include/Ice/Locator.h ../../include/Ice/IncomingAsync.h ../../include/Ice/UserExceptionFactory.h ../../include/Ice/FactoryTable.h ../../include/Ice/FactoryTableDef.h ../../include/IceUtil/StaticMutex.h ../../include/Ice/UserExceptionFactoryF.h ../../include/Ice/ProcessF.h ../../include/Ice/LoggerUtil.h ../Ice/ThreadPool.h ../../include/Ice/Communicator.h ../../include/Ice/ImplicitContextF.h ../../include/Ice/Router.h ../Ice/DefaultsAndOverrides.h ../Ice/TraceLevels.h ../Ice/PropertyNames.h
+ObjectAdapter$(OBJEXT): ObjectAdapter.cpp ../../include/Ice/ObjectAdapter.h ../../include/Ice/LocalObjectF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/Proxy.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/RequestHandlerF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/CommunicatorF.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/RouterF.h ../../include/Ice/LocatorF.h ../../include/Ice/FacetMap.h ../../include/Ice/BasicStream.h ../../include/Ice/InstanceF.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/Ice/StringConverter.h ../../include/IceUtil/Unicode.h ../../include/IceUtil/Iterator.h ../../include/IceUtil/ScopedArray.h ../../include/IceUtil/DisableWarnings.h
+ObjectFactoryManager$(OBJEXT): ObjectFactoryManager.cpp ../Ice/ObjectFactoryManager.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../Ice/ObjectFactoryManagerF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/LocalObjectF.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/ObjectFactory.h ../../include/Ice/Functional.h ../../include/IceUtil/Functional.h ../../include/Ice/LocalException.h ../../include/Ice/Proxy.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/RequestHandlerF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/CommunicatorF.h ../../include/Ice/BuiltinSequences.h
+ObjectFactory$(OBJEXT): ObjectFactory.cpp ../../include/Ice/ObjectFactory.h ../../include/Ice/LocalObjectF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/BasicStream.h ../../include/Ice/InstanceF.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/Ice/StringConverter.h ../../include/IceUtil/Unicode.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/IceUtil/Iterator.h ../../include/IceUtil/ScopedArray.h ../../include/IceUtil/DisableWarnings.h
+Object$(OBJEXT): Object.cpp ../../include/Ice/Object.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Config.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/IceUtil/Shared.h ../../include/Ice/GCShared.h ../../include/Ice/Config.h ../../include/Ice/GCCountMap.h ../../include/Ice/ObjectF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/LocalObjectF.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/Incoming.h ../../include/Ice/InstanceF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/ServantManagerF.h ../../include/Ice/BasicStream.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/Ice/StringConverter.h ../../include/IceUtil/Unicode.h ../../include/Ice/IncomingAsync.h ../Ice/IncomingRequest.h ../../include/Ice/Direct.h ../../include/Ice/ReferenceF.h ../../include/Ice/LocalException.h ../../include/Ice/Proxy.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/RequestHandlerF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/CommunicatorF.h ../../include/Ice/BuiltinSequences.h ../../include/Ice/Stream.h
+OutgoingAsync$(OBJEXT): OutgoingAsync.cpp ../../include/Ice/OutgoingAsync.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Config.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Timer.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Thread.h ../../include/IceUtil/Handle.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/InstanceF.h ../../include/Ice/ReferenceF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/LocalObject.h ../../include/Ice/LocalObjectF.h ../../include/Ice/Current.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/StreamF.h ../Ice/ConnectionI.h ../../include/Ice/Connection.h ../../include/Ice/Proxy.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/RequestHandlerF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/CommunicatorF.h ../../include/Ice/ConnectionFactoryF.h ../Ice/TransceiverF.h ../../include/Ice/ServantManagerF.h ../../include/Ice/LoggerF.h ../Ice/TraceLevelsF.h ../Ice/EventHandler.h ../Ice/EventHandlerF.h ../Ice/ThreadPoolF.h ../../include/Ice/BasicStream.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/Ice/StringConverter.h ../../include/IceUtil/Unicode.h ../Ice/SelectorThread.h ../Ice/SelectorThreadF.h ../Ice/Selector.h ../Ice/RequestHandler.h ../Ice/Reference.h ../../include/IceUtil/RecMutex.h ../Ice/ReferenceFactoryF.h ../../include/Ice/RouterF.h ../../include/Ice/LocatorF.h ../Ice/RouterInfoF.h ../Ice/LocatorInfoF.h ../Ice/SharedContext.h ../Ice/Instance.h ../../include/Ice/StatsF.h ../Ice/DefaultsAndOverridesF.h ../../include/Ice/ConnectionMonitorF.h ../Ice/ObjectFactoryManagerF.h ../../include/Ice/ObjectAdapterFactoryF.h ../Ice/EndpointFactoryManagerF.h ../../include/Ice/DynamicLibraryF.h ../../include/Ice/PluginF.h ../../include/Ice/Initialize.h ../../include/Ice/PropertiesF.h ../../include/Ice/BuiltinSequences.h ../Ice/ImplicitContextI.h ../../include/Ice/ImplicitContext.h ../../include/Ice/LocalException.h ../../include/Ice/FacetMap.h ../../include/Ice/Process.h ../../include/Ice/Outgoing.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/Direct.h ../../include/Ice/Properties.h ../../include/Ice/LoggerUtil.h ../Ice/LocatorInfo.h ../Ice/ProxyFactory.h ../Ice/RouterInfo.h ../Ice/ReplyStatus.h
+Outgoing$(OBJEXT): Outgoing.cpp ../../include/Ice/Outgoing.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Config.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/Ice/RequestHandlerF.h ../../include/IceUtil/Shared.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/InstanceF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/LocalObject.h ../../include/Ice/LocalObjectF.h ../../include/Ice/ReferenceF.h ../../include/Ice/BasicStream.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Exception.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/Ice/StringConverter.h ../../include/IceUtil/Unicode.h ../../include/Ice/Current.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/StreamF.h ../Ice/RequestHandler.h ../../include/Ice/OutgoingAsyncF.h ../Ice/ConnectionI.h ../../include/IceUtil/Thread.h ../../include/Ice/Connection.h ../../include/Ice/Proxy.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/CommunicatorF.h ../../include/Ice/ConnectionFactoryF.h ../Ice/TransceiverF.h ../../include/Ice/ServantManagerF.h ../../include/Ice/LoggerF.h ../Ice/TraceLevelsF.h ../Ice/EventHandler.h ../Ice/EventHandlerF.h ../Ice/ThreadPoolF.h ../Ice/SelectorThread.h ../../include/IceUtil/Timer.h ../Ice/SelectorThreadF.h ../Ice/Selector.h ../Ice/Reference.h ../../include/IceUtil/RecMutex.h ../Ice/ReferenceFactoryF.h ../../include/Ice/RouterF.h ../../include/Ice/LocatorF.h ../Ice/RouterInfoF.h ../Ice/LocatorInfoF.h ../Ice/SharedContext.h ../../include/Ice/LocalException.h ../../include/Ice/BuiltinSequences.h ../Ice/Instance.h ../../include/Ice/StatsF.h ../Ice/DefaultsAndOverridesF.h ../../include/Ice/ConnectionMonitorF.h ../Ice/ObjectFactoryManagerF.h ../../include/Ice/ObjectAdapterFactoryF.h ../Ice/EndpointFactoryManagerF.h ../../include/Ice/DynamicLibraryF.h ../../include/Ice/PluginF.h ../../include/Ice/Initialize.h ../../include/Ice/PropertiesF.h ../Ice/ImplicitContextI.h ../../include/Ice/ImplicitContext.h ../../include/Ice/FacetMap.h ../../include/Ice/Process.h ../../include/Ice/OutgoingAsync.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/Direct.h ../Ice/ReplyStatus.h
+PluginManagerI$(OBJEXT): PluginManagerI.cpp ../Ice/PluginManagerI.h ../../include/Ice/Plugin.h ../../include/Ice/LocalObjectF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/LoggerF.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/InstanceF.h ../../include/Ice/CommunicatorF.h ../../include/Ice/DynamicLibraryF.h ../../include/Ice/BuiltinSequences.h ../../include/Ice/Proxy.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/RequestHandlerF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/DynamicLibrary.h ../../include/Ice/Communicator.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/StatsF.h ../../include/Ice/PropertiesF.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/RouterF.h ../../include/Ice/LocatorF.h ../../include/Ice/PluginF.h ../../include/Ice/ImplicitContextF.h ../../include/Ice/Properties.h ../../include/Ice/Outgoing.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/Ice/BasicStream.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/Ice/StringConverter.h ../../include/IceUtil/Unicode.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/ServantManagerF.h ../../include/Ice/Direct.h ../../include/Ice/LoggerUtil.h ../../include/Ice/Initialize.h ../../include/Ice/LocalException.h
+Plugin$(OBJEXT): Plugin.cpp ../../include/Ice/Plugin.h ../../include/Ice/LocalObjectF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/LoggerF.h ../../include/Ice/UndefSysMacros.h ../../include/IceUtil/Iterator.h ../../include/IceUtil/ScopedArray.h ../../include/IceUtil/DisableWarnings.h
+Process$(OBJEXT): Process.cpp ../../include/Ice/Process.h ../../include/Ice/LocalObjectF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/Proxy.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/RequestHandlerF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/CommunicatorF.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/Outgoing.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/Ice/InstanceF.h ../../include/Ice/BasicStream.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/Ice/StringConverter.h ../../include/IceUtil/Unicode.h ../../include/Ice/OutgoingAsync.h ../../include/IceUtil/Timer.h ../../include/IceUtil/Thread.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/ServantManagerF.h ../../include/Ice/Direct.h ../../include/Ice/LocalException.h ../../include/Ice/BuiltinSequences.h ../../include/Ice/ObjectFactory.h ../../include/IceUtil/Iterator.h ../../include/IceUtil/ScopedArray.h ../../include/IceUtil/DisableWarnings.h
+PropertiesI$(OBJEXT): PropertiesI.cpp ../../include/IceUtil/DisableWarnings.h ../../include/IceUtil/StringUtil.h ../../include/IceUtil/Config.h ../Ice/PropertiesI.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/Ice/Properties.h ../../include/Ice/LocalObjectF.h ../../include/IceUtil/Shared.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/Proxy.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/RequestHandlerF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/CommunicatorF.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/Outgoing.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/Ice/InstanceF.h ../../include/Ice/BasicStream.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/Ice/StringConverter.h ../../include/IceUtil/Unicode.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/ServantManagerF.h ../../include/Ice/Direct.h ../../include/Ice/BuiltinSequences.h ../../include/Ice/Initialize.h ../../include/Ice/PropertiesF.h ../../include/Ice/LoggerF.h ../../include/Ice/StatsF.h ../../include/Ice/LocalException.h ../Ice/PropertyNames.h ../../include/Ice/Logger.h ../../include/Ice/LoggerUtil.h ../../include/Ice/Communicator.h ../../include/Ice/RouterF.h ../../include/Ice/LocatorF.h ../../include/Ice/PluginF.h ../../include/Ice/ImplicitContextF.h
+Properties$(OBJEXT): Properties.cpp ../../include/Ice/Properties.h ../../include/Ice/LocalObjectF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/Proxy.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/RequestHandlerF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/CommunicatorF.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/Outgoing.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/Ice/InstanceF.h ../../include/Ice/BasicStream.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/Ice/StringConverter.h ../../include/IceUtil/Unicode.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/ServantManagerF.h ../../include/Ice/Direct.h ../../include/Ice/BuiltinSequences.h ../../include/Ice/LocalException.h ../../include/Ice/ObjectFactory.h ../../include/IceUtil/Iterator.h ../../include/IceUtil/ScopedArray.h ../../include/IceUtil/DisableWarnings.h
PropertyNames$(OBJEXT): PropertyNames.cpp ../Ice/PropertyNames.h ../../include/Ice/Config.h ../../include/IceUtil/Config.h
Protocol$(OBJEXT): Protocol.cpp ../../include/Ice/Protocol.h ../../include/Ice/Config.h ../../include/IceUtil/Config.h
-ProtocolPluginFacade$(OBJEXT): ProtocolPluginFacade.cpp ../../include/Ice/ProtocolPluginFacade.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/Ice/ProtocolPluginFacadeF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/CommunicatorF.h ../../include/Ice/LocalObjectF.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/EndpointFactoryF.h ../../include/Ice/InstanceF.h ../Ice/Instance.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/RecMutex.h ../../include/IceUtil/Timer.h ../../include/IceUtil/Thread.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/Ice/StatsF.h ../Ice/TraceLevelsF.h ../Ice/DefaultsAndOverridesF.h ../Ice/RouterInfoF.h ../Ice/LocatorInfoF.h ../Ice/ReferenceFactoryF.h ../../include/Ice/ProxyFactoryF.h ../Ice/ThreadPoolF.h ../../include/Ice/ConnectionFactoryF.h ../../include/Ice/ConnectionMonitorF.h ../Ice/ObjectFactoryManagerF.h ../../include/Ice/ObjectAdapterFactoryF.h ../Ice/EndpointFactoryManagerF.h ../../include/Ice/DynamicLibraryF.h ../../include/Ice/PluginF.h ../../include/Ice/Initialize.h ../../include/Ice/PropertiesF.h ../../include/Ice/Proxy.h ../../include/Ice/ConnectionIF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/LoggerF.h ../../include/Ice/StringConverter.h ../../include/Ice/BuiltinSequences.h ../Ice/SharedContext.h ../Ice/ImplicitContextI.h ../../include/Ice/ImplicitContext.h ../../include/Ice/LocalException.h ../../include/Ice/FacetMap.h ../../include/Ice/Process.h ../../include/Ice/Outgoing.h ../../include/Ice/BasicStream.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/IceUtil/Unicode.h ../../include/Ice/OutgoingAsync.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/ServantManagerF.h ../../include/Ice/Direct.h ../Ice/EndpointFactoryManager.h ../Ice/TraceLevels.h ../Ice/DefaultsAndOverrides.h
-ProxyFactory$(OBJEXT): ProxyFactory.cpp ../../include/IceUtil/Thread.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Time.h ../Ice/ProxyFactory.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/InstanceF.h ../../include/Ice/ReferenceF.h ../../include/Ice/ProxyF.h ../../include/Ice/Exception.h ../Ice/Instance.h ../../include/IceUtil/RecMutex.h ../../include/IceUtil/Timer.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/Ice/CommunicatorF.h ../../include/Ice/LocalObjectF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/LocalObject.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/StatsF.h ../Ice/TraceLevelsF.h ../Ice/DefaultsAndOverridesF.h ../Ice/RouterInfoF.h ../Ice/LocatorInfoF.h ../Ice/ReferenceFactoryF.h ../Ice/ThreadPoolF.h ../../include/Ice/ConnectionFactoryF.h ../../include/Ice/ConnectionMonitorF.h ../Ice/ObjectFactoryManagerF.h ../../include/Ice/ObjectAdapterFactoryF.h ../Ice/EndpointFactoryManagerF.h ../../include/Ice/DynamicLibraryF.h ../../include/Ice/PluginF.h ../../include/Ice/Initialize.h ../../include/Ice/PropertiesF.h ../../include/Ice/Proxy.h ../../include/Ice/ConnectionIF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/LoggerF.h ../../include/Ice/StringConverter.h ../../include/Ice/BuiltinSequences.h ../Ice/SharedContext.h ../Ice/ImplicitContextI.h ../../include/Ice/ImplicitContext.h ../../include/Ice/LocalException.h ../../include/Ice/FacetMap.h ../../include/Ice/Process.h ../../include/Ice/Outgoing.h ../../include/Ice/BasicStream.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/IceUtil/Unicode.h ../../include/Ice/OutgoingAsync.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/ServantManagerF.h ../../include/Ice/Direct.h ../Ice/ReferenceFactory.h ../Ice/Reference.h ../../include/Ice/RouterF.h ../../include/Ice/LocatorF.h ../Ice/LocatorInfo.h ../../include/Ice/Properties.h ../../include/Ice/LoggerUtil.h ../Ice/TraceLevels.h
-Proxy$(OBJEXT): Proxy.cpp ../../include/Ice/Proxy.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/Ice/ProxyF.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/IceUtil/Handle.h ../../include/Ice/Handle.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/LocalObject.h ../../include/Ice/LocalObjectF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/CommunicatorF.h ../Ice/ProxyFactory.h ../../include/Ice/InstanceF.h ../Ice/ReferenceFactory.h ../Ice/ReferenceFactoryF.h ../Ice/Reference.h ../../include/IceUtil/RecMutex.h ../../include/Ice/RouterF.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/LocatorF.h ../Ice/RouterInfoF.h ../Ice/LocatorInfoF.h ../Ice/SharedContext.h ../../include/Ice/BuiltinSequences.h ../Ice/ObjectAdapterFactory.h ../Ice/ObjectAdapterI.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/Ice/ObjectAdapter.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/FacetMap.h ../../include/Ice/ObjectAdapterFactoryF.h ../../include/Ice/ConnectionFactoryF.h ../../include/Ice/ServantManagerF.h ../Ice/ConnectorF.h ../Ice/ThreadPoolF.h ../../include/Ice/Outgoing.h ../../include/Ice/BasicStream.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/Ice/StringConverter.h ../../include/IceUtil/Unicode.h ../../include/Ice/OutgoingAsync.h ../../include/Ice/Direct.h ../Ice/EndpointI.h ../Ice/TransceiverF.h ../Ice/AcceptorF.h ../Ice/Instance.h ../../include/IceUtil/Timer.h ../../include/IceUtil/Thread.h ../../include/Ice/StatsF.h ../Ice/TraceLevelsF.h ../Ice/DefaultsAndOverridesF.h ../../include/Ice/ConnectionMonitorF.h ../Ice/ObjectFactoryManagerF.h ../Ice/EndpointFactoryManagerF.h ../../include/Ice/DynamicLibraryF.h ../../include/Ice/PluginF.h ../../include/Ice/Initialize.h ../../include/Ice/PropertiesF.h ../../include/Ice/LoggerF.h ../Ice/ImplicitContextI.h ../../include/Ice/ImplicitContext.h ../../include/Ice/LocalException.h ../../include/Ice/Process.h ../../include/Ice/Incoming.h ../Ice/RouterInfo.h ../Ice/LocatorInfo.h ../Ice/ConnectionI.h ../../include/Ice/Connection.h ../Ice/EventHandler.h ../Ice/EventHandlerF.h ../../include/Ice/Stream.h
-ReferenceFactory$(OBJEXT): ReferenceFactory.cpp ../../include/Ice/Communicator.h ../../include/Ice/LocalObjectF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/Proxy.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/CommunicatorF.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/LoggerF.h ../../include/Ice/StatsF.h ../../include/Ice/PropertiesF.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/RouterF.h ../../include/Ice/LocatorF.h ../../include/Ice/PluginF.h ../../include/Ice/ImplicitContextF.h ../Ice/ReferenceFactory.h ../Ice/ReferenceFactoryF.h ../Ice/Reference.h ../../include/IceUtil/RecMutex.h ../../include/Ice/InstanceF.h ../Ice/RouterInfoF.h ../Ice/LocatorInfoF.h ../Ice/SharedContext.h ../../include/Ice/BuiltinSequences.h ../Ice/ProxyFactory.h ../../include/Ice/LocalException.h ../Ice/Instance.h ../../include/IceUtil/Timer.h ../../include/IceUtil/Thread.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../Ice/TraceLevelsF.h ../Ice/DefaultsAndOverridesF.h ../Ice/ThreadPoolF.h ../../include/Ice/ConnectionFactoryF.h ../../include/Ice/ConnectionMonitorF.h ../Ice/ObjectFactoryManagerF.h ../../include/Ice/ObjectAdapterFactoryF.h ../Ice/EndpointFactoryManagerF.h ../../include/Ice/DynamicLibraryF.h ../../include/Ice/Initialize.h ../../include/Ice/StringConverter.h ../Ice/ImplicitContextI.h ../../include/Ice/ImplicitContext.h ../../include/Ice/FacetMap.h ../../include/Ice/Process.h ../../include/Ice/Outgoing.h ../../include/Ice/BasicStream.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/IceUtil/Unicode.h ../../include/Ice/OutgoingAsync.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/ServantManagerF.h ../../include/Ice/Direct.h ../Ice/EndpointI.h ../Ice/TransceiverF.h ../Ice/ConnectorF.h ../Ice/AcceptorF.h ../Ice/EndpointFactoryManager.h ../../include/Ice/EndpointFactoryF.h ../Ice/RouterInfo.h ../../include/Ice/Router.h ../Ice/LocatorInfo.h ../../include/Ice/Locator.h ../../include/Ice/IncomingAsync.h ../../include/Ice/UserExceptionFactory.h ../../include/Ice/FactoryTable.h ../../include/Ice/FactoryTableDef.h ../../include/IceUtil/StaticMutex.h ../../include/Ice/UserExceptionFactoryF.h ../../include/Ice/ProcessF.h ../../include/Ice/LoggerUtil.h ../../include/Ice/Properties.h ../Ice/DefaultsAndOverrides.h ../Ice/PropertyNames.h ../../include/IceUtil/StringUtil.h
-Reference$(OBJEXT): Reference.cpp ../Ice/Reference.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/IceUtil/RecMutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/Ice/ReferenceF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../Ice/ReferenceFactoryF.h ../../include/Ice/EndpointIF.h ../../include/Ice/LocalObject.h ../../include/Ice/LocalObjectF.h ../../include/Ice/InstanceF.h ../../include/Ice/RouterF.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/Proxy.h ../../include/IceUtil/Mutex.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/Endpoint.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/CommunicatorF.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/LocatorF.h ../Ice/RouterInfoF.h ../Ice/LocatorInfoF.h ../Ice/SharedContext.h ../Ice/ReferenceFactory.h ../../include/Ice/BuiltinSequences.h ../../include/Ice/LocalException.h ../Ice/Instance.h ../../include/IceUtil/Timer.h ../../include/IceUtil/Thread.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/Ice/StatsF.h ../Ice/TraceLevelsF.h ../Ice/DefaultsAndOverridesF.h ../Ice/ThreadPoolF.h ../../include/Ice/ConnectionFactoryF.h ../../include/Ice/ConnectionMonitorF.h ../Ice/ObjectFactoryManagerF.h ../../include/Ice/ObjectAdapterFactoryF.h ../Ice/EndpointFactoryManagerF.h ../../include/Ice/DynamicLibraryF.h ../../include/Ice/PluginF.h ../../include/Ice/Initialize.h ../../include/Ice/PropertiesF.h ../../include/Ice/LoggerF.h ../../include/Ice/StringConverter.h ../Ice/ImplicitContextI.h ../../include/Ice/ImplicitContext.h ../../include/Ice/FacetMap.h ../../include/Ice/Process.h ../../include/Ice/Outgoing.h ../../include/Ice/BasicStream.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/IceUtil/Unicode.h ../../include/Ice/OutgoingAsync.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/ServantManagerF.h ../../include/Ice/Direct.h ../Ice/EndpointI.h ../Ice/TransceiverF.h ../Ice/ConnectorF.h ../Ice/AcceptorF.h ../Ice/RouterInfo.h ../../include/Ice/Router.h ../Ice/LocatorInfo.h ../../include/Ice/Locator.h ../../include/Ice/IncomingAsync.h ../../include/Ice/UserExceptionFactory.h ../../include/Ice/FactoryTable.h ../../include/Ice/FactoryTableDef.h ../../include/IceUtil/StaticMutex.h ../../include/Ice/UserExceptionFactoryF.h ../../include/Ice/ProcessF.h ../../include/Ice/Functional.h ../../include/IceUtil/Functional.h ../Ice/ConnectionI.h ../../include/Ice/Connection.h ../Ice/EventHandler.h ../Ice/EventHandlerF.h ../Ice/ConnectionFactory.h ../../include/Ice/LoggerUtil.h ../Ice/TraceLevels.h ../Ice/DefaultsAndOverrides.h ../../include/IceUtil/StringUtil.h ../../include/IceUtil/Random.h
-RouterInfo$(OBJEXT): RouterInfo.cpp ../Ice/RouterInfo.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../Ice/RouterInfoF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/RouterF.h ../../include/Ice/LocalObjectF.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/Proxy.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/CommunicatorF.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/Router.h ../../include/Ice/Outgoing.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/Ice/BasicStream.h ../../include/Ice/InstanceF.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/Ice/StringConverter.h ../../include/IceUtil/Unicode.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/ServantManagerF.h ../../include/Ice/Direct.h ../../include/Ice/BuiltinSequences.h ../../include/Ice/LocalException.h ../../include/Ice/Connection.h ../../include/Ice/Functional.h ../../include/IceUtil/Functional.h ../Ice/Reference.h ../../include/IceUtil/RecMutex.h ../Ice/ReferenceFactoryF.h ../../include/Ice/LocatorF.h ../Ice/LocatorInfoF.h ../Ice/SharedContext.h
-Router$(OBJEXT): Router.cpp ../../include/Ice/Router.h ../../include/Ice/LocalObjectF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/Proxy.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/CommunicatorF.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/Outgoing.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/Ice/BasicStream.h ../../include/Ice/InstanceF.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/Ice/StringConverter.h ../../include/IceUtil/Unicode.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/ServantManagerF.h ../../include/Ice/Direct.h ../../include/Ice/BuiltinSequences.h ../../include/Ice/LocalException.h ../../include/Ice/ObjectFactory.h ../../include/IceUtil/Iterator.h ../../include/IceUtil/ScopedArray.h ../../include/IceUtil/DisableWarnings.h
-ServantLocator$(OBJEXT): ServantLocator.cpp ../../include/Ice/ServantLocator.h ../../include/Ice/LocalObjectF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/BasicStream.h ../../include/Ice/InstanceF.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/Ice/StringConverter.h ../../include/IceUtil/Unicode.h ../../include/Ice/Object.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/StreamF.h ../../include/IceUtil/Iterator.h ../../include/IceUtil/ScopedArray.h ../../include/IceUtil/DisableWarnings.h
-ServantManager$(OBJEXT): ServantManager.cpp ../Ice/ServantManager.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/Ice/ServantManagerF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/InstanceF.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/LocalObjectF.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/Identity.h ../../include/Ice/FacetMap.h ../../include/Ice/ServantLocator.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/LocalException.h ../../include/Ice/Proxy.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/StreamF.h ../../include/Ice/CommunicatorF.h ../../include/Ice/BuiltinSequences.h ../../include/Ice/LoggerUtil.h ../../include/Ice/LoggerF.h ../Ice/Instance.h ../../include/IceUtil/RecMutex.h ../../include/IceUtil/Timer.h ../../include/IceUtil/Thread.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/Ice/StatsF.h ../Ice/TraceLevelsF.h ../Ice/DefaultsAndOverridesF.h ../Ice/RouterInfoF.h ../Ice/LocatorInfoF.h ../Ice/ReferenceFactoryF.h ../Ice/ThreadPoolF.h ../../include/Ice/ConnectionFactoryF.h ../../include/Ice/ConnectionMonitorF.h ../Ice/ObjectFactoryManagerF.h ../../include/Ice/ObjectAdapterFactoryF.h ../Ice/EndpointFactoryManagerF.h ../../include/Ice/DynamicLibraryF.h ../../include/Ice/PluginF.h ../../include/Ice/Initialize.h ../../include/Ice/PropertiesF.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/StringConverter.h ../Ice/SharedContext.h ../Ice/ImplicitContextI.h ../../include/Ice/ImplicitContext.h ../../include/Ice/Process.h ../../include/Ice/Outgoing.h ../../include/Ice/BasicStream.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/IceUtil/Unicode.h ../../include/Ice/OutgoingAsync.h ../../include/Ice/Incoming.h ../../include/Ice/Direct.h ../../include/IceUtil/StringUtil.h
-Service$(OBJEXT): Service.cpp ../../include/IceUtil/DisableWarnings.h ../../include/IceUtil/CtrlCHandler.h ../../include/IceUtil/Config.h ../../include/IceUtil/Exception.h ../../include/IceUtil/Thread.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/IceUtil/ArgVector.h ../../include/Ice/Service.h ../../include/Ice/Ice.h ../../include/Ice/Initialize.h ../../include/Ice/CommunicatorF.h ../../include/Ice/LocalObjectF.h ../../include/Ice/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/PropertiesF.h ../../include/Ice/Proxy.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/InstanceF.h ../../include/Ice/LoggerF.h ../../include/Ice/StatsF.h ../../include/Ice/StringConverter.h ../../include/Ice/BuiltinSequences.h ../../include/Ice/LocalException.h ../../include/Ice/Properties.h ../../include/Ice/Outgoing.h ../../include/Ice/BasicStream.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/IceUtil/Unicode.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/ServantManagerF.h ../../include/Ice/Direct.h ../../include/Ice/Logger.h ../../include/Ice/LoggerUtil.h ../../include/Ice/Stats.h ../../include/Ice/Communicator.h ../../include/Ice/RouterF.h ../../include/Ice/LocatorF.h ../../include/Ice/PluginF.h ../../include/Ice/ImplicitContextF.h ../../include/Ice/ObjectFactory.h ../../include/Ice/ObjectAdapter.h ../../include/Ice/FacetMap.h ../../include/Ice/ServantLocator.h ../../include/Ice/OutgoingAsync.h ../../include/IceUtil/RecMutex.h ../../include/Ice/IncomingAsync.h ../../include/Ice/Process.h ../../include/Ice/Application.h ../../include/Ice/Connection.h ../../include/Ice/Functional.h ../../include/IceUtil/Functional.h ../../include/Ice/Stream.h ../../include/Ice/ImplicitContext.h ../../include/Ice/Locator.h ../../include/Ice/UserExceptionFactory.h ../../include/Ice/FactoryTable.h ../../include/Ice/FactoryTableDef.h ../../include/IceUtil/StaticMutex.h ../../include/Ice/UserExceptionFactoryF.h ../../include/Ice/ProcessF.h ../../include/Ice/Router.h ../../include/Ice/DispatchInterceptor.h ../../include/Ice/IconvStringConverter.h ../Ice/LoggerI.h ../Ice/Network.h
-SliceChecksumDict$(OBJEXT): SliceChecksumDict.cpp ../../include/Ice/SliceChecksumDict.h ../../include/Ice/LocalObjectF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/BasicStream.h ../../include/Ice/InstanceF.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/Ice/StringConverter.h ../../include/IceUtil/Unicode.h ../../include/Ice/Object.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/IceUtil/Iterator.h ../../include/IceUtil/ScopedArray.h ../../include/IceUtil/DisableWarnings.h
-SliceChecksums$(OBJEXT): SliceChecksums.cpp ../../include/Ice/SliceChecksums.h ../../include/Ice/SliceChecksumDict.h ../../include/Ice/LocalObjectF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/UndefSysMacros.h ../../include/IceUtil/StaticMutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h
-Stats$(OBJEXT): Stats.cpp ../../include/Ice/Stats.h ../../include/Ice/LocalObjectF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/UndefSysMacros.h ../../include/IceUtil/Iterator.h ../../include/IceUtil/ScopedArray.h ../../include/IceUtil/DisableWarnings.h
-StreamI$(OBJEXT): StreamI.cpp ../Ice/StreamI.h ../../include/Ice/Stream.h ../../include/Ice/StreamF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/CommunicatorF.h ../../include/Ice/LocalObjectF.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/Object.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/BasicStream.h ../../include/Ice/InstanceF.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/Ice/StringConverter.h ../../include/IceUtil/Unicode.h ../../include/Ice/Initialize.h ../../include/Ice/PropertiesF.h ../../include/Ice/Proxy.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/LoggerF.h ../../include/Ice/StatsF.h ../../include/Ice/BuiltinSequences.h
-Stream$(OBJEXT): Stream.cpp ../../include/Ice/Stream.h ../../include/Ice/StreamF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/CommunicatorF.h ../../include/Ice/LocalObjectF.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/Object.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h
-StringConverter$(OBJEXT): StringConverter.cpp ../../include/Ice/StringConverter.h ../../include/Ice/Config.h ../../include/IceUtil/Config.h ../../include/IceUtil/Exception.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Handle.h ../../include/IceUtil/IceUtil.h ../../include/IceUtil/AbstractMutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Algorithm.h ../../include/IceUtil/ArgVector.h ../../include/IceUtil/Base64.h ../../include/IceUtil/Cache.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/CountDownLatch.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/IceUtil/CtrlCHandler.h ../../include/IceUtil/Functional.h ../../include/IceUtil/InputUtil.h ../../include/IceUtil/Iterator.h ../../include/IceUtil/MD5.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Options.h ../../include/IceUtil/RecMutex.h ../../include/IceUtil/OutputUtil.h ../../include/IceUtil/RWRecMutex.h ../../include/IceUtil/Thread.h ../../include/IceUtil/Random.h ../../include/IceUtil/ScopedArray.h ../../include/IceUtil/StaticMutex.h ../../include/IceUtil/StringUtil.h ../../include/IceUtil/UUID.h ../../include/IceUtil/Unicode.h ../../include/IceUtil/Timer.h ../../include/Ice/LocalException.h ../../include/Ice/LocalObjectF.h ../../include/Ice/Handle.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/Proxy.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/CommunicatorF.h ../../include/Ice/BuiltinSequences.h
+ProtocolPluginFacade$(OBJEXT): ProtocolPluginFacade.cpp ../../include/Ice/ProtocolPluginFacade.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/Ice/ProtocolPluginFacadeF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/CommunicatorF.h ../../include/Ice/LocalObjectF.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/EndpointFactoryF.h ../../include/Ice/InstanceF.h ../../include/Ice/EndpointIF.h ../Ice/Instance.h ../../include/IceUtil/RecMutex.h ../../include/IceUtil/Timer.h ../../include/IceUtil/Thread.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/Ice/StatsF.h ../Ice/TraceLevelsF.h ../Ice/DefaultsAndOverridesF.h ../Ice/RouterInfoF.h ../Ice/LocatorInfoF.h ../Ice/ReferenceFactoryF.h ../../include/Ice/ProxyFactoryF.h ../Ice/ThreadPoolF.h ../Ice/SelectorThreadF.h ../../include/Ice/ConnectionFactoryF.h ../../include/Ice/ConnectionMonitorF.h ../Ice/ObjectFactoryManagerF.h ../../include/Ice/ObjectAdapterFactoryF.h ../Ice/EndpointFactoryManagerF.h ../../include/Ice/DynamicLibraryF.h ../../include/Ice/PluginF.h ../../include/Ice/Initialize.h ../../include/Ice/PropertiesF.h ../../include/Ice/Proxy.h ../../include/Ice/ConnectionIF.h ../../include/Ice/RequestHandlerF.h ../../include/Ice/Endpoint.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/LoggerF.h ../../include/Ice/StringConverter.h ../../include/Ice/BuiltinSequences.h ../Ice/SharedContext.h ../Ice/ImplicitContextI.h ../../include/Ice/ImplicitContext.h ../../include/Ice/LocalException.h ../../include/Ice/FacetMap.h ../../include/Ice/Process.h ../../include/Ice/Outgoing.h ../../include/Ice/BasicStream.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/IceUtil/Unicode.h ../../include/Ice/OutgoingAsync.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/ServantManagerF.h ../../include/Ice/Direct.h ../Ice/EndpointFactoryManager.h ../Ice/TraceLevels.h ../Ice/DefaultsAndOverrides.h
+ProxyFactory$(OBJEXT): ProxyFactory.cpp ../../include/IceUtil/Thread.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Time.h ../Ice/ProxyFactory.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/InstanceF.h ../../include/Ice/ReferenceF.h ../../include/Ice/ProxyF.h ../../include/Ice/Exception.h ../Ice/Instance.h ../../include/IceUtil/RecMutex.h ../../include/IceUtil/Timer.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/Ice/CommunicatorF.h ../../include/Ice/LocalObjectF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/LocalObject.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/StatsF.h ../Ice/TraceLevelsF.h ../Ice/DefaultsAndOverridesF.h ../Ice/RouterInfoF.h ../Ice/LocatorInfoF.h ../Ice/ReferenceFactoryF.h ../Ice/ThreadPoolF.h ../Ice/SelectorThreadF.h ../../include/Ice/ConnectionFactoryF.h ../../include/Ice/ConnectionMonitorF.h ../Ice/ObjectFactoryManagerF.h ../../include/Ice/ObjectAdapterFactoryF.h ../Ice/EndpointFactoryManagerF.h ../../include/Ice/DynamicLibraryF.h ../../include/Ice/PluginF.h ../../include/Ice/Initialize.h ../../include/Ice/PropertiesF.h ../../include/Ice/Proxy.h ../../include/Ice/ConnectionIF.h ../../include/Ice/RequestHandlerF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/LoggerF.h ../../include/Ice/StringConverter.h ../../include/Ice/BuiltinSequences.h ../Ice/SharedContext.h ../Ice/ImplicitContextI.h ../../include/Ice/ImplicitContext.h ../../include/Ice/LocalException.h ../../include/Ice/FacetMap.h ../../include/Ice/Process.h ../../include/Ice/Outgoing.h ../../include/Ice/BasicStream.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/IceUtil/Unicode.h ../../include/Ice/OutgoingAsync.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/ServantManagerF.h ../../include/Ice/Direct.h ../Ice/ReferenceFactory.h ../Ice/Reference.h ../../include/Ice/RouterF.h ../../include/Ice/LocatorF.h ../Ice/LocatorInfo.h ../../include/Ice/Properties.h ../../include/Ice/LoggerUtil.h ../Ice/TraceLevels.h
+Proxy$(OBJEXT): Proxy.cpp ../../include/Ice/Proxy.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/Ice/ProxyF.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/IceUtil/Handle.h ../../include/Ice/Handle.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/LocalObject.h ../../include/Ice/LocalObjectF.h ../../include/Ice/RequestHandlerF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/CommunicatorF.h ../Ice/ProxyFactory.h ../../include/Ice/InstanceF.h ../Ice/ReferenceFactory.h ../Ice/ReferenceFactoryF.h ../Ice/Reference.h ../../include/IceUtil/RecMutex.h ../../include/Ice/RouterF.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/LocatorF.h ../Ice/RouterInfoF.h ../Ice/LocatorInfoF.h ../Ice/SharedContext.h ../../include/Ice/BuiltinSequences.h ../Ice/ObjectAdapterFactory.h ../Ice/ObjectAdapterI.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/Ice/ObjectAdapter.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/FacetMap.h ../../include/Ice/ObjectAdapterFactoryF.h ../../include/Ice/ConnectionFactoryF.h ../../include/Ice/ServantManagerF.h ../Ice/ConnectorF.h ../Ice/ThreadPoolF.h ../../include/Ice/Outgoing.h ../../include/Ice/BasicStream.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/Ice/StringConverter.h ../../include/IceUtil/Unicode.h ../../include/Ice/OutgoingAsync.h ../../include/IceUtil/Timer.h ../../include/IceUtil/Thread.h ../Ice/ConnectRequestHandler.h ../Ice/RequestHandler.h ../Ice/RouterInfo.h ../Ice/ConnectionRequestHandler.h ../../include/Ice/Direct.h ../Ice/EndpointI.h ../Ice/TransceiverF.h ../Ice/AcceptorF.h ../Ice/Instance.h ../../include/Ice/StatsF.h ../Ice/TraceLevelsF.h ../Ice/DefaultsAndOverridesF.h ../Ice/SelectorThreadF.h ../../include/Ice/ConnectionMonitorF.h ../Ice/ObjectFactoryManagerF.h ../Ice/EndpointFactoryManagerF.h ../../include/Ice/DynamicLibraryF.h ../../include/Ice/PluginF.h ../../include/Ice/Initialize.h ../../include/Ice/PropertiesF.h ../../include/Ice/LoggerF.h ../Ice/ImplicitContextI.h ../../include/Ice/ImplicitContext.h ../../include/Ice/LocalException.h ../../include/Ice/Process.h ../../include/Ice/Incoming.h ../Ice/LocatorInfo.h ../Ice/ConnectionI.h ../../include/Ice/Connection.h ../Ice/EventHandler.h ../Ice/EventHandlerF.h ../Ice/SelectorThread.h ../Ice/Selector.h ../../include/Ice/Stream.h
+ReferenceFactory$(OBJEXT): ReferenceFactory.cpp ../../include/Ice/Communicator.h ../../include/Ice/LocalObjectF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/Proxy.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/RequestHandlerF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/CommunicatorF.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/LoggerF.h ../../include/Ice/StatsF.h ../../include/Ice/PropertiesF.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/RouterF.h ../../include/Ice/LocatorF.h ../../include/Ice/PluginF.h ../../include/Ice/ImplicitContextF.h ../Ice/ReferenceFactory.h ../Ice/ReferenceFactoryF.h ../Ice/Reference.h ../../include/IceUtil/RecMutex.h ../../include/Ice/InstanceF.h ../Ice/RouterInfoF.h ../Ice/LocatorInfoF.h ../Ice/SharedContext.h ../../include/Ice/BuiltinSequences.h ../Ice/ProxyFactory.h ../../include/Ice/LocalException.h ../Ice/Instance.h ../../include/IceUtil/Timer.h ../../include/IceUtil/Thread.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../Ice/TraceLevelsF.h ../Ice/DefaultsAndOverridesF.h ../Ice/ThreadPoolF.h ../Ice/SelectorThreadF.h ../../include/Ice/ConnectionFactoryF.h ../../include/Ice/ConnectionMonitorF.h ../Ice/ObjectFactoryManagerF.h ../../include/Ice/ObjectAdapterFactoryF.h ../Ice/EndpointFactoryManagerF.h ../../include/Ice/DynamicLibraryF.h ../../include/Ice/Initialize.h ../../include/Ice/StringConverter.h ../Ice/ImplicitContextI.h ../../include/Ice/ImplicitContext.h ../../include/Ice/FacetMap.h ../../include/Ice/Process.h ../../include/Ice/Outgoing.h ../../include/Ice/BasicStream.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/IceUtil/Unicode.h ../../include/Ice/OutgoingAsync.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/ServantManagerF.h ../../include/Ice/Direct.h ../Ice/EndpointI.h ../Ice/TransceiverF.h ../Ice/ConnectorF.h ../Ice/AcceptorF.h ../Ice/EndpointFactoryManager.h ../../include/Ice/EndpointFactoryF.h ../Ice/RouterInfo.h ../../include/Ice/Router.h ../Ice/LocatorInfo.h ../../include/Ice/Locator.h ../../include/Ice/IncomingAsync.h ../../include/Ice/UserExceptionFactory.h ../../include/Ice/FactoryTable.h ../../include/Ice/FactoryTableDef.h ../../include/IceUtil/StaticMutex.h ../../include/Ice/UserExceptionFactoryF.h ../../include/Ice/ProcessF.h ../../include/Ice/LoggerUtil.h ../../include/Ice/Properties.h ../Ice/DefaultsAndOverrides.h ../Ice/PropertyNames.h ../../include/IceUtil/StringUtil.h
+Reference$(OBJEXT): Reference.cpp ../Ice/Reference.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/IceUtil/RecMutex.h ../../include/Ice/ReferenceF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../Ice/ReferenceFactoryF.h ../../include/Ice/EndpointIF.h ../../include/Ice/LocalObject.h ../../include/Ice/LocalObjectF.h ../../include/Ice/InstanceF.h ../../include/Ice/RouterF.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/Proxy.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/RequestHandlerF.h ../../include/Ice/Endpoint.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/CommunicatorF.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/LocatorF.h ../Ice/RouterInfoF.h ../Ice/LocatorInfoF.h ../Ice/SharedContext.h ../Ice/ReferenceFactory.h ../../include/Ice/BuiltinSequences.h ../../include/Ice/LocalException.h ../Ice/Instance.h ../../include/IceUtil/Timer.h ../../include/IceUtil/Thread.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/Ice/StatsF.h ../Ice/TraceLevelsF.h ../Ice/DefaultsAndOverridesF.h ../Ice/ThreadPoolF.h ../Ice/SelectorThreadF.h ../../include/Ice/ConnectionFactoryF.h ../../include/Ice/ConnectionMonitorF.h ../Ice/ObjectFactoryManagerF.h ../../include/Ice/ObjectAdapterFactoryF.h ../Ice/EndpointFactoryManagerF.h ../../include/Ice/DynamicLibraryF.h ../../include/Ice/PluginF.h ../../include/Ice/Initialize.h ../../include/Ice/PropertiesF.h ../../include/Ice/LoggerF.h ../../include/Ice/StringConverter.h ../Ice/ImplicitContextI.h ../../include/Ice/ImplicitContext.h ../../include/Ice/FacetMap.h ../../include/Ice/Process.h ../../include/Ice/Outgoing.h ../../include/Ice/BasicStream.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/IceUtil/Unicode.h ../../include/Ice/OutgoingAsync.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/ServantManagerF.h ../../include/Ice/Direct.h ../Ice/EndpointI.h ../Ice/TransceiverF.h ../Ice/ConnectorF.h ../Ice/AcceptorF.h ../Ice/RouterInfo.h ../../include/Ice/Router.h ../Ice/LocatorInfo.h ../../include/Ice/Locator.h ../../include/Ice/IncomingAsync.h ../../include/Ice/UserExceptionFactory.h ../../include/Ice/FactoryTable.h ../../include/Ice/FactoryTableDef.h ../../include/IceUtil/StaticMutex.h ../../include/Ice/UserExceptionFactoryF.h ../../include/Ice/ProcessF.h ../../include/Ice/Functional.h ../../include/IceUtil/Functional.h ../Ice/ConnectionI.h ../../include/Ice/Connection.h ../Ice/EventHandler.h ../Ice/EventHandlerF.h ../Ice/SelectorThread.h ../Ice/Selector.h ../Ice/ConnectionFactory.h ../../include/Ice/LoggerUtil.h ../Ice/TraceLevels.h ../Ice/DefaultsAndOverrides.h ../../include/IceUtil/StringUtil.h ../../include/IceUtil/Random.h
+RequestHandler$(OBJEXT): RequestHandler.cpp ../Ice/RequestHandler.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/Ice/RequestHandlerF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/LocalObject.h ../../include/Ice/LocalObjectF.h
+RouterInfo$(OBJEXT): RouterInfo.cpp ../Ice/RouterInfo.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../Ice/RouterInfoF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/RouterF.h ../../include/Ice/LocalObjectF.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/Proxy.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/RequestHandlerF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/CommunicatorF.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/BuiltinSequences.h ../../include/Ice/Router.h ../../include/Ice/Outgoing.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/Ice/InstanceF.h ../../include/Ice/BasicStream.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/Ice/StringConverter.h ../../include/IceUtil/Unicode.h ../../include/Ice/OutgoingAsync.h ../../include/IceUtil/Timer.h ../../include/IceUtil/Thread.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/ServantManagerF.h ../../include/Ice/Direct.h ../../include/Ice/LocalException.h ../../include/Ice/Connection.h ../../include/Ice/Functional.h ../../include/IceUtil/Functional.h ../Ice/Reference.h ../../include/IceUtil/RecMutex.h ../Ice/ReferenceFactoryF.h ../../include/Ice/LocatorF.h ../Ice/LocatorInfoF.h ../Ice/SharedContext.h
+Router$(OBJEXT): Router.cpp ../../include/Ice/Router.h ../../include/Ice/LocalObjectF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/Proxy.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/RequestHandlerF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/CommunicatorF.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/Outgoing.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/Ice/InstanceF.h ../../include/Ice/BasicStream.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/Ice/StringConverter.h ../../include/IceUtil/Unicode.h ../../include/Ice/OutgoingAsync.h ../../include/IceUtil/Timer.h ../../include/IceUtil/Thread.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/ServantManagerF.h ../../include/Ice/Direct.h ../../include/Ice/BuiltinSequences.h ../../include/Ice/LocalException.h ../../include/Ice/ObjectFactory.h ../../include/IceUtil/Iterator.h ../../include/IceUtil/ScopedArray.h ../../include/IceUtil/DisableWarnings.h
+Selector$(OBJEXT): Selector.cpp ../../include/IceUtil/DisableWarnings.h ../Ice/Selector.h ../../include/Ice/Config.h ../../include/IceUtil/Config.h ../../include/Ice/InstanceF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/ProxyHandle.h ../Ice/Network.h ../../include/Ice/PropertiesF.h ../../include/Ice/LocalObjectF.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/Proxy.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/RequestHandlerF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/CommunicatorF.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/LoggerF.h ../Ice/Instance.h ../../include/IceUtil/RecMutex.h ../../include/IceUtil/Timer.h ../../include/IceUtil/Thread.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/Ice/StatsF.h ../Ice/TraceLevelsF.h ../Ice/DefaultsAndOverridesF.h ../Ice/RouterInfoF.h ../Ice/LocatorInfoF.h ../Ice/ReferenceFactoryF.h ../Ice/ThreadPoolF.h ../Ice/SelectorThreadF.h ../../include/Ice/ConnectionFactoryF.h ../../include/Ice/ConnectionMonitorF.h ../Ice/ObjectFactoryManagerF.h ../../include/Ice/ObjectAdapterFactoryF.h ../Ice/EndpointFactoryManagerF.h ../../include/Ice/DynamicLibraryF.h ../../include/Ice/PluginF.h ../../include/Ice/Initialize.h ../../include/Ice/StringConverter.h ../../include/Ice/BuiltinSequences.h ../Ice/SharedContext.h ../Ice/ImplicitContextI.h ../../include/Ice/ImplicitContext.h ../../include/Ice/LocalException.h ../../include/Ice/FacetMap.h ../../include/Ice/Process.h ../../include/Ice/Outgoing.h ../../include/Ice/BasicStream.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/IceUtil/Unicode.h ../../include/Ice/OutgoingAsync.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/ServantManagerF.h ../../include/Ice/Direct.h ../../include/Ice/LoggerUtil.h
+SelectorThread$(OBJEXT): SelectorThread.cpp ../../include/IceUtil/DisableWarnings.h ../Ice/SelectorThread.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/IceUtil/Thread.h ../../include/IceUtil/Timer.h ../../include/Ice/Config.h ../Ice/SelectorThreadF.h ../../include/Ice/Handle.h ../../include/Ice/ProxyHandle.h ../../include/Ice/InstanceF.h ../Ice/Selector.h ../Ice/Network.h ../../include/Ice/PropertiesF.h ../../include/Ice/LocalObjectF.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/Proxy.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/RequestHandlerF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/CommunicatorF.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/LoggerF.h ../Ice/Instance.h ../../include/IceUtil/RecMutex.h ../../include/Ice/StatsF.h ../Ice/TraceLevelsF.h ../Ice/DefaultsAndOverridesF.h ../Ice/RouterInfoF.h ../Ice/LocatorInfoF.h ../Ice/ReferenceFactoryF.h ../Ice/ThreadPoolF.h ../../include/Ice/ConnectionFactoryF.h ../../include/Ice/ConnectionMonitorF.h ../Ice/ObjectFactoryManagerF.h ../../include/Ice/ObjectAdapterFactoryF.h ../Ice/EndpointFactoryManagerF.h ../../include/Ice/DynamicLibraryF.h ../../include/Ice/PluginF.h ../../include/Ice/Initialize.h ../../include/Ice/StringConverter.h ../../include/Ice/BuiltinSequences.h ../Ice/SharedContext.h ../Ice/ImplicitContextI.h ../../include/Ice/ImplicitContext.h ../../include/Ice/LocalException.h ../../include/Ice/FacetMap.h ../../include/Ice/Process.h ../../include/Ice/Outgoing.h ../../include/Ice/BasicStream.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/IceUtil/Unicode.h ../../include/Ice/OutgoingAsync.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/ServantManagerF.h ../../include/Ice/Direct.h ../../include/Ice/LoggerUtil.h
+ServantLocator$(OBJEXT): ServantLocator.cpp ../../include/Ice/ServantLocator.h ../../include/Ice/LocalObjectF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/BasicStream.h ../../include/Ice/InstanceF.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/Ice/StringConverter.h ../../include/IceUtil/Unicode.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/StreamF.h ../../include/IceUtil/Iterator.h ../../include/IceUtil/ScopedArray.h ../../include/IceUtil/DisableWarnings.h
+ServantManager$(OBJEXT): ServantManager.cpp ../Ice/ServantManager.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/Ice/ServantManagerF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/InstanceF.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/LocalObjectF.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/Identity.h ../../include/Ice/FacetMap.h ../../include/Ice/ServantLocator.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/LocalException.h ../../include/Ice/Proxy.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/RequestHandlerF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/StreamF.h ../../include/Ice/CommunicatorF.h ../../include/Ice/BuiltinSequences.h ../../include/Ice/LoggerUtil.h ../../include/Ice/LoggerF.h ../Ice/Instance.h ../../include/IceUtil/RecMutex.h ../../include/IceUtil/Timer.h ../../include/IceUtil/Thread.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/Ice/StatsF.h ../Ice/TraceLevelsF.h ../Ice/DefaultsAndOverridesF.h ../Ice/RouterInfoF.h ../Ice/LocatorInfoF.h ../Ice/ReferenceFactoryF.h ../Ice/ThreadPoolF.h ../Ice/SelectorThreadF.h ../../include/Ice/ConnectionFactoryF.h ../../include/Ice/ConnectionMonitorF.h ../Ice/ObjectFactoryManagerF.h ../../include/Ice/ObjectAdapterFactoryF.h ../Ice/EndpointFactoryManagerF.h ../../include/Ice/DynamicLibraryF.h ../../include/Ice/PluginF.h ../../include/Ice/Initialize.h ../../include/Ice/PropertiesF.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/StringConverter.h ../Ice/SharedContext.h ../Ice/ImplicitContextI.h ../../include/Ice/ImplicitContext.h ../../include/Ice/Process.h ../../include/Ice/Outgoing.h ../../include/Ice/BasicStream.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/IceUtil/Unicode.h ../../include/Ice/OutgoingAsync.h ../../include/Ice/Incoming.h ../../include/Ice/Direct.h ../../include/IceUtil/StringUtil.h
+Service$(OBJEXT): Service.cpp ../../include/IceUtil/DisableWarnings.h ../../include/IceUtil/CtrlCHandler.h ../../include/IceUtil/Config.h ../../include/IceUtil/Exception.h ../../include/IceUtil/Thread.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/IceUtil/ArgVector.h ../../include/Ice/Service.h ../../include/Ice/Ice.h ../../include/Ice/Initialize.h ../../include/Ice/CommunicatorF.h ../../include/Ice/LocalObjectF.h ../../include/Ice/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/PropertiesF.h ../../include/Ice/Proxy.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/RequestHandlerF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/InstanceF.h ../../include/Ice/LoggerF.h ../../include/Ice/StatsF.h ../../include/Ice/StringConverter.h ../../include/Ice/BuiltinSequences.h ../../include/Ice/LocalException.h ../../include/Ice/Properties.h ../../include/Ice/Outgoing.h ../../include/Ice/BasicStream.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/IceUtil/Unicode.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/ServantManagerF.h ../../include/Ice/Direct.h ../../include/Ice/Logger.h ../../include/Ice/LoggerUtil.h ../../include/Ice/Stats.h ../../include/Ice/Communicator.h ../../include/Ice/RouterF.h ../../include/Ice/LocatorF.h ../../include/Ice/PluginF.h ../../include/Ice/ImplicitContextF.h ../../include/Ice/ObjectFactory.h ../../include/Ice/ObjectAdapter.h ../../include/Ice/FacetMap.h ../../include/Ice/ServantLocator.h ../../include/Ice/OutgoingAsync.h ../../include/IceUtil/Timer.h ../../include/Ice/IncomingAsync.h ../../include/Ice/Process.h ../../include/Ice/Application.h ../../include/Ice/Connection.h ../../include/Ice/Functional.h ../../include/IceUtil/Functional.h ../../include/Ice/Stream.h ../../include/Ice/ImplicitContext.h ../../include/Ice/Locator.h ../../include/Ice/UserExceptionFactory.h ../../include/Ice/FactoryTable.h ../../include/Ice/FactoryTableDef.h ../../include/IceUtil/StaticMutex.h ../../include/Ice/UserExceptionFactoryF.h ../../include/Ice/ProcessF.h ../../include/Ice/Router.h ../../include/Ice/DispatchInterceptor.h ../../include/Ice/IconvStringConverter.h ../Ice/LoggerI.h ../Ice/Network.h
+SliceChecksumDict$(OBJEXT): SliceChecksumDict.cpp ../../include/Ice/SliceChecksumDict.h ../../include/Ice/LocalObjectF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/BasicStream.h ../../include/Ice/InstanceF.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/Ice/StringConverter.h ../../include/IceUtil/Unicode.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/IceUtil/Iterator.h ../../include/IceUtil/ScopedArray.h ../../include/IceUtil/DisableWarnings.h
+SliceChecksums$(OBJEXT): SliceChecksums.cpp ../../include/Ice/SliceChecksums.h ../../include/Ice/SliceChecksumDict.h ../../include/Ice/LocalObjectF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/UndefSysMacros.h ../../include/IceUtil/StaticMutex.h
+Stats$(OBJEXT): Stats.cpp ../../include/Ice/Stats.h ../../include/Ice/LocalObjectF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/UndefSysMacros.h ../../include/IceUtil/Iterator.h ../../include/IceUtil/ScopedArray.h ../../include/IceUtil/DisableWarnings.h
+StreamI$(OBJEXT): StreamI.cpp ../Ice/StreamI.h ../../include/Ice/Stream.h ../../include/Ice/StreamF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/CommunicatorF.h ../../include/Ice/LocalObjectF.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/BasicStream.h ../../include/Ice/InstanceF.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/Ice/StringConverter.h ../../include/IceUtil/Unicode.h ../../include/Ice/Initialize.h ../../include/Ice/PropertiesF.h ../../include/Ice/Proxy.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/RequestHandlerF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/LoggerF.h ../../include/Ice/StatsF.h ../../include/Ice/BuiltinSequences.h
+Stream$(OBJEXT): Stream.cpp ../../include/Ice/Stream.h ../../include/Ice/StreamF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/CommunicatorF.h ../../include/Ice/LocalObjectF.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h
+StringConverter$(OBJEXT): StringConverter.cpp ../../include/Ice/StringConverter.h ../../include/Ice/Config.h ../../include/IceUtil/Config.h ../../include/IceUtil/Exception.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Handle.h ../../include/IceUtil/IceUtil.h ../../include/IceUtil/AbstractMutex.h ../../include/IceUtil/Algorithm.h ../../include/IceUtil/ArgVector.h ../../include/IceUtil/Base64.h ../../include/IceUtil/Cache.h ../../include/IceUtil/CountDownLatch.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/IceUtil/CtrlCHandler.h ../../include/IceUtil/Functional.h ../../include/IceUtil/InputUtil.h ../../include/IceUtil/Iterator.h ../../include/IceUtil/MD5.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Options.h ../../include/IceUtil/RecMutex.h ../../include/IceUtil/OutputUtil.h ../../include/IceUtil/RWRecMutex.h ../../include/IceUtil/Thread.h ../../include/IceUtil/Random.h ../../include/IceUtil/ScopedArray.h ../../include/IceUtil/StaticMutex.h ../../include/IceUtil/StringUtil.h ../../include/IceUtil/UUID.h ../../include/IceUtil/Unicode.h ../../include/IceUtil/Timer.h ../../include/Ice/LocalException.h ../../include/Ice/LocalObjectF.h ../../include/Ice/Handle.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/Proxy.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/RequestHandlerF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/CommunicatorF.h ../../include/Ice/BuiltinSequences.h
SysLoggerI$(OBJEXT): SysLoggerI.cpp ../Ice/SysLoggerI.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Config.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/Ice/Logger.h ../../include/Ice/LocalObjectF.h ../../include/IceUtil/Shared.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/UndefSysMacros.h
-TcpAcceptor$(OBJEXT): TcpAcceptor.cpp ../Ice/TcpAcceptor.h ../Ice/TransceiverF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/InstanceF.h ../Ice/TraceLevelsF.h ../../include/Ice/LoggerF.h ../../include/Ice/LocalObjectF.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/UndefSysMacros.h ../Ice/Acceptor.h ../Ice/AcceptorF.h ../Ice/TcpTransceiver.h ../../include/Ice/StatsF.h ../Ice/Transceiver.h ../Ice/Instance.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/RecMutex.h ../../include/IceUtil/Timer.h ../../include/IceUtil/Thread.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/Ice/CommunicatorF.h ../Ice/DefaultsAndOverridesF.h ../Ice/RouterInfoF.h ../Ice/LocatorInfoF.h ../Ice/ReferenceFactoryF.h ../../include/Ice/ProxyFactoryF.h ../Ice/ThreadPoolF.h ../../include/Ice/ConnectionFactoryF.h ../../include/Ice/ConnectionMonitorF.h ../Ice/ObjectFactoryManagerF.h ../../include/Ice/ObjectAdapterFactoryF.h ../Ice/EndpointFactoryManagerF.h ../../include/Ice/DynamicLibraryF.h ../../include/Ice/PluginF.h ../../include/Ice/Initialize.h ../../include/Ice/PropertiesF.h ../../include/Ice/Proxy.h ../../include/Ice/ConnectionIF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/StringConverter.h ../../include/Ice/BuiltinSequences.h ../Ice/SharedContext.h ../Ice/ImplicitContextI.h ../../include/Ice/ImplicitContext.h ../../include/Ice/LocalException.h ../../include/Ice/FacetMap.h ../../include/Ice/Process.h ../../include/Ice/Outgoing.h ../../include/Ice/BasicStream.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/IceUtil/Unicode.h ../../include/Ice/OutgoingAsync.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/ServantManagerF.h ../../include/Ice/Direct.h ../Ice/TraceLevels.h ../../include/Ice/LoggerUtil.h ../Ice/Network.h
-TcpConnector$(OBJEXT): TcpConnector.cpp ../Ice/TcpConnector.h ../Ice/TransceiverF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/InstanceF.h ../Ice/TraceLevelsF.h ../../include/Ice/LoggerF.h ../../include/Ice/LocalObjectF.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/UndefSysMacros.h ../Ice/Connector.h ../Ice/ConnectorF.h ../Ice/TcpTransceiver.h ../../include/Ice/StatsF.h ../Ice/Transceiver.h ../Ice/TcpEndpointI.h ../Ice/EndpointI.h ../../include/Ice/Endpoint.h ../../include/Ice/EndpointIF.h ../Ice/AcceptorF.h ../../include/Ice/EndpointFactory.h ../../include/Ice/EndpointFactoryF.h ../Ice/Instance.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/RecMutex.h ../../include/IceUtil/Timer.h ../../include/IceUtil/Thread.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/Ice/CommunicatorF.h ../Ice/DefaultsAndOverridesF.h ../Ice/RouterInfoF.h ../Ice/LocatorInfoF.h ../Ice/ReferenceFactoryF.h ../../include/Ice/ProxyFactoryF.h ../Ice/ThreadPoolF.h ../../include/Ice/ConnectionFactoryF.h ../../include/Ice/ConnectionMonitorF.h ../Ice/ObjectFactoryManagerF.h ../../include/Ice/ObjectAdapterFactoryF.h ../Ice/EndpointFactoryManagerF.h ../../include/Ice/DynamicLibraryF.h ../../include/Ice/PluginF.h ../../include/Ice/Initialize.h ../../include/Ice/PropertiesF.h ../../include/Ice/Proxy.h ../../include/Ice/ConnectionIF.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/StringConverter.h ../../include/Ice/BuiltinSequences.h ../Ice/SharedContext.h ../Ice/ImplicitContextI.h ../../include/Ice/ImplicitContext.h ../../include/Ice/LocalException.h ../../include/Ice/FacetMap.h ../../include/Ice/Process.h ../../include/Ice/Outgoing.h ../../include/Ice/BasicStream.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/IceUtil/Unicode.h ../../include/Ice/OutgoingAsync.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/ServantManagerF.h ../../include/Ice/Direct.h ../Ice/TraceLevels.h ../../include/Ice/LoggerUtil.h ../Ice/Network.h
-TcpEndpointI$(OBJEXT): TcpEndpointI.cpp ../Ice/TcpEndpointI.h ../Ice/EndpointI.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/Ice/Endpoint.h ../../include/Ice/LocalObjectF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/EndpointIF.h ../../include/Ice/InstanceF.h ../Ice/TransceiverF.h ../Ice/ConnectorF.h ../Ice/AcceptorF.h ../../include/Ice/EndpointFactory.h ../../include/Ice/EndpointFactoryF.h ../Ice/Network.h ../../include/Ice/PropertiesF.h ../../include/Ice/Proxy.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/CommunicatorF.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/LoggerF.h ../Ice/TcpAcceptor.h ../Ice/TraceLevelsF.h ../Ice/Acceptor.h ../Ice/TcpConnector.h ../Ice/Connector.h ../Ice/TcpTransceiver.h ../../include/Ice/StatsF.h ../Ice/Transceiver.h ../../include/Ice/BasicStream.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/Ice/StringConverter.h ../../include/IceUtil/Unicode.h ../../include/Ice/LocalException.h ../../include/Ice/BuiltinSequences.h ../Ice/Instance.h ../../include/IceUtil/RecMutex.h ../../include/IceUtil/Timer.h ../../include/IceUtil/Thread.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../Ice/DefaultsAndOverridesF.h ../Ice/RouterInfoF.h ../Ice/LocatorInfoF.h ../Ice/ReferenceFactoryF.h ../Ice/ThreadPoolF.h ../../include/Ice/ConnectionFactoryF.h ../../include/Ice/ConnectionMonitorF.h ../Ice/ObjectFactoryManagerF.h ../../include/Ice/ObjectAdapterFactoryF.h ../Ice/EndpointFactoryManagerF.h ../../include/Ice/DynamicLibraryF.h ../../include/Ice/PluginF.h ../../include/Ice/Initialize.h ../Ice/SharedContext.h ../Ice/ImplicitContextI.h ../../include/Ice/ImplicitContext.h ../../include/Ice/FacetMap.h ../../include/Ice/Process.h ../../include/Ice/Outgoing.h ../../include/Ice/OutgoingAsync.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/ServantManagerF.h ../../include/Ice/Direct.h ../Ice/DefaultsAndOverrides.h
-TcpTransceiver$(OBJEXT): TcpTransceiver.cpp ../Ice/TcpTransceiver.h ../../include/Ice/InstanceF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../Ice/TraceLevelsF.h ../../include/Ice/LoggerF.h ../../include/Ice/LocalObjectF.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/StatsF.h ../Ice/Transceiver.h ../Ice/TransceiverF.h ../Ice/Instance.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/RecMutex.h ../../include/IceUtil/Timer.h ../../include/IceUtil/Thread.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/Ice/CommunicatorF.h ../Ice/DefaultsAndOverridesF.h ../Ice/RouterInfoF.h ../Ice/LocatorInfoF.h ../Ice/ReferenceFactoryF.h ../../include/Ice/ProxyFactoryF.h ../Ice/ThreadPoolF.h ../../include/Ice/ConnectionFactoryF.h ../../include/Ice/ConnectionMonitorF.h ../Ice/ObjectFactoryManagerF.h ../../include/Ice/ObjectAdapterFactoryF.h ../Ice/EndpointFactoryManagerF.h ../../include/Ice/DynamicLibraryF.h ../../include/Ice/PluginF.h ../../include/Ice/Initialize.h ../../include/Ice/PropertiesF.h ../../include/Ice/Proxy.h ../../include/Ice/ConnectionIF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/StringConverter.h ../../include/Ice/BuiltinSequences.h ../Ice/SharedContext.h ../Ice/ImplicitContextI.h ../../include/Ice/ImplicitContext.h ../../include/Ice/LocalException.h ../../include/Ice/FacetMap.h ../../include/Ice/Process.h ../../include/Ice/Outgoing.h ../../include/Ice/BasicStream.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/IceUtil/Unicode.h ../../include/Ice/OutgoingAsync.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/ServantManagerF.h ../../include/Ice/Direct.h ../Ice/TraceLevels.h ../../include/Ice/LoggerUtil.h ../../include/Ice/Stats.h ../Ice/Network.h
-ThreadPool$(OBJEXT): ThreadPool.cpp ../../include/IceUtil/DisableWarnings.h ../Ice/ThreadPool.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/IceUtil/Thread.h ../../include/IceUtil/Handle.h ../Ice/ThreadPoolF.h ../../include/Ice/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/InstanceF.h ../../include/Ice/LoggerF.h ../../include/Ice/LocalObjectF.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/PropertiesF.h ../../include/Ice/Proxy.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/CommunicatorF.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../Ice/EventHandlerF.h ../Ice/EventHandler.h ../../include/Ice/BasicStream.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/Ice/StringConverter.h ../../include/IceUtil/Unicode.h ../Ice/Network.h ../../include/Ice/LocalException.h ../../include/Ice/BuiltinSequences.h ../Ice/Instance.h ../../include/IceUtil/RecMutex.h ../../include/IceUtil/Timer.h ../../include/Ice/StatsF.h ../Ice/TraceLevelsF.h ../Ice/DefaultsAndOverridesF.h ../Ice/RouterInfoF.h ../Ice/LocatorInfoF.h ../Ice/ReferenceFactoryF.h ../../include/Ice/ConnectionFactoryF.h ../../include/Ice/ConnectionMonitorF.h ../Ice/ObjectFactoryManagerF.h ../../include/Ice/ObjectAdapterFactoryF.h ../Ice/EndpointFactoryManagerF.h ../../include/Ice/DynamicLibraryF.h ../../include/Ice/PluginF.h ../../include/Ice/Initialize.h ../Ice/SharedContext.h ../Ice/ImplicitContextI.h ../../include/Ice/ImplicitContext.h ../../include/Ice/FacetMap.h ../../include/Ice/Process.h ../../include/Ice/Outgoing.h ../../include/Ice/OutgoingAsync.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/ServantManagerF.h ../../include/Ice/Direct.h ../../include/Ice/LoggerUtil.h ../../include/Ice/Functional.h ../../include/IceUtil/Functional.h ../Ice/ObjectAdapterFactory.h ../Ice/ObjectAdapterI.h ../../include/Ice/ObjectAdapter.h ../../include/Ice/RouterF.h ../../include/Ice/LocatorF.h ../Ice/ConnectorF.h ../../include/Ice/Properties.h
-TraceLevels$(OBJEXT): TraceLevels.cpp ../Ice/TraceLevels.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../Ice/TraceLevelsF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/PropertiesF.h ../../include/Ice/LocalObjectF.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/Proxy.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/CommunicatorF.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/Properties.h ../../include/Ice/Outgoing.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/Ice/BasicStream.h ../../include/Ice/InstanceF.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/Ice/StringConverter.h ../../include/IceUtil/Unicode.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/ServantManagerF.h ../../include/Ice/Direct.h ../../include/Ice/BuiltinSequences.h
-TraceUtil$(OBJEXT): TraceUtil.cpp ../../include/IceUtil/StaticMutex.h ../../include/IceUtil/Config.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/IceUtil/StringUtil.h ../Ice/TraceUtil.h ../../include/Ice/LoggerF.h ../../include/Ice/LocalObjectF.h ../../include/IceUtil/Shared.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/UndefSysMacros.h ../Ice/TraceLevelsF.h ../Ice/Instance.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/RecMutex.h ../../include/IceUtil/Timer.h ../../include/IceUtil/Thread.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/Ice/InstanceF.h ../../include/Ice/CommunicatorF.h ../../include/Ice/StatsF.h ../Ice/DefaultsAndOverridesF.h ../Ice/RouterInfoF.h ../Ice/LocatorInfoF.h ../Ice/ReferenceFactoryF.h ../../include/Ice/ProxyFactoryF.h ../Ice/ThreadPoolF.h ../../include/Ice/ConnectionFactoryF.h ../../include/Ice/ConnectionMonitorF.h ../Ice/ObjectFactoryManagerF.h ../../include/Ice/ObjectAdapterFactoryF.h ../Ice/EndpointFactoryManagerF.h ../../include/Ice/DynamicLibraryF.h ../../include/Ice/PluginF.h ../../include/Ice/Initialize.h ../../include/Ice/PropertiesF.h ../../include/Ice/Proxy.h ../../include/Ice/ConnectionIF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/StringConverter.h ../../include/Ice/BuiltinSequences.h ../Ice/SharedContext.h ../Ice/ImplicitContextI.h ../../include/Ice/ImplicitContext.h ../../include/Ice/LocalException.h ../../include/Ice/FacetMap.h ../../include/Ice/Process.h ../../include/Ice/Outgoing.h ../../include/Ice/BasicStream.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/IceUtil/Unicode.h ../../include/Ice/OutgoingAsync.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/ServantManagerF.h ../../include/Ice/Direct.h ../Ice/TraceLevels.h ../../include/Ice/Logger.h ../Ice/ReplyStatus.h
-Transceiver$(OBJEXT): Transceiver.cpp ../Ice/Transceiver.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../Ice/TransceiverF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h
-UdpConnector$(OBJEXT): UdpConnector.cpp ../Ice/UdpConnector.h ../Ice/TransceiverF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/InstanceF.h ../Ice/Connector.h ../Ice/ConnectorF.h ../Ice/UdpTransceiver.h ../Ice/TraceLevelsF.h ../../include/Ice/LoggerF.h ../../include/Ice/LocalObjectF.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/StatsF.h ../Ice/Transceiver.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../Ice/UdpEndpointI.h ../Ice/EndpointI.h ../../include/Ice/Endpoint.h ../../include/Ice/EndpointIF.h ../Ice/AcceptorF.h ../../include/Ice/EndpointFactory.h ../../include/Ice/EndpointFactoryF.h ../Ice/Network.h ../../include/Ice/PropertiesF.h ../../include/Ice/Proxy.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/CommunicatorF.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/LocalException.h ../../include/Ice/BuiltinSequences.h
-UdpEndpointI$(OBJEXT): UdpEndpointI.cpp ../Ice/UdpEndpointI.h ../Ice/EndpointI.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/Ice/Endpoint.h ../../include/Ice/LocalObjectF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/EndpointIF.h ../../include/Ice/InstanceF.h ../Ice/TransceiverF.h ../Ice/ConnectorF.h ../Ice/AcceptorF.h ../../include/Ice/EndpointFactory.h ../../include/Ice/EndpointFactoryF.h ../Ice/Network.h ../../include/Ice/PropertiesF.h ../../include/Ice/Proxy.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/CommunicatorF.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/LoggerF.h ../Ice/UdpConnector.h ../Ice/Connector.h ../Ice/UdpTransceiver.h ../Ice/TraceLevelsF.h ../../include/Ice/StatsF.h ../Ice/Transceiver.h ../../include/Ice/BasicStream.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/Ice/StringConverter.h ../../include/IceUtil/Unicode.h ../../include/Ice/LocalException.h ../../include/Ice/BuiltinSequences.h ../Ice/Instance.h ../../include/IceUtil/RecMutex.h ../../include/IceUtil/Timer.h ../../include/IceUtil/Thread.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../Ice/DefaultsAndOverridesF.h ../Ice/RouterInfoF.h ../Ice/LocatorInfoF.h ../Ice/ReferenceFactoryF.h ../Ice/ThreadPoolF.h ../../include/Ice/ConnectionFactoryF.h ../../include/Ice/ConnectionMonitorF.h ../Ice/ObjectFactoryManagerF.h ../../include/Ice/ObjectAdapterFactoryF.h ../Ice/EndpointFactoryManagerF.h ../../include/Ice/DynamicLibraryF.h ../../include/Ice/PluginF.h ../../include/Ice/Initialize.h ../Ice/SharedContext.h ../Ice/ImplicitContextI.h ../../include/Ice/ImplicitContext.h ../../include/Ice/FacetMap.h ../../include/Ice/Process.h ../../include/Ice/Outgoing.h ../../include/Ice/OutgoingAsync.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/ServantManagerF.h ../../include/Ice/Direct.h ../Ice/DefaultsAndOverrides.h
-UdpTransceiver$(OBJEXT): UdpTransceiver.cpp ../Ice/UdpTransceiver.h ../../include/Ice/InstanceF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../Ice/TraceLevelsF.h ../../include/Ice/LoggerF.h ../../include/Ice/LocalObjectF.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/StatsF.h ../Ice/Transceiver.h ../Ice/TransceiverF.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../Ice/Instance.h ../../include/IceUtil/RecMutex.h ../../include/IceUtil/Timer.h ../../include/IceUtil/Thread.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/Ice/CommunicatorF.h ../Ice/DefaultsAndOverridesF.h ../Ice/RouterInfoF.h ../Ice/LocatorInfoF.h ../Ice/ReferenceFactoryF.h ../../include/Ice/ProxyFactoryF.h ../Ice/ThreadPoolF.h ../../include/Ice/ConnectionFactoryF.h ../../include/Ice/ConnectionMonitorF.h ../Ice/ObjectFactoryManagerF.h ../../include/Ice/ObjectAdapterFactoryF.h ../Ice/EndpointFactoryManagerF.h ../../include/Ice/DynamicLibraryF.h ../../include/Ice/PluginF.h ../../include/Ice/Initialize.h ../../include/Ice/PropertiesF.h ../../include/Ice/Proxy.h ../../include/Ice/ConnectionIF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/StringConverter.h ../../include/Ice/BuiltinSequences.h ../Ice/SharedContext.h ../Ice/ImplicitContextI.h ../../include/Ice/ImplicitContext.h ../../include/Ice/LocalException.h ../../include/Ice/FacetMap.h ../../include/Ice/Process.h ../../include/Ice/Outgoing.h ../../include/Ice/BasicStream.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/IceUtil/Unicode.h ../../include/Ice/OutgoingAsync.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/ServantManagerF.h ../../include/Ice/Direct.h ../Ice/TraceLevels.h ../../include/Ice/LoggerUtil.h ../../include/Ice/Stats.h ../Ice/Network.h ../../include/Ice/Properties.h
-UnknownEndpointI$(OBJEXT): UnknownEndpointI.cpp ../Ice/UnknownEndpointI.h ../Ice/EndpointI.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/Ice/Endpoint.h ../../include/Ice/LocalObjectF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/EndpointIF.h ../../include/Ice/InstanceF.h ../Ice/TransceiverF.h ../Ice/ConnectorF.h ../Ice/AcceptorF.h ../../include/Ice/EndpointFactory.h ../../include/Ice/EndpointFactoryF.h ../../include/Ice/BasicStream.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/Ice/StringConverter.h ../../include/IceUtil/Unicode.h ../Ice/Instance.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/RecMutex.h ../../include/IceUtil/Timer.h ../../include/IceUtil/Thread.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/Ice/CommunicatorF.h ../../include/Ice/StatsF.h ../Ice/TraceLevelsF.h ../Ice/DefaultsAndOverridesF.h ../Ice/RouterInfoF.h ../Ice/LocatorInfoF.h ../Ice/ReferenceFactoryF.h ../../include/Ice/ProxyFactoryF.h ../Ice/ThreadPoolF.h ../../include/Ice/ConnectionFactoryF.h ../../include/Ice/ConnectionMonitorF.h ../Ice/ObjectFactoryManagerF.h ../../include/Ice/ObjectAdapterFactoryF.h ../Ice/EndpointFactoryManagerF.h ../../include/Ice/DynamicLibraryF.h ../../include/Ice/PluginF.h ../../include/Ice/Initialize.h ../../include/Ice/PropertiesF.h ../../include/Ice/Proxy.h ../../include/Ice/ConnectionIF.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/LoggerF.h ../../include/Ice/BuiltinSequences.h ../Ice/SharedContext.h ../Ice/ImplicitContextI.h ../../include/Ice/ImplicitContext.h ../../include/Ice/LocalException.h ../../include/Ice/FacetMap.h ../../include/Ice/Process.h ../../include/Ice/Outgoing.h ../../include/Ice/OutgoingAsync.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/ServantManagerF.h ../../include/Ice/Direct.h ../../include/IceUtil/Base64.h
-DLLMain$(OBJEXT): DLLMain.cpp ../Ice/EventLoggerI.h ../../include/Ice/Logger.h ../../include/Ice/LocalObjectF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/UndefSysMacros.h ../Ice/ImplicitContextI.h ../../include/Ice/ImplicitContext.h ../../include/Ice/Proxy.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/CommunicatorF.h ../../include/Ice/LocalException.h ../../include/Ice/BuiltinSequences.h ../../include/Ice/Service.h ../../include/Ice/Ice.h ../../include/Ice/Initialize.h ../../include/Ice/PropertiesF.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/InstanceF.h ../../include/Ice/LoggerF.h ../../include/Ice/StatsF.h ../../include/Ice/StringConverter.h ../../include/Ice/Properties.h ../../include/Ice/Outgoing.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/Ice/BasicStream.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/IceUtil/Unicode.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/ServantManagerF.h ../../include/Ice/Direct.h ../../include/Ice/LoggerUtil.h ../../include/Ice/Stats.h ../../include/Ice/Communicator.h ../../include/Ice/RouterF.h ../../include/Ice/LocatorF.h ../../include/Ice/PluginF.h ../../include/Ice/ImplicitContextF.h ../../include/Ice/ObjectFactory.h ../../include/Ice/ObjectAdapter.h ../../include/Ice/FacetMap.h ../../include/Ice/ServantLocator.h ../../include/Ice/OutgoingAsync.h ../../include/IceUtil/RecMutex.h ../../include/Ice/IncomingAsync.h ../../include/Ice/Process.h ../../include/Ice/Application.h ../../include/Ice/Connection.h ../../include/Ice/Functional.h ../../include/IceUtil/Functional.h ../../include/Ice/Stream.h ../../include/Ice/Locator.h ../../include/Ice/UserExceptionFactory.h ../../include/Ice/FactoryTable.h ../../include/Ice/FactoryTableDef.h ../../include/IceUtil/StaticMutex.h ../../include/Ice/UserExceptionFactoryF.h ../../include/Ice/ProcessF.h ../../include/Ice/Router.h ../../include/Ice/DispatchInterceptor.h ../../include/Ice/IconvStringConverter.h
-EventLoggerI$(OBJEXT): EventLoggerI.cpp ../Ice/EventLoggerI.h ../../include/Ice/Logger.h ../../include/Ice/LocalObjectF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/UndefSysMacros.h ../Ice/EventLoggerMsg.h ../../include/Ice/LocalException.h ../../include/Ice/Proxy.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/CommunicatorF.h ../../include/Ice/BuiltinSequences.h ../Ice/Network.h ../../include/Ice/PropertiesF.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/LoggerF.h ../../include/IceUtil/StaticMutex.h
+TcpAcceptor$(OBJEXT): TcpAcceptor.cpp ../Ice/TcpAcceptor.h ../Ice/TransceiverF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/InstanceF.h ../Ice/TraceLevelsF.h ../../include/Ice/LoggerF.h ../../include/Ice/LocalObjectF.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/UndefSysMacros.h ../Ice/Acceptor.h ../Ice/AcceptorF.h ../Ice/TcpTransceiver.h ../../include/Ice/StatsF.h ../Ice/Transceiver.h ../Ice/Selector.h ../Ice/Instance.h ../../include/IceUtil/RecMutex.h ../../include/IceUtil/Timer.h ../../include/IceUtil/Thread.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/Ice/CommunicatorF.h ../Ice/DefaultsAndOverridesF.h ../Ice/RouterInfoF.h ../Ice/LocatorInfoF.h ../Ice/ReferenceFactoryF.h ../../include/Ice/ProxyFactoryF.h ../Ice/ThreadPoolF.h ../Ice/SelectorThreadF.h ../../include/Ice/ConnectionFactoryF.h ../../include/Ice/ConnectionMonitorF.h ../Ice/ObjectFactoryManagerF.h ../../include/Ice/ObjectAdapterFactoryF.h ../Ice/EndpointFactoryManagerF.h ../../include/Ice/DynamicLibraryF.h ../../include/Ice/PluginF.h ../../include/Ice/Initialize.h ../../include/Ice/PropertiesF.h ../../include/Ice/Proxy.h ../../include/Ice/ConnectionIF.h ../../include/Ice/RequestHandlerF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/StringConverter.h ../../include/Ice/BuiltinSequences.h ../Ice/SharedContext.h ../Ice/ImplicitContextI.h ../../include/Ice/ImplicitContext.h ../../include/Ice/LocalException.h ../../include/Ice/FacetMap.h ../../include/Ice/Process.h ../../include/Ice/Outgoing.h ../../include/Ice/BasicStream.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/IceUtil/Unicode.h ../../include/Ice/OutgoingAsync.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/ServantManagerF.h ../../include/Ice/Direct.h ../Ice/TraceLevels.h ../../include/Ice/LoggerUtil.h ../Ice/Network.h
+TcpConnector$(OBJEXT): TcpConnector.cpp ../Ice/TcpConnector.h ../Ice/TransceiverF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/InstanceF.h ../Ice/TraceLevelsF.h ../../include/Ice/LoggerF.h ../../include/Ice/LocalObjectF.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/UndefSysMacros.h ../Ice/Connector.h ../Ice/ConnectorF.h ../Ice/TcpTransceiver.h ../../include/Ice/StatsF.h ../Ice/Transceiver.h ../Ice/Selector.h ../Ice/TcpEndpointI.h ../Ice/EndpointI.h ../../include/IceUtil/Thread.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/Ice/Endpoint.h ../../include/Ice/EndpointIF.h ../Ice/AcceptorF.h ../../include/Ice/EndpointFactory.h ../../include/Ice/EndpointFactoryF.h ../Ice/Instance.h ../../include/IceUtil/RecMutex.h ../../include/IceUtil/Timer.h ../../include/Ice/CommunicatorF.h ../Ice/DefaultsAndOverridesF.h ../Ice/RouterInfoF.h ../Ice/LocatorInfoF.h ../Ice/ReferenceFactoryF.h ../../include/Ice/ProxyFactoryF.h ../Ice/ThreadPoolF.h ../Ice/SelectorThreadF.h ../../include/Ice/ConnectionFactoryF.h ../../include/Ice/ConnectionMonitorF.h ../Ice/ObjectFactoryManagerF.h ../../include/Ice/ObjectAdapterFactoryF.h ../Ice/EndpointFactoryManagerF.h ../../include/Ice/DynamicLibraryF.h ../../include/Ice/PluginF.h ../../include/Ice/Initialize.h ../../include/Ice/PropertiesF.h ../../include/Ice/Proxy.h ../../include/Ice/ConnectionIF.h ../../include/Ice/RequestHandlerF.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/StringConverter.h ../../include/Ice/BuiltinSequences.h ../Ice/SharedContext.h ../Ice/ImplicitContextI.h ../../include/Ice/ImplicitContext.h ../../include/Ice/LocalException.h ../../include/Ice/FacetMap.h ../../include/Ice/Process.h ../../include/Ice/Outgoing.h ../../include/Ice/BasicStream.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/IceUtil/Unicode.h ../../include/Ice/OutgoingAsync.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/ServantManagerF.h ../../include/Ice/Direct.h ../Ice/TraceLevels.h ../../include/Ice/LoggerUtil.h ../Ice/Network.h
+TcpEndpointI$(OBJEXT): TcpEndpointI.cpp ../Ice/TcpEndpointI.h ../Ice/EndpointI.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/IceUtil/Thread.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/Ice/Endpoint.h ../../include/Ice/LocalObjectF.h ../../include/Ice/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/EndpointIF.h ../../include/Ice/InstanceF.h ../Ice/TransceiverF.h ../Ice/ConnectorF.h ../Ice/AcceptorF.h ../../include/Ice/EndpointFactory.h ../../include/Ice/EndpointFactoryF.h ../Ice/Network.h ../../include/Ice/PropertiesF.h ../../include/Ice/Proxy.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/RequestHandlerF.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/CommunicatorF.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/LoggerF.h ../Ice/TcpAcceptor.h ../Ice/TraceLevelsF.h ../Ice/Acceptor.h ../Ice/TcpConnector.h ../Ice/Connector.h ../Ice/TcpTransceiver.h ../../include/Ice/StatsF.h ../Ice/Transceiver.h ../Ice/Selector.h ../../include/Ice/BasicStream.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/Ice/StringConverter.h ../../include/IceUtil/Unicode.h ../../include/Ice/LocalException.h ../../include/Ice/BuiltinSequences.h ../Ice/Instance.h ../../include/IceUtil/RecMutex.h ../../include/IceUtil/Timer.h ../Ice/DefaultsAndOverridesF.h ../Ice/RouterInfoF.h ../Ice/LocatorInfoF.h ../Ice/ReferenceFactoryF.h ../Ice/ThreadPoolF.h ../Ice/SelectorThreadF.h ../../include/Ice/ConnectionFactoryF.h ../../include/Ice/ConnectionMonitorF.h ../Ice/ObjectFactoryManagerF.h ../../include/Ice/ObjectAdapterFactoryF.h ../Ice/EndpointFactoryManagerF.h ../../include/Ice/DynamicLibraryF.h ../../include/Ice/PluginF.h ../../include/Ice/Initialize.h ../Ice/SharedContext.h ../Ice/ImplicitContextI.h ../../include/Ice/ImplicitContext.h ../../include/Ice/FacetMap.h ../../include/Ice/Process.h ../../include/Ice/Outgoing.h ../../include/Ice/OutgoingAsync.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/ServantManagerF.h ../../include/Ice/Direct.h ../Ice/DefaultsAndOverrides.h
+TcpTransceiver$(OBJEXT): TcpTransceiver.cpp ../Ice/TcpTransceiver.h ../../include/Ice/InstanceF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../Ice/TraceLevelsF.h ../../include/Ice/LoggerF.h ../../include/Ice/LocalObjectF.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/StatsF.h ../Ice/Transceiver.h ../Ice/TransceiverF.h ../Ice/Selector.h ../Ice/Instance.h ../../include/IceUtil/RecMutex.h ../../include/IceUtil/Timer.h ../../include/IceUtil/Thread.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/Ice/CommunicatorF.h ../Ice/DefaultsAndOverridesF.h ../Ice/RouterInfoF.h ../Ice/LocatorInfoF.h ../Ice/ReferenceFactoryF.h ../../include/Ice/ProxyFactoryF.h ../Ice/ThreadPoolF.h ../Ice/SelectorThreadF.h ../../include/Ice/ConnectionFactoryF.h ../../include/Ice/ConnectionMonitorF.h ../Ice/ObjectFactoryManagerF.h ../../include/Ice/ObjectAdapterFactoryF.h ../Ice/EndpointFactoryManagerF.h ../../include/Ice/DynamicLibraryF.h ../../include/Ice/PluginF.h ../../include/Ice/Initialize.h ../../include/Ice/PropertiesF.h ../../include/Ice/Proxy.h ../../include/Ice/ConnectionIF.h ../../include/Ice/RequestHandlerF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/StringConverter.h ../../include/Ice/BuiltinSequences.h ../Ice/SharedContext.h ../Ice/ImplicitContextI.h ../../include/Ice/ImplicitContext.h ../../include/Ice/LocalException.h ../../include/Ice/FacetMap.h ../../include/Ice/Process.h ../../include/Ice/Outgoing.h ../../include/Ice/BasicStream.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/IceUtil/Unicode.h ../../include/Ice/OutgoingAsync.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/ServantManagerF.h ../../include/Ice/Direct.h ../Ice/TraceLevels.h ../../include/Ice/LoggerUtil.h ../../include/Ice/Stats.h ../Ice/Network.h
+ThreadPool$(OBJEXT): ThreadPool.cpp ../../include/IceUtil/DisableWarnings.h ../Ice/ThreadPool.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/IceUtil/Thread.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../Ice/ThreadPoolF.h ../../include/Ice/Handle.h ../../include/Ice/ProxyHandle.h ../../include/Ice/InstanceF.h ../../include/Ice/LoggerF.h ../../include/Ice/LocalObjectF.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/PropertiesF.h ../../include/Ice/Proxy.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/RequestHandlerF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/CommunicatorF.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../Ice/EventHandlerF.h ../Ice/Selector.h ../Ice/EventHandler.h ../../include/Ice/BasicStream.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/Ice/StringConverter.h ../../include/IceUtil/Unicode.h ../Ice/Network.h ../../include/Ice/LocalException.h ../../include/Ice/BuiltinSequences.h ../Ice/Instance.h ../../include/IceUtil/RecMutex.h ../../include/IceUtil/Timer.h ../../include/Ice/StatsF.h ../Ice/TraceLevelsF.h ../Ice/DefaultsAndOverridesF.h ../Ice/RouterInfoF.h ../Ice/LocatorInfoF.h ../Ice/ReferenceFactoryF.h ../Ice/SelectorThreadF.h ../../include/Ice/ConnectionFactoryF.h ../../include/Ice/ConnectionMonitorF.h ../Ice/ObjectFactoryManagerF.h ../../include/Ice/ObjectAdapterFactoryF.h ../Ice/EndpointFactoryManagerF.h ../../include/Ice/DynamicLibraryF.h ../../include/Ice/PluginF.h ../../include/Ice/Initialize.h ../Ice/SharedContext.h ../Ice/ImplicitContextI.h ../../include/Ice/ImplicitContext.h ../../include/Ice/FacetMap.h ../../include/Ice/Process.h ../../include/Ice/Outgoing.h ../../include/Ice/OutgoingAsync.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/ServantManagerF.h ../../include/Ice/Direct.h ../../include/Ice/LoggerUtil.h ../../include/Ice/Functional.h ../../include/IceUtil/Functional.h ../Ice/ObjectAdapterFactory.h ../Ice/ObjectAdapterI.h ../../include/Ice/ObjectAdapter.h ../../include/Ice/RouterF.h ../../include/Ice/LocatorF.h ../Ice/ConnectorF.h ../../include/Ice/Properties.h
+TraceLevels$(OBJEXT): TraceLevels.cpp ../Ice/TraceLevels.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../Ice/TraceLevelsF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/PropertiesF.h ../../include/Ice/LocalObjectF.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/Proxy.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/RequestHandlerF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/CommunicatorF.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/Properties.h ../../include/Ice/Outgoing.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/Ice/InstanceF.h ../../include/Ice/BasicStream.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/Ice/StringConverter.h ../../include/IceUtil/Unicode.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/ServantManagerF.h ../../include/Ice/Direct.h ../../include/Ice/BuiltinSequences.h
+TraceUtil$(OBJEXT): TraceUtil.cpp ../../include/IceUtil/StaticMutex.h ../../include/IceUtil/Config.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/IceUtil/StringUtil.h ../Ice/TraceUtil.h ../../include/Ice/LoggerF.h ../../include/Ice/LocalObjectF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Mutex.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/UndefSysMacros.h ../Ice/TraceLevelsF.h ../Ice/Instance.h ../../include/IceUtil/RecMutex.h ../../include/IceUtil/Timer.h ../../include/IceUtil/Thread.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/Ice/InstanceF.h ../../include/Ice/CommunicatorF.h ../../include/Ice/StatsF.h ../Ice/DefaultsAndOverridesF.h ../Ice/RouterInfoF.h ../Ice/LocatorInfoF.h ../Ice/ReferenceFactoryF.h ../../include/Ice/ProxyFactoryF.h ../Ice/ThreadPoolF.h ../Ice/SelectorThreadF.h ../../include/Ice/ConnectionFactoryF.h ../../include/Ice/ConnectionMonitorF.h ../Ice/ObjectFactoryManagerF.h ../../include/Ice/ObjectAdapterFactoryF.h ../Ice/EndpointFactoryManagerF.h ../../include/Ice/DynamicLibraryF.h ../../include/Ice/PluginF.h ../../include/Ice/Initialize.h ../../include/Ice/PropertiesF.h ../../include/Ice/Proxy.h ../../include/Ice/ConnectionIF.h ../../include/Ice/RequestHandlerF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/StringConverter.h ../../include/Ice/BuiltinSequences.h ../Ice/SharedContext.h ../Ice/ImplicitContextI.h ../../include/Ice/ImplicitContext.h ../../include/Ice/LocalException.h ../../include/Ice/FacetMap.h ../../include/Ice/Process.h ../../include/Ice/Outgoing.h ../../include/Ice/BasicStream.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/IceUtil/Unicode.h ../../include/Ice/OutgoingAsync.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/ServantManagerF.h ../../include/Ice/Direct.h ../Ice/TraceLevels.h ../../include/Ice/Logger.h ../Ice/ReplyStatus.h
+Transceiver$(OBJEXT): Transceiver.cpp ../Ice/Transceiver.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../Ice/TransceiverF.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../Ice/Selector.h ../../include/Ice/InstanceF.h
+UdpConnector$(OBJEXT): UdpConnector.cpp ../Ice/UdpConnector.h ../Ice/TransceiverF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/InstanceF.h ../Ice/Connector.h ../Ice/ConnectorF.h ../Ice/UdpTransceiver.h ../Ice/TraceLevelsF.h ../../include/Ice/LoggerF.h ../../include/Ice/LocalObjectF.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/StatsF.h ../Ice/Transceiver.h ../Ice/Selector.h ../Ice/UdpEndpointI.h ../Ice/EndpointI.h ../../include/IceUtil/Thread.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/Ice/Endpoint.h ../../include/Ice/EndpointIF.h ../Ice/AcceptorF.h ../../include/Ice/EndpointFactory.h ../../include/Ice/EndpointFactoryF.h ../Ice/Network.h ../../include/Ice/PropertiesF.h ../../include/Ice/Proxy.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/RequestHandlerF.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/CommunicatorF.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/LocalException.h ../../include/Ice/BuiltinSequences.h
+UdpEndpointI$(OBJEXT): UdpEndpointI.cpp ../Ice/UdpEndpointI.h ../Ice/EndpointI.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/IceUtil/Thread.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/Ice/Endpoint.h ../../include/Ice/LocalObjectF.h ../../include/Ice/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/EndpointIF.h ../../include/Ice/InstanceF.h ../Ice/TransceiverF.h ../Ice/ConnectorF.h ../Ice/AcceptorF.h ../../include/Ice/EndpointFactory.h ../../include/Ice/EndpointFactoryF.h ../Ice/Network.h ../../include/Ice/PropertiesF.h ../../include/Ice/Proxy.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/RequestHandlerF.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/CommunicatorF.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/LoggerF.h ../Ice/UdpConnector.h ../Ice/Connector.h ../Ice/UdpTransceiver.h ../Ice/TraceLevelsF.h ../../include/Ice/StatsF.h ../Ice/Transceiver.h ../Ice/Selector.h ../../include/Ice/BasicStream.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/Ice/StringConverter.h ../../include/IceUtil/Unicode.h ../../include/Ice/LocalException.h ../../include/Ice/BuiltinSequences.h ../Ice/Instance.h ../../include/IceUtil/RecMutex.h ../../include/IceUtil/Timer.h ../Ice/DefaultsAndOverridesF.h ../Ice/RouterInfoF.h ../Ice/LocatorInfoF.h ../Ice/ReferenceFactoryF.h ../Ice/ThreadPoolF.h ../Ice/SelectorThreadF.h ../../include/Ice/ConnectionFactoryF.h ../../include/Ice/ConnectionMonitorF.h ../Ice/ObjectFactoryManagerF.h ../../include/Ice/ObjectAdapterFactoryF.h ../Ice/EndpointFactoryManagerF.h ../../include/Ice/DynamicLibraryF.h ../../include/Ice/PluginF.h ../../include/Ice/Initialize.h ../Ice/SharedContext.h ../Ice/ImplicitContextI.h ../../include/Ice/ImplicitContext.h ../../include/Ice/FacetMap.h ../../include/Ice/Process.h ../../include/Ice/Outgoing.h ../../include/Ice/OutgoingAsync.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/ServantManagerF.h ../../include/Ice/Direct.h ../Ice/DefaultsAndOverrides.h
+UdpTransceiver$(OBJEXT): UdpTransceiver.cpp ../Ice/UdpTransceiver.h ../../include/Ice/InstanceF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../Ice/TraceLevelsF.h ../../include/Ice/LoggerF.h ../../include/Ice/LocalObjectF.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/StatsF.h ../Ice/Transceiver.h ../Ice/TransceiverF.h ../Ice/Selector.h ../Ice/Instance.h ../../include/IceUtil/RecMutex.h ../../include/IceUtil/Timer.h ../../include/IceUtil/Thread.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/Ice/CommunicatorF.h ../Ice/DefaultsAndOverridesF.h ../Ice/RouterInfoF.h ../Ice/LocatorInfoF.h ../Ice/ReferenceFactoryF.h ../../include/Ice/ProxyFactoryF.h ../Ice/ThreadPoolF.h ../Ice/SelectorThreadF.h ../../include/Ice/ConnectionFactoryF.h ../../include/Ice/ConnectionMonitorF.h ../Ice/ObjectFactoryManagerF.h ../../include/Ice/ObjectAdapterFactoryF.h ../Ice/EndpointFactoryManagerF.h ../../include/Ice/DynamicLibraryF.h ../../include/Ice/PluginF.h ../../include/Ice/Initialize.h ../../include/Ice/PropertiesF.h ../../include/Ice/Proxy.h ../../include/Ice/ConnectionIF.h ../../include/Ice/RequestHandlerF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/StringConverter.h ../../include/Ice/BuiltinSequences.h ../Ice/SharedContext.h ../Ice/ImplicitContextI.h ../../include/Ice/ImplicitContext.h ../../include/Ice/LocalException.h ../../include/Ice/FacetMap.h ../../include/Ice/Process.h ../../include/Ice/Outgoing.h ../../include/Ice/BasicStream.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/IceUtil/Unicode.h ../../include/Ice/OutgoingAsync.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/ServantManagerF.h ../../include/Ice/Direct.h ../Ice/TraceLevels.h ../../include/Ice/LoggerUtil.h ../../include/Ice/Stats.h ../Ice/Network.h ../../include/Ice/Properties.h
+UnknownEndpointI$(OBJEXT): UnknownEndpointI.cpp ../Ice/UnknownEndpointI.h ../Ice/EndpointI.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/IceUtil/Thread.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/Ice/Endpoint.h ../../include/Ice/LocalObjectF.h ../../include/Ice/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/UndefSysMacros.h ../../include/Ice/EndpointIF.h ../../include/Ice/InstanceF.h ../Ice/TransceiverF.h ../Ice/ConnectorF.h ../Ice/AcceptorF.h ../../include/Ice/EndpointFactory.h ../../include/Ice/EndpointFactoryF.h ../../include/Ice/BasicStream.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/Ice/StringConverter.h ../../include/IceUtil/Unicode.h ../Ice/Instance.h ../../include/IceUtil/RecMutex.h ../../include/IceUtil/Timer.h ../../include/Ice/CommunicatorF.h ../../include/Ice/StatsF.h ../Ice/TraceLevelsF.h ../Ice/DefaultsAndOverridesF.h ../Ice/RouterInfoF.h ../Ice/LocatorInfoF.h ../Ice/ReferenceFactoryF.h ../../include/Ice/ProxyFactoryF.h ../Ice/ThreadPoolF.h ../Ice/SelectorThreadF.h ../../include/Ice/ConnectionFactoryF.h ../../include/Ice/ConnectionMonitorF.h ../Ice/ObjectFactoryManagerF.h ../../include/Ice/ObjectAdapterFactoryF.h ../Ice/EndpointFactoryManagerF.h ../../include/Ice/DynamicLibraryF.h ../../include/Ice/PluginF.h ../../include/Ice/Initialize.h ../../include/Ice/PropertiesF.h ../../include/Ice/Proxy.h ../../include/Ice/ConnectionIF.h ../../include/Ice/RequestHandlerF.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/LoggerF.h ../../include/Ice/BuiltinSequences.h ../Ice/SharedContext.h ../Ice/ImplicitContextI.h ../../include/Ice/ImplicitContext.h ../../include/Ice/LocalException.h ../../include/Ice/FacetMap.h ../../include/Ice/Process.h ../../include/Ice/Outgoing.h ../../include/Ice/OutgoingAsync.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/ServantManagerF.h ../../include/Ice/Direct.h ../../include/IceUtil/Base64.h
+DLLMain$(OBJEXT): DLLMain.cpp ../Ice/EventLoggerI.h ../../include/Ice/Logger.h ../../include/Ice/LocalObjectF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/UndefSysMacros.h ../Ice/ImplicitContextI.h ../../include/Ice/ImplicitContext.h ../../include/Ice/Proxy.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/RequestHandlerF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/CommunicatorF.h ../../include/Ice/LocalException.h ../../include/Ice/BuiltinSequences.h ../../include/Ice/Service.h ../../include/Ice/Ice.h ../../include/Ice/Initialize.h ../../include/Ice/PropertiesF.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/InstanceF.h ../../include/Ice/LoggerF.h ../../include/Ice/StatsF.h ../../include/Ice/StringConverter.h ../../include/Ice/Properties.h ../../include/Ice/Outgoing.h ../../include/IceUtil/Monitor.h ../../include/IceUtil/Cond.h ../../include/IceUtil/Time.h ../../include/Ice/BasicStream.h ../../include/Ice/ObjectFactoryF.h ../../include/Ice/Buffer.h ../../include/Ice/Protocol.h ../../include/IceUtil/Unicode.h ../../include/Ice/Incoming.h ../../include/Ice/ServantLocatorF.h ../../include/Ice/ServantManagerF.h ../../include/Ice/Direct.h ../../include/Ice/LoggerUtil.h ../../include/Ice/Stats.h ../../include/Ice/Communicator.h ../../include/Ice/RouterF.h ../../include/Ice/LocatorF.h ../../include/Ice/PluginF.h ../../include/Ice/ImplicitContextF.h ../../include/Ice/ObjectFactory.h ../../include/Ice/ObjectAdapter.h ../../include/Ice/FacetMap.h ../../include/Ice/ServantLocator.h ../../include/Ice/OutgoingAsync.h ../../include/IceUtil/Timer.h ../../include/IceUtil/Thread.h ../../include/Ice/IncomingAsync.h ../../include/Ice/Process.h ../../include/Ice/Application.h ../../include/Ice/Connection.h ../../include/Ice/Functional.h ../../include/IceUtil/Functional.h ../../include/Ice/Stream.h ../../include/Ice/Locator.h ../../include/Ice/UserExceptionFactory.h ../../include/Ice/FactoryTable.h ../../include/Ice/FactoryTableDef.h ../../include/IceUtil/StaticMutex.h ../../include/Ice/UserExceptionFactoryF.h ../../include/Ice/ProcessF.h ../../include/Ice/Router.h ../../include/Ice/DispatchInterceptor.h ../../include/Ice/IconvStringConverter.h
+EventLoggerI$(OBJEXT): EventLoggerI.cpp ../Ice/EventLoggerI.h ../../include/Ice/Logger.h ../../include/Ice/LocalObjectF.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/IceUtil/Mutex.h ../../include/IceUtil/Lock.h ../../include/IceUtil/ThreadException.h ../../include/IceUtil/Exception.h ../../include/Ice/Handle.h ../../include/IceUtil/Handle.h ../../include/Ice/Config.h ../../include/Ice/ProxyHandle.h ../../include/Ice/ProxyF.h ../../include/Ice/ObjectF.h ../../include/Ice/GCCountMap.h ../../include/Ice/GCShared.h ../../include/Ice/Exception.h ../../include/Ice/LocalObject.h ../../include/Ice/UndefSysMacros.h ../Ice/EventLoggerMsg.h ../../include/Ice/LocalException.h ../../include/Ice/Proxy.h ../../include/Ice/ProxyFactoryF.h ../../include/Ice/ConnectionIF.h ../../include/Ice/RequestHandlerF.h ../../include/Ice/EndpointIF.h ../../include/Ice/Endpoint.h ../../include/Ice/ObjectAdapterF.h ../../include/Ice/ReferenceF.h ../../include/Ice/OutgoingAsyncF.h ../../include/Ice/Current.h ../../include/Ice/ConnectionF.h ../../include/Ice/Identity.h ../../include/Ice/StreamF.h ../../include/Ice/CommunicatorF.h ../../include/Ice/BuiltinSequences.h ../Ice/Network.h ../../include/Ice/PropertiesF.h ../../include/Ice/Object.h ../../include/Ice/IncomingAsyncF.h ../../include/Ice/LoggerF.h ../../include/IceUtil/StaticMutex.h
BuiltinSequences.cpp: ../../../slice/Ice/BuiltinSequences.ice
CommunicatorF.cpp: ../../../slice/Ice/CommunicatorF.ice
Communicator.cpp: ../../../slice/Ice/Communicator.ice ../../../slice/Ice/LoggerF.ice ../../../slice/Ice/StatsF.ice ../../../slice/Ice/ObjectAdapterF.ice ../../../slice/Ice/PropertiesF.ice ../../../slice/Ice/ObjectFactoryF.ice ../../../slice/Ice/RouterF.ice ../../../slice/Ice/LocatorF.ice ../../../slice/Ice/PluginF.ice ../../../slice/Ice/ImplicitContextF.ice ../../../slice/Ice/Current.ice ../../../slice/Ice/ConnectionF.ice ../../../slice/Ice/Identity.ice
diff --git a/cpp/src/Ice/ConnectRequestHandler.cpp b/cpp/src/Ice/ConnectRequestHandler.cpp
new file mode 100644
index 00000000000..f306b6c26b6
--- /dev/null
+++ b/cpp/src/Ice/ConnectRequestHandler.cpp
@@ -0,0 +1,412 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2007 ZeroC, Inc. All rights reserved.
+//
+// This copy of Ice is licensed to you under the terms described in the
+// ICE_LICENSE file included in this distribution.
+//
+// **********************************************************************
+
+#include <Ice/ConnectRequestHandler.h>
+#include <Ice/ConnectionRequestHandler.h>
+#include <Ice/Instance.h>
+#include <Ice/Proxy.h>
+#include <Ice/ConnectionI.h>
+#include <Ice/RouterInfo.h>
+#include <Ice/Outgoing.h>
+#include <Ice/OutgoingAsync.h>
+#include <Ice/Protocol.h>
+#include <Ice/Properties.h>
+
+using namespace std;
+using namespace IceInternal;
+
+ConnectRequestHandler::ConnectRequestHandler(const ReferencePtr& ref,
+ const Ice::ObjectPrx& proxy,
+ const Handle< ::IceDelegate::Ice::Object>& delegate) :
+ RequestHandler(ref),
+ _proxy(proxy),
+ _delegate(delegate),
+ _response(ref->getMode() == Reference::ModeTwoway),
+ _batchAutoFlush(
+ ref->getInstance()->initializationData().properties->getPropertyAsIntWithDefault("Ice.BatchAutoFlush", 1) > 0),
+ _initialized(false),
+ _flushing(false),
+ _batchRequestInProgress(false),
+ _batchRequestsSize(sizeof(requestBatchHdr)),
+ _batchStream(ref->getInstance().get(), _batchAutoFlush),
+ _updateRequestHandler(false)
+{
+}
+
+ConnectRequestHandler::~ConnectRequestHandler()
+{
+}
+
+RequestHandlerPtr
+ConnectRequestHandler::connect()
+{
+ _reference->getConnection(this);
+
+ Lock sync(*this);
+ if(_connection)
+ {
+ return new ConnectionRequestHandler(_reference, _connection, _compress);
+ }
+ else
+ {
+ _updateRequestHandler = true; // The proxy request handler will be updated when the connection is set.
+ return this;
+ }
+}
+
+void
+ConnectRequestHandler::prepareBatchRequest(BasicStream* os)
+{
+ {
+ Lock sync(*this);
+ while(_batchRequestInProgress)
+ {
+ wait();
+ }
+
+ if(!initialized())
+ {
+ _batchRequestInProgress = true;
+ _batchStream.swap(*os);
+ return;
+ }
+ }
+ _connection->prepareBatchRequest(os);
+}
+
+void
+ConnectRequestHandler::finishBatchRequest(BasicStream* os)
+{
+ {
+ Lock sync(*this);
+ if(!initialized())
+ {
+ assert(_batchRequestInProgress);
+ _batchRequestInProgress = false;
+ notifyAll();
+
+ _batchStream.swap(*os);
+
+ if(!_batchAutoFlush &&
+ _batchStream.b.size() + _batchRequestsSize > _reference->getInstance()->messageSizeMax())
+ {
+ throw Ice::MemoryLimitException(__FILE__, __LINE__);
+ }
+
+ _batchRequestsSize += _batchStream.b.size();
+
+ Request req;
+ req.os = new BasicStream(_reference->getInstance().get(), _batchAutoFlush);
+ req.os->swap(_batchStream);
+ _requests.push_back(req);
+ return;
+ }
+ }
+ _connection->finishBatchRequest(os, _compress);
+}
+
+void
+ConnectRequestHandler::abortBatchRequest()
+{
+ {
+ Lock sync(*this);
+ if(!initialized())
+ {
+ assert(_batchRequestInProgress);
+ _batchRequestInProgress = false;
+ notifyAll();
+
+ BasicStream dummy(_reference->getInstance().get(), _batchAutoFlush);
+ _batchStream.swap(dummy);
+ _batchRequestsSize = sizeof(requestBatchHdr);
+
+ return;
+ }
+ }
+ _connection->abortBatchRequest();
+}
+
+Ice::ConnectionI*
+ConnectRequestHandler::sendRequest(Outgoing* out)
+{
+ return (!getConnection(true)->sendRequest(out, _compress, _response) || _response) ? _connection.get() : 0;
+}
+
+void
+ConnectRequestHandler::sendAsyncRequest(const OutgoingAsyncPtr& out)
+{
+ try
+ {
+ {
+ Lock sync(*this);
+ if(!initialized())
+ {
+ Request req;
+ req.out = out;
+ _requests.push_back(req);
+ return;
+ }
+ }
+ _connection->sendAsyncRequest(out, _compress, _response);
+ }
+ catch(const LocalExceptionWrapper& ex)
+ {
+ out->__finished(ex);
+ }
+ catch(const Ice::LocalException& ex)
+ {
+ out->__finished(ex);
+ }
+}
+
+bool
+ConnectRequestHandler::flushBatchRequests(BatchOutgoing* out)
+{
+ return getConnection(true)->flushBatchRequests(out);
+}
+
+void
+ConnectRequestHandler::flushAsyncBatchRequests(const BatchOutgoingAsyncPtr& out)
+{
+ try
+ {
+ {
+ Lock sync(*this);
+ if(!initialized())
+ {
+ Request req;
+ req.batchOut = out;
+ _requests.push_back(req);
+ return;
+ }
+ }
+ _connection->flushAsyncBatchRequests(out);
+ }
+ catch(const Ice::LocalException& ex)
+ {
+ out->__finished(ex);
+ }
+}
+
+Ice::ConnectionIPtr
+ConnectRequestHandler::getConnection(bool waitInit)
+{
+ if(waitInit)
+ {
+ //
+ // Wait for the connection establishment to complete or fail.
+ //
+ Lock sync(*this);
+ while(!_initialized && !_exception.get())
+ {
+ wait();
+ }
+ }
+
+ if(_exception.get())
+ {
+ _exception->ice_throw();
+ return false; // Keep the compiler happy.
+ }
+ else
+ {
+ assert(!waitInit || _initialized);
+ return _connection;
+ }
+}
+
+void
+ConnectRequestHandler::setConnection(const Ice::ConnectionIPtr& connection, bool compress)
+{
+ {
+ Lock sync(*this);
+ _connection = connection;
+ _compress = compress;
+ }
+
+ //
+ // If this proxy is for a non-local object, and we are using a router, then
+ // add this proxy to the router info object.
+ //
+ RouterInfoPtr ri = _reference->getRouterInfo();
+ if(ri)
+ {
+ if(!ri->addProxy(_proxy, this))
+ {
+ return; // The request handler will be initialized once addProxy returns.
+ }
+ }
+
+ flushRequests();
+}
+
+void
+ConnectRequestHandler::setException(const Ice::LocalException& ex)
+{
+ {
+ Lock sync(*this);
+ _exception.reset(dynamic_cast<Ice::LocalException*>(ex.ice_clone()));
+ _proxy = 0; // Break cyclic reference count.
+ _delegate = 0; // Break cyclic reference count.
+ notifyAll();
+ }
+
+ for(vector<Request>::const_iterator p = _requests.begin(); p != _requests.end(); ++p)
+ {
+ if(p->out)
+ {
+ p->out->__finished(ex);
+ }
+ else if(p->batchOut)
+ {
+ p->batchOut->__finished(ex);
+ }
+ else
+ {
+ assert(p->os);
+ delete p->os;
+ }
+ }
+ _requests.clear();
+}
+
+void
+ConnectRequestHandler::addedProxy()
+{
+ flushRequests();
+}
+
+bool
+ConnectRequestHandler::initialized()
+{
+ // Must be called with the mutex locked.
+
+ if(_initialized)
+ {
+ assert(_connection);
+ return true;
+ }
+ else
+ {
+ while(_flushing)
+ {
+ wait();
+ }
+
+ if(_exception.get())
+ {
+ _exception->ice_throw();
+ return false; // Keep the compiler happy.
+ }
+ else
+ {
+ return _initialized;
+ }
+ }
+}
+
+void
+ConnectRequestHandler::flushRequests()
+{
+ {
+ Lock sync(*this);
+ assert(_connection);
+
+ while(_batchRequestInProgress)
+ {
+ wait();
+ }
+
+ //
+ // We set the _flushing flag to true to prevent any additional queuing. Callers
+ // might block for a little while as the queued requests are being sent but this
+ // shouldn't be an issue as the request sends are non-blocking.
+ //
+ _flushing = true;
+ }
+
+ for(vector<Request>::const_iterator p = _requests.begin(); p != _requests.end(); ++p)
+ {
+ // _requests is immutable when _flushing = true
+ if(p->out)
+ {
+ try
+ {
+ _connection->sendAsyncRequest(p->out, _compress, _response);
+ }
+ catch(const LocalExceptionWrapper& ex)
+ {
+ p->out->__finished(ex);
+ }
+ catch(const Ice::LocalException& ex)
+ {
+ p->out->__finished(ex);
+ }
+ }
+ else if(p->batchOut)
+ {
+ try
+ {
+ _connection->flushAsyncBatchRequests(p->batchOut);
+ }
+ catch(const Ice::LocalException& ex)
+ {
+ p->batchOut->__finished(ex);
+ }
+ }
+ else
+ {
+ assert(p->os);
+ if(_exception.get())
+ {
+ delete p->os;
+ }
+ else
+ {
+ //
+ // TODO: Add sendBatchRequest() method to ConnectionI?
+ //
+ try
+ {
+ BasicStream os(p->os->instance());
+ _connection->prepareBatchRequest(&os);
+ const Ice::Byte* bytes;
+ p->os->i = p->os->b.begin();
+ p->os->readBlob(bytes, p->os->b.size());
+ os.writeBlob(bytes, p->os->b.size());
+ _connection->finishBatchRequest(&os, _compress);
+ delete p->os;
+ }
+ catch(const Ice::LocalException& ex)
+ {
+ delete p->os;
+ _connection->abortBatchRequest();
+ _exception.reset(dynamic_cast<Ice::LocalException*>(ex.ice_clone()));
+ }
+ }
+ }
+ }
+ _requests.clear();
+
+ {
+ Lock sync(*this);
+ _initialized = true;
+ _flushing = false;
+ notifyAll();
+ }
+
+ if(_updateRequestHandler && !_exception.get())
+ {
+ _proxy->__setRequestHandler(_delegate, new ConnectionRequestHandler(_reference, _connection, _compress));
+ }
+ _proxy = 0; // Break cyclic reference count.
+ _delegate = 0; // Break cyclic reference count.
+}
+
+
diff --git a/cpp/src/Ice/ConnectRequestHandler.h b/cpp/src/Ice/ConnectRequestHandler.h
new file mode 100644
index 00000000000..bdf8d1b3a16
--- /dev/null
+++ b/cpp/src/Ice/ConnectRequestHandler.h
@@ -0,0 +1,88 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2007 ZeroC, Inc. All rights reserved.
+//
+// This copy of Ice is licensed to you under the terms described in the
+// ICE_LICENSE file included in this distribution.
+//
+// **********************************************************************
+
+#ifndef ICE_CONNECT_REQUEST_HANDLER_H
+#define ICE_CONNECT_REQUEST_HANDLER_H
+
+#include <IceUtil/Monitor.h>
+#include <IceUtil/Mutex.h>
+
+#include <Ice/RequestHandler.h>
+#include <Ice/Reference.h>
+#include <Ice/RouterInfo.h>
+#include <Ice/ProxyF.h>
+#include <Ice/BasicStream.h>
+
+namespace IceInternal
+{
+
+class ConnectRequestHandler : public RequestHandler,
+ public Reference::GetConnectionCallback,
+ public RouterInfo::AddProxyCallback,
+ public IceUtil::Monitor<IceUtil::Mutex>
+{
+public:
+
+ ConnectRequestHandler(const ReferencePtr&, const Ice::ObjectPrx&, const Handle< ::IceDelegate::Ice::Object>&);
+ virtual ~ConnectRequestHandler();
+
+ RequestHandlerPtr connect();
+
+ virtual void prepareBatchRequest(BasicStream*);
+ virtual void finishBatchRequest(BasicStream*);
+ virtual void abortBatchRequest();
+
+ virtual Ice::ConnectionI* sendRequest(Outgoing*);
+ virtual void sendAsyncRequest(const OutgoingAsyncPtr&);
+
+ virtual bool flushBatchRequests(BatchOutgoing*);
+ virtual void flushAsyncBatchRequests(const BatchOutgoingAsyncPtr&);
+
+ virtual Ice::ConnectionIPtr getConnection(bool);
+
+ virtual void setConnection(const Ice::ConnectionIPtr&, bool);
+ virtual void setException(const Ice::LocalException&);
+
+ virtual void addedProxy();
+
+private:
+
+ bool initialized();
+ void flushRequests();
+
+ struct Request
+ {
+ OutgoingAsyncPtr out;
+ BatchOutgoingAsyncPtr batchOut;
+ BasicStream* os;
+ };
+
+ Ice::ObjectPrx _proxy;
+ Handle< ::IceDelegate::Ice::Object> _delegate;
+
+ const bool _response;
+ const bool _batchAutoFlush;
+
+ Ice::ConnectionIPtr _connection;
+ bool _compress;
+ std::auto_ptr<Ice::LocalException> _exception;
+ bool _initialized;
+ bool _flushing;
+
+ std::vector<Request> _requests;
+ bool _batchRequestInProgress;
+ size_t _batchRequestsSize;
+ BasicStream _batchStream;
+ bool _updateRequestHandler;
+};
+typedef IceUtil::Handle<ConnectRequestHandler> ConnectRequestHandlerPtr;
+
+}
+
+#endif
diff --git a/cpp/src/Ice/ConnectionFactory.cpp b/cpp/src/Ice/ConnectionFactory.cpp
index af2b506193d..6d69a36cb84 100644
--- a/cpp/src/Ice/ConnectionFactory.cpp
+++ b/cpp/src/Ice/ConnectionFactory.cpp
@@ -38,6 +38,7 @@ IceUtil::Shared* IceInternal::upCast(IncomingConnectionFactory* p) { return p; }
namespace
{
+
struct RandomNumberGenerator : public std::unary_function<ptrdiff_t, ptrdiff_t>
{
ptrdiff_t operator()(ptrdiff_t d)
@@ -45,6 +46,22 @@ struct RandomNumberGenerator : public std::unary_function<ptrdiff_t, ptrdiff_t>
return IceUtil::random(static_cast<int>(d));
}
};
+
+}
+
+bool
+IceInternal::OutgoingConnectionFactory::ConnectorInfo::operator<(const ConnectorInfo& other) const
+{
+ if(!threadPerConnection && other.threadPerConnection)
+ {
+ return true;
+ }
+ else if(other.threadPerConnection < threadPerConnection)
+ {
+ return false;
+ }
+
+ return connector < other.connector;
}
void
@@ -60,11 +77,11 @@ IceInternal::OutgoingConnectionFactory::destroy()
#ifdef _STLP_BEGIN_NAMESPACE
// voidbind2nd is an STLport extension for broken compilers in IceUtil/Functional.h
for_each(_connections.begin(), _connections.end(),
- voidbind2nd(Ice::secondVoidMemFun1<ConnectorPtr, ConnectionI, ConnectionI::DestructionReason>
+ voidbind2nd(Ice::secondVoidMemFun1<ConnectorInfo, ConnectionI, ConnectionI::DestructionReason>
(&ConnectionI::destroy), ConnectionI::CommunicatorDestroyed));
#else
for_each(_connections.begin(), _connections.end(),
- bind2nd(Ice::secondVoidMemFun1<const ConnectorPtr, ConnectionI, ConnectionI::DestructionReason>
+ bind2nd(Ice::secondVoidMemFun1<const ConnectorInfo, ConnectionI, ConnectionI::DestructionReason>
(&ConnectionI::destroy), ConnectionI::CommunicatorDestroyed));
#endif
@@ -75,7 +92,7 @@ IceInternal::OutgoingConnectionFactory::destroy()
void
IceInternal::OutgoingConnectionFactory::waitUntilFinished()
{
- multimap<ConnectorPtr, ConnectionIPtr> connections;
+ multimap<ConnectorInfo, ConnectionIPtr> connections;
{
IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this);
@@ -85,7 +102,7 @@ IceInternal::OutgoingConnectionFactory::waitUntilFinished()
// until there are no pending connections anymore. Only then
// we can be sure the _connections contains all connections.
//
- while(!_destroyed || !_pending.empty())
+ while(!_destroyed || !_pending.empty() || !_pendingEndpoints.empty())
{
wait();
}
@@ -94,311 +111,187 @@ IceInternal::OutgoingConnectionFactory::waitUntilFinished()
// We want to wait until all connections are finished outside the
// thread synchronization.
//
- connections.swap(_connections);
+ connections = _connections;
}
for_each(connections.begin(), connections.end(),
- Ice::secondVoidMemFun<const ConnectorPtr, ConnectionI>(&ConnectionI::waitUntilFinished));
+ Ice::secondVoidMemFun<const ConnectorInfo, ConnectionI>(&ConnectionI::waitUntilFinished));
+
+ {
+ IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this);
+ _connections.clear();
+ }
}
ConnectionIPtr
-IceInternal::OutgoingConnectionFactory::create(const vector<EndpointIPtr>& endpts, bool moreEndpts,
+IceInternal::OutgoingConnectionFactory::create(const vector<EndpointIPtr>& endpts, bool hasMore,
bool threadPerConnection, Ice::EndpointSelectionType selType,
bool& compress)
{
assert(!endpts.empty());
- vector<pair<ConnectorPtr, EndpointIPtr> > connectors;
+
+ //
+ // Apply the overrides.
+ //
+ vector<EndpointIPtr> endpoints = applyOverrides(endpts);
+ //
+ // Try to find a connection to one of the given endpoints.
+ //
+ Ice::ConnectionIPtr connection = findConnection(endpoints, threadPerConnection, compress);
+ if(connection)
{
- IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this);
+ return connection;
+ }
- if(_destroyed)
- {
- throw CommunicatorDestroyedException(__FILE__, __LINE__);
- }
+ auto_ptr<Ice::LocalException> exception;
+ //
+ // If we didn't find a connection with the endpoints, we create the connectors
+ // for the endpoints.
+ //
+ vector<ConnectorInfo> connectors;
+ for(vector<EndpointIPtr>::const_iterator p = endpoints.begin(); p != endpoints.end(); ++p)
+ {
//
- // Reap connections for which destruction has completed.
+ // Create connectors for the endpoint.
//
- std::multimap<ConnectorPtr, ConnectionIPtr>::iterator p = _connections.begin();
- while(p != _connections.end())
- {
- if(p->second->isFinished())
- {
- _connections.erase(p++);
- }
- else
- {
- ++p;
- }
- }
-
- vector<EndpointIPtr> endpoints = endpts;
- vector<EndpointIPtr>::iterator q;
- for(q = endpoints.begin(); q != endpoints.end(); ++q)
+ try
{
- //
- // Modify endpoints with overrides.
- //
- if(_instance->defaultsAndOverrides()->overrideTimeout)
- {
- *q = (*q)->timeout(_instance->defaultsAndOverrides()->overrideTimeoutValue);
- }
-
- //
- // Create connectors for the endpoints.
- //
- vector<ConnectorPtr> cons = (*q)->connectors();
- assert(cons.size() > 0);
-
- //
- // Shuffle connectors is endpoint selection type is Random.
- //
+ vector<ConnectorPtr> cons = (*p)->connectors();
+ assert(!cons.empty());
+
if(selType == Random)
{
RandomNumberGenerator rng;
random_shuffle(cons.begin(), cons.end(), rng);
}
-
- vector<ConnectorPtr>::const_iterator r;
- for(r = cons.begin(); r != cons.end(); ++r)
- {
- connectors.push_back(make_pair(*r, *q));
- }
- }
-
- //
- // Search for existing connections.
- //
- vector<pair<ConnectorPtr, EndpointIPtr> >::const_iterator r;
- for(r = connectors.begin(); r != connectors.end(); ++r)
- {
- pair<multimap<ConnectorPtr, ConnectionIPtr>::iterator,
- multimap<ConnectorPtr, ConnectionIPtr>::iterator> pr = _connections.equal_range((*r).first);
- while(pr.first != pr.second)
+ for(vector<ConnectorPtr>::const_iterator r = cons.begin(); r != cons.end(); ++r)
{
- //
- // Don't return connections for which destruction has
- // been initiated. The connection must also match the
- // requested thread-per-connection setting.
- //
- if(!pr.first->second->isDestroyed() &&
- pr.first->second->threadPerConnection() == threadPerConnection)
- {
- if(_instance->defaultsAndOverrides()->overrideCompress)
- {
- compress = _instance->defaultsAndOverrides()->overrideCompressValue;
- }
- else
- {
- compress = (*r).second->compress();
- }
-
- return pr.first->second;
- }
-
- ++pr.first;
+ assert(*r);
+ connectors.push_back(ConnectorInfo(*r, *p, threadPerConnection));
}
}
-
- //
- // If some other thread is currently trying to establish a
- // connection to any of our endpoints, we wait until this
- // thread is finished.
- //
- bool searchAgain = false;
- while(!_destroyed)
+ catch(const Ice::LocalException& ex)
{
- for(r = connectors.begin(); r != connectors.end(); ++r)
- {
- if(_pending.find((*r).first) != _pending.end())
- {
- break;
- }
- }
-
- if(r == connectors.end())
- {
- break;
- }
-
- searchAgain = true;
-
- wait();
- }
-
- if(_destroyed)
- {
- throw CommunicatorDestroyedException(__FILE__, __LINE__);
- }
-
- //
- // Search for existing connections again if we waited above,
- // as new connections might have been added in the meantime.
- //
- if(searchAgain)
- {
- for(r = connectors.begin(); r != connectors.end(); ++r)
- {
- pair<multimap<ConnectorPtr, ConnectionIPtr>::iterator,
- multimap<ConnectorPtr, ConnectionIPtr>::iterator> pr = _connections.equal_range((*r).first);
-
- while(pr.first != pr.second)
- {
- //
- // Don't return connections for which destruction has
- // been initiated. The connection must also match the
- // requested thread-per-connection setting.
- //
- if(!pr.first->second->isDestroyed() &&
- pr.first->second->threadPerConnection() == threadPerConnection)
- {
- if(_instance->defaultsAndOverrides()->overrideCompress)
- {
- compress = _instance->defaultsAndOverrides()->overrideCompressValue;
- }
- else
- {
- compress = (*r).second->compress();
- }
-
- return pr.first->second;
- }
-
- ++pr.first;
- }
- }
- }
-
- //
- // No connection to any of our endpoints exists yet, so we
- // will try to create one. To avoid that other threads try to
- // create connections to the same endpoints, we add our
- // endpoints to _pending.
- //
- for(r = connectors.begin(); r != connectors.end(); ++r)
- {
- _pending.insert((*r).first);
+ exception.reset(dynamic_cast<Ice::LocalException*>(ex.ice_clone()));
+ handleException(ex, hasMore || p != endpoints.end() - 1);
}
}
- ConnectorPtr connector;
- ConnectionIPtr connection;
- auto_ptr<LocalException> exception;
+ if(connectors.empty())
+ {
+ assert(exception.get());
+ exception->ice_throw();
+ }
- vector<pair<ConnectorPtr, EndpointIPtr> >::const_iterator q;
- for(q = connectors.begin(); q != connectors.end(); ++q)
+ //
+ // Try to get a connection to one of the connectors. A null result indicates that no
+ // connection was found and that we should try to establish the connection (and that
+ // the connectors were added to _pending to prevent other threads from establishing
+ // the connection).
+ //
+ connection = getConnection(connectors, 0, compress);
+ if(connection)
+ {
+ return connection;
+ }
+
+ //
+ // Try to establish the connection to the connectors.
+ //
+ DefaultsAndOverridesPtr defaultsAndOverrides = _instance->defaultsAndOverrides();
+ for(vector<ConnectorInfo>::const_iterator p = connectors.begin(); p != connectors.end(); ++p)
{
- connector = (*q).first;
- EndpointIPtr endpoint = (*q).second;
-
try
{
-
int timeout;
- if(_instance->defaultsAndOverrides()->overrideConnectTimeout)
+ if(defaultsAndOverrides->overrideConnectTimeout)
{
- timeout = _instance->defaultsAndOverrides()->overrideConnectTimeoutValue;
+ timeout = defaultsAndOverrides->overrideConnectTimeoutValue;
}
- // It is not necessary to check for overrideTimeout,
- // the endpoint has already been modified with this
- // override, if set.
else
{
- timeout = endpoint->timeout();
+ //
+ // It is not necessary to check for overrideTimeout, the endpoint has already
+ // been modified with this override, if set.
+ //
+ timeout = p->endpoint->timeout();
}
- TransceiverPtr transceiver = connector->connect(timeout);
- assert(transceiver);
-
- connection = new ConnectionI(_instance, transceiver, endpoint->compress(false), 0, threadPerConnection,
- _instance->threadPerConnectionStackSize());
- connection->start();
- connection->validate();
+ connection = createConnection(p->connector->connect(timeout), *p);
+ connection->start(0);
- if(_instance->defaultsAndOverrides()->overrideCompress)
+ if(defaultsAndOverrides->overrideCompress)
{
- compress = _instance->defaultsAndOverrides()->overrideCompressValue;
+ compress = defaultsAndOverrides->overrideCompressValue;
}
else
{
- compress = endpoint->compress();
+ compress = p->endpoint->compress();
}
+
break;
}
- catch(const LocalException& ex)
+ catch(const Ice::CommunicatorDestroyedException& ex)
{
- exception.reset(dynamic_cast<LocalException*>(ex.ice_clone()));
-
- //
- // If a connection object was constructed, then validate()
- // must have raised the exception.
- //
- if(connection)
- {
- connection->waitUntilFinished(); // We must call waitUntilFinished() for cleanup.
- connection = 0;
- }
+ exception.reset(dynamic_cast<Ice::LocalException*>(ex.ice_clone()));
+ handleException(*exception.get(), *p, connection, hasMore || p != connectors.end() - 1);
+ connection = 0;
+ break; // No need to continue
}
-
- TraceLevelsPtr traceLevels = _instance->traceLevels();
- if(traceLevels->retry >= 2)
+ catch(const Ice::LocalException& ex)
{
- Trace out(_instance->initializationData().logger, traceLevels->retryCat);
-
- out << "connection to endpoint failed";
- if(moreEndpts || q + 1 != connectors.end())
- {
- out << ", trying next endpoint\n";
- }
- else
- {
- out << " and no more endpoints to try\n";
- }
- out << *exception.get();
+ exception.reset(dynamic_cast<Ice::LocalException*>(ex.ice_clone()));
+ handleException(*exception.get(), *p, connection, hasMore || p != connectors.end() - 1);
+ connection = 0;
}
}
-
- {
- IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this);
-
- //
- // Signal other threads that we are done with trying to
- // establish connections to our endpoints.
- //
- for(q = connectors.begin(); q != connectors.end(); ++q)
- {
- _pending.erase((*q).first);
- }
- notifyAll();
- if(!connection)
- {
- assert(exception.get());
- exception->ice_throw();
- }
- else
- {
- _connections.insert(_connections.end(), pair<const ConnectorPtr, ConnectionIPtr>(connector, connection));
+ //
+ // Finish creating the connection (this removes the connectors from the _pending
+ // list and notifies any waiting threads).
+ //
+ finishGetConnection(connectors, 0, connection);
- if(_destroyed)
- {
- connection->destroy(ConnectionI::CommunicatorDestroyed);
- throw CommunicatorDestroyedException(__FILE__, __LINE__);
- }
- else
- {
- connection->activate();
- }
- }
+ if(!connection)
+ {
+ assert(exception.get());
+ exception->ice_throw();
}
- assert(connection);
return connection;
}
void
+IceInternal::OutgoingConnectionFactory::create(const vector<EndpointIPtr>& endpts, bool hasMore,
+ bool tpc, Ice::EndpointSelectionType selType,
+ const CreateConnectionCallbackPtr& callback)
+{
+ assert(!endpts.empty());
+
+ //
+ // Apply the overrides.
+ //
+ vector<EndpointIPtr> endpoints = applyOverrides(endpts);
+
+ //
+ // Try to find a connection to one of the given endpoints.
+ //
+ bool compress;
+ Ice::ConnectionIPtr connection = findConnection(endpoints, tpc, compress);
+ if(connection)
+ {
+ callback->setConnection(connection, compress);
+ return;
+ }
+
+ ConnectCallbackPtr cb = new ConnectCallback(this, endpoints, hasMore, callback, selType, tpc);
+ cb->getConnection();
+}
+
+void
IceInternal::OutgoingConnectionFactory::setRouterInfo(const RouterInfoPtr& routerInfo)
{
IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this);
@@ -442,14 +335,14 @@ IceInternal::OutgoingConnectionFactory::setRouterInfo(const RouterInfoPtr& route
//
endpoint = endpoint->compress(false);
- multimap<ConnectorPtr, ConnectionIPtr>::const_iterator q;
+ multimap<ConnectorInfo, ConnectionIPtr>::const_iterator q;
for(q = _connections.begin(); q != _connections.end(); ++q)
{
- if((*q).second->endpoint() == endpoint)
+ if(q->second->endpoint() == endpoint)
{
try
{
- (*q).second->setAdapter(adapter);
+ q->second->setAdapter(adapter);
}
catch(const Ice::LocalException&)
{
@@ -472,7 +365,7 @@ IceInternal::OutgoingConnectionFactory::removeAdapter(const ObjectAdapterPtr& ad
return;
}
- for(multimap<ConnectorPtr, ConnectionIPtr>::const_iterator p = _connections.begin(); p != _connections.end(); ++p)
+ for(multimap<ConnectorInfo, ConnectionIPtr>::const_iterator p = _connections.begin(); p != _connections.end(); ++p)
{
if(p->second->getAdapter() == adapter)
{
@@ -497,9 +390,7 @@ IceInternal::OutgoingConnectionFactory::flushBatchRequests()
{
IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this);
-
- for(std::multimap<ConnectorPtr, ConnectionIPtr>::const_iterator p = _connections.begin();
- p != _connections.end();
+ for(multimap<ConnectorInfo, ConnectionIPtr>::const_iterator p = _connections.begin(); p != _connections.end();
++p)
{
c.push_back(p->second);
@@ -531,6 +422,668 @@ IceInternal::OutgoingConnectionFactory::~OutgoingConnectionFactory()
assert(_connections.empty());
}
+vector<EndpointIPtr>
+IceInternal::OutgoingConnectionFactory::applyOverrides(const vector<EndpointIPtr>& endpts)
+{
+ DefaultsAndOverridesPtr defaultsAndOverrides = _instance->defaultsAndOverrides();
+ vector<EndpointIPtr> endpoints = endpts;
+ for(vector<EndpointIPtr>::iterator p = endpoints.begin(); p != endpoints.end(); ++p)
+ {
+ //
+ // Modify endpoints with overrides.
+ //
+ if(defaultsAndOverrides->overrideTimeout)
+ {
+ *p = (*p)->timeout(defaultsAndOverrides->overrideTimeoutValue);
+ }
+ }
+ return endpoints;
+}
+
+ConnectionIPtr
+IceInternal::OutgoingConnectionFactory::findConnection(const vector<EndpointIPtr>& endpoints, bool tpc, bool& compress)
+{
+ IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this);
+
+ DefaultsAndOverridesPtr defaultsAndOverrides = _instance->defaultsAndOverrides();
+ assert(!endpoints.empty());
+ for(vector<EndpointIPtr>::const_iterator p = endpoints.begin(); p != endpoints.end(); ++p)
+ {
+ pair<multimap<EndpointIPtr, ConnectionIPtr>::iterator,
+ multimap<EndpointIPtr, ConnectionIPtr>::iterator> pr = _connectionsByEndpoint.equal_range(*p);
+
+ for(multimap<EndpointIPtr, ConnectionIPtr>::iterator q = pr.first; q != pr.second; ++q)
+ {
+ if(q->second->isActiveOrHolding() &&
+ q->second->threadPerConnection() == tpc) // Don't return destroyed or un-validated connections
+ {
+ if(defaultsAndOverrides->overrideCompress)
+ {
+ compress = defaultsAndOverrides->overrideCompressValue;
+ }
+ else
+ {
+ compress = (*p)->compress();
+ }
+ return q->second;
+ }
+ }
+ }
+ return 0;
+}
+
+ConnectionIPtr
+IceInternal::OutgoingConnectionFactory::findConnection(const vector<ConnectorInfo>& connectors, bool& compress)
+{
+ DefaultsAndOverridesPtr defaultsAndOverrides = _instance->defaultsAndOverrides();
+ for(vector<ConnectorInfo>::const_iterator p = connectors.begin(); p != connectors.end(); ++p)
+ {
+ pair<multimap<ConnectorInfo, ConnectionIPtr>::iterator,
+ multimap<ConnectorInfo, ConnectionIPtr>::iterator> pr = _connections.equal_range(*p);
+
+ if(pr.first == pr.second)
+ {
+ continue;
+ }
+
+ for(multimap<ConnectorInfo, ConnectionIPtr>::iterator q = pr.first; q != pr.second; ++q)
+ {
+ if(q->second->isActiveOrHolding()) // Don't return destroyed or un-validated connections
+ {
+ if(q->second->endpoint() != p->endpoint)
+ {
+ _connectionsByEndpoint.insert(make_pair(p->endpoint, q->second));
+ }
+
+ if(defaultsAndOverrides->overrideCompress)
+ {
+ compress = defaultsAndOverrides->overrideCompressValue;
+ }
+ else
+ {
+ compress = p->endpoint->compress();
+ }
+ return q->second;
+ }
+ }
+ }
+
+ return 0;
+}
+
+void
+IceInternal::OutgoingConnectionFactory::addPendingEndpoints(const vector<EndpointIPtr>& endpoints)
+{
+ IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this);
+ if(_destroyed)
+ {
+ throw Ice::CommunicatorDestroyedException(__FILE__, __LINE__);
+ }
+ _pendingEndpoints.insert(endpoints.begin(), endpoints.end());
+}
+
+void
+IceInternal::OutgoingConnectionFactory::removePendingEndpoints(const vector<EndpointIPtr>& endpoints)
+{
+ IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this);
+ for(vector<EndpointIPtr>::const_iterator p = endpoints.begin(); p != endpoints.end(); ++p)
+ {
+ assert(_pendingEndpoints.find(*p) != _pendingEndpoints.end());
+ _pendingEndpoints.erase(_pendingEndpoints.find(*p));
+ }
+
+ if(_destroyed)
+ {
+ notifyAll();
+ }
+}
+
+ConnectionIPtr
+IceInternal::OutgoingConnectionFactory::getConnection(const vector<ConnectorInfo>& connectors,
+ const ConnectCallbackPtr& cb, bool& compress)
+{
+ {
+ IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this);
+ if(_destroyed)
+ {
+ throw Ice::CommunicatorDestroyedException(__FILE__, __LINE__);
+ }
+
+ //
+ // Reap connections for which destruction has completed.
+ //
+ multimap<ConnectorInfo, ConnectionIPtr>::iterator p = _connections.begin();
+ while(p != _connections.end())
+ {
+ if(p->second->isFinished())
+ {
+ _connections.erase(p++);
+ }
+ else
+ {
+ ++p;
+ }
+ }
+
+ multimap<EndpointIPtr, ConnectionIPtr>::iterator q = _connectionsByEndpoint.begin();
+ while(q != _connectionsByEndpoint.end())
+ {
+ if(q->second->isFinished())
+ {
+ _connectionsByEndpoint.erase(q++);
+ }
+ else
+ {
+ ++q;
+ }
+ }
+
+ //
+ // Try to get the connection. We may need to wait for other threads to
+ // finish if one of them is currently establishing a connection to one
+ // of our connectors.
+ //
+ while(!_destroyed)
+ {
+ //
+ // Search for a matching connection. If we find one, we're done.
+ //
+ Ice::ConnectionIPtr connection = findConnection(connectors, compress);
+ if(connection)
+ {
+ if(cb)
+ {
+ //
+ // This might not be the first getConnection call for the callback. We need
+ // to ensure that the callback isn't registered with any other pending
+ // connectors since we just found a connection and therefore don't need to
+ // wait anymore for other pending connectors.
+ //
+ for(vector<ConnectorInfo>::const_iterator p = connectors.begin(); p != connectors.end(); ++p)
+ {
+ map<ConnectorInfo, set<ConnectCallbackPtr> >::iterator q = _pending.find(*p);
+ if(q != _pending.end())
+ {
+ q->second.erase(cb);
+ }
+ }
+ }
+ return connection;
+ }
+
+ //
+ // Determine whether another thread is currently attempting to connect to one of our endpoints;
+ // if so we wait until it's done.
+ //
+ bool found = false;
+ for(vector<ConnectorInfo>::const_iterator p = connectors.begin(); p != connectors.end(); ++p)
+ {
+ map<ConnectorInfo, set<ConnectCallbackPtr> >::iterator q = _pending.find(*p);
+ if(q != _pending.end())
+ {
+ found = true;
+ if(cb)
+ {
+ q->second.insert(cb); // Add the callback to each pending connector.
+ }
+ }
+ }
+
+ if(!found)
+ {
+ //
+ // If no thread is currently establishing a connection to one of our connectors,
+ // we get out of this loop and start the connection establishment to one of the
+ // given connectors.
+ //
+ break;
+ }
+ else
+ {
+ //
+ // If a callback is not specified we wait until another thread notifies us about a
+ // change to the pending list. Otherwise, if a callback is provided we're done:
+ // when the pending list changes the callback will be notified and will try to
+ // get the connection again.
+ //
+ if(!cb)
+ {
+ wait();
+ }
+ else
+ {
+ return 0;
+ }
+ }
+ }
+
+ if(_destroyed)
+ {
+ throw Ice::CommunicatorDestroyedException(__FILE__, __LINE__);
+ }
+
+ //
+ // No connection to any of our endpoints exists yet; we add the given connectors to
+ // the _pending set to indicate that we're attempting connection establishment to
+ // these connectors.
+ //
+ for(vector<ConnectorInfo>::const_iterator p = connectors.begin(); p != connectors.end(); ++p)
+ {
+ assert(_pending.find(*p) == _pending.end());
+ _pending.insert(pair<ConnectorInfo, set<ConnectCallbackPtr> >(*p, set<ConnectCallbackPtr>()));
+ }
+ }
+
+ //
+ // At this point, we're responsible for establishing the connection to one of
+ // the given connectors. If it's a non-blocking connect, calling nextConnector
+ // will start the connection establishment. Otherwise, we return null to get
+ // the caller to establish the connection.
+ //
+ if(cb)
+ {
+ cb->nextConnector();
+ }
+
+ return 0;
+}
+
+ConnectionIPtr
+IceInternal::OutgoingConnectionFactory::createConnection(const TransceiverPtr& transceiver, const ConnectorInfo& ci)
+{
+ IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this);
+ assert(_pending.find(ci) != _pending.end() && transceiver);
+
+ //
+ // Create and add the connection to the connection map. Adding the connection to the map
+ // is necessary to support the interruption of the connection initialization and validation
+ // in case the communicator is destroyed.
+ //
+ try
+ {
+ if(_destroyed)
+ {
+ throw Ice::CommunicatorDestroyedException(__FILE__, __LINE__);
+ }
+
+ Ice::ConnectionIPtr connection = new ConnectionI(_instance, transceiver, ci.endpoint->compress(false),
+ 0, ci.threadPerConnection,
+ _instance->threadPerConnectionStackSize());
+ _connections.insert(make_pair(ci, connection));
+ _connectionsByEndpoint.insert(make_pair(ci.endpoint, connection));
+ return connection;
+ }
+ catch(const Ice::LocalException&)
+ {
+ try
+ {
+ transceiver->close();
+ }
+ catch(const Ice::LocalException&)
+ {
+ // Ignore
+ }
+ throw;
+ }
+}
+
+void
+IceInternal::OutgoingConnectionFactory::finishGetConnection(const vector<ConnectorInfo>& connectors,
+ const ConnectCallbackPtr& cb,
+ const ConnectionIPtr& connection)
+{
+ vector<ConnectCallbackPtr> callbacks;
+
+ {
+ IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this);
+
+ //
+ // We're done trying to connect to the given connectors so we remove the
+ // connectors from the pending list and notify waiting threads. We also
+ // notify the pending connect callbacks (outside the synchronization).
+ //
+
+ for(vector<ConnectorInfo>::const_iterator p = connectors.begin(); p != connectors.end(); ++p)
+ {
+ map<ConnectorInfo, set<ConnectCallbackPtr> >::iterator q = _pending.find(*p);
+ assert(q != _pending.end());
+ callbacks.insert(callbacks.end(), q->second.begin(), q->second.end());
+ _pending.erase(q);
+ }
+ notifyAll();
+
+ //
+ // If the connect attempt succeeded and the communicator is not destroyed,
+ // activate the connection!
+ //
+ if(connection && !_destroyed)
+ {
+ connection->activate();
+ }
+ }
+
+ //
+ // Notify any waiting callbacks.
+ //
+ for(vector<ConnectCallbackPtr>::const_iterator p = callbacks.begin(); p != callbacks.end(); ++p)
+ {
+ (*p)->getConnection();
+ }
+}
+
+void
+IceInternal::OutgoingConnectionFactory::handleException(const LocalException& ex, const ConnectorInfo& ci,
+ const ConnectionIPtr& connection, bool hasMore)
+{
+ TraceLevelsPtr traceLevels = _instance->traceLevels();
+ if(traceLevels->retry >= 2)
+ {
+ Trace out(_instance->initializationData().logger, traceLevels->retryCat);
+
+ out << "connection to endpoint failed";
+ if(dynamic_cast<const CommunicatorDestroyedException*>(&ex))
+ {
+ out << "\n";
+ }
+ else
+ {
+ if(hasMore)
+ {
+ out << ", trying next endpoint\n";
+ }
+ else
+ {
+ out << " and no more endpoints to try\n";
+ }
+ }
+ out << ex;
+ }
+
+ if(connection && connection->isFinished())
+ {
+ //
+ // If the connection is finished, we remove it right away instead of
+ // waiting for the reaping.
+ //
+ // NOTE: it's possible for the connection to not be finished yet. That's
+ // for instance the case when using thread per connection and if it's the
+ // thread which is calling back the outgoing connection factory to notify
+ // it of the failure.
+ //
+ {
+ IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this);
+ pair<multimap<ConnectorInfo, ConnectionIPtr>::iterator,
+ multimap<ConnectorInfo, ConnectionIPtr>::iterator> pr = _connections.equal_range(ci);
+
+ for(multimap<ConnectorInfo, ConnectionIPtr>::iterator p = pr.first; p != pr.second; ++p)
+ {
+ if(p->second == connection)
+ {
+ _connections.erase(p);
+ break;
+ }
+ }
+
+ pair<multimap<EndpointIPtr, ConnectionIPtr>::iterator,
+ multimap<EndpointIPtr, ConnectionIPtr>::iterator> qr = _connectionsByEndpoint.equal_range(ci.endpoint);
+
+ for(multimap<EndpointIPtr, ConnectionIPtr>::iterator q = qr.first; q != qr.second; ++q)
+ {
+ if(q->second == connection)
+ {
+ _connectionsByEndpoint.erase(q);
+ break;
+ }
+ }
+ }
+ }
+}
+
+void
+IceInternal::OutgoingConnectionFactory::handleException(const LocalException& ex, bool hasMore)
+{
+ TraceLevelsPtr traceLevels = _instance->traceLevels();
+ if(traceLevels->retry >= 2)
+ {
+ Trace out(_instance->initializationData().logger, traceLevels->retryCat);
+
+ out << "couldn't resolve endpoint host";
+ if(dynamic_cast<const CommunicatorDestroyedException*>(&ex))
+ {
+ out << "\n";
+ }
+ else
+ {
+ if(hasMore)
+ {
+ out << ", trying next endpoint\n";
+ }
+ else
+ {
+ out << " and no more endpoints to try\n";
+ }
+ }
+ out << ex;
+ }
+}
+
+IceInternal::OutgoingConnectionFactory::ConnectCallback::ConnectCallback(const OutgoingConnectionFactoryPtr& factory,
+ const vector<EndpointIPtr>& endpoints,
+ bool hasMore,
+ const CreateConnectionCallbackPtr& cb,
+ Ice::EndpointSelectionType selType,
+ bool threadPerConnection) :
+ _factory(factory),
+ _selectorThread(_factory->_instance->selectorThread()),
+ _endpoints(endpoints),
+ _hasMore(hasMore),
+ _callback(cb),
+ _selType(selType),
+ _threadPerConnection(threadPerConnection)
+{
+ _endpointsIter = _endpoints.begin();
+}
+
+//
+// Methods from ConnectionI.StartCallback
+//
+void
+IceInternal::OutgoingConnectionFactory::ConnectCallback::connectionStartCompleted(const ConnectionIPtr& connection)
+{
+ assert(!_exception.get() && connection == _connection);
+
+ bool compress;
+ DefaultsAndOverridesPtr defaultsAndOverrides = _factory->_instance->defaultsAndOverrides();
+ if(defaultsAndOverrides->overrideCompress)
+ {
+ compress = defaultsAndOverrides->overrideCompressValue;
+ }
+ else
+ {
+ compress = _iter->endpoint->compress();
+ }
+
+ _factory->finishGetConnection(_connectors, this, connection);
+ _factory->removePendingEndpoints(_endpoints);
+ _callback->setConnection(connection, compress);
+}
+
+void
+IceInternal::OutgoingConnectionFactory::ConnectCallback::connectionStartFailed(const ConnectionIPtr& connection,
+ const LocalException& ex)
+{
+ assert(!_exception.get() && connection == _connection);
+
+ _exception.reset(dynamic_cast<LocalException*>(ex.ice_clone()));
+ handleException();
+}
+
+//
+// Methods from EndpointI_connectors
+//
+void
+IceInternal::OutgoingConnectionFactory::ConnectCallback::connectors(const vector<ConnectorPtr>& connectors)
+{
+ vector<ConnectorPtr> cons = connectors;
+ if(_selType == Random)
+ {
+ RandomNumberGenerator rng;
+ random_shuffle(cons.begin(), cons.end(), rng);
+ }
+
+ for(vector<ConnectorPtr>::const_iterator p = cons.begin(); p != cons.end(); ++p)
+ {
+ _connectors.push_back(ConnectorInfo(*p, *_endpointsIter, _threadPerConnection));
+ }
+
+ if(++_endpointsIter != _endpoints.end())
+ {
+ (*_endpointsIter)->connectors_async(this);
+ }
+ else
+ {
+ assert(!_connectors.empty());
+
+ //
+ // We now have all the connectors for the given endpoints. We can try to obtain the
+ // connection.
+ //
+ _iter = _connectors.begin();
+ getConnection();
+ }
+}
+
+void
+IceInternal::OutgoingConnectionFactory::ConnectCallback::exception(const Ice::LocalException& ex)
+{
+ _factory->handleException(ex, _hasMore || _endpointsIter != _endpoints.end() - 1);
+ if(++_endpointsIter != _endpoints.end())
+ {
+ (*_endpointsIter)->connectors_async(this);
+ }
+ else if(!_connectors.empty())
+ {
+ //
+ // We now have all the connectors for the given endpoints. We can try to obtain the
+ // connection.
+ //
+ _iter = _connectors.begin();
+ getConnection();
+ }
+ else
+ {
+ _exception.reset(dynamic_cast<Ice::LocalException*>(ex.ice_clone()));
+ _factory->_instance->clientThreadPool()->execute(this);
+ }
+}
+
+//
+// Methods from ThreadPoolWorkItem
+//
+void
+IceInternal::OutgoingConnectionFactory::ConnectCallback::execute(const ThreadPoolPtr& threadPool)
+{
+ threadPool->promoteFollower();
+ assert(_exception.get());
+ _factory->removePendingEndpoints(_endpoints);
+ _callback->setException(*_exception.get());
+}
+
+void
+IceInternal::OutgoingConnectionFactory::ConnectCallback::getConnection()
+{
+ //
+ // First, get the connectors for all the endpoints.
+ //
+ if(_endpointsIter != _endpoints.end())
+ {
+ try
+ {
+ _factory->addPendingEndpoints(_endpoints);
+ (*_endpointsIter)->connectors_async(this);
+ }
+ catch(const Ice::LocalException& ex)
+ {
+ _callback->setException(ex);
+ }
+ return;
+ }
+
+ try
+ {
+ //
+ // If all the connectors have been created, we ask the factory to get a
+ // connection.
+ //
+ bool compress;
+ Ice::ConnectionIPtr connection = _factory->getConnection(_connectors, this, compress);
+ if(!connection)
+ {
+ //
+ // A null return value from getConnection indicates that the connection
+ // is being established and that everthing has been done to ensure that
+ // the callback will be notified when the connection establishment is
+ // done.
+ //
+ return;
+ }
+
+ _factory->removePendingEndpoints(_endpoints);
+ _callback->setConnection(connection, compress);
+ }
+ catch(const Ice::LocalException& ex)
+ {
+ _exception.reset(dynamic_cast<Ice::LocalException*>(ex.ice_clone()));
+ _factory->_instance->clientThreadPool()->execute(this);
+ }
+}
+
+void
+IceInternal::OutgoingConnectionFactory::ConnectCallback::nextConnector()
+{
+ try
+ {
+ _exception.reset(0);
+ _connection = _factory->createConnection(_iter->connector->connect(0), *_iter);
+ _connection->start(this);
+ }
+ catch(const Ice::LocalException& ex)
+ {
+ _exception.reset(dynamic_cast<Ice::LocalException*>(ex.ice_clone()));
+ handleException();
+ }
+}
+
+void
+IceInternal::OutgoingConnectionFactory::ConnectCallback::handleException()
+{
+ assert(_iter != _connectors.end() && _exception.get());
+
+ _factory->handleException(*_exception.get(), *_iter, _connection, _hasMore || _iter != _connectors.end() - 1);
+ if(dynamic_cast<Ice::CommunicatorDestroyedException*>(_exception.get())) // No need to continue.
+ {
+ _factory->finishGetConnection(_connectors, this, 0);
+ _factory->removePendingEndpoints(_endpoints);
+ _callback->setException(*_exception.get());
+ }
+ else if(++_iter != _connectors.end()) // Try the next connector.
+ {
+ nextConnector();
+ }
+ else
+ {
+ _factory->finishGetConnection(_connectors, this, 0);
+ _factory->removePendingEndpoints(_endpoints);
+ _callback->setException(*_exception.get());
+ }
+}
+
+bool
+IceInternal::OutgoingConnectionFactory::ConnectCallback::operator<(const ConnectCallback& rhs) const
+{
+ return this < &rhs;
+}
+
void
IceInternal::IncomingConnectionFactory::activate()
{
@@ -612,7 +1165,7 @@ IceInternal::IncomingConnectionFactory::waitUntilFinished()
// We want to wait until all connections are finished outside the
// thread synchronization.
//
- connections.swap(_connections);
+ connections = _connections;
}
if(threadPerIncomingConnectionFactory)
@@ -621,6 +1174,11 @@ IceInternal::IncomingConnectionFactory::waitUntilFinished()
}
for_each(connections.begin(), connections.end(), Ice::voidMemFun(&ConnectionI::waitUntilFinished));
+
+ {
+ IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this);
+ _connections.clear();
+ }
}
EndpointIPtr
@@ -641,7 +1199,7 @@ IceInternal::IncomingConnectionFactory::connections() const
// Only copy connections which have not been destroyed.
//
remove_copy_if(_connections.begin(), _connections.end(), back_inserter(result),
- Ice::constMemFun(&ConnectionI::isDestroyed));
+ not1(Ice::constMemFun(&ConnectionI::isActiveOrHolding)));
return result;
}
@@ -678,11 +1236,12 @@ IceInternal::IncomingConnectionFactory::readable() const
return false;
}
-void
+bool
IceInternal::IncomingConnectionFactory::read(BasicStream&)
{
assert(!_threadPerConnection); // Only for use with a thread pool.
- assert(false); // Must not be called.
+ assert(false); // Must not be called, readable() returns false.
+ return false;
}
class PromoteFollower
@@ -772,10 +1331,23 @@ IceInternal::IncomingConnectionFactory::message(BasicStream&, const ThreadPoolPt
{
assert(!_threadPerConnection);
connection = new ConnectionI(_instance, transceiver, _endpoint, _adapter, false, 0);
- connection->start();
}
- catch(const LocalException&)
+ catch(const LocalException& ex)
{
+ try
+ {
+ transceiver->close();
+ }
+ catch(const Ice::LocalException&)
+ {
+ // Ignore.
+ }
+
+ if(_warn)
+ {
+ Warning out(_instance->initializationData().logger);
+ out << "connection exception:\n" << ex << '\n' << _acceptor->toString();
+ }
return;
}
@@ -784,23 +1356,7 @@ IceInternal::IncomingConnectionFactory::message(BasicStream&, const ThreadPoolPt
assert(connection);
- //
- // We validate outside the thread synchronization, to not block
- // the factory.
- //
- try
- {
- connection->validate();
- }
- catch(const LocalException&)
- {
- IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this);
- connection->waitUntilFinished(); // We must call waitUntilFinished() for cleanup.
- _connections.remove(connection);
- return;
- }
-
- connection->activate();
+ connection->start(this);
}
void
@@ -844,6 +1400,48 @@ IceInternal::IncomingConnectionFactory::toString() const
return _acceptor->toString();
}
+void
+IceInternal::IncomingConnectionFactory::connectionStartCompleted(const Ice::ConnectionIPtr& connection)
+{
+ IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this);
+
+ //
+ // Initialy, connections are in the holding state. If the factory is active
+ // we activate the connection.
+ //
+ if(_state == StateActive)
+ {
+ connection->activate();
+ }
+}
+
+void
+IceInternal::IncomingConnectionFactory::connectionStartFailed(const Ice::ConnectionIPtr& connection,
+ const Ice::LocalException& ex)
+{
+ IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this);
+ if(_state == StateClosed)
+ {
+ return;
+ }
+
+ if(_warn)
+ {
+ Warning out(_instance->initializationData().logger);
+ out << "connection exception:\n" << ex << '\n' << _acceptor->toString();
+ }
+
+ //
+ // If the connection is finished, remove it right away from
+ // the connection map. Otherwise, we keep it in the map, it
+ // will eventually be reaped.
+ //
+ if(connection->isFinished())
+ {
+ _connections.remove(connection);
+ }
+}
+
IceInternal::IncomingConnectionFactory::IncomingConnectionFactory(const InstancePtr& instance,
const EndpointIPtr& endpoint,
const ObjectAdapterPtr& adapter,
@@ -881,23 +1479,22 @@ IceInternal::IncomingConnectionFactory::IncomingConnectionFactory(const Instance
{
connection = new ConnectionI(_instance, _transceiver, _endpoint, _adapter, _threadPerConnection,
_threadPerConnectionStackSize);
- connection->start();
- connection->validate();
}
catch(const LocalException&)
{
- //
- // If a connection object was constructed, then validate()
- // must have raised the exception.
- //
- if(connection)
+ try
{
- connection->waitUntilFinished(); // We must call waitUntilFinished() for cleanup.
+ _transceiver->close();
}
-
- return;
+ catch(const Ice::LocalException&)
+ {
+ // Ignore
+ }
+ throw;
}
+ connection->start(0);
+
_connections.push_back(connection);
}
else
@@ -1148,33 +1745,44 @@ IceInternal::IncomingConnectionFactory::run()
//
// Create a connection object for the connection.
//
- if(transceiver)
+ if(!transceiver)
+ {
+ continue;
+ }
+
+ try
+ {
+ connection = new ConnectionI(_instance, transceiver, _endpoint, _adapter, _threadPerConnection,
+ _threadPerConnectionStackSize);
+ }
+ catch(const LocalException& ex)
{
try
{
- connection = new ConnectionI(_instance, transceiver, _endpoint, _adapter, _threadPerConnection,
- _threadPerConnectionStackSize);
- connection->start();
+ transceiver->close();
}
- catch(const LocalException&)
+ catch(const Ice::LocalException&)
{
- return;
}
- _connections.push_back(connection);
+ if(_warn)
+ {
+ Warning out(_instance->initializationData().logger);
+ out << "connection exception:\n" << ex << '\n' << _acceptor->toString();
+ }
+ continue;
}
+
+ _connections.push_back(connection);
}
//
- // In thread per connection mode, the connection's thread will
- // take care of connection validation and activation (for
- // non-datagram connections). We don't want to block this
- // thread waiting until validation is complete, because in
- // contrast to thread pool mode, it is the only thread that
- // can accept connections with this factory's
- // acceptor. Therefore we don't call validate() and activate()
- // from the connection factory in thread per connection mode.
+ // In thread-per-connection mode and regardless of the background mode,
+ // start() doesn't block. The connection thread is started and takes
+ // care of the connection validation and notifies the factory through
+ // the callback when it's done.
//
+ connection->start(this);
}
}
diff --git a/cpp/src/Ice/ConnectionFactory.h b/cpp/src/Ice/ConnectionFactory.h
index e1351e976a7..1c2c3349a42 100644
--- a/cpp/src/Ice/ConnectionFactory.h
+++ b/cpp/src/Ice/ConnectionFactory.h
@@ -14,7 +14,7 @@
#include <IceUtil/Monitor.h>
#include <IceUtil/Thread.h> // For ThreadPerIncomingConnectionFactory.
#include <Ice/ConnectionFactoryF.h>
-#include <Ice/ConnectionIF.h>
+#include <Ice/ConnectionI.h>
#include <Ice/InstanceF.h>
#include <Ice/ObjectAdapterF.h>
#include <Ice/EndpointIF.h>
@@ -24,6 +24,7 @@
#include <Ice/TransceiverF.h>
#include <Ice/RouterInfoF.h>
#include <Ice/EventHandler.h>
+#include <Ice/EndpointI.h>
#include <list>
#include <set>
@@ -38,15 +39,26 @@ class ObjectAdapterI;
namespace IceInternal
{
-class OutgoingConnectionFactory : public IceUtil::Shared, public IceUtil::Monitor<IceUtil::Mutex>
+class OutgoingConnectionFactory : virtual public IceUtil::Shared, public IceUtil::Monitor<IceUtil::Mutex>
{
public:
+ class CreateConnectionCallback : virtual public IceUtil::Shared
+ {
+ public:
+
+ virtual void setConnection(const Ice::ConnectionIPtr&, bool) = 0;
+ virtual void setException(const Ice::LocalException&) = 0;
+ };
+ typedef IceUtil::Handle<CreateConnectionCallback> CreateConnectionCallbackPtr;
+
void destroy();
void waitUntilFinished();
Ice::ConnectionIPtr create(const std::vector<EndpointIPtr>&, bool, bool, Ice::EndpointSelectionType, bool&);
+ void create(const std::vector<EndpointIPtr>&, bool, bool, Ice::EndpointSelectionType,
+ const CreateConnectionCallbackPtr&);
void setRouterInfo(const RouterInfoPtr&);
void removeAdapter(const Ice::ObjectAdapterPtr&);
void flushBatchRequests();
@@ -57,13 +69,87 @@ private:
virtual ~OutgoingConnectionFactory();
friend class Instance;
+ struct ConnectorInfo
+ {
+ ConnectorInfo(const ConnectorPtr& c, const EndpointIPtr& e, bool t) :
+ connector(c), endpoint(e), threadPerConnection(t)
+ {
+ }
+
+ bool operator<(const ConnectorInfo& other) const;
+
+ ConnectorPtr connector;
+ EndpointIPtr endpoint;
+ bool threadPerConnection;
+ };
+
+ class ConnectCallback : public Ice::ConnectionI::StartCallback, public IceInternal::EndpointI_connectors,
+ public IceInternal::ThreadPoolWorkItem
+ {
+ public:
+
+ ConnectCallback(const OutgoingConnectionFactoryPtr&, const std::vector<EndpointIPtr>&, bool,
+ const CreateConnectionCallbackPtr&, Ice::EndpointSelectionType, bool);
+
+ virtual void connectionStartCompleted(const Ice::ConnectionIPtr&);
+ virtual void connectionStartFailed(const Ice::ConnectionIPtr&, const Ice::LocalException&);
+
+ virtual void connectors(const std::vector<ConnectorPtr>&);
+ virtual void exception(const Ice::LocalException&);
+
+ virtual void execute(const ThreadPoolPtr&);
+
+ void getConnection();
+ void nextConnector();
+
+ bool operator<(const ConnectCallback&) const;
+
+ private:
+
+ void handleException();
+
+ const OutgoingConnectionFactoryPtr _factory;
+ const SelectorThreadPtr _selectorThread;
+ const std::vector<EndpointIPtr> _endpoints;
+ const bool _hasMore;
+ const CreateConnectionCallbackPtr _callback;
+ const Ice::EndpointSelectionType _selType;
+ const bool _threadPerConnection;
+ std::vector<EndpointIPtr>::const_iterator _endpointsIter;
+ std::vector<ConnectorInfo> _connectors;
+ std::vector<ConnectorInfo>::const_iterator _iter;
+ std::auto_ptr<Ice::LocalException> _exception;
+ Ice::ConnectionIPtr _connection;
+ };
+ typedef IceUtil::Handle<ConnectCallback> ConnectCallbackPtr;
+ friend class ConnectCallback;
+
+ std::vector<EndpointIPtr> applyOverrides(const std::vector<EndpointIPtr>&);
+ Ice::ConnectionIPtr findConnection(const std::vector<EndpointIPtr>&, bool, bool&);
+ void addPendingEndpoints(const std::vector<EndpointIPtr>&);
+ void removePendingEndpoints(const std::vector<EndpointIPtr>&);
+ Ice::ConnectionIPtr getConnection(const std::vector<ConnectorInfo>&, const ConnectCallbackPtr&, bool&);
+ void finishGetConnection(const std::vector<ConnectorInfo>&, const ConnectCallbackPtr&, const Ice::ConnectionIPtr&);
+ Ice::ConnectionIPtr findConnection(const std::vector<ConnectorInfo>&, bool&);
+ Ice::ConnectionIPtr createConnection(const TransceiverPtr&, const ConnectorInfo&);
+
+ void handleException(const Ice::LocalException&, bool);
+ void handleException(const Ice::LocalException&, const ConnectorInfo&, const Ice::ConnectionIPtr&, bool);
+
const InstancePtr _instance;
bool _destroyed;
- std::multimap<ConnectorPtr, Ice::ConnectionIPtr> _connections;
- std::set<ConnectorPtr> _pending; // Connectors for which connection establishment is pending.
+
+ std::multimap<ConnectorInfo, Ice::ConnectionIPtr> _connections;
+ std::map<ConnectorInfo, std::set<ConnectCallbackPtr> > _pending;
+
+ std::multimap<EndpointIPtr, Ice::ConnectionIPtr> _connectionsByEndpoint;
+ std::multiset<EndpointIPtr> _pendingEndpoints;
};
-class IncomingConnectionFactory : public EventHandler, public IceUtil::Monitor<IceUtil::Mutex>
+class IncomingConnectionFactory : public EventHandler,
+ public Ice::ConnectionI::StartCallback,
+ public IceUtil::Monitor<IceUtil::Mutex>
+
{
public:
@@ -83,11 +169,14 @@ public:
//
virtual bool datagram() const;
virtual bool readable() const;
- virtual void read(BasicStream&);
+ virtual bool read(BasicStream&);
virtual void message(BasicStream&, const ThreadPoolPtr&);
virtual void finished(const ThreadPoolPtr&);
virtual void exception(const Ice::LocalException&);
virtual std::string toString() const;
+
+ virtual void connectionStartCompleted(const Ice::ConnectionIPtr&);
+ virtual void connectionStartFailed(const Ice::ConnectionIPtr&, const Ice::LocalException&);
private:
diff --git a/cpp/src/Ice/ConnectionI.cpp b/cpp/src/Ice/ConnectionI.cpp
index cdf3dce6b80..ccc6d5236e7 100644
--- a/cpp/src/Ice/ConnectionI.cpp
+++ b/cpp/src/Ice/ConnectionI.cpp
@@ -34,195 +34,226 @@ using namespace IceInternal;
Ice::LocalObject* IceInternal::upCast(ConnectionI* p) { return p; }
void
-Ice::ConnectionI::validate()
+Ice::ConnectionI::OutgoingMessage::adopt(BasicStream* str)
{
- bool active = false;
+ if(adopted)
+ {
+ if(str)
+ {
+ delete stream;
+ stream = 0;
+ adopted = false;
+ }
+ else
+ {
+ return; // Stream is already adopted.
+ }
+ }
+ else if(!str)
+ {
+ if(out || outAsync)
+ {
+ return; // Adopting request stream is not necessary.
+ }
+ else
+ {
+ str = stream; // Adopt this stream
+ stream = 0;
+ }
+ }
- if(!_endpoint->datagram()) // Datagram connections are always implicitly validated.
+ assert(str);
+ stream = new BasicStream(str->instance());
+ stream->swap(*str);
+ adopted = true;
+}
+
+void
+Ice::ConnectionI::OutgoingMessage::sent(ConnectionI* connection, bool notify)
+{
+ if(out)
+ {
+ out->sent(notify); // true = notify the waiting thread that the request was sent.
+ }
+ else if(outAsync)
+ {
+ outAsync->__sent(connection);
+ }
+
+ if(adopted)
+ {
+ delete stream;
+ stream = 0;
+ }
+}
+
+void
+Ice::ConnectionI::OutgoingMessage::finished(const Ice::LocalException& ex)
+{
+ if(!response)
+ {
+ //
+ // Only notify oneway requests. The connection keeps track of twoway
+ // requests in the _requests/_asyncRequests maps and will notify them
+ // of the connection exceptions.
+ //
+ if(out)
+ {
+ out->finished(ex);
+ }
+ else if(outAsync)
+ {
+ outAsync->__finished(ex);
+ }
+ }
+
+ if(adopted)
+ {
+ delete stream;
+ stream = 0;
+ }
+}
+
+void
+Ice::ConnectionI::start(const StartCallbackPtr& callback)
+{
+ try
{
{
IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this);
-
- if(_thread && _thread->getThreadControl() != IceUtil::ThreadControl())
- {
- //
- // In thread per connection mode, this connection's thread
- // will take care of connection validation. Therefore all we
- // have to do here is to wait until this thread has completed
- // validation.
- //
- while(_state == StateNotValidated)
- {
- wait();
- }
-
- if(_state >= StateClosing)
- {
- assert(_exception.get());
- _exception->ice_throw();
- }
-
- return;
- }
-
+ _startCallback = callback;
+
//
- // The connection might already be closed (e.g.: the communicator
- // was destroyed or object adapter deactivated.)
+ // The connection might already be closed if the communicator was destroyed.
//
- assert(_state == StateNotValidated || _state == StateClosed);
if(_state == StateClosed)
{
assert(_exception.get());
_exception->ice_throw();
}
-
- if(_adapter)
- {
- active = true; // The server side has the active role for connection validation.
- }
- else
- {
- active = false; // The client side has the passive role for connection validation.
- }
- }
-
- try
- {
- Int timeout;
- if(_instance->defaultsAndOverrides()->overrideConnectTimeout)
- {
- timeout = _instance->defaultsAndOverrides()->overrideConnectTimeoutValue;
- }
- else
- {
- timeout = _endpoint->timeout();
- }
-
- if(active)
- {
- IceUtil::Mutex::Lock sendSync(_sendMutex);
- if(!_transceiver) // Has the transceiver already been closed?
- {
- assert(_exception.get());
- _exception->ice_throw(); // The exception is immutable at this point.
- }
-
- BasicStream os(_instance.get());
- os.write(magic[0]);
- os.write(magic[1]);
- os.write(magic[2]);
- os.write(magic[3]);
- os.write(protocolMajor);
- os.write(protocolMinor);
- os.write(encodingMajor);
- os.write(encodingMinor);
- os.write(validateConnectionMsg);
- os.write(static_cast<Byte>(0)); // Compression status (always zero for validate connection).
- os.write(headerSize); // Message size.
- os.i = os.b.begin();
- traceHeader("sending validate connection", os, _logger, _traceLevels);
- try
- {
- _transceiver->initialize(timeout);
- _transceiver->write(os, timeout);
- }
- catch(const TimeoutException&)
- {
- throw ConnectTimeoutException(__FILE__, __LINE__);
- }
- }
- else
+ //
+ // In thread per connection mode, we create the thread for the connection. The
+ // intialization and validation of the connection is taken care of by the thread
+ // per connection. If a callback is given, no need to wait, the thread will notify
+ // the callback, otherwise wait until the connection is validated.
+ //
+ if(_threadPerConnection)
{
- BasicStream is(_instance.get());
- is.b.resize(headerSize);
- is.i = is.b.begin();
try
{
- _transceiver->initialize(timeout);
- _transceiver->read(is, timeout);
+ _thread = new ThreadPerConnection(this);
+ _thread->start(_threadPerConnectionStackSize);
}
- catch(const TimeoutException&)
+ catch(const IceUtil::Exception& ex)
{
- throw ConnectTimeoutException(__FILE__, __LINE__);
- }
- assert(is.i == is.b.end());
- is.i = is.b.begin();
- Byte m[4];
- is.read(m[0]);
- is.read(m[1]);
- is.read(m[2]);
- is.read(m[3]);
- if(m[0] != magic[0] || m[1] != magic[1] || m[2] != magic[2] || m[3] != magic[3])
- {
- BadMagicException ex(__FILE__, __LINE__);
- ex.badMagic = Ice::ByteSeq(&m[0], &m[0] + sizeof(magic));
- throw ex;
- }
- Byte pMajor;
- Byte pMinor;
- is.read(pMajor);
- is.read(pMinor);
- if(pMajor != protocolMajor)
- {
- UnsupportedProtocolException ex(__FILE__, __LINE__);
- ex.badMajor = static_cast<unsigned char>(pMajor);
- ex.badMinor = static_cast<unsigned char>(pMinor);
- ex.major = static_cast<unsigned char>(protocolMajor);
- ex.minor = static_cast<unsigned char>(protocolMinor);
- throw ex;
- }
- Byte eMajor;
- Byte eMinor;
- is.read(eMajor);
- is.read(eMinor);
- if(eMajor != encodingMajor)
- {
- UnsupportedEncodingException ex(__FILE__, __LINE__);
- ex.badMajor = static_cast<unsigned char>(eMajor);
- ex.badMinor = static_cast<unsigned char>(eMinor);
- ex.major = static_cast<unsigned char>(encodingMajor);
- ex.minor = static_cast<unsigned char>(encodingMinor);
- throw ex;
- }
- Byte messageType;
- is.read(messageType);
- if(messageType != validateConnectionMsg)
- {
- throw ConnectionNotValidatedException(__FILE__, __LINE__);
+ {
+ Error out(_logger);
+ out << "cannot create thread for connection:\n" << ex;
+ }
+
+ //
+ // Clean up.
+ //
+ _thread = 0;
+ _state = StateClosed;
+
+ ex.ice_throw();
}
- Byte compress;
- is.read(compress); // Ignore compression status for validate connection.
- Int size;
- is.read(size);
- if(size != headerSize)
+
+ if(!callback) // Wait for the connection to be validated.
{
- throw IllegalMessageSizeException(__FILE__, __LINE__);
+ while(_state <= StateNotValidated)
+ {
+ wait();
+ }
+
+ if(_state >= StateClosing)
+ {
+ assert(_exception.get());
+ _exception->ice_throw();
+ }
}
- traceHeader("received validate connection", is, _logger, _traceLevels);
+ return; // We're done.
}
}
- catch(const LocalException& ex)
+
+ SocketStatus status = initialize();
+ if(status == Finished)
+ {
+ status = validate();
+ }
+
+ if(status == Finished)
+ {
+ finishStart();
+ return; // We're done!
+ }
+
+ assert(callback);
+
+ IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this);
+ if(_state == StateClosed)
{
- IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this);
- setState(StateClosed, ex);
assert(_exception.get());
_exception->ice_throw();
}
- }
- {
- IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this);
+ int timeout;
+ DefaultsAndOverridesPtr defaultsAndOverrides = _instance->defaultsAndOverrides();
+ if(defaultsAndOverrides->overrideConnectTimeout)
+ {
+ timeout = defaultsAndOverrides->overrideConnectTimeoutValue;
+ }
+ else
+ {
+ timeout = _endpoint->timeout();
+ }
- if(_acmTimeout > 0)
+ _sendInProgress = true;
+ _selectorThread->_register(_transceiver->fd(), this, status, timeout);
+ return;
+ }
+ catch(const Ice::LocalException& ex)
+ {
{
- _acmAbsoluteTimeout = IceUtil::Time::now(IceUtil::Time::Monotonic) + IceUtil::Time::seconds(_acmTimeout);
+ IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this);
+ setState(StateClosed, ex);
+
+ //
+ // If start is called with a callback, the callback is notified either by the
+ // thread per conncetion or the thread pool.
+ //
+ if(callback)
+ {
+ if(!_threadPerConnection)
+ {
+ registerWithPool();
+ unregisterWithPool(); // Let finished do the close.
+ }
+ return;
+ }
+
+ //
+ // Close the transceiver if there's no thread per connection, otherwise, the
+ // thread per connection takes care of it.
+ //
+ if(!_thread && _transceiver)
+ {
+ try
+ {
+ _transceiver->close();
+ }
+ catch(const Ice::LocalException&)
+ {
+ // Here we ignore any exceptions in close().
+ }
+ _transceiver = 0;
+ }
}
- //
- // We start out in holding state.
- //
- setState(StateHolding);
+ waitUntilFinished();
+ throw;
}
}
@@ -230,10 +261,14 @@ void
Ice::ConnectionI::activate()
{
IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this);
+ if(_state <= StateNotValidated)
+ {
+ return;
+ }
- while(_state == StateNotValidated)
+ if(_acmTimeout > 0)
{
- wait();
+ _acmAbsoluteTimeout = IceUtil::Time::now(IceUtil::Time::Monotonic) + IceUtil::Time::seconds(_acmTimeout);
}
setState(StateActive);
@@ -243,10 +278,9 @@ void
Ice::ConnectionI::hold()
{
IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this);
-
- while(_state == StateNotValidated)
+ if(_state <= StateNotValidated)
{
- wait();
+ return;
}
setState(StateHolding);
@@ -255,20 +289,35 @@ Ice::ConnectionI::hold()
void
Ice::ConnectionI::destroy(DestructionReason reason)
{
- IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this);
-
- switch(reason)
+ bool send = false;
+ {
+ IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this);
+
+ switch(reason)
+ {
+ case ObjectAdapterDeactivated:
+ {
+ send = setState(StateClosing, ObjectAdapterDeactivatedException(__FILE__, __LINE__));
+ break;
+ }
+
+ case CommunicatorDestroyed:
+ {
+ send = setState(StateClosing, CommunicatorDestroyedException(__FILE__, __LINE__));
+ break;
+ }
+ }
+ }
+
+ if(send) // Send the close connection message
{
- case ObjectAdapterDeactivated:
+ try
{
- setState(StateClosing, ObjectAdapterDeactivatedException(__FILE__, __LINE__));
- break;
+ finishSendMessage();
}
-
- case CommunicatorDestroyed:
+ catch(const Ice::LocalException&)
{
- setState(StateClosing, CommunicatorDestroyedException(__FILE__, __LINE__));
- break;
+ // Ignore.
}
}
}
@@ -276,32 +325,47 @@ Ice::ConnectionI::destroy(DestructionReason reason)
void
Ice::ConnectionI::close(bool force)
{
- IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this);
-
- if(force)
+ bool send = false;
{
- setState(StateClosed, ForcedCloseConnectionException(__FILE__, __LINE__));
+ IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this);
+
+ if(force)
+ {
+ setState(StateClosed, ForcedCloseConnectionException(__FILE__, __LINE__));
+ }
+ else
+ {
+ //
+ // If we do a graceful shutdown, then we wait until all
+ // outstanding requests have been completed. Otherwise, the
+ // CloseConnectionException will cause all outstanding
+ // requests to be retried, regardless of whether the server
+ // has processed them or not.
+ //
+ while(!_requests.empty() || !_asyncRequests.empty())
+ {
+ wait();
+ }
+
+ send = setState(StateClosing, CloseConnectionException(__FILE__, __LINE__));
+ }
}
- else
+
+ if(send) // Send the close connection message
{
- //
- // If we do a graceful shutdown, then we wait until all
- // outstanding requests have been completed. Otherwise, the
- // CloseConnectionException will cause all outstanding
- // requests to be retried, regardless of whether the server
- // has processed them or not.
- //
- while(!_requests.empty() || !_asyncRequests.empty())
+ try
{
- wait();
+ finishSendMessage();
+ }
+ catch(const Ice::LocalException&)
+ {
+ // Ignore.
}
-
- setState(StateClosing, CloseConnectionException(__FILE__, __LINE__));
}
}
bool
-Ice::ConnectionI::isDestroyed() const
+Ice::ConnectionI::isActiveOrHolding() const
{
//
// We can not use trylock here, otherwise the outgoing connection
@@ -310,7 +374,7 @@ Ice::ConnectionI::isDestroyed() const
//
IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this);
- return _state >= StateClosing;
+ return _state > StateNotValidated && _state < StateClosing;
}
bool
@@ -460,56 +524,55 @@ Ice::ConnectionI::waitUntilFinished()
void
Ice::ConnectionI::monitor()
{
- IceUtil::Monitor<IceUtil::Mutex>::TryLock sync(*this);
-
- if(!sync.acquired())
+ bool send = false;
{
- return;
- }
+ IceUtil::Monitor<IceUtil::Mutex>::TryLock sync(*this);
+ if(!sync.acquired())
+ {
+ return;
+ }
- if(_state != StateActive)
- {
- return;
- }
+ if(_state != StateActive)
+ {
+ return;
+ }
- //
- // Check for timed out async requests.
- //
- for(map<Int, AsyncRequest>::iterator p = _asyncRequests.begin(); p != _asyncRequests.end(); ++p)
- {
- if(p->second.t > IceUtil::Time() && p->second.t <= IceUtil::Time::now(IceUtil::Time::Monotonic))
+ //
+ // Active connection management for idle connections.
+ //
+ if(_acmTimeout <= 0 ||
+ !_requests.empty() || !_asyncRequests.empty() ||
+ _batchStreamInUse || !_batchStream.b.empty() ||
+ _sendInProgress || _dispatchCount > 0)
{
- setState(StateClosed, TimeoutException(__FILE__, __LINE__));
return;
}
+
+ if(IceUtil::Time::now(IceUtil::Time::Monotonic) >= _acmAbsoluteTimeout)
+ {
+ send = setState(StateClosing, ConnectionTimeoutException(__FILE__, __LINE__));
+ }
}
-
- //
- // Active connection management for idle connections.
- //
- if(_acmTimeout > 0 &&
- _requests.empty() && _asyncRequests.empty() &&
- !_batchStreamInUse && _batchStream.b.empty() &&
- _dispatchCount == 0)
+
+ if(send)
{
- if(IceUtil::Time::now(IceUtil::Time::Monotonic) >= _acmAbsoluteTimeout)
+ try
+ {
+ finishSendMessage();
+ }
+ catch(const Ice::LocalException&)
{
- setState(StateClosing, ConnectionTimeoutException(__FILE__, __LINE__));
- return;
}
}
}
-void
-Ice::ConnectionI::sendRequest(BasicStream* os, Outgoing* out, bool compress)
+bool
+Ice::ConnectionI::sendRequest(Outgoing* out, bool compress, bool response)
{
- Int requestId;
-
+ BasicStream* os = out->os();
+ bool send = false;
{
IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this);
-
- assert(!(out && _endpoint->datagram())); // Twoway requests cannot be datagrams.
-
if(_exception.get())
{
//
@@ -523,10 +586,8 @@ Ice::ConnectionI::sendRequest(BasicStream* os, Outgoing* out, bool compress)
assert(_state > StateNotValidated);
assert(_state < StateClosing);
- //
- // Only add to the request map if this is a twoway call.
- //
- if(out)
+ Int requestId;
+ if(response)
{
//
// Create a new unique request ID.
@@ -547,134 +608,65 @@ Ice::ConnectionI::sendRequest(BasicStream* os, Outgoing* out, bool compress)
#else
copy(p, p + sizeof(Int), os->b.begin() + headerSize);
#endif
-
- //
- // Add to the requests map.
- //
- _requestsHint = _requests.insert(_requests.end(), pair<const Int, Outgoing*>(requestId, out));
}
-
- if(_acmTimeout > 0)
+
+ //
+ // Send the message. If it can't be sent without blocking the message is added
+ // to _sendStreams and it will be sent by the selector thread or by this thread
+ // if flush is true.
+ //
+ try
{
- _acmAbsoluteTimeout = IceUtil::Time::now(IceUtil::Time::Monotonic) + IceUtil::Time::seconds(_acmTimeout);
+ OutgoingMessage message(out, os, compress, response);
+ send = sendMessage(message);
}
- }
-
- try
- {
- IceUtil::Mutex::Lock sendSync(_sendMutex);
-
- if(!_transceiver) // Has the transceiver already been closed?
+ catch(const LocalException& ex)
{
- assert(_exception.get());
- _exception->ice_throw(); // The exception is immutable at this point.
+ setState(StateClosed, ex);
+ assert(_exception.get());
+ _exception->ice_throw();
}
-
- if(compress && os->b.size() >= 100) // Only compress messages larger than 100 bytes.
+
+ if(response)
{
//
- // Message compressed. Request compressed response, if any.
- //
- os->b[9] = 2;
-
- //
- // Do compression.
- //
- BasicStream cstream(_instance.get());
- doCompress(*os, cstream);
-
- //
- // Send the request.
+ // Add to the requests map.
//
- os->i = os->b.begin();
- traceRequest("sending request", *os, _logger, _traceLevels);
- cstream.i = cstream.b.begin();
- _transceiver->write(cstream, _endpoint->timeout());
+ _requestsHint = _requests.insert(_requests.end(), pair<const Int, Outgoing*>(requestId, out));
}
- else
- {
- if(compress)
- {
- //
- // Message not compressed. Request compressed response, if any.
- //
- os->b[9] = 1;
- }
- //
- // No compression, just fill in the message size.
- //
- Int sz = static_cast<Int>(os->b.size());
- const Byte* p = reinterpret_cast<const Byte*>(&sz);
-#ifdef ICE_BIG_ENDIAN
- reverse_copy(p, p + sizeof(Int), os->b.begin() + 10);
-#else
- copy(p, p + sizeof(Int), os->b.begin() + 10);
-#endif
-
- //
- // Send the request.
- //
- os->i = os->b.begin();
- traceRequest("sending request", *os, _logger, _traceLevels);
- _transceiver->write(*os, _endpoint->timeout());
+ if(!send)
+ {
+ return !_sendInProgress && _queuedStreams.empty(); // The request was sent if it's not queued!
}
}
- catch(const LocalException& ex)
- {
- IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this);
- setState(StateClosed, ex);
- assert(_exception.get());
- if(out)
+ if(send)
+ {
+ try
{
- //
- // If the request has already been removed from the
- // request map, we are out of luck. It would mean that
- // finished() has been called already, and therefore the
- // exception has been set using the Outgoing::finished()
- // callback. In this case, we cannot throw the exception
- // here, because we must not both raise an exception and
- // have Outgoing::finished() called with an
- // exception. This means that in some rare cases, a
- // request will not be retried even though it could. But I
- // honestly don't know how I could avoid this, without a
- // very elaborate and complex design, which would be bad
- // for performance.
- //
- map<Int, Outgoing*>::iterator p = _requests.find(requestId);
- if(p != _requests.end())
- {
- if(p == _requestsHint)
- {
- _requests.erase(p++);
- _requestsHint = p;
- }
- else
- {
- _requests.erase(p);
- }
-
- _exception->ice_throw();
- }
+ finishSendMessage();
}
- else
+ catch(const Ice::LocalException&)
{
- _exception->ice_throw();
+ assert(_exception.get());
+ if(!response) // Twoway calls are notified through finished()
+ {
+ throw;
+ }
}
}
+ return true; // The request was sent.
}
void
-Ice::ConnectionI::sendAsyncRequest(BasicStream* os, const OutgoingAsyncPtr& out, bool compress)
+Ice::ConnectionI::sendAsyncRequest(const OutgoingAsyncPtr& out, bool compress, bool response)
{
- Int requestId;
+ BasicStream* os = out->__getOs();
+ bool send = false;
{
IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this);
-
- assert(!_endpoint->datagram()); // Twoway requests cannot be datagrams, and async implies twoway.
-
if(_exception.get())
{
//
@@ -687,140 +679,66 @@ Ice::ConnectionI::sendAsyncRequest(BasicStream* os, const OutgoingAsyncPtr& out,
assert(_state > StateNotValidated);
assert(_state < StateClosing);
-
- //
- // Create a new unique request ID.
- //
- requestId = _nextRequestId++;
- if(requestId <= 0)
+
+ Int requestId;
+ if(response)
{
- _nextRequestId = 1;
+ //
+ // Create a new unique request ID.
+ //
requestId = _nextRequestId++;
- }
-
- //
- // Fill in the request ID.
- //
- const Byte* p = reinterpret_cast<const Byte*>(&requestId);
+ if(requestId <= 0)
+ {
+ _nextRequestId = 1;
+ requestId = _nextRequestId++;
+ }
+
+ //
+ // Fill in the request ID.
+ //
+ const Byte* p = reinterpret_cast<const Byte*>(&requestId);
#ifdef ICE_BIG_ENDIAN
- reverse_copy(p, p + sizeof(Int), os->b.begin() + headerSize);
+ reverse_copy(p, p + sizeof(Int), os->b.begin() + headerSize);
#else
- copy(p, p + sizeof(Int), os->b.begin() + headerSize);
+ copy(p, p + sizeof(Int), os->b.begin() + headerSize);
#endif
-
- //
- // Add to the async requests map.
- //
- struct AsyncRequest asyncRequest;
- asyncRequest.p = out;
- if(_endpoint->timeout() > 0)
- {
- asyncRequest.t =
- IceUtil::Time::now(IceUtil::Time::Monotonic) + IceUtil::Time::milliSeconds(_endpoint->timeout());
}
- _asyncRequestsHint = _asyncRequests.insert(_asyncRequests.end(),
- pair<const Int, AsyncRequest>(requestId, asyncRequest));
-
- if(_acmTimeout > 0)
+
+ try
{
- _acmAbsoluteTimeout = IceUtil::Time::now(IceUtil::Time::Monotonic) + IceUtil::Time::seconds(_acmTimeout);
+ OutgoingMessage message(out, os, compress, response);
+ send = sendMessage(message);
}
- }
-
- try
- {
- IceUtil::Mutex::Lock sendSync(_sendMutex);
-
- if(!_transceiver) // Has the transceiver already been closed?
+ catch(const LocalException& ex)
{
+ setState(StateClosed, ex);
assert(_exception.get());
- _exception->ice_throw(); // The exception is immutable at this point.
+ _exception->ice_throw();
}
- if(compress && os->b.size() >= 100) // Only compress messages larger than 100 bytes.
- {
- //
- // Message compressed. Request compressed response, if any.
- //
- os->b[9] = 2;
-
- //
- // Do compression.
- //
- BasicStream cstream(_instance.get());
- doCompress(*os, cstream);
-
- //
- // Send the request.
- //
- os->i = os->b.begin();
- traceRequest("sending asynchronous request", *os, _logger, _traceLevels);
- cstream.i = cstream.b.begin();
- _transceiver->write(cstream, _endpoint->timeout());
- }
- else
+ if(response)
{
- if(compress)
- {
- //
- // Message not compressed. Request compressed response, if any.
- //
- os->b[9] = 1;
- }
-
- //
- // No compression, just fill in the message size.
- //
- Int sz = static_cast<Int>(os->b.size());
- const Byte* p = reinterpret_cast<const Byte*>(&sz);
-#ifdef ICE_BIG_ENDIAN
- reverse_copy(p, p + sizeof(Int), os->b.begin() + 10);
-#else
- copy(p, p + sizeof(Int), os->b.begin() + 10);
-#endif
-
//
- // Send the request.
+ // Add to the async requests map.
//
- os->i = os->b.begin();
- traceRequest("sending asynchronous request", *os, _logger, _traceLevels);
- _transceiver->write(*os, _endpoint->timeout());
+ _asyncRequestsHint = _asyncRequests.insert(_asyncRequests.end(),
+ pair<const Int, OutgoingAsyncPtr>(requestId, out));
}
}
- catch(const LocalException& ex)
+
+ if(send)
{
- IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this);
- setState(StateClosed, ex);
- assert(_exception.get());
-
- //
- // If the request has already been removed from the async
- // request map, we are out of luck. It would mean that
- // finished() has been called already, and therefore the
- // exception has been set using the
- // OutgoingAsync::__finished() callback. In this case, we
- // cannot throw the exception here, because we must not both
- // raise an exception and have OutgoingAsync::__finished()
- // called with an exception. This means that in some rare
- // cases, a request will not be retried even though it
- // could. But I honestly don't know how I could avoid this,
- // without a very elaborate and complex design, which would be
- // bad for performance.
- //
- map<Int, AsyncRequest>::iterator p = _asyncRequests.find(requestId);
- if(p != _asyncRequests.end())
+ try
{
- if(p == _asyncRequestsHint)
- {
- _asyncRequests.erase(p++);
- _asyncRequestsHint = p;
- }
- else
+ finishSendMessage();
+ }
+ catch(const Ice::LocalException&)
+ {
+ assert(_exception.get());
+ if(!response) // Twoway calls are notified through finished().
{
- _asyncRequests.erase(p);
- }
-
- _exception->ice_throw();
+ throw;
+ }
}
}
}
@@ -872,9 +790,8 @@ Ice::ConnectionI::prepareBatchRequest(BasicStream* os)
void
Ice::ConnectionI::finishBatchRequest(BasicStream* os, bool compress)
{
- bool autoflush = false;
- vector<Ice::Byte> lastRequest;
-
+ bool send = false;
+ try
{
IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this);
@@ -882,16 +799,15 @@ Ice::ConnectionI::finishBatchRequest(BasicStream* os, bool compress)
// Get the batch stream back.
//
_batchStream.swap(*os);
-
+
+ if(_exception.get())
+ {
+ _exception->ice_throw();
+ }
+
+ bool flush = false;
if(_batchAutoFlush)
{
- IceUtil::Mutex::Lock sendSync(_sendMutex);
- if(!_transceiver)
- {
- assert(_exception.get());
- _exception->ice_throw(); // The exception is immutable at this point.
- }
-
//
// Throw memory limit exception if the first message added causes us to
// go over limit. Otherwise put aside the marshalled message that caused
@@ -903,122 +819,152 @@ Ice::ConnectionI::finishBatchRequest(BasicStream* os, bool compress)
}
catch(const Ice::Exception&)
{
- if(_batchRequestNum == 0)
+ if(_batchRequestNum > 0)
+ {
+ flush = true;
+ }
+ else
{
- resetBatch(true);
throw;
}
- vector<Ice::Byte>(_batchStream.b.begin() + _batchMarker, _batchStream.b.end()).swap(lastRequest);
- _batchStream.b.resize(_batchMarker);
- autoflush = true;
}
}
- if(!autoflush)
+ if(flush)
{
//
- // Increment the number of requests in the batch.
+ // Temporarily save the last request.
+ //
+ vector<Ice::Byte> lastRequest(_batchStream.b.begin() + _batchMarker, _batchStream.b.end());
+ _batchStream.b.resize(_batchMarker);
+
+ //
+ // Send the batch stream without the last request.
+ //
+ try
+ {
+ //
+ // Fill in the number of requests in the batch.
+ //
+ const Byte* p = reinterpret_cast<const Byte*>(&_batchRequestNum);
+#ifdef ICE_BIG_ENDIAN
+ reverse_copy(p, p + sizeof(Int), _batchStream.b.begin() + headerSize);
+#else
+ copy(p, p + sizeof(Int), _batchStream.b.begin() + headerSize);
+#endif
+
+ OutgoingMessage message(&_batchStream, _batchRequestCompress);
+ send = sendMessage(message);
+ if(send)
+ {
+ //
+ // If the request can't be sent immediately and this is a foreground send,
+ // we adopt the stream to be able to re-use _batchStream immediately.
+ //
+ assert(!_sendStreams.empty());
+ _sendStreams.back().adopt(0);
+ }
+ }
+ catch(const Ice::LocalException& ex)
+ {
+ setState(StateClosed, ex);
+ assert(_exception.get());
+ _exception->ice_throw();
+ }
+
+ //
+ // Reset the batch.
//
- ++_batchRequestNum;
+ BasicStream dummy(_instance.get(), _batchAutoFlush);
+ _batchStream.swap(dummy);
+ _batchRequestNum = 0;
+ _batchRequestCompress = false;
+ _batchMarker = 0;
//
- // We compress the whole batch if there is at least one compressed
- // message.
+ // Check again if the last request doesn't exceed what we can send with the auto flush
//
- if(compress)
+ if(sizeof(requestBatchHdr) + lastRequest.size() > _instance->messageSizeMax())
{
- _batchRequestCompress = true;
+ throw MemoryLimitException(__FILE__, __LINE__);
}
-
+
//
- // Notify about the batch stream not being in use anymore.
+ // Start a new batch with the last message that caused us to go over the limit.
//
- assert(_batchStreamInUse);
- _batchStreamInUse = false;
- notifyAll();
+ _batchStream.writeBlob(requestBatchHdr, sizeof(requestBatchHdr));
+ _batchStream.writeBlob(&lastRequest[0], lastRequest.size());
}
- }
-
- if(autoflush)
- {
- //
- // We have to keep _batchStreamInUse set until after we insert the
- // saved marshalled data into a new stream.
- //
- flushBatchRequestsInternal(true);
-
- IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this);
//
- // Throw memory limit exception if the message that caused us to go over
- // limit causes us to exceed the limit by itself.
+ // Increment the number of requests in the batch.
//
- if(sizeof(requestBatchHdr) + lastRequest.size() > _instance->messageSizeMax())
- {
- resetBatch(true);
- throw MemoryLimitException(__FILE__, __LINE__);
- }
-
+ ++_batchRequestNum;
+
//
- // Start a new batch with the last message that caused us to
- // go over the limit.
+ // We compress the whole batch if there is at least one compressed
+ // message.
//
- try
- {
- _batchStream.writeBlob(requestBatchHdr, sizeof(requestBatchHdr));
- _batchStream.writeBlob(&lastRequest[0], lastRequest.size());
- }
- catch(const LocalException& ex)
- {
- setState(StateClosed, ex);
- ex.ice_throw();
- }
-
if(compress)
{
_batchRequestCompress = true;
}
-
+
//
- // Notify that the batch stream not in use anymore.
+ // Notify about the batch stream not being in use anymore.
//
- ++_batchRequestNum;
+ assert(_batchStreamInUse);
_batchStreamInUse = false;
notifyAll();
}
+ catch(const Ice::LocalException&)
+ {
+ abortBatchRequest();
+ if(send)
+ {
+ finishSendMessage(); // Let exceptions go through to report auto-flush failures to the caller.
+ }
+ throw;
+ }
+
+ if(send)
+ {
+ finishSendMessage(); // Let exceptions go through to report auto-flush failures to the caller.
+ }
}
void
Ice::ConnectionI::abortBatchRequest()
{
IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this);
-
- //
- // Reset the batch stream. We cannot save old requests
- // in the batch stream, as they might be corrupted due to
- // incomplete marshaling.
- //
- resetBatch(true);
+
+ BasicStream dummy(_instance.get(), _batchAutoFlush);
+ _batchStream.swap(dummy);
+ _batchRequestNum = 0;
+ _batchRequestCompress = false;
+ _batchMarker = 0;
+
+ assert(_batchStreamInUse);
+ _batchStreamInUse = false;
+ notifyAll();
}
void
Ice::ConnectionI::flushBatchRequests()
{
- flushBatchRequestsInternal(false);
+ BatchOutgoing out(this, _instance.get());
+ out.invoke();
}
-void
-Ice::ConnectionI::flushBatchRequestsInternal(bool ignoreInUse)
+bool
+Ice::ConnectionI::flushBatchRequests(BatchOutgoing* out)
{
+ bool send = false;
{
IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this);
-
- if(!ignoreInUse)
+ while(_batchStreamInUse && !_exception.get())
{
- while(_batchStreamInUse && !_exception.get())
- {
- wait();
- }
+ wait();
}
if(_exception.get())
@@ -1026,36 +972,78 @@ Ice::ConnectionI::flushBatchRequestsInternal(bool ignoreInUse)
_exception->ice_throw();
}
- if(_batchStream.b.empty())
+ if(_batchRequestNum == 0)
{
- return; // Nothing to do.
+ return true;
}
- assert(_state > StateNotValidated);
- assert(_state < StateClosing);
-
- _batchStream.i = _batchStream.b.begin();
+ //
+ // Fill in the number of requests in the batch.
+ //
+ const Byte* p = reinterpret_cast<const Byte*>(&_batchRequestNum);
+#ifdef ICE_BIG_ENDIAN
+ reverse_copy(p, p + sizeof(Int), _batchStream.b.begin() + headerSize);
+#else
+ copy(p, p + sizeof(Int), _batchStream.b.begin() + headerSize);
+#endif
+ _batchStream.swap(*out->os());
- if(_acmTimeout > 0)
+ //
+ // Send the batch stream.
+ //
+ try
{
- _acmAbsoluteTimeout = IceUtil::Time::now(IceUtil::Time::Monotonic) + IceUtil::Time::seconds(_acmTimeout);
+ OutgoingMessage message(out, out->os(), _batchRequestCompress, false);
+ send = sendMessage(message);
+ }
+ catch(const Ice::LocalException& ex)
+ {
+ setState(StateClosed, ex);
+ assert(_exception.get());
+ _exception->ice_throw();
}
//
- // Prevent that new batch requests are added while we are
- // flushing.
+ // Reset the batch stream.
//
- _batchStreamInUse = true;
+ BasicStream dummy(_instance.get(), _batchAutoFlush);
+ _batchStream.swap(dummy);
+ _batchRequestNum = 0;
+ _batchRequestCompress = false;
+ _batchMarker = 0;
+
+ if(!send)
+ {
+ return !_sendInProgress && _queuedStreams.empty(); // The request was sent if it's not queued!
+ }
}
-
- try
+
+ if(send)
+ {
+ finishSendMessage();
+ }
+ return true;
+}
+
+void
+Ice::ConnectionI::flushAsyncBatchRequests(const BatchOutgoingAsyncPtr& outAsync)
+{
+ bool send = false;
{
- IceUtil::Mutex::Lock sendSync(_sendMutex);
+ IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this);
+ while(_batchStreamInUse && !_exception.get())
+ {
+ wait();
+ }
+
+ if(_exception.get())
+ {
+ _exception->ice_throw();
+ }
- if(!_transceiver) // Has the transceiver already been closed?
+ if(_batchRequestNum == 0)
{
- assert(_exception.get());
- _exception->ice_throw(); // The exception is immutable at this point.
+ return;
}
//
@@ -1067,195 +1055,123 @@ Ice::ConnectionI::flushBatchRequestsInternal(bool ignoreInUse)
#else
copy(p, p + sizeof(Int), _batchStream.b.begin() + headerSize);
#endif
-
- if(_batchRequestCompress && _batchStream.b.size() >= 100) // Only compress messages larger than 100 bytes.
+ _batchStream.swap(*outAsync->__getOs());
+
+ //
+ // Send the batch stream.
+ //
+ try
{
- //
- // Message compressed. Request compressed response, if any.
- //
- _batchStream.b[9] = 2;
-
- //
- // Do compression.
- //
- BasicStream cstream(_instance.get());
- doCompress(_batchStream, cstream);
-
- //
- // Send the batch request.
- //
- _batchStream.i = _batchStream.b.begin();
- traceBatchRequest("sending batch request", _batchStream, _logger, _traceLevels);
- cstream.i = cstream.b.begin();
- _transceiver->write(cstream, _endpoint->timeout());
+ OutgoingMessage message(outAsync, outAsync->__getOs(), _batchRequestCompress, false);
+ send = sendMessage(message);
}
- else
+ catch(const Ice::LocalException& ex)
{
- if(_batchRequestCompress)
- {
- //
- // Message not compressed. Request compressed response, if any.
- //
- _batchStream.b[9] = 1;
- }
-
- //
- // No compression, just fill in the message size.
- //
- Int sz = static_cast<Int>(_batchStream.b.size());
- const Byte* q = reinterpret_cast<const Byte*>(&sz);
-#ifdef ICE_BIG_ENDIAN
- reverse_copy(q, q + sizeof(Int), _batchStream.b.begin() + 10);
-#else
- copy(q, q + sizeof(Int), _batchStream.b.begin() + 10);
-#endif
-
- //
- // Send the batch request.
- //
- _batchStream.i = _batchStream.b.begin();
- traceBatchRequest("sending batch request", _batchStream, _logger, _traceLevels);
- _transceiver->write(_batchStream, _endpoint->timeout());
+ setState(StateClosed, ex);
+ assert(_exception.get());
+ _exception->ice_throw();
}
- }
- catch(const LocalException& ex)
- {
- IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this);
- setState(StateClosed, ex);
- assert(_exception.get());
//
- // Since batch requests are all oneways (or datagrams), we
- // must report the exception to the caller.
+ // Reset the batch stream.
//
- _exception->ice_throw();
+ BasicStream dummy(_instance.get(), _batchAutoFlush);
+ _batchStream.swap(dummy);
+ _batchRequestNum = 0;
+ _batchRequestCompress = false;
+ _batchMarker = 0;
}
+ if(send)
{
- IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this);
-
- //
- // Reset the batch stream, and notify that flushing is over.
- //
- resetBatch(!ignoreInUse);
- }
-}
-
-void
-Ice::ConnectionI::resetBatch(bool resetInUse)
-{
- BasicStream dummy(_instance.get(), _batchAutoFlush);
- _batchStream.swap(dummy);
- _batchRequestNum = 0;
- _batchRequestCompress = false;
- _batchMarker = 0;
-
- //
- // Notify about the batch stream not being in use
- // anymore.
- //
- if(resetInUse)
- {
- assert(_batchStreamInUse);
- _batchStreamInUse = false;
- notifyAll();
+ finishSendMessage();
}
}
void
Ice::ConnectionI::sendResponse(BasicStream* os, Byte compressFlag)
{
- try
+ bool send = false;
{
- IceUtil::Mutex::Lock sendSync(_sendMutex);
-
- if(!_transceiver) // Has the transceiver already been closed?
- {
- assert(_exception.get());
- _exception->ice_throw(); // The exception is immutable at this point.
- }
+ IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this);
+ assert(_state > StateNotValidated);
- //
- // Only compress if compression was requested by the client,
- // and if the message is larger than 100 bytes.
- //
- if(compressFlag > 0 && os->b.size() >= 100)
+ try
{
- //
- // Message compressed. Request compressed response, if any.
- //
- os->b[9] = 2;
+ if(--_dispatchCount == 0)
+ {
+ notifyAll();
+ }
- //
- // Do compression.
- //
- BasicStream cstream(_instance.get());
- doCompress(*os, cstream);
+ if(_state == StateClosed)
+ {
+ assert(_exception.get());
+ _exception->ice_throw();
+ }
- //
- // Send the reply.
- //
- os->i = os->b.begin();
- traceReply("sending reply", *os, _logger, _traceLevels);
- cstream.i = cstream.b.begin();
- _transceiver->write(cstream, _endpoint->timeout());
- }
- else
- {
- if(compressFlag > 0)
+ OutgoingMessage message(os, compressFlag > 0);
+ send = sendMessage(message);
+
+ if(_state == StateClosing && _dispatchCount == 0)
{
- //
- // Message not compressed. Request compressed response, if any.
- //
- os->b[9] = 1;
+ send = initiateShutdown(send);
}
- //
- // No compression, just fill in the message size.
- //
- Int sz = static_cast<Int>(os->b.size());
- const Byte* p = reinterpret_cast<const Byte*>(&sz);
-#ifdef ICE_BIG_ENDIAN
- reverse_copy(p, p + sizeof(Int), os->b.begin() + 10);
-#else
- copy(p, p + sizeof(Int), os->b.begin() + 10);
-#endif
-
- //
- // Send the reply.
- //
- os->i = os->b.begin();
- traceReply("sending reply", *os, _logger, _traceLevels);
- _transceiver->write(*os, _endpoint->timeout());
+ if(_acmTimeout > 0)
+ {
+ _acmAbsoluteTimeout = IceUtil::Time::now(IceUtil::Time::Monotonic) +
+ IceUtil::Time::seconds(_acmTimeout);
+ }
+ }
+ catch(const LocalException& ex)
+ {
+ setState(StateClosed, ex);
}
}
- catch(const LocalException& ex)
+
+ if(send)
{
- IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this);
- setState(StateClosed, ex);
+ try
+ {
+ finishSendMessage();
+ }
+ catch(Ice::LocalException&)
+ {
+ // Ignore.
+ }
}
+}
+void
+Ice::ConnectionI::sendNoResponse()
+{
+ bool send = false;
{
IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this);
-
assert(_state > StateNotValidated);
-
+
try
{
if(--_dispatchCount == 0)
{
notifyAll();
}
-
+
+ if(_state == StateClosed)
+ {
+ assert(_exception.get());
+ _exception->ice_throw();
+ }
+
if(_state == StateClosing && _dispatchCount == 0)
{
- initiateShutdown();
+ send = initiateShutdown(false);
}
-
+
if(_acmTimeout > 0)
{
- _acmAbsoluteTimeout =
- IceUtil::Time::now(IceUtil::Time::Monotonic) + IceUtil::Time::seconds(_acmTimeout);
+ _acmAbsoluteTimeout = IceUtil::Time::now(IceUtil::Time::Monotonic) +
+ IceUtil::Time::seconds(_acmTimeout);
}
}
catch(const LocalException& ex)
@@ -1263,31 +1179,18 @@ Ice::ConnectionI::sendResponse(BasicStream* os, Byte compressFlag)
setState(StateClosed, ex);
}
}
-}
-void
-Ice::ConnectionI::sendNoResponse()
-{
- IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this);
-
- assert(_state > StateNotValidated);
-
- try
+ if(send)
{
- if(--_dispatchCount == 0)
+ try
{
- notifyAll();
+ finishSendMessage();
}
-
- if(_state == StateClosing && _dispatchCount == 0)
+ catch(Ice::LocalException&)
{
- initiateShutdown();
+ // Ignore.
}
}
- catch(const LocalException& ex)
- {
- setState(StateClosed, ex);
- }
}
EndpointIPtr
@@ -1307,12 +1210,15 @@ Ice::ConnectionI::setAdapter(const ObjectAdapterPtr& adapter)
{
IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this);
- if(_exception.get())
+ if(_state == StateClosing || _state == StateClosed)
{
+ assert(_exception.get());
_exception->ice_throw();
}
-
- assert(_state < StateClosing);
+ else if(_state <= StateNotValidated)
+ {
+ return;
+ }
_adapter = adapter;
@@ -1370,12 +1276,12 @@ Ice::ConnectionI::readable() const
return true;
}
-void
+bool
Ice::ConnectionI::read(BasicStream& stream)
{
assert(!_threadPerConnection); // Only for use with a thread pool.
- _transceiver->read(stream, 0);
+ return _transceiver->read(stream, 0);
//
// Updating _acmAbsoluteTimeout is too expensive here, because we
@@ -1446,9 +1352,6 @@ Ice::ConnectionI::finished(const ThreadPoolPtr& threadPool)
threadPool->promoteFollower();
auto_ptr<LocalException> localEx;
-
- map<Int, Outgoing*> requests;
- map<Int, AsyncRequest> asyncRequests;
{
IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this);
@@ -1456,49 +1359,48 @@ Ice::ConnectionI::finished(const ThreadPoolPtr& threadPool)
--_finishedCount;
assert(threadPool.get() == _threadPool.get());
- if(_finishedCount == 0 && _state == StateClosed)
+ if(_finishedCount > 0 || _state != StateClosed || _sendInProgress)
{
- _threadPool->decFdsInUse();
+ return;
+ }
- //
- // We must make sure that nobody is sending when we close
- // the transceiver.
- //
- IceUtil::Mutex::Lock sendSync(_sendMutex);
+ _threadPool->decFdsInUse();
+ _selectorThread->decFdsInUse();
- try
- {
- _transceiver->close();
- }
- catch(const LocalException& ex)
- {
- localEx.reset(dynamic_cast<LocalException*>(ex.ice_clone()));
- }
-
- _transceiver = 0;
- notifyAll();
+ try
+ {
+ _transceiver->close();
}
-
- if(_state == StateClosed || _state == StateClosing)
+ catch(const LocalException& ex)
{
- requests.swap(_requests);
- _requestsHint = _requests.end();
-
- asyncRequests.swap(_asyncRequests);
- _asyncRequestsHint = _asyncRequests.end();
+ localEx.reset(dynamic_cast<LocalException*>(ex.ice_clone()));
}
+
+ _transceiver = 0;
+ notifyAll();
}
- for(map<Int, Outgoing*>::iterator p = requests.begin(); p != requests.end(); ++p)
+ finishStart(*_exception.get());
+
+ // Note: the streams must be cleared first because they expect the Outgoing objects to still be valid.
+ for(deque<OutgoingMessage>::iterator o = _queuedStreams.begin(); o != _queuedStreams.end(); ++o)
{
- p->second->finished(*_exception.get()); // The exception is immutable at this point.
+ o->finished(*_exception.get());
}
+ _queuedStreams.clear();
- for(map<Int, AsyncRequest>::iterator q = asyncRequests.begin(); q != asyncRequests.end(); ++q)
+ for(map<Int, Outgoing*>::iterator p = _requests.begin(); p != _requests.end(); ++p)
{
- q->second.p->__finished(*_exception.get()); // The exception is immutable at this point.
+ p->second->finished(*_exception.get()); // The exception is immutable at this point.
}
+ _requests.clear();
+ for(map<Int, OutgoingAsyncPtr>::iterator q = _asyncRequests.begin(); q != _asyncRequests.end(); ++q)
+ {
+ q->second->__finished(*_exception.get()); // The exception is immutable at this point.
+ }
+ _asyncRequests.clear();
+
if(localEx.get())
{
localEx->ice_throw();
@@ -1554,6 +1456,139 @@ Ice::ConnectionI::toString() const
}
//
+// Operations from SocketReadyCallback
+//
+SocketStatus
+Ice::ConnectionI::socketReady(bool finished)
+{
+ if(!finished)
+ {
+ try
+ {
+ //
+ // First, we check if there's something to send. If that's the case, the connection
+ // must be active and the only thing to do is send the queued streams.
+ //
+ if(!_sendStreams.empty())
+ {
+ if(!send(0))
+ {
+ return NeedWrite;
+ }
+ assert(_sendStreams.empty());
+ }
+ else
+ {
+ //
+ // If there's nothing to send, we're still validating the connection.
+ //
+ int state;
+ {
+ IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this);
+ assert(_state == StateClosed || _state <= StateNotValidated);
+
+ state = _state;
+
+ if(_state == StateClosed)
+ {
+ assert(_exception.get());
+ _exception->ice_throw();
+ }
+ }
+
+ if(state == StateNotInitialized)
+ {
+ SocketStatus status = initialize();
+ if(status != Finished)
+ {
+ return status;
+ }
+ }
+
+ if(state <= StateNotValidated)
+ {
+ SocketStatus status = validate();
+ if(status != Finished)
+ {
+ return status;
+ }
+ }
+
+ finishStart();
+ }
+ }
+ catch(const Ice::LocalException& ex)
+ {
+ IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this);
+ setState(StateClosed, ex);
+ }
+ }
+
+ //
+ // If there's no more data to send or if connection validation is finished, we checkout
+ // the connection state to figure out whether or not it's time to unregister with the
+ // selector thread.
+ //
+
+ IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this);
+ assert(_sendInProgress);
+ if(_state == StateClosed)
+ {
+ assert(!_startCallback || (!_threadPerConnection && !_registeredWithPool));
+
+ _queuedStreams.insert(_queuedStreams.begin(), _sendStreams.begin(), _sendStreams.end());
+ _sendStreams.clear();
+ _sendInProgress = false;
+
+ if(_threadPerConnection)
+ {
+ _transceiver->shutdownReadWrite();
+ }
+ else
+ {
+ registerWithPool();
+ unregisterWithPool(); // Let finished() do the close.
+ }
+ notifyAll();
+ return Finished;
+ }
+ else if(_waitingForSend > 0) // If there's synchronous calls waiting to be sent, unregister.
+ {
+ _sendInProgress = false;
+ notifyAll();
+ return Finished;
+ }
+ else if(_queuedStreams.empty())
+ {
+ _sendInProgress = false;
+ if(_acmTimeout > 0)
+ {
+ _acmAbsoluteTimeout = IceUtil::Time::now(IceUtil::Time::Monotonic) + IceUtil::Time::seconds(_acmTimeout);
+ }
+ return Finished;
+ }
+ else
+ {
+ _sendStreams.swap(_queuedStreams);
+ return NeedWrite; // We're not finished yet, there's more data to send!
+ }
+}
+
+void
+Ice::ConnectionI::socketTimeout()
+{
+ IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this);
+ if(_state <= StateNotValidated)
+ {
+ setState(StateClosed, ConnectTimeoutException(__FILE__, __LINE__));
+ }
+ else if(_state <= StateClosing)
+ {
+ setState(StateClosed, TimeoutException(__FILE__, __LINE__));
+ }
+}
+
+//
// Only used by the SSL plug-in.
//
// The external party has to synchronize the connection, since the
@@ -1596,8 +1631,10 @@ Ice::ConnectionI::ConnectionI(const InstancePtr& instance,
_batchRequestNum(0),
_batchRequestCompress(false),
_batchMarker(0),
+ _sendInProgress(false),
+ _waitingForSend(0),
_dispatchCount(0),
- _state(StateNotValidated),
+ _state(StateNotInitialized),
_stateTime(IceUtil::Time::now(IceUtil::Time::Monotonic))
{
Int& acmTimeout = const_cast<Int&>(_acmTimeout);
@@ -1635,17 +1672,17 @@ Ice::ConnectionI::ConnectionI(const InstancePtr& instance,
_servantManager = adapterImpl->getServantManager();
}
- if(!threadPerConnection)
+ __setNoDelete(true);
+ try
{
- //
- // Only set _threadPool if we really need it, i.e., if we are
- // not in thread per connection mode. Thread pools have lazy
- // initialization in Instance, and we don't want them to be
- // created if they are not needed.
- //
- __setNoDelete(true);
- try
+ if(!threadPerConnection)
{
+ //
+ // Only set _threadPool if we really need it, i.e., if we are
+ // not in thread per connection mode. Thread pools have lazy
+ // initialization in Instance, and we don't want them to be
+ // created if they are not needed.
+ //
if(adapterImpl)
{
const_cast<ThreadPoolPtr&>(_threadPool) = adapterImpl->getThreadPool();
@@ -1656,76 +1693,34 @@ Ice::ConnectionI::ConnectionI(const InstancePtr& instance,
}
_threadPool->incFdsInUse();
}
- catch(const IceUtil::Exception& ex)
- {
- try
- {
- _transceiver->close();
- }
- catch(const LocalException&)
- {
- // Here we ignore any exceptions in close().
- }
- __setNoDelete(false);
- ex.ice_throw();
- }
+ //
+ // Only set selector thread if we really need it.
+ //
+ const_cast<SelectorThreadPtr&>(_selectorThread) = _instance->selectorThread();
+ _selectorThread->incFdsInUse();
+ }
+ catch(const IceUtil::Exception&)
+ {
__setNoDelete(false);
+ throw;
}
+ __setNoDelete(false);
}
Ice::ConnectionI::~ConnectionI()
{
+ assert(!_startCallback);
assert(_state == StateClosed);
assert(!_transceiver);
assert(_dispatchCount == 0);
assert(!_thread);
+ assert(_queuedStreams.empty());
+ assert(_requests.empty());
+ assert(_asyncRequests.empty());
}
-void
-Ice::ConnectionI::start()
-{
- //
- // If we are in thread per connection mode, create the thread for this connection.
- // We can't start the thread in the constructor because it can cause a race condition
- // (see bug 1718).
- //
- if(_threadPerConnection)
- {
- try
- {
- _thread = new ThreadPerConnection(this);
- _thread->start(_threadPerConnectionStackSize);
- }
- catch(const IceUtil::Exception& ex)
- {
- {
- Error out(_logger);
- out << "cannot create thread for connection:\n" << ex;
- }
-
- try
- {
- _transceiver->close();
- }
- catch(const LocalException&)
- {
- // Here we ignore any exceptions in close().
- }
-
- //
- // Clean up.
- //
- _transceiver = 0;
- _thread = 0;
- _state = StateClosed;
-
- ex.ice_throw();
- }
- }
-}
-
-void
+bool
Ice::ConnectionI::setState(State state, const LocalException& ex)
{
//
@@ -1736,7 +1731,7 @@ Ice::ConnectionI::setState(State state, const LocalException& ex)
if(_state == state) // Don't switch twice.
{
- return;
+ return false;
}
if(!_exception.get())
@@ -1777,10 +1772,10 @@ Ice::ConnectionI::setState(State state, const LocalException& ex)
// exceptions. Otherwise new requests may retry on a connection
// that is not yet marked as closed or closing.
//
- setState(state);
+ return setState(state);
}
-void
+bool
Ice::ConnectionI::setState(State state)
{
//
@@ -1795,135 +1790,122 @@ Ice::ConnectionI::setState(State state)
//
// Skip graceful shutdown if we are destroyed before validation.
//
- if(_state == StateNotValidated && state == StateClosing)
+ if(_state <= StateNotValidated && state == StateClosing)
{
state = StateClosed;
}
if(_state == state) // Don't switch twice.
{
- return;
+ return false;
}
switch(state)
{
- case StateNotValidated:
+ case StateNotInitialized:
+ {
+ assert(false);
+ break;
+ }
+
+ case StateNotValidated:
+ {
+ if(_state != StateNotInitialized)
{
- assert(false);
- break;
+ assert(_state == StateClosed);
+ return false;
}
+ break;
+ }
- case StateActive:
+ case StateActive:
+ {
+ //
+ // Can only switch from holding or not validated to
+ // active.
+ //
+ if(_state != StateHolding && _state != StateNotValidated)
{
- //
- // Can only switch from holding or not validated to
- // active.
- //
- if(_state != StateHolding && _state != StateNotValidated)
- {
- return;
- }
- if(!_threadPerConnection)
- {
- registerWithPool();
- }
- break;
+ return false;
+ }
+ if(!_threadPerConnection)
+ {
+ registerWithPool();
+ }
+ break;
+ }
+
+ case StateHolding:
+ {
+ //
+ // Can only switch from active or not validated to
+ // holding.
+ //
+ if(_state != StateActive && _state != StateNotValidated)
+ {
+ return false;
+ }
+ if(!_threadPerConnection)
+ {
+ unregisterWithPool();
+ }
+ break;
+ }
+
+ case StateClosing:
+ {
+ //
+ // Can't change back from closed.
+ //
+ if(_state == StateClosed)
+ {
+ return false;
}
+ if(!_threadPerConnection)
+ {
+ registerWithPool(); // We need to continue to read in closing state.
+ }
+ break;
+ }
- case StateHolding:
+ case StateClosed:
+ {
+ if(_sendInProgress)
{
//
- // Can only switch from active or not validated to
- // holding.
+ // Unregister with both the pool and the selector thread. We unregister with
+ // the pool to ensure that it stops reading on the socket (otherwise, if the
+ // socket is closed the thread pool would spin always reading 0 from the FD).
+ // The selector thread will register again the FD with the pool once it's
+ // done.
//
- if(_state != StateActive && _state != StateNotValidated)
- {
- return;
- }
+ _selectorThread->unregister(_transceiver->fd());
if(!_threadPerConnection)
{
unregisterWithPool();
}
- break;
- }
- case StateClosing:
+ _transceiver->shutdownWrite(); // Prevent further writes.
+ }
+ else if(_state <= StateNotValidated || _threadPerConnection)
{
//
- // Can't change back from closed.
+ // If we are in thread per connection mode or we're initializing
+ // the connection in blocking mode, we shutdown both for reading
+ // and writing. This will unblock and read call with an exception.
+ // The thread per connection then closes the transceiver.
//
- if(_state == StateClosed)
- {
- return;
- }
- if(!_threadPerConnection)
- {
- registerWithPool(); // We need to continue to read in closing state.
- }
- break;
+ _transceiver->shutdownReadWrite();
}
-
- case StateClosed:
+ else
{
- if(_threadPerConnection)
- {
- //
- // If we are in thread per connection mode, we
- // shutdown both for reading and writing. This will
- // unblock and read call with an exception. The thread
- // per connection then closes the transceiver.
- //
- _transceiver->shutdownReadWrite();
- }
- else if(_state == StateNotValidated)
- {
- //
- // If we change from not validated we can close right
- // away.
- //
- assert(!_registeredWithPool);
-
- _threadPool->decFdsInUse();
-
- //
- // We must make sure that nobody is sending when we
- // close the transceiver.
- //
- IceUtil::Mutex::Lock sendSync(_sendMutex);
-
- try
- {
- _transceiver->close();
- }
- catch(const LocalException&)
- {
- // Here we ignore any exceptions in close().
- }
-
- _transceiver = 0;
- //notifyAll(); // We notify already below.
- }
- else
- {
- //
- // Otherwise we first must make sure that we are
- // registered, then we unregister, and let finished()
- // do the close.
- //
- registerWithPool();
- unregisterWithPool();
+ registerWithPool();
+ unregisterWithPool(); // Let finished() do the close.
- //
- // We must prevent any further writes when _state == StateClosed.
- // However, functions such as sendResponse cannot acquire the main
- // mutex in order to check _state. Therefore we shut down the write
- // end of the transceiver, which causes subsequent write attempts
- // to fail with an exception.
- //
- _transceiver->shutdownWrite();
- }
- break;
+ _transceiver->shutdownWrite(); // Prevent further writes.
}
+ break;
+ }
}
//
@@ -1954,25 +1936,25 @@ Ice::ConnectionI::setState(State state)
{
try
{
- initiateShutdown();
+ return initiateShutdown(false);
}
catch(const LocalException& ex)
{
setState(StateClosed, ex);
}
}
+
+ return false;
}
-void
-Ice::ConnectionI::initiateShutdown() const
+bool
+Ice::ConnectionI::initiateShutdown(bool queue)
{
assert(_state == StateClosing);
assert(_dispatchCount == 0);
if(!_endpoint->datagram())
{
- IceUtil::Mutex::Lock sendSync(_sendMutex);
-
//
// Before we shut down, we send a close connection message.
//
@@ -1989,12 +1971,9 @@ Ice::ConnectionI::initiateShutdown() const
os.write((Byte)1); // Compression status: compression supported but not used.
os.write(headerSize); // Message size.
- //
- // Send the message.
- //
- os.i = os.b.begin();
- traceHeader("sending close connection", os, _logger, _traceLevels);
- _transceiver->write(os, _endpoint->timeout());
+ OutgoingMessage message(&os, false);
+ return sendMessage(message, queue);
+
//
// The CloseConnection message should be sufficient. Closing the write
// end of the socket is probably an artifact of how things were done
@@ -2005,6 +1984,610 @@ Ice::ConnectionI::initiateShutdown() const
//
//_transceiver->shutdownWrite();
}
+
+ return false;
+}
+
+SocketStatus
+Ice::ConnectionI::initialize()
+{
+ int timeout = 0;
+ if(!_startCallback || _threadPerConnection)
+ {
+ DefaultsAndOverridesPtr defaultsAndOverrides = _instance->defaultsAndOverrides();
+ if(defaultsAndOverrides->overrideConnectTimeout)
+ {
+ timeout = defaultsAndOverrides->overrideConnectTimeoutValue;
+ }
+ else
+ {
+ timeout = _endpoint->timeout();
+ }
+ }
+
+ try
+ {
+ SocketStatus status = _transceiver->initialize(timeout);
+ if(status != Finished)
+ {
+ if(!_startCallback || _threadPerConnection)
+ {
+ throw TimeoutException(__FILE__, __LINE__);
+ }
+ return status;
+ }
+ }
+ catch(const TimeoutException&)
+ {
+ throw ConnectTimeoutException(__FILE__, __LINE__);
+ }
+
+ {
+ IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this);
+ if(_state == StateClosed)
+ {
+ assert(_exception.get());
+ _exception->ice_throw();
+ }
+
+ //
+ // Update the connection description once the transceiver is initialized.
+ //
+ const_cast<string&>(_desc) = _transceiver->toString();
+
+ setState(StateNotValidated);
+ }
+
+ return Finished;
+}
+
+SocketStatus
+Ice::ConnectionI::validate()
+{
+ if(!_endpoint->datagram()) // Datagram connections are always implicitly validated.
+ {
+ Int timeout = 0;
+ if(!_startCallback || _threadPerConnection)
+ {
+ if(_instance->defaultsAndOverrides()->overrideConnectTimeout)
+ {
+ timeout = _instance->defaultsAndOverrides()->overrideConnectTimeoutValue;
+ }
+ else
+ {
+ timeout = _endpoint->timeout();
+ }
+ }
+
+ if(_adapter) // The server side has the active role for connection validation.
+ {
+ BasicStream& os = _stream;
+ if(os.b.empty())
+ {
+ os.write(magic[0]);
+ os.write(magic[1]);
+ os.write(magic[2]);
+ os.write(magic[3]);
+ os.write(protocolMajor);
+ os.write(protocolMinor);
+ os.write(encodingMajor);
+ os.write(encodingMinor);
+ os.write(validateConnectionMsg);
+ os.write(static_cast<Byte>(0)); // Compression status (always zero for validate connection).
+ os.write(headerSize); // Message size.
+ os.i = os.b.begin();
+ traceSend(os, _logger, _traceLevels);
+ }
+ else
+ {
+ // The stream can only be non-empty if we're doing a non-blocking connection validation.
+ assert(_startCallback && !_threadPerConnection);
+ }
+
+ try
+ {
+ if(!_transceiver->write(os, timeout))
+ {
+ if(!_startCallback || _threadPerConnection)
+ {
+ throw TimeoutException(__FILE__, __LINE__);
+ }
+ return NeedWrite;
+ }
+ }
+ catch(const TimeoutException&)
+ {
+ throw ConnectTimeoutException(__FILE__, __LINE__);
+ }
+ }
+ else // The client side has the passive role for connection validation.
+ {
+ BasicStream& is = _stream;
+ if(is.b.empty())
+ {
+ is.b.resize(headerSize);
+ is.i = is.b.begin();
+ }
+ else
+ {
+ // The stream can only be non-empty if we're doing a non-blocking connection validation.
+ assert(_startCallback && !_threadPerConnection);
+ }
+
+ try
+ {
+ if(!_transceiver->read(is, timeout))
+ {
+ if(!_startCallback || _threadPerConnection)
+ {
+ throw TimeoutException(__FILE__, __LINE__);
+ }
+ return NeedRead;
+ }
+ }
+ catch(const TimeoutException&)
+ {
+ throw ConnectTimeoutException(__FILE__, __LINE__);
+ }
+
+ assert(is.i == is.b.end());
+ is.i = is.b.begin();
+ Byte m[4];
+ is.read(m[0]);
+ is.read(m[1]);
+ is.read(m[2]);
+ is.read(m[3]);
+ if(m[0] != magic[0] || m[1] != magic[1] || m[2] != magic[2] || m[3] != magic[3])
+ {
+ BadMagicException ex(__FILE__, __LINE__);
+ ex.badMagic = Ice::ByteSeq(&m[0], &m[0] + sizeof(magic));
+ throw ex;
+ }
+ Byte pMajor;
+ Byte pMinor;
+ is.read(pMajor);
+ is.read(pMinor);
+ if(pMajor != protocolMajor)
+ {
+ UnsupportedProtocolException ex(__FILE__, __LINE__);
+ ex.badMajor = static_cast<unsigned char>(pMajor);
+ ex.badMinor = static_cast<unsigned char>(pMinor);
+ ex.major = static_cast<unsigned char>(protocolMajor);
+ ex.minor = static_cast<unsigned char>(protocolMinor);
+ throw ex;
+ }
+ Byte eMajor;
+ Byte eMinor;
+ is.read(eMajor);
+ is.read(eMinor);
+ if(eMajor != encodingMajor)
+ {
+ UnsupportedEncodingException ex(__FILE__, __LINE__);
+ ex.badMajor = static_cast<unsigned char>(eMajor);
+ ex.badMinor = static_cast<unsigned char>(eMinor);
+ ex.major = static_cast<unsigned char>(encodingMajor);
+ ex.minor = static_cast<unsigned char>(encodingMinor);
+ throw ex;
+ }
+ Byte messageType;
+ is.read(messageType);
+ if(messageType != validateConnectionMsg)
+ {
+ throw ConnectionNotValidatedException(__FILE__, __LINE__);
+ }
+ Byte compress;
+ is.read(compress); // Ignore compression status for validate connection.
+ Int size;
+ is.read(size);
+ if(size != headerSize)
+ {
+ throw IllegalMessageSizeException(__FILE__, __LINE__);
+ }
+ traceRecv(is, _logger, _traceLevels);
+ }
+ }
+
+ {
+ IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this);
+ _stream.resize(0);
+ _stream.i = _stream.b.begin();
+
+ if(_state == StateClosed)
+ {
+ assert(_exception.get());
+ _exception->ice_throw();
+ }
+
+ //
+ // We start out in holding state.
+ //
+ setState(StateHolding);
+ }
+
+ return Finished;
+}
+
+bool
+Ice::ConnectionI::send(int timeout)
+{
+ assert(_transceiver);
+ assert(!_sendStreams.empty());
+
+ while(!_sendStreams.empty())
+ {
+ OutgoingMessage* message = &_sendStreams.front();
+
+ //
+ // Prepare the message stream for writing if necessary.
+ //
+ if(!message->stream->i)
+ {
+ message->stream->i = message->stream->b.begin();
+ if(message->compress && message->stream->b.size() >= 100) // Only compress messages larger than 100 bytes.
+ {
+ //
+ // Message compressed. Request compressed response, if any.
+ //
+ message->stream->b[9] = 2;
+
+ //
+ // Do compression.
+ //
+ BasicStream stream(_instance.get());
+ doCompress(*message->stream, stream);
+
+ if(message->outAsync)
+ {
+ trace("sending asynchronous request", *message->stream, _logger, _traceLevels);
+ }
+ else
+ {
+ traceSend(*message->stream, _logger, _traceLevels);
+ }
+
+ message->adopt(&stream); // Adopt the compressed stream.
+ message->stream->i = message->stream->b.begin();
+ }
+ else
+ {
+ if(message->compress)
+ {
+ //
+ // Message not compressed. Request compressed response, if any.
+ //
+ message->stream->b[9] = 1;
+ }
+
+ //
+ // No compression, just fill in the message size.
+ //
+ Int sz = static_cast<Int>(message->stream->b.size());
+ const Byte* p = reinterpret_cast<const Byte*>(&sz);
+#ifdef ICE_BIG_ENDIAN
+ reverse_copy(p, p + sizeof(Int), message->stream->b.begin() + 10);
+#else
+ copy(p, p + sizeof(Int), message->stream->b.begin() + 10);
+#endif
+ message->stream->i = message->stream->b.begin();
+
+ if(message->outAsync)
+ {
+ trace("sending asynchronous request", *message->stream, _logger, _traceLevels);
+ }
+ else
+ {
+ traceSend(*message->stream, _logger, _traceLevels);
+ }
+ }
+ }
+
+ //
+ // Send the first message.
+ //
+ assert(message->stream->i);
+ if(!_transceiver->write(*message->stream, timeout))
+ {
+ assert(timeout == 0);
+ return false;
+ }
+
+ //
+ // Notify the message that it was sent.
+ //
+ message->sent(this, timeout == 0); // timeout == 0 indicates that this is called by the selector thread.
+ _sendStreams.pop_front();
+ }
+
+ return true;
+}
+
+bool
+Ice::ConnectionI::sendMessage(OutgoingMessage& message, bool queue)
+{
+ assert(_state != StateClosed);
+
+ //
+ // TODO: Remove support for foreground send? If set to true, messages are sent
+ // by the calling thread. Foreground send might still be useful for transports
+ // that don't support non-blocking send.
+ //
+ bool foreground = false;
+
+ message.stream->i = 0; // Reset the message stream iterator before starting sending the message.
+
+ //
+ // If another thread is currently sending messages, we queue the message in _queuedStreams
+ // if we're not required to send the message in the foreground. If we're required to send
+ // the request in the foreground we wait until no more threads send messages.
+ //
+ if(_sendInProgress)
+ {
+ if(!foreground)
+ {
+ _queuedStreams.push_back(message);
+ _queuedStreams.back().adopt(0);
+ return false;
+ }
+ else if(queue)
+ {
+ //
+ // Add the message to _sendStreams if requested, this is useful for sendResponse() to
+ // send the close connection message after sending the response.
+ //
+ _sendStreams.push_back(message);
+ return true; // The calling thread must send the messages by calling finishSendMessage()
+ }
+ else
+ {
+ ++_waitingForSend;
+ while(_sendInProgress)
+ {
+ wait();
+ }
+ --_waitingForSend;
+
+ if(_state == StateClosed)
+ {
+ assert(_exception.get());
+ _exception->ice_throw();
+ }
+ }
+ }
+
+ assert(!_sendInProgress);
+
+ //
+ // Attempt to send the message without blocking. If the send blocks, we register
+ // the connection with the selector thread or we request the caller to call
+ // finishSendMessage() outside the synchronization.
+ //
+
+ message.stream->i = message.stream->b.begin();
+
+ if(message.compress && message.stream->b.size() >= 100) // Only compress messages larger than 100 bytes.
+ {
+ //
+ // Message compressed. Request compressed response, if any.
+ //
+ message.stream->b[9] = 2;
+
+ //
+ // Do compression.
+ //
+ BasicStream stream(_instance.get());
+ doCompress(*message.stream, stream);
+ stream.i = stream.b.begin();
+
+ if(message.outAsync)
+ {
+ trace("sending asynchronous request", *message.stream, _logger, _traceLevels);
+ }
+ else
+ {
+ traceSend(*message.stream, _logger, _traceLevels);
+ }
+
+ //
+ // Send the message without blocking.
+ //
+ if(!foreground && _transceiver->write(stream, 0))
+ {
+ message.sent(this, false);
+ if(_acmTimeout > 0)
+ {
+ _acmAbsoluteTimeout =
+ IceUtil::Time::now(IceUtil::Time::Monotonic) + IceUtil::Time::seconds(_acmTimeout);
+ }
+ return false;
+ }
+
+ _sendStreams.push_back(message);
+ _sendStreams.back().adopt(&stream);
+ }
+ else
+ {
+ if(message.compress)
+ {
+ //
+ // Message not compressed. Request compressed response, if any.
+ //
+ message.stream->b[9] = 1;
+ }
+
+ //
+ // No compression, just fill in the message size.
+ //
+ Int sz = static_cast<Int>(message.stream->b.size());
+ const Byte* p = reinterpret_cast<const Byte*>(&sz);
+#ifdef ICE_BIG_ENDIAN
+ reverse_copy(p, p + sizeof(Int), message.stream->b.begin() + 10);
+#else
+ copy(p, p + sizeof(Int), message.stream->b.begin() + 10);
+#endif
+ message.stream->i = message.stream->b.begin();
+
+ if(message.outAsync)
+ {
+ trace("sending asynchronous request", *message.stream, _logger, _traceLevels);
+ }
+ else
+ {
+ traceSend(*message.stream, _logger, _traceLevels);
+ }
+
+ //
+ // Send the message without blocking.
+ //
+ if(!foreground && _transceiver->write(*message.stream, 0))
+ {
+ message.sent(this, false);
+ if(_acmTimeout > 0)
+ {
+ _acmAbsoluteTimeout =
+ IceUtil::Time::now(IceUtil::Time::Monotonic) + IceUtil::Time::seconds(_acmTimeout);
+ }
+ return false;
+ }
+
+ _sendStreams.push_back(message);
+ if(!foreground)
+ {
+ _sendStreams.back().adopt(0);
+ }
+ }
+
+ _sendInProgress = true;
+ if(!foreground)
+ {
+ _selectorThread->_register(_transceiver->fd(), this, NeedWrite, _endpoint->timeout());
+ return false; // The selector thread will send the message.
+ }
+ else
+ {
+ return true; // The calling thread must send the message by calling finishSendMessage()
+ }
+}
+
+void
+Ice::ConnectionI::finishSendMessage()
+{
+ try
+ {
+ //
+ // Send the send messages with a blocking write().
+ //
+ send(_endpoint->timeout());
+ }
+ catch(const Ice::LocalException& ex)
+ {
+ IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this);
+ setState(StateClosed, ex);
+
+ for(deque<OutgoingMessage>::const_iterator p = _sendStreams.begin(); p != _sendStreams.end(); ++p)
+ {
+ if(p->adopted)
+ {
+ delete p->stream;
+ }
+ }
+ _sendStreams.clear();
+ _sendInProgress = false;
+
+ if(_threadPerConnection)
+ {
+ _transceiver->shutdownReadWrite();
+ }
+ else
+ {
+ registerWithPool();
+ unregisterWithPool(); // Let finished() do the close.
+ }
+
+ notifyAll();
+
+ assert(_exception.get());
+ _exception->ice_throw();
+ }
+
+
+ //
+ // Clear the _sendInProgress flag and notify waiting threads that we're not
+ // sending anymore data.
+ //
+ IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this);
+ assert(_sendStreams.empty());
+
+ if(_state == StateClosed)
+ {
+ _sendInProgress = false;
+ if(_threadPerConnection)
+ {
+ _transceiver->shutdownReadWrite();
+ }
+ else
+ {
+ registerWithPool();
+ unregisterWithPool(); // Let finished() do the close.
+ }
+ notifyAll();
+ }
+ else if(_waitingForSend > 0)
+ {
+ _sendInProgress = false;
+ notifyAll();
+ }
+ else if(_queuedStreams.empty())
+ {
+ if(_acmTimeout > 0)
+ {
+ _acmAbsoluteTimeout = IceUtil::Time::now(IceUtil::Time::Monotonic) + IceUtil::Time::seconds(_acmTimeout);
+ }
+ _sendInProgress = false;
+ }
+ else
+ {
+ _selectorThread->_register(_transceiver->fd(), this, NeedWrite, _endpoint->timeout());
+ }
+}
+
+void
+Ice::ConnectionI::finishStart()
+{
+ //
+ // We set _startCallback to null to break potential cyclic reference count
+ // and because the destructor checks for it to ensure that we always invoke
+ // on the callback.
+ //
+
+ StartCallbackPtr callback;
+ {
+ IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this);
+ swap(callback, _startCallback);
+ }
+ if(callback)
+ {
+ callback->connectionStartCompleted(this);
+ }
+}
+
+void
+Ice::ConnectionI::finishStart(const Ice::LocalException& ex)
+{
+ //
+ // We set _startCallback to null to break potential cyclic reference count
+ // and because the destructor checks for it to ensure that we always invoke
+ // on the callback.
+ //
+
+ StartCallbackPtr callback;
+ {
+ IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this);
+ swap(callback, _startCallback);
+ }
+ if(callback)
+ {
+ callback->connectionStartFailed(this, ex);
+ }
}
void
@@ -2213,7 +2796,7 @@ Ice::ConnectionI::parseMessage(BasicStream& stream, Int& invokeNum, Int& request
{
case closeConnectionMsg:
{
- traceHeader("received close connection", stream, _logger, _traceLevels);
+ traceRecv(stream, _logger, _traceLevels);
if(_endpoint->datagram())
{
if(_warn)
@@ -2233,13 +2816,12 @@ Ice::ConnectionI::parseMessage(BasicStream& stream, Int& invokeNum, Int& request
{
if(_state == StateClosing)
{
- traceRequest("received request during closing\n"
- "(ignored by server, client will retry)",
- stream, _logger, _traceLevels);
+ trace("received request during closing\n(ignored by server, client will retry)", stream, _logger,
+ _traceLevels);
}
else
{
- traceRequest("received request", stream, _logger, _traceLevels);
+ traceRecv(stream, _logger, _traceLevels);
stream.read(requestId);
invokeNum = 1;
servantManager = _servantManager;
@@ -2253,13 +2835,12 @@ Ice::ConnectionI::parseMessage(BasicStream& stream, Int& invokeNum, Int& request
{
if(_state == StateClosing)
{
- traceBatchRequest("received batch request during closing\n"
- "(ignored by server, client will retry)",
- stream, _logger, _traceLevels);
+ trace("received batch request during closing\n(ignored by server, client will retry)", stream,
+ _logger, _traceLevels);
}
else
{
- traceBatchRequest("received batch request", stream, _logger, _traceLevels);
+ traceRecv(stream, _logger, _traceLevels);
stream.read(invokeNum);
if(invokeNum < 0)
{
@@ -2275,12 +2856,12 @@ Ice::ConnectionI::parseMessage(BasicStream& stream, Int& invokeNum, Int& request
case replyMsg:
{
- traceReply("received reply", stream, _logger, _traceLevels);
+ traceRecv(stream, _logger, _traceLevels);
stream.read(requestId);
map<Int, Outgoing*>::iterator p = _requests.end();
- map<Int, AsyncRequest>::iterator q = _asyncRequests.end();
+ map<Int, OutgoingAsyncPtr>::iterator q = _asyncRequests.end();
if(_requestsHint != _requests.end())
{
@@ -2334,7 +2915,7 @@ Ice::ConnectionI::parseMessage(BasicStream& stream, Int& invokeNum, Int& request
{
assert(q != _asyncRequests.end());
- outAsync = q->second.p;
+ outAsync = q->second;
if(q == _asyncRequestsHint)
{
@@ -2352,7 +2933,7 @@ Ice::ConnectionI::parseMessage(BasicStream& stream, Int& invokeNum, Int& request
case validateConnectionMsg:
{
- traceHeader("received validate connection", stream, _logger, _traceLevels);
+ traceRecv(stream, _logger, _traceLevels);
if(_warn)
{
Warning out(_logger);
@@ -2363,9 +2944,7 @@ Ice::ConnectionI::parseMessage(BasicStream& stream, Int& invokeNum, Int& request
default:
{
- traceHeader("received unknown message\n"
- "(invalid, closing connection)",
- stream, _logger, _traceLevels);
+ trace("received unknown message\n(invalid, closing connection)", stream, _logger, _traceLevels);
throw UnknownMessageException(__FILE__, __LINE__);
break;
}
@@ -2448,30 +3027,26 @@ Ice::ConnectionI::invokeAll(BasicStream& stream, Int invokeNum, Int requestId, B
void
Ice::ConnectionI::run()
{
- //
- // For non-datagram connections, the thread-per-connection must
- // validate and activate this connection, and not in the
- // connection factory. Please see the comments in the connection
- // factory for details.
- //
- if(!_endpoint->datagram())
+ try
+ {
+ //
+ // Initialize the connection transceiver and validate the connection using
+ // blocking operations.
+ //
+ SocketStatus status;
+
+ status = initialize();
+ assert(status == Finished);
+
+ status = validate();
+ assert(status == Finished);
+ }
+ catch(const LocalException& ex)
{
- try
- {
- validate();
- }
- catch(const LocalException&)
{
IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this);
-
- assert(_state == StateClosed);
-
- //
- // We must make sure that nobody is sending when we close
- // the transceiver.
- //
- IceUtil::Mutex::Lock sendSync(_sendMutex);
-
+ setState(StateClosed, ex);
+
if(_transceiver)
{
try
@@ -2482,15 +3057,17 @@ Ice::ConnectionI::run()
{
// Here we ignore any exceptions in close().
}
-
+
_transceiver = 0;
}
notifyAll();
- return;
}
-
- activate();
+
+ finishStart(ex);
+ return;
}
+
+ finishStart();
const bool warnUdp = _instance->initializationData().properties->getPropertyAsInt("Ice.Warn.Datagrams") > 0;
@@ -2615,9 +3192,6 @@ Ice::ConnectionI::run()
OutgoingAsyncPtr outAsync;
auto_ptr<LocalException> localEx;
-
- map<Int, Outgoing*> requests;
- map<Int, AsyncRequest> asyncRequests;
{
IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this);
@@ -2638,12 +3212,24 @@ Ice::ConnectionI::run()
//
if(_state == StateClosed)
{
+ if(_sendInProgress)
+ {
+ _selectorThread->unregister(_transceiver->fd());
+ }
+
//
- // We must make sure that nobody is sending when we close
- // the transceiver.
+ // Prevent further writes.
//
- IceUtil::Mutex::Lock sendSync(_sendMutex);
-
+ _transceiver->shutdownWrite();
+
+ //
+ // We must make sure that nobody is sending before closing the transceiver.
+ //
+ while(_sendInProgress)
+ {
+ wait();
+ }
+
try
{
_transceiver->close();
@@ -2652,26 +3238,15 @@ Ice::ConnectionI::run()
{
localEx.reset(dynamic_cast<LocalException*>(ex.ice_clone()));
}
-
_transceiver = 0;
notifyAll();
//
- // We cannot simply return here. We have to make sure
- // that all requests (regular and async) are notified
- // about the closed connection below.
+ // We cannot simply return here. We have to make sure that all requests (regular and
+ // async) are notified about the closed connection below.
//
closed = true;
}
-
- if(_state == StateClosed || _state == StateClosing)
- {
- requests.swap(_requests);
- _requestsHint = _requests.end();
-
- asyncRequests.swap(_asyncRequests);
- _asyncRequestsHint = _asyncRequests.end();
- }
}
//
@@ -2690,21 +3265,33 @@ Ice::ConnectionI::run()
//
invokeAll(stream, invokeNum, requestId, compress, servantManager, adapter);
- for(map<Int, Outgoing*>::iterator p = requests.begin(); p != requests.end(); ++p)
- {
- p->second->finished(*_exception.get()); // The exception is immutable at this point.
- }
-
- for(map<Int, AsyncRequest>::iterator q = asyncRequests.begin(); q != asyncRequests.end(); ++q)
+ if(closed)
{
- q->second.p->__finished(*_exception.get()); // The exception is immutable at this point.
- }
+ // Note: the streams must be cleared first because they expect the Outgoing objects to still be valid.
+ for(deque<OutgoingMessage>::iterator o = _queuedStreams.begin(); o != _queuedStreams.end(); ++o)
+ {
+ o->finished(*_exception.get());
+ }
+ _queuedStreams.clear();
+
+ for(map<Int, Outgoing*>::iterator p = _requests.begin(); p != _requests.end(); ++p)
+ {
+ p->second->finished(*_exception.get()); // The exception is immutable at this point.
+ }
+ _requests.clear();
+ for(map<Int, OutgoingAsyncPtr>::iterator q = _asyncRequests.begin(); q != _asyncRequests.end(); ++q)
+ {
+ q->second->__finished(*_exception.get()); // The exception is immutable at this point.
+ }
+ _asyncRequests.clear();
+ }
+
if(localEx.get())
{
assert(closed);
localEx->ice_throw();
- }
+ }
}
}
diff --git a/cpp/src/Ice/ConnectionI.h b/cpp/src/Ice/ConnectionI.h
index 8e712cb3b42..9d7b9cc15af 100644
--- a/cpp/src/Ice/ConnectionI.h
+++ b/cpp/src/Ice/ConnectionI.h
@@ -26,11 +26,16 @@
#include <Ice/TraceLevelsF.h>
#include <Ice/OutgoingAsyncF.h>
#include <Ice/EventHandler.h>
+#include <Ice/SelectorThread.h>
+
+#include <deque>
namespace IceInternal
{
class Outgoing;
+class BatchOutgoing;
+class OutgoingMessageCallback;
}
@@ -39,23 +44,35 @@ namespace Ice
class LocalException;
-class ICE_API ConnectionI : public Connection, public IceInternal::EventHandler,
+class ICE_API ConnectionI : public Connection,
+ public IceInternal::EventHandler,
+ public IceInternal::SocketReadyCallback,
public IceUtil::Monitor<IceUtil::Mutex>
{
public:
- void validate();
+ class StartCallback : virtual public IceUtil::Shared
+ {
+ public:
+
+ virtual void connectionStartCompleted(const ConnectionIPtr&) = 0;
+ virtual void connectionStartFailed(const ConnectionIPtr&, const Ice::LocalException&) = 0;
+ };
+ typedef IceUtil::Handle<StartCallback> StartCallbackPtr;
+
enum DestructionReason
{
ObjectAdapterDeactivated,
CommunicatorDestroyed
};
+
+ void start(const StartCallbackPtr&);
void activate();
void hold();
void destroy(DestructionReason);
virtual void close(bool); // From Connection.
- bool isDestroyed() const;
+ bool isActiveOrHolding() const;
bool isFinished() const;
void throwException() const; // Throws the connection exception if destroyed.
@@ -65,14 +82,18 @@ public:
void monitor();
- void sendRequest(IceInternal::BasicStream*, IceInternal::Outgoing*, bool);
- void sendAsyncRequest(IceInternal::BasicStream*, const IceInternal::OutgoingAsyncPtr&, bool);
+ bool sendRequest(IceInternal::Outgoing*, bool, bool);
+ void sendAsyncRequest(const IceInternal::OutgoingAsyncPtr&, bool, bool);
void prepareBatchRequest(IceInternal::BasicStream*);
void finishBatchRequest(IceInternal::BasicStream*, bool);
void abortBatchRequest();
+
virtual void flushBatchRequests(); // From Connection.
+ bool flushBatchRequests(IceInternal::BatchOutgoing*);
+ void flushAsyncBatchRequests(const IceInternal::BatchOutgoingAsyncPtr&);
+
void sendResponse(IceInternal::BasicStream*, Byte);
void sendNoResponse();
@@ -88,7 +109,7 @@ public:
//
virtual bool datagram() const;
virtual bool readable() const;
- virtual void read(IceInternal::BasicStream&);
+ virtual bool read(IceInternal::BasicStream&);
virtual void message(IceInternal::BasicStream&, const IceInternal::ThreadPoolPtr&);
virtual void finished(const IceInternal::ThreadPoolPtr&);
virtual void exception(const LocalException&);
@@ -97,6 +118,12 @@ public:
virtual Ice::Int timeout() const; // From Connection.
virtual std::string toString() const; // From Connection and EvantHandler.
+ //
+ // Operations from SocketReadyCallback
+ //
+ virtual IceInternal::SocketStatus socketReady(bool);
+ virtual void socketTimeout();
+
// SSL plug-in needs to be able to get the transceiver.
IceInternal::TransceiverPtr getTransceiver() const;
@@ -105,12 +132,13 @@ private:
ConnectionI(const IceInternal::InstancePtr&, const IceInternal::TransceiverPtr&,
const IceInternal::EndpointIPtr&, const ObjectAdapterPtr&, bool, size_t);
virtual ~ConnectionI();
- void start();
+
friend class IceInternal::IncomingConnectionFactory;
friend class IceInternal::OutgoingConnectionFactory;
enum State
{
+ StateNotInitialized,
StateNotValidated,
StateActive,
StateHolding,
@@ -118,13 +146,53 @@ private:
StateClosed
};
- void resetBatch(bool);
- void flushBatchRequestsInternal(bool);
+ bool setState(State, const LocalException&);
+ bool setState(State);
+
+ bool initiateShutdown(bool);
+
+ struct OutgoingMessage
+ {
+ OutgoingMessage()
+ {
+ }
+
+ OutgoingMessage(IceInternal::BasicStream* str, bool comp) :
+ stream(str), out(0), compress(comp), response(false), adopted(false)
+ {
+ }
+
+ OutgoingMessage(IceInternal::OutgoingMessageCallback* o, IceInternal::BasicStream* str, bool comp, bool resp) :
+ stream(str), out(o), compress(comp), response(resp), adopted(false)
+ {
+ }
+
+ OutgoingMessage(const IceInternal::OutgoingAsyncMessageCallbackPtr& o, IceInternal::BasicStream* str,
+ bool comp, bool resp) :
+ stream(str), out(0), outAsync(o), compress(comp), response(resp), adopted(false)
+ {
+ }
+
+ void adopt(IceInternal::BasicStream*);
+ void sent(ConnectionI*, bool);
+ void finished(const Ice::LocalException&);
+
+ IceInternal::BasicStream* stream;
+ IceInternal::OutgoingMessageCallback* out;
+ IceInternal::OutgoingAsyncMessageCallbackPtr outAsync;
+ bool compress;
+ bool response;
+ bool adopted;
+ };
- void setState(State, const LocalException&);
- void setState(State);
+ IceInternal::SocketStatus initialize();
+ IceInternal::SocketStatus validate();
+ bool send(int);
+ bool sendMessage(OutgoingMessage&, bool = false);
+ void finishSendMessage();
- void initiateShutdown() const;
+ void finishStart();
+ void finishStart(const Ice::LocalException&);
void registerWithPool();
void unregisterWithPool();
@@ -171,6 +239,10 @@ private:
int _finishedCount;
const IceInternal::ThreadPoolPtr _threadPool;
+ const IceInternal::SelectorThreadPtr _selectorThread;
+
+ StartCallbackPtr _startCallback;
+
const bool _warn;
const int _acmTimeout;
@@ -183,13 +255,8 @@ private:
std::map<Int, IceInternal::Outgoing*> _requests;
std::map<Int, IceInternal::Outgoing*>::iterator _requestsHint;
- struct AsyncRequest
- {
- IceInternal::OutgoingAsyncPtr p;
- IceUtil::Time t;
- };
- std::map<Int, AsyncRequest> _asyncRequests;
- std::map<Int, AsyncRequest>::iterator _asyncRequestsHint;
+ std::map<Int, IceInternal::OutgoingAsyncPtr> _asyncRequests;
+ std::map<Int, IceInternal::OutgoingAsyncPtr>::iterator _asyncRequestsHint;
std::auto_ptr<LocalException> _exception;
@@ -200,16 +267,15 @@ private:
bool _batchRequestCompress;
size_t _batchMarker;
+ std::deque<OutgoingMessage> _queuedStreams;
+ std::deque<OutgoingMessage> _sendStreams;
+ bool _sendInProgress;
+ int _waitingForSend;
+
int _dispatchCount;
State _state; // The current state.
IceUtil::Time _stateTime; // The last time when the state was changed.
-
- //
- // We have a separate mutex for sending, so that we don't block
- // the whole connection when we do a blocking send.
- //
- IceUtil::Mutex _sendMutex;
};
}
diff --git a/cpp/src/Ice/ConnectionMonitor.cpp b/cpp/src/Ice/ConnectionMonitor.cpp
index cf4104e805d..a462251679b 100644
--- a/cpp/src/Ice/ConnectionMonitor.cpp
+++ b/cpp/src/Ice/ConnectionMonitor.cpp
@@ -69,7 +69,7 @@ IceInternal::ConnectionMonitor::~ConnectionMonitor()
}
void
-IceInternal::ConnectionMonitor::run()
+IceInternal::ConnectionMonitor::runTimerTask()
{
set<ConnectionIPtr> connections;
diff --git a/cpp/src/Ice/ConnectionMonitor.h b/cpp/src/Ice/ConnectionMonitor.h
index bfd7954dc4c..63f4be8457e 100644
--- a/cpp/src/Ice/ConnectionMonitor.h
+++ b/cpp/src/Ice/ConnectionMonitor.h
@@ -36,7 +36,7 @@ private:
virtual ~ConnectionMonitor();
friend class Instance;
- virtual void run();
+ virtual void runTimerTask();
InstancePtr _instance;
std::set<Ice::ConnectionIPtr> _connections;
diff --git a/cpp/src/Ice/ConnectionRequestHandler.cpp b/cpp/src/Ice/ConnectionRequestHandler.cpp
new file mode 100644
index 00000000000..dffab29e69b
--- /dev/null
+++ b/cpp/src/Ice/ConnectionRequestHandler.cpp
@@ -0,0 +1,107 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2007 ZeroC, Inc. All rights reserved.
+//
+// This copy of Ice is licensed to you under the terms described in the
+// ICE_LICENSE file included in this distribution.
+//
+// **********************************************************************
+
+#include <Ice/ConnectionRequestHandler.h>
+#include <Ice/Proxy.h>
+#include <Ice/Reference.h>
+#include <Ice/ConnectionI.h>
+#include <Ice/RouterInfo.h>
+#include <Ice/Outgoing.h>
+#include <Ice/OutgoingAsync.h>
+
+using namespace std;
+using namespace IceInternal;
+
+ConnectionRequestHandler::ConnectionRequestHandler(const ReferencePtr& reference, const Ice::ObjectPrx& proxy) :
+ RequestHandler(reference),
+ _response(reference->getMode() == Reference::ModeTwoway)
+{
+ _connection = _reference->getConnection(_compress);
+ RouterInfoPtr ri = reference->getRouterInfo();
+ if(ri)
+ {
+ ri->addProxy(proxy);
+ }
+}
+
+ConnectionRequestHandler::ConnectionRequestHandler(const ReferencePtr& reference,
+ const Ice::ConnectionIPtr& connection,
+ bool compress) :
+ RequestHandler(reference),
+ _response(reference->getMode() == Reference::ModeTwoway),
+ _connection(connection),
+ _compress(compress)
+{
+}
+
+void
+ConnectionRequestHandler::prepareBatchRequest(BasicStream* out)
+{
+ _connection->prepareBatchRequest(out);
+}
+
+void
+ConnectionRequestHandler::finishBatchRequest(BasicStream* out)
+{
+ _connection->finishBatchRequest(out, _compress);
+}
+
+void
+ConnectionRequestHandler::abortBatchRequest()
+{
+ _connection->abortBatchRequest();
+}
+
+Ice::ConnectionI*
+ConnectionRequestHandler::sendRequest(Outgoing* out)
+{
+ return (!_connection->sendRequest(out, _compress, _response) || _response) ? _connection.get() : 0;
+}
+
+void
+ConnectionRequestHandler::sendAsyncRequest(const OutgoingAsyncPtr& out)
+{
+ try
+ {
+ _connection->sendAsyncRequest(out, _compress, _response);
+ }
+ catch(const LocalExceptionWrapper& ex)
+ {
+ out->__finished(ex);
+ }
+ catch(const Ice::LocalException& ex)
+ {
+ out->__finished(ex);
+ }
+}
+
+bool
+ConnectionRequestHandler::flushBatchRequests(BatchOutgoing* out)
+{
+ return _connection->flushBatchRequests(out);
+}
+
+void
+ConnectionRequestHandler::flushAsyncBatchRequests(const BatchOutgoingAsyncPtr& out)
+{
+ try
+ {
+ _connection->flushAsyncBatchRequests(out);
+ }
+ catch(const Ice::LocalException& ex)
+ {
+ out->__finished(ex);
+ }
+}
+
+Ice::ConnectionIPtr
+ConnectionRequestHandler::getConnection(bool wait)
+{
+ return _connection;
+}
diff --git a/cpp/src/Ice/ConnectionRequestHandler.h b/cpp/src/Ice/ConnectionRequestHandler.h
new file mode 100644
index 00000000000..785cda3b5b6
--- /dev/null
+++ b/cpp/src/Ice/ConnectionRequestHandler.h
@@ -0,0 +1,48 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2007 ZeroC, Inc. All rights reserved.
+//
+// This copy of Ice is licensed to you under the terms described in the
+// ICE_LICENSE file included in this distribution.
+//
+// **********************************************************************
+
+#ifndef ICE_CONNECTION_REQUEST_HANDLER_H
+#define ICE_CONNECTION_REQUEST_HANDLER_H
+
+#include <Ice/RequestHandler.h>
+#include <Ice/ReferenceF.h>
+#include <Ice/ProxyF.h>
+
+namespace IceInternal
+{
+
+class ConnectionRequestHandler : public RequestHandler
+{
+public:
+
+ ConnectionRequestHandler(const ReferencePtr&, const Ice::ObjectPrx&);
+ ConnectionRequestHandler(const ReferencePtr&, const Ice::ConnectionIPtr&, bool);
+
+ virtual void prepareBatchRequest(BasicStream*);
+ virtual void finishBatchRequest(BasicStream*);
+ virtual void abortBatchRequest();
+
+ virtual Ice::ConnectionI* sendRequest(Outgoing*);
+ virtual void sendAsyncRequest(const OutgoingAsyncPtr&);
+
+ virtual bool flushBatchRequests(BatchOutgoing*);
+ virtual void flushAsyncBatchRequests(const BatchOutgoingAsyncPtr&);
+
+ virtual Ice::ConnectionIPtr getConnection(bool);
+
+private:
+
+ const bool _response;
+ Ice::ConnectionIPtr _connection;
+ bool _compress;
+};
+
+}
+
+#endif
diff --git a/cpp/src/Ice/Connector.h b/cpp/src/Ice/Connector.h
index 347997afbce..825afa86383 100644
--- a/cpp/src/Ice/Connector.h
+++ b/cpp/src/Ice/Connector.h
@@ -14,6 +14,12 @@
#include <Ice/ConnectorF.h>
#include <Ice/TransceiverF.h>
+#ifdef _WIN32
+# include <winsock2.h>
+#else
+# define SOCKET int
+#endif
+
namespace IceInternal
{
@@ -22,6 +28,7 @@ class ICE_API Connector : public ::IceUtil::Shared
public:
virtual TransceiverPtr connect(int) = 0;
+
virtual Ice::Short type() const = 0;
virtual std::string toString() const = 0;
diff --git a/cpp/src/Ice/EndpointFactoryManager.cpp b/cpp/src/Ice/EndpointFactoryManager.cpp
index a2a7900c26d..9b1a126a1d6 100644
--- a/cpp/src/Ice/EndpointFactoryManager.cpp
+++ b/cpp/src/Ice/EndpointFactoryManager.cpp
@@ -66,8 +66,6 @@ IceInternal::EndpointFactoryManager::get(Short type) const
EndpointIPtr
IceInternal::EndpointFactoryManager::create(const string& str, bool oaEndpoint) const
{
- IceUtil::Mutex::Lock sync(*this); // TODO: Necessary?
-
const string delim = " \t\n\r";
string::size_type beg = str.find_first_not_of(delim);
@@ -91,30 +89,40 @@ IceInternal::EndpointFactoryManager::create(const string& str, bool oaEndpoint)
protocol = _instance->defaultsAndOverrides()->defaultProtocol;
}
- //
- // TODO: Optimize with a map?
- //
- for(vector<EndpointFactoryPtr>::size_type i = 0; i < _factories.size(); i++)
+ EndpointFactoryPtr factory;
{
- if(_factories[i]->protocol() == protocol)
+ IceUtil::Mutex::Lock sync(*this); // TODO: Necessary?
+
+ //
+ // TODO: Optimize with a map?
+ //
+ for(vector<EndpointFactoryPtr>::size_type i = 0; i < _factories.size(); i++)
{
+ if(_factories[i]->protocol() == protocol)
+ {
+ factory = _factories[i];
+ }
+ }
+ }
+
+ if(factory)
+ {
#if 1
- return _factories[i]->create(str.substr(end), oaEndpoint);
+ return factory->create(str.substr(end), oaEndpoint);
#else
- // Code below left in place for debugging.
-
- EndpointIPtr e = _factories[i]->create(str.substr(end), oaEndpoint);
- BasicStream bs(_instance.get());
- e->streamWrite(&bs);
- bs.i = bs.b.begin();
- short type;
- bs.read(type);
- EndpointIPtr ue = new IceInternal::UnknownEndpointI(type, &bs);
- cerr << "Normal: " << e->toString() << endl;
- cerr << "Opaque: " << ue->toString() << endl;
- return e;
+ // Code below left in place for debugging.
+
+ EndpointIPtr e = factory->create(str.substr(end), oaEndpoint);
+ BasicStream bs(_instance.get());
+ e->streamWrite(&bs);
+ bs.i = bs.b.begin();
+ short type;
+ bs.read(type);
+ EndpointIPtr ue = new IceInternal::UnknownEndpointI(type, &bs);
+ cerr << "Normal: " << e->toString() << endl;
+ cerr << "Opaque: " << ue->toString() << endl;
+ return e;
#endif
- }
}
//
@@ -124,22 +132,20 @@ IceInternal::EndpointFactoryManager::create(const string& str, bool oaEndpoint)
if(protocol == "opaque")
{
EndpointIPtr ue = new UnknownEndpointI(str.substr(end));
- for(vector<EndpointFactoryPtr>::size_type i = 0; i < _factories.size(); i++)
+ factory = get(ue->type());
+ if(factory)
{
- if(_factories[i]->type() == ue->type())
- {
- //
- // Make a temporary stream, write the opaque endpoint data into the stream,
- // and ask the factory to read the endpoint data from that stream to create
- // the actual endpoint.
- //
- BasicStream bs(_instance.get());
- ue->streamWrite(&bs);
- bs.i = bs.b.begin();
- short type;
- bs.read(type);
- return _factories[i]->read(&bs);
- }
+ //
+ // Make a temporary stream, write the opaque endpoint data into the stream,
+ // and ask the factory to read the endpoint data from that stream to create
+ // the actual endpoint.
+ //
+ BasicStream bs(_instance.get());
+ ue->streamWrite(&bs);
+ bs.i = bs.b.begin();
+ short type;
+ bs.read(type);
+ return factory->read(&bs);
}
return ue; // Endpoint is opaque, but we don't have a factory for its type.
}
@@ -150,20 +156,13 @@ IceInternal::EndpointFactoryManager::create(const string& str, bool oaEndpoint)
EndpointIPtr
IceInternal::EndpointFactoryManager::read(BasicStream* s) const
{
- IceUtil::Mutex::Lock sync(*this); // TODO: Necessary?
-
Short type;
s->read(type);
- //
- // TODO: Optimize with a map?
- //
- for(vector<EndpointFactoryPtr>::size_type i = 0; i < _factories.size(); i++)
+ EndpointFactoryPtr factory = get(type);
+ if(factory)
{
- if(_factories[i]->type() == type)
- {
- return _factories[i]->read(s);
- }
+ return factory->read(s);
}
return new UnknownEndpointI(type, s);
diff --git a/cpp/src/Ice/EndpointI.cpp b/cpp/src/Ice/EndpointI.cpp
index 45f88a6cde8..f3505005f28 100644
--- a/cpp/src/Ice/EndpointI.cpp
+++ b/cpp/src/Ice/EndpointI.cpp
@@ -8,7 +8,110 @@
// **********************************************************************
#include <Ice/EndpointI.h>
+#include <Ice/Instance.h>
+#include <Ice/LocalException.h>
+#include <Ice/Network.h>
-using namespace Ice;
+using namespace std;
+using namespace IceInternal;
Ice::LocalObject* IceInternal::upCast(EndpointI* p) { return p; }
+IceUtil::Shared* IceInternal::upCast(EndpointHostResolver* p) { return p; }
+
+vector<ConnectorPtr>
+IceInternal::EndpointI::connectors(const vector<struct sockaddr_in>& addrs) const
+{
+ //
+ // This method must be extended by endpoints which use the EndpointHostResolver to create
+ // connectors from IP addresses.
+ //
+ assert(false);
+ return vector<ConnectorPtr>();
+}
+
+IceInternal::EndpointHostResolver::EndpointHostResolver(const InstancePtr& instance) :
+ _instance(instance),
+ _destroyed(false)
+{
+ start();
+}
+
+void
+IceInternal::EndpointHostResolver::resolve(const string& host, int port, const EndpointIPtr& endpoint,
+ const EndpointI_connectorsPtr& callback)
+{
+ //
+ // Try to get the addresses without DNS lookup. If this doesn't work, we queue a resolve
+ // entry and the thread will take care of getting the endpoint addresses.
+ //
+ vector<struct sockaddr_in> addrs = getAddresses(host, port, false);
+ if(!addrs.empty())
+ {
+ callback->connectors(endpoint->connectors(addrs));
+ return;
+ }
+
+ Lock sync(*this);
+ assert(!_destroyed);
+
+ ResolveEntry entry;
+ entry.host = host;
+ entry.port = port;
+ entry.endpoint = endpoint;
+ entry.callback = callback;
+ _queue.push_back(entry);
+ notify();
+}
+
+void
+IceInternal::EndpointHostResolver::destroy()
+{
+ Lock sync(*this);
+ assert(!_destroyed);
+ _destroyed = true;
+ notify();
+}
+
+void
+IceInternal::EndpointHostResolver::run()
+{
+ if(_instance->initializationData().threadHook)
+ {
+ _instance->initializationData().threadHook->start();
+ }
+
+ while(true)
+ {
+ ResolveEntry resolve;
+
+ {
+ Lock sync(*this);
+
+ while(!_destroyed && _queue.empty())
+ {
+ wait();
+ }
+
+ if(_destroyed)
+ {
+ break;
+ }
+
+ resolve = _queue.front();
+ _queue.pop_front();
+ }
+
+ resolve.callback->connectors(resolve.endpoint->connectors(getAddresses(resolve.host, resolve.port)));
+ }
+
+ for(deque<ResolveEntry>::const_iterator p = _queue.begin(); p != _queue.end(); ++p)
+ {
+ p->callback->exception(Ice::CommunicatorDestroyedException(__FILE__, __LINE__));
+ }
+ _queue.clear();
+
+ if(_instance->initializationData().threadHook)
+ {
+ _instance->initializationData().threadHook->stop();
+ }
+}
diff --git a/cpp/src/Ice/EndpointI.h b/cpp/src/Ice/EndpointI.h
index 9470d0e4468..1d5eff2df76 100644
--- a/cpp/src/Ice/EndpointI.h
+++ b/cpp/src/Ice/EndpointI.h
@@ -11,6 +11,8 @@
#define ICE_ENDPOINT_I_H
#include <IceUtil/Shared.h>
+#include <IceUtil/Thread.h>
+#include <IceUtil/Monitor.h>
#include <Ice/Endpoint.h>
#include <Ice/EndpointIF.h>
#include <Ice/InstanceF.h>
@@ -18,11 +20,30 @@
#include <Ice/ConnectorF.h>
#include <Ice/AcceptorF.h>
+#ifdef _WIN32
+# include <winsock2.h>
+#else
+# include <netinet/in.h> // For struct sockaddr_in
+#endif
+
+#include <deque>
+
namespace IceInternal
{
class BasicStream;
+class ICE_API EndpointI_connectors : public virtual IceUtil::Shared
+{
+public:
+
+ virtual ~EndpointI_connectors() { }
+
+ virtual void connectors(const std::vector<ConnectorPtr>&) = 0;
+ virtual void exception(const Ice::LocalException&) = 0;
+};
+typedef IceUtil::Handle<EndpointI_connectors> EndpointI_connectorsPtr;
+
class ICE_API EndpointI : public Ice::Endpoint
{
public:
@@ -97,6 +118,7 @@ public:
// connector is available.
//
virtual std::vector<ConnectorPtr> connectors() const = 0;
+ virtual void connectors_async(const EndpointI_connectorsPtr&) const = 0;
//
// Return an acceptor for this endpoint, or null if no acceptors
@@ -114,9 +136,9 @@ public:
virtual std::vector<EndpointIPtr> expand() const = 0;
//
- // Check whether the endpoint is equivalent to a specific Connector.
+ // Check whether the endpoint is equivalent to another one.
//
- virtual bool equivalent(const ConnectorPtr&) const = 0;
+ virtual bool equivalent(const EndpointIPtr&) const = 0;
//
// Compare endpoints for sorting purposes.
@@ -127,6 +149,9 @@ public:
private:
+ virtual std::vector<ConnectorPtr> connectors(const std::vector<struct sockaddr_in>&) const;
+ friend class EndpointHostResolver;
+
#if defined(__SUNPRO_CC) || defined(__HP_aCC)
//
// COMPILERFIX: prevent the compiler from emitting a warning about
@@ -137,6 +162,32 @@ private:
#endif
};
+class ICE_API EndpointHostResolver : public IceUtil::Thread, public IceUtil::Monitor<IceUtil::Mutex>
+{
+public:
+
+ EndpointHostResolver(const InstancePtr&);
+
+ void resolve(const std::string&, int, const EndpointIPtr&, const EndpointI_connectorsPtr&);
+ void destroy();
+
+ virtual void run();
+
+private:
+
+ struct ResolveEntry
+ {
+ std::string host;
+ int port;
+ EndpointIPtr endpoint;
+ EndpointI_connectorsPtr callback;
+ };
+
+ const InstancePtr _instance;
+ bool _destroyed;
+ std::deque<ResolveEntry> _queue;
+};
+
}
#endif
diff --git a/cpp/src/Ice/EventHandler.cpp b/cpp/src/Ice/EventHandler.cpp
index 6a92e51788d..c14576855b8 100644
--- a/cpp/src/Ice/EventHandler.cpp
+++ b/cpp/src/Ice/EventHandler.cpp
@@ -15,6 +15,7 @@ using namespace Ice;
using namespace IceInternal;
IceUtil::Shared* IceInternal::upCast(EventHandler* p) { return p; }
+IceUtil::Shared* IceInternal::upCast(ThreadPoolWorkItem* p) { return p; }
InstancePtr
IceInternal::EventHandler::instance() const
diff --git a/cpp/src/Ice/EventHandler.h b/cpp/src/Ice/EventHandler.h
index 03c34bc3fe0..88111ce545b 100644
--- a/cpp/src/Ice/EventHandler.h
+++ b/cpp/src/Ice/EventHandler.h
@@ -46,7 +46,7 @@ public:
// Read data via the event handler. May only be called if
// readable() returns true.
//
- virtual void read(BasicStream&) = 0;
+ virtual bool read(BasicStream&) = 0;
//
// A complete message has been received.
@@ -77,15 +77,21 @@ protected:
const InstancePtr _instance;
-private:
-
//
- // The _stream data member is for use by ThreadPool only
+ // The _stream data member is for use by ThreadPool or by the
+ // connection for connection validation only.
//
BasicStream _stream;
friend class ThreadPool;
};
+class ThreadPoolWorkItem : virtual public IceUtil::Shared
+{
+public:
+
+ virtual void execute(const ThreadPoolPtr&) = 0;
+};
+
}
#endif
diff --git a/cpp/src/Ice/EventHandlerF.h b/cpp/src/Ice/EventHandlerF.h
index 576fbaac575..d15b1ff96da 100644
--- a/cpp/src/Ice/EventHandlerF.h
+++ b/cpp/src/Ice/EventHandlerF.h
@@ -21,6 +21,10 @@ class EventHandler;
IceUtil::Shared* upCast(EventHandler*);
typedef Handle<EventHandler> EventHandlerPtr;
+class ThreadPoolWorkItem;
+IceUtil::Shared* upCast(ThreadPoolWorkItem*);
+typedef Handle<ThreadPoolWorkItem> ThreadPoolWorkItemPtr;
+
}
#endif
diff --git a/cpp/src/Ice/Instance.cpp b/cpp/src/Ice/Instance.cpp
index ef5a4b2f167..9349990bb63 100644
--- a/cpp/src/Ice/Instance.cpp
+++ b/cpp/src/Ice/Instance.cpp
@@ -18,6 +18,7 @@
#include <Ice/ReferenceFactory.h>
#include <Ice/ProxyFactory.h>
#include <Ice/ThreadPool.h>
+#include <Ice/SelectorThread.h>
#include <Ice/ConnectionFactory.h>
#include <Ice/ConnectionMonitor.h>
#include <Ice/ObjectFactoryManager.h>
@@ -235,6 +236,42 @@ IceInternal::Instance::serverThreadPool()
return _serverThreadPool;
}
+SelectorThreadPtr
+IceInternal::Instance::selectorThread()
+{
+ IceUtil::RecMutex::Lock sync(*this);
+
+ if(_state == StateDestroyed)
+ {
+ throw CommunicatorDestroyedException(__FILE__, __LINE__);
+ }
+
+ if(!_selectorThread) // Lazy initialization.
+ {
+ _selectorThread = new SelectorThread(this);
+ }
+
+ return _selectorThread;
+}
+
+EndpointHostResolverPtr
+IceInternal::Instance::endpointHostResolver()
+{
+ IceUtil::RecMutex::Lock sync(*this);
+
+ if(_state == StateDestroyed)
+ {
+ throw CommunicatorDestroyedException(__FILE__, __LINE__);
+ }
+
+ if(!_endpointHostResolver) // Lazy initialization.
+ {
+ _endpointHostResolver = new EndpointHostResolver(this);
+ }
+
+ return _endpointHostResolver;
+}
+
IceUtil::TimerPtr
IceInternal::Instance::timer()
{
@@ -914,6 +951,8 @@ IceInternal::Instance::~Instance()
assert(!_objectAdapterFactory);
assert(!_clientThreadPool);
assert(!_serverThreadPool);
+ assert(!_selectorThread);
+ assert(!_endpointHostResolver);
assert(!_timer);
assert(!_routerManager);
assert(!_locatorManager);
@@ -1077,6 +1116,8 @@ IceInternal::Instance::destroy()
ThreadPoolPtr serverThreadPool;
ThreadPoolPtr clientThreadPool;
+ SelectorThreadPtr selectorThread;
+ EndpointHostResolverPtr endpointHostResolver;
{
IceUtil::RecMutex::Lock sync(*this);
@@ -1102,6 +1143,18 @@ IceInternal::Instance::destroy()
std::swap(_clientThreadPool, clientThreadPool);
}
+ if(_selectorThread)
+ {
+ _selectorThread->destroy();
+ std::swap(selectorThread, _selectorThread);
+ }
+
+ if(_endpointHostResolver)
+ {
+ _endpointHostResolver->destroy();
+ std::swap(endpointHostResolver, _endpointHostResolver);
+ }
+
if(_timer)
{
_timer->destroy();
@@ -1169,6 +1222,14 @@ IceInternal::Instance::destroy()
{
serverThreadPool->joinWithAllThreads();
}
+ if(selectorThread)
+ {
+ selectorThread->joinWithThread();
+ }
+ if(endpointHostResolver)
+ {
+ endpointHostResolver->getThreadControl().join();
+ }
if(_initData.properties->getPropertyAsInt("Ice.Warn.UnusedProperties") > 0)
{
diff --git a/cpp/src/Ice/Instance.h b/cpp/src/Ice/Instance.h
index f3aa41fb58e..cbf6ad36ecf 100644
--- a/cpp/src/Ice/Instance.h
+++ b/cpp/src/Ice/Instance.h
@@ -24,6 +24,7 @@
#include <Ice/ReferenceFactoryF.h>
#include <Ice/ProxyFactoryF.h>
#include <Ice/ThreadPoolF.h>
+#include <Ice/SelectorThreadF.h>
#include <Ice/ConnectionFactoryF.h>
#include <Ice/ConnectionMonitorF.h>
#include <Ice/ObjectFactoryManagerF.h>
@@ -67,6 +68,8 @@ public:
ObjectAdapterFactoryPtr objectAdapterFactory() const;
ThreadPoolPtr clientThreadPool();
ThreadPoolPtr serverThreadPool();
+ SelectorThreadPtr selectorThread();
+ EndpointHostResolverPtr endpointHostResolver();
IceUtil::TimerPtr timer();
bool threadPerConnection() const;
size_t threadPerConnectionStackSize() const;
@@ -122,6 +125,8 @@ private:
ObjectAdapterFactoryPtr _objectAdapterFactory;
ThreadPoolPtr _clientThreadPool;
ThreadPoolPtr _serverThreadPool;
+ SelectorThreadPtr _selectorThread;
+ EndpointHostResolverPtr _endpointHostResolver;
IceUtil::TimerPtr _timer;
const bool _threadPerConnection;
const size_t _threadPerConnectionStackSize;
diff --git a/cpp/src/Ice/LocatorInfo.cpp b/cpp/src/Ice/LocatorInfo.cpp
index 606d7557fdd..f14561fef20 100644
--- a/cpp/src/Ice/LocatorInfo.cpp
+++ b/cpp/src/Ice/LocatorInfo.cpp
@@ -375,92 +375,149 @@ IceInternal::LocatorInfo::getEndpoints(const IndirectReferencePtr& ref, int ttl,
cached = objectCached || endpointsCached;
}
}
- catch(const AdapterNotFoundException&)
+ catch(const Ice::Exception& ex)
{
- if(ref->getInstance()->traceLevels()->location >= 1)
- {
- Trace out(ref->getInstance()->initializationData().logger,
- ref->getInstance()->traceLevels()->locationCat);
- out << "adapter not found" << "\n";
- out << "adapter = " << ref->getAdapterId();
- }
-
- NotRegisteredException ex(__FILE__, __LINE__);
- ex.kindOfObject = "object adapter";
- ex.id = ref->getAdapterId();
- throw ex;
+ getEndpointsException(ref, ex);
}
- catch(const ObjectNotFoundException&)
- {
- if(ref->getInstance()->traceLevels()->location >= 1)
- {
- Trace out(ref->getInstance()->initializationData().logger,
- ref->getInstance()->traceLevels()->locationCat);
- out << "object not found" << "\n";
- out << "object = " << ref->getInstance()->identityToString(ref->getIdentity());
- }
- NotRegisteredException ex(__FILE__, __LINE__);
- ex.kindOfObject = "object";
- ex.id = ref->getInstance()->identityToString(ref->getIdentity());
- throw ex;
- }
- catch(const NotRegisteredException&)
+ if(ref->getInstance()->traceLevels()->location >= 1)
{
- throw;
+ getEndpointsTrace(ref, endpoints, cached);
}
- catch(const LocalException& ex)
+
+ return endpoints;
+}
+
+void
+IceInternal::LocatorInfo::getEndpoints(const IndirectReferencePtr& ref, int ttl,
+ const GetEndpointsCallbackPtr& callback)
+{
+ string adapterId = ref->getAdapterId();
+ Ice::Identity identity = ref->getIdentity();
+ InstancePtr instance = ref->getInstance();
+ if(!adapterId.empty())
{
- if(ref->getInstance()->traceLevels()->location >= 1)
+ vector<EndpointIPtr> endpoints;
+ if(!_table->getAdapterEndpoints(adapterId, ttl, endpoints))
{
- Trace out(ref->getInstance()->initializationData().logger,
- ref->getInstance()->traceLevels()->locationCat);
- out << "couldn't contact the locator to retrieve adapter endpoints\n";
- if(ref->getAdapterId().empty())
+ if(instance->traceLevels()->location >= 1)
{
- out << "object = " << ref->getInstance()->identityToString(ref->getIdentity()) << "\n";
+ Trace out(instance->initializationData().logger, instance->traceLevels()->locationCat);
+ out << "searching for adapter by id" << "\nadapter = " << adapterId;
}
- else
+
+ class Callback : public AMI_Locator_findAdapterById
{
- out << "adapter = " << ref->getAdapterId() << "\n";
+ public:
+
+ virtual void
+ ice_response(const Ice::ObjectPrx& object)
+ {
+ vector<EndpointIPtr> endpoints;
+ if(object)
+ {
+ endpoints = object->__reference()->getEndpoints();
+ if(!endpoints.empty())
+ {
+ _table->addAdapterEndpoints(_reference->getAdapterId(), endpoints);
+ }
+ }
+
+ if(_reference->getInstance()->traceLevels()->location >= 1)
+ {
+ _locatorInfo->getEndpointsTrace(_reference, endpoints, false);
+ }
+
+ _callback->setEndpoints(endpoints, false);
+ }
+
+ virtual void
+ ice_exception(const Ice::Exception& ex)
+ {
+ _locatorInfo->getEndpointsException(_reference, ex, _callback);
+ }
+
+ Callback(const LocatorInfoPtr& locatorInfo, const LocatorTablePtr& table,
+ const IndirectReferencePtr& reference, const GetEndpointsCallbackPtr& callback) :
+ _locatorInfo(locatorInfo), _table(table), _reference(reference), _callback(callback)
+ {
+ }
+
+ private:
+
+ const LocatorInfoPtr _locatorInfo;
+ const LocatorTablePtr _table;
+ const IndirectReferencePtr _reference;
+ const GetEndpointsCallbackPtr _callback;
+ };
+
+ //
+ // Search the adapter in the location service if we didn't
+ // find it in the cache.
+ //
+ _locator->findAdapterById_async(new Callback(this, _table, ref, callback), adapterId);
+ return;
+ }
+ else
+ {
+ if(instance->traceLevels()->location >= 1)
+ {
+ getEndpointsTrace(ref, endpoints, true);
}
- out << "reason = " << ex;
+ callback->setEndpoints(endpoints, true);
+ return;
}
- throw;
}
-
-
- if(ref->getInstance()->traceLevels()->location >= 1)
+ else
{
- if(!endpoints.empty())
+ Ice::ObjectPrx object;
+ if(!_table->getProxy(identity, ttl, object))
{
- if(cached)
+ if(instance->traceLevels()->location >= 1)
{
- trace("found endpoints in locator table", ref, endpoints);
+ Trace out(instance->initializationData().logger, instance->traceLevels()->locationCat);
+ out << "searching for object by id" << "\nobject = " << instance->identityToString(ref->getIdentity());
}
- else
+
+ class Callback : public Ice::AMI_Locator_findObjectById
{
- trace("retrieved endpoints from locator, adding to locator table", ref, endpoints);
- }
+ public:
+
+ virtual void
+ ice_response(const Ice::ObjectPrx& object)
+ {
+ _locatorInfo->getWellKnownObjectEndpoints(_reference, object, _ttl, false, _callback);
+ }
+
+ virtual void
+ ice_exception(const Ice::Exception& ex)
+ {
+ _locatorInfo->getEndpointsException(_reference, ex, _callback);
+ }
+
+ Callback(const LocatorInfoPtr& locatorInfo, const IndirectReferencePtr& reference, int ttl,
+ const GetEndpointsCallbackPtr& callback) :
+ _locatorInfo(locatorInfo), _reference(reference), _ttl(ttl), _callback(callback)
+ {
+ }
+
+ private:
+
+ const LocatorInfoPtr _locatorInfo;
+ const IndirectReferencePtr _reference;
+ int _ttl;
+ const GetEndpointsCallbackPtr _callback;
+ };
+
+ _locator->findObjectById_async(new Callback(this, ref, ttl, callback), identity);
+ return;
}
else
{
- Trace out(ref->getInstance()->initializationData().logger, ref->getInstance()->traceLevels()->locationCat);
- out << "no endpoints configured for ";
- if(ref->getAdapterId().empty())
- {
- out << "object\n";
- out << "object = " << ref->getInstance()->identityToString(ref->getIdentity());
- }
- else
- {
- out << "adapter\n";
- out << "adapter = " << ref->getAdapterId();
- }
+ getWellKnownObjectEndpoints(ref, object, ttl, true, callback);
+ return;
}
}
-
- return endpoints;
}
void
@@ -548,3 +605,195 @@ IceInternal::LocatorInfo::trace(const string& msg,
Ice::constMemFun(&Endpoint::toString));
out << "endpoints = " << o.str();
}
+
+void
+IceInternal::LocatorInfo::getEndpointsException(const IndirectReferencePtr& ref, const Ice::Exception& exc)
+{
+ try
+ {
+ exc.ice_throw();
+ }
+ catch(const AdapterNotFoundException&)
+ {
+ if(ref->getInstance()->traceLevels()->location >= 1)
+ {
+ Trace out(ref->getInstance()->initializationData().logger,
+ ref->getInstance()->traceLevels()->locationCat);
+ out << "adapter not found" << "\n";
+ out << "adapter = " << ref->getAdapterId();
+ }
+
+ NotRegisteredException ex(__FILE__, __LINE__);
+ ex.kindOfObject = "object adapter";
+ ex.id = ref->getAdapterId();
+ throw ex;
+ }
+ catch(const ObjectNotFoundException&)
+ {
+ if(ref->getInstance()->traceLevels()->location >= 1)
+ {
+ Trace out(ref->getInstance()->initializationData().logger,
+ ref->getInstance()->traceLevels()->locationCat);
+ out << "object not found" << "\n";
+ out << "object = " << ref->getInstance()->identityToString(ref->getIdentity());
+ }
+
+ NotRegisteredException ex(__FILE__, __LINE__);
+ ex.kindOfObject = "object";
+ ex.id = ref->getInstance()->identityToString(ref->getIdentity());
+ throw ex;
+ }
+ catch(const NotRegisteredException&)
+ {
+ throw;
+ }
+ catch(const LocalException& ex)
+ {
+ if(ref->getInstance()->traceLevels()->location >= 1)
+ {
+ Trace out(ref->getInstance()->initializationData().logger,
+ ref->getInstance()->traceLevels()->locationCat);
+ out << "couldn't contact the locator to retrieve adapter endpoints\n";
+ if(ref->getAdapterId().empty())
+ {
+ out << "object = " << ref->getInstance()->identityToString(ref->getIdentity()) << "\n";
+ }
+ else
+ {
+ out << "adapter = " << ref->getAdapterId() << "\n";
+ }
+ out << "reason = " << ex;
+ }
+ throw;
+ }
+}
+
+void
+IceInternal::LocatorInfo::getEndpointsException(const IndirectReferencePtr& ref, const Ice::Exception& exc,
+ const GetEndpointsCallbackPtr& callback)
+{
+ try
+ {
+ getEndpointsException(ref, exc);
+ }
+ catch(const Ice::LocalException& ex)
+ {
+ callback->setException(ex);
+ }
+}
+
+void
+IceInternal::LocatorInfo::getWellKnownObjectEndpoints(const IndirectReferencePtr& ref,
+ const Ice::ObjectPrx& object,
+ int ttl,
+ bool objectCached,
+ const GetEndpointsCallbackPtr& callback)
+{
+ class Callback : public GetEndpointsCallback
+ {
+ public:
+
+ virtual void
+ setEndpoints(const vector<EndpointIPtr>& endpoints, bool endpointsCached)
+ {
+ if(!_objectCached && !endpoints.empty())
+ {
+ _table->addProxy(_reference->getIdentity(), _object);
+ }
+
+ if(_reference->getInstance()->traceLevels()->location >= 1)
+ {
+ _locatorInfo->getEndpointsTrace(_reference, endpoints, _objectCached || endpointsCached);
+ }
+
+ _callback->setEndpoints(endpoints, _objectCached || endpointsCached);
+ }
+
+ virtual void
+ setException(const Ice::LocalException& ex)
+ {
+ _callback->setException(ex);
+ }
+
+ Callback(const LocatorInfoPtr& locatorInfo, const LocatorTablePtr& table,
+ const IndirectReferencePtr& reference, const Ice::ObjectPrx& object,
+ bool objectCached, const GetEndpointsCallbackPtr& callback) :
+ _locatorInfo(locatorInfo), _table(table), _reference(reference), _object(object),
+ _objectCached(objectCached), _callback(callback)
+ {
+ }
+
+ private:
+
+ const LocatorInfoPtr _locatorInfo;
+ const LocatorTablePtr _table;
+ const IndirectReferencePtr _reference;
+ const Ice::ObjectPrx _object;
+ const bool _objectCached;
+ const GetEndpointsCallbackPtr _callback;
+ };
+
+ vector<EndpointIPtr> endpoints;
+ if(object)
+ {
+ DirectReferencePtr odr = DirectReferencePtr::dynamicCast(object->__reference());
+ if(odr)
+ {
+ endpoints = odr->getEndpoints();
+ }
+ else
+ {
+ IndirectReferencePtr oir = IndirectReferencePtr::dynamicCast(object->__reference());
+ assert(oir);
+ if(!oir->getAdapterId().empty())
+ {
+ getEndpoints(oir, ttl, new Callback(this, _table, ref, object, objectCached, callback));
+ return;
+ }
+ }
+ }
+
+ if(!objectCached && !endpoints.empty())
+ {
+ _table->addProxy(ref->getIdentity(), object);
+ }
+
+ if(ref->getInstance()->traceLevels()->location >= 1)
+ {
+ getEndpointsTrace(ref, endpoints, objectCached);
+ }
+
+ callback->setEndpoints(endpoints, objectCached);
+}
+
+void
+IceInternal::LocatorInfo::getEndpointsTrace(const IndirectReferencePtr& ref, const vector<EndpointIPtr>& endpoints,
+ bool cached)
+{
+ if(!endpoints.empty())
+ {
+ if(cached)
+ {
+ trace("found endpoints in locator table", ref, endpoints);
+ }
+ else
+ {
+ trace("retrieved endpoints from locator, adding to locator table", ref, endpoints);
+ }
+ }
+ else
+ {
+ Trace out(ref->getInstance()->initializationData().logger, ref->getInstance()->traceLevels()->locationCat);
+ out << "no endpoints configured for ";
+ if(ref->getAdapterId().empty())
+ {
+ out << "object\n";
+ out << "object = " << ref->getInstance()->identityToString(ref->getIdentity());
+ }
+ else
+ {
+ out << "adapter\n";
+ out << "adapter = " << ref->getAdapterId();
+ }
+ }
+}
diff --git a/cpp/src/Ice/LocatorInfo.h b/cpp/src/Ice/LocatorInfo.h
index 4811030d97c..f0a1032fa05 100644
--- a/cpp/src/Ice/LocatorInfo.h
+++ b/cpp/src/Ice/LocatorInfo.h
@@ -71,6 +71,15 @@ class LocatorInfo : public IceUtil::Shared, public IceUtil::Mutex
{
public:
+ class GetEndpointsCallback : virtual public IceUtil::Shared
+ {
+ public:
+
+ virtual void setEndpoints(const std::vector<EndpointIPtr>&, bool) = 0;
+ virtual void setException(const Ice::LocalException&) = 0;
+ };
+ typedef IceUtil::Handle<GetEndpointsCallback> GetEndpointsCallbackPtr;
+
LocatorInfo(const Ice::LocatorPrx&, const LocatorTablePtr&);
void destroy();
@@ -83,6 +92,7 @@ public:
Ice::LocatorRegistryPrx getLocatorRegistry();
std::vector<EndpointIPtr> getEndpoints(const IndirectReferencePtr&, int, bool&);
+ void getEndpoints(const IndirectReferencePtr&, int, const GetEndpointsCallbackPtr&);
void clearCache(const IndirectReferencePtr&);
void clearObjectCache(const IndirectReferencePtr&);
@@ -90,6 +100,12 @@ private:
void trace(const std::string&, const IndirectReferencePtr&, const std::vector<EndpointIPtr>&);
+ void getEndpointsException(const IndirectReferencePtr&, const Ice::Exception&);
+ void getWellKnownObjectEndpoints(const IndirectReferencePtr&, const Ice::ObjectPrx&, int, bool,
+ const GetEndpointsCallbackPtr&);
+ void getEndpointsException(const IndirectReferencePtr&, const Ice::Exception&, const GetEndpointsCallbackPtr&);
+ void getEndpointsTrace(const IndirectReferencePtr&, const std::vector<EndpointIPtr>&, bool);
+
const Ice::LocatorPrx _locator;
Ice::LocatorRegistryPrx _locatorRegistry;
const LocatorTablePtr _table;
diff --git a/cpp/src/Ice/Makefile b/cpp/src/Ice/Makefile
index ebecec755eb..2c7c06d5238 100644
--- a/cpp/src/Ice/Makefile
+++ b/cpp/src/Ice/Makefile
@@ -22,10 +22,12 @@ OBJS = Acceptor.o \
BuiltinSequences.o \
CommunicatorI.o \
Communicator.o \
+ ConnectRequestHandler.o \
ConnectionFactory.o \
ConnectionI.o \
ConnectionMonitor.o \
Connection.o \
+ ConnectionRequestHandler.o \
Connector.o \
Current.o \
DefaultsAndOverrides.o \
@@ -78,8 +80,11 @@ OBJS = Acceptor.o \
Proxy.o \
ReferenceFactory.o \
Reference.o \
+ RequestHandler.o \
RouterInfo.o \
Router.o \
+ Selector.o \
+ SelectorThread.o \
ServantLocator.o \
ServantManager.o \
Service.o \
diff --git a/cpp/src/Ice/Makefile.mak b/cpp/src/Ice/Makefile.mak
index 80c69167223..6b4d6ee0318 100644
--- a/cpp/src/Ice/Makefile.mak
+++ b/cpp/src/Ice/Makefile.mak
@@ -21,11 +21,13 @@ OBJS = Acceptor.obj \
BuiltinSequences.obj \
CommunicatorI.obj \
Communicator.obj \
+ ConnectRequestHandler.obj \
ConnectionFactory.obj \
ConnectionI.obj \
ConnectionMonitor.obj \
Connection.obj \
Connector.obj \
+ ConnectionRequestHandler.obj \
Current.obj \
DefaultsAndOverrides.obj \
Direct.obj \
@@ -79,8 +81,11 @@ OBJS = Acceptor.obj \
Proxy.obj \
ReferenceFactory.obj \
Reference.obj \
+ RequestHandler.obj \
RouterInfo.obj \
Router.obj \
+ Selector.obj \
+ SelectorThread.obj \
ServantLocator.obj \
ServantManager.obj \
Service.obj \
diff --git a/cpp/src/Ice/Network.cpp b/cpp/src/Ice/Network.cpp
index 0ee86c6472d..1fb9491e479 100644
--- a/cpp/src/Ice/Network.cpp
+++ b/cpp/src/Ice/Network.cpp
@@ -190,6 +190,8 @@ IceInternal::notConnected()
{
#ifdef _WIN32
return WSAGetLastError() == WSAENOTCONN;
+#elif defined(__APPLE__) || defined(__FreeBSD__)
+ return errno == ENOTCONN || errno == EINVAL;
#else
return errno == ENOTCONN;
#endif
@@ -293,7 +295,7 @@ IceInternal::shutdownSocketWrite(SOCKET fd)
{
return;
}
-#elif defined(__APPLE__)
+#elif defined(__APPLE__) || defined(__FreeBSD__)
if(errno == ENOTCONN || errno == EINVAL)
{
return;
@@ -329,7 +331,7 @@ IceInternal::shutdownSocketReadWrite(SOCKET fd)
{
return;
}
-#elif defined(__APPLE__)
+#elif defined(__APPLE__) || defined(__FreeBSD__)
if(errno == ENOTCONN || errno == EINVAL)
{
return;
@@ -568,44 +570,9 @@ repeatListen:
}
}
-void
+bool
IceInternal::doConnect(SOCKET fd, struct sockaddr_in& addr, int timeout)
{
-#ifdef _WIN32
- //
- // Set larger send buffer size to avoid performance problems on
- // WIN32.
- //
- setSendBufferSize(fd, 64 * 1024);
-
- //
- // Under WinCE its not possible to find out the connection failure
- // reason with SO_ERROR, so its necessary to use the WSAEVENT
- // mechanism. We use the same mechanism for any Winsock platform.
- //
- WSAEVENT event = WSACreateEvent();
- if(event == 0)
- {
- closeSocketNoThrow(fd);
-
- SocketException ex(__FILE__, __LINE__);
- ex.error = WSAGetLastError();
- throw ex;
- }
-
- if(WSAEventSelect(fd, event, FD_CONNECT) == SOCKET_ERROR)
- {
- int error = WSAGetLastError();
-
- WSACloseEvent(event);
- closeSocketNoThrow(fd);
-
- SocketException ex(__FILE__, __LINE__);
- ex.error = error;
- throw ex;
- }
-#endif
-
repeatConnect:
if(::connect(fd, reinterpret_cast<struct sockaddr*>(&addr), int(sizeof(addr))) == SOCKET_ERROR)
{
@@ -616,125 +583,141 @@ repeatConnect:
if(connectInProgress())
{
- int val;
-#ifdef _WIN32
- WSAEVENT events[1];
- events[0] = event;
- long tout = (timeout >= 0) ? timeout : WSA_INFINITE;
- DWORD rc = WSAWaitForMultipleEvents(1, events, FALSE, tout, FALSE);
- if(rc == WSA_WAIT_FAILED)
+ if(timeout == 0)
{
- int error = WSAGetLastError();
-
- WSACloseEvent(event);
- closeSocketNoThrow(fd);
-
- SocketException ex(__FILE__, __LINE__);
- ex.error = error;
- throw ex;
+ return false;
}
- if(rc == WSA_WAIT_TIMEOUT)
+ try
{
- WSACloseEvent(event);
- closeSocketNoThrow(fd);
-
- assert(timeout >= 0);
- throw ConnectTimeoutException(__FILE__, __LINE__);
+ doFinishConnect(fd, timeout);
}
- assert(rc == WSA_WAIT_EVENT_0);
-
- WSANETWORKEVENTS nevents;
- if(WSAEnumNetworkEvents(fd, event, &nevents) == SOCKET_ERROR)
+ catch(const Ice::LocalException&)
{
- int error = WSAGetLastError();
- WSACloseEvent(event);
closeSocketNoThrow(fd);
-
- SocketException ex(__FILE__, __LINE__);
- ex.error = error;
- throw ex;
+ throw;
}
+ return true;
+ }
+
+ closeSocketNoThrow(fd);
+ if(connectionRefused())
+ {
+ ConnectionRefusedException ex(__FILE__, __LINE__);
+ ex.error = getSocketErrno();
+ throw ex;
+ }
+ else if(connectFailed())
+ {
+ ConnectFailedException ex(__FILE__, __LINE__);
+ ex.error = getSocketErrno();
+ throw ex;
+ }
+ else
+ {
+ SocketException ex(__FILE__, __LINE__);
+ ex.error = getSocketErrno();
+ throw ex;
+ }
+ }
- //
- // Now we close the event, because we're finished and
- // this code be repeated.
- //
- WSACloseEvent(event);
+#if defined(__linux)
+ //
+ // Prevent self connect (self connect happens on Linux when a client tries to connect to
+ // a server which was just deactivated if the client socket re-uses the same ephemeral
+ // port as the server).
+ //
+ struct sockaddr_in localAddr;
+ fdToLocalAddress(fd, localAddr);
+ if(compareAddress(addr, localAddr) == 0)
+ {
+ ConnectionRefusedException ex(__FILE__, __LINE__);
+ ex.error = 0; // No appropriate errno
+ throw ex;
+ }
+#endif
+ return true;
+}
- assert(nevents.lNetworkEvents & FD_CONNECT);
- val = nevents.iErrorCode[FD_CONNECT_BIT];
+void
+IceInternal::doFinishConnect(SOCKET fd, int timeout)
+{
+ //
+ // Note: we don't close the socket if there's an exception. It's the responsability
+ // of the caller to do so.
+ //
+
+ if(timeout != 0)
+ {
+ repeatSelect:
+#ifdef _WIN32
+ fd_set wFdSet;
+ fd_set eFdSet;
+ FD_ZERO(&wFdSet);
+ FD_ZERO(&eFdSet);
+ FD_SET(fd, &wFdSet);
+ FD_SET(fd, &eFdSet);
+
+ int ret;
+ if(timeout >= 0)
+ {
+ struct timeval tv;
+ tv.tv_sec = timeout / 1000;
+ tv.tv_usec = (timeout - tv.tv_sec * 1000) * 1000;
+ ret = ::select(static_cast<int>(fd + 1), 0, &wFdSet, &eFdSet, &tv);
+ }
+ else
+ {
+ ret = ::select(static_cast<int>(fd + 1), 0, &wFdSet, &eFdSet, 0);
+ }
#else
- repeatPoll:
- struct pollfd pollFd[1];
- pollFd[0].fd = fd;
- pollFd[0].events = POLLOUT;
- int ret = ::poll(pollFd, 1, timeout);
- if(ret == 0)
+ struct pollfd pollFd[1];
+ pollFd[0].fd = fd;
+ pollFd[0].events = POLLOUT;
+ int ret = ::poll(pollFd, 1, timeout);
+#endif
+ if(ret == 0)
+ {
+ throw ConnectTimeoutException(__FILE__, __LINE__);
+ }
+ else if(ret == SOCKET_ERROR)
+ {
+ if(interrupted())
{
- closeSocketNoThrow(fd);
- throw ConnectTimeoutException(__FILE__, __LINE__);
+ goto repeatSelect;
}
- else if(ret == SOCKET_ERROR)
- {
- if(interrupted())
- {
- goto repeatPoll;
- }
- SocketException ex(__FILE__, __LINE__);
- ex.error = getSocketErrno();
- throw ex;
- }
-
- //
- // Strange windows bug: The following call to Sleep() is
- // necessary, otherwise no error is reported through
- // getsockopt.
- //
- //Sleep(0);
- socklen_t len = static_cast<socklen_t>(sizeof(int));
- if(getsockopt(fd, SOL_SOCKET, SO_ERROR, reinterpret_cast<char*>(&val), &len) == SOCKET_ERROR)
- {
- closeSocketNoThrow(fd);
- SocketException ex(__FILE__, __LINE__);
- ex.error = getSocketErrno();
- throw ex;
- }
+ SocketException ex(__FILE__, __LINE__);
+ ex.error = getSocketErrno();
+ throw ex;
+ }
+ }
+
+ int val;
+
+ //
+ // Strange windows bug: The following call to Sleep() is
+ // necessary, otherwise no error is reported through
+ // getsockopt.
+ //
+#ifdef _WIN32
+ Sleep(0);
#endif
+ socklen_t len = static_cast<socklen_t>(sizeof(int));
+ if(getsockopt(fd, SOL_SOCKET, SO_ERROR, reinterpret_cast<char*>(&val), &len) == SOCKET_ERROR)
+ {
+ SocketException ex(__FILE__, __LINE__);
+ ex.error = getSocketErrno();
+ throw ex;
+ }
- if(val > 0)
- {
- closeSocketNoThrow(fd);
+ if(val > 0)
+ {
#ifdef _WIN32
- WSASetLastError(val);
+ WSASetLastError(val);
#else
- errno = val;
+ errno = val;
#endif
- if(connectionRefused())
- {
- ConnectionRefusedException ex(__FILE__, __LINE__);
- ex.error = getSocketErrno();
- throw ex;
- }
- else if(connectFailed())
- {
- ConnectFailedException ex(__FILE__, __LINE__);
- ex.error = getSocketErrno();
- throw ex;
- }
- else
- {
- SocketException ex(__FILE__, __LINE__);
- ex.error = getSocketErrno();
- throw ex;
- }
- }
-
- return;
- }
-
- closeSocketNoThrow(fd);
if(connectionRefused())
{
ConnectionRefusedException ex(__FILE__, __LINE__);
@@ -754,6 +737,23 @@ repeatConnect:
throw ex;
}
}
+
+#if defined(__linux)
+ //
+ // Prevent self connect (self connect happens on Linux when a client tries to connect to
+ // a server which was just deactivated if the client socket re-uses the same ephemeral
+ // port as the server).
+ //
+ struct sockaddr_in localAddr;
+ fdToLocalAddress(fd, localAddr);
+ struct sockaddr_in remoteAddr;
+ if(fdToRemoteAddress(fd, remoteAddr) && compareAddress(remoteAddr, localAddr) == 0)
+ {
+ ConnectionRefusedException ex(__FILE__, __LINE__);
+ ex.error = 0; // No appropriate errno
+ throw ex;
+ }
+#endif
}
SOCKET
@@ -826,15 +826,6 @@ repeatAccept:
setTcpNoDelay(ret);
setKeepAlive(ret);
-
-#ifdef _WIN32
- //
- // Set larger send buffer size to avoid performance problems on
- // WIN32.
- //
- setSendBufferSize(ret, 64 * 1024);
-#endif
-
return ret;
}
@@ -848,41 +839,44 @@ IceInternal::getAddress(const string& host, int port, struct sockaddr_in& addr)
if(addr.sin_addr.s_addr == INADDR_NONE)
{
-#ifdef _WIN32
-
//
- // Windows XP has getaddrinfo(), but we don't want to require XP to run Ice.
+ // We now use getaddrinfo() on Windows.
//
+// #ifdef _WIN32
+
+// //
+// // Windows XP has getaddrinfo(), but we don't want to require XP to run Ice.
+// //
- //
- // gethostbyname() is thread safe on Windows, with a separate hostent per thread
- //
- struct hostent* entry;
- int retry = 5;
- do
- {
- entry = gethostbyname(host.c_str());
- }
- while(entry == 0 && WSAGetLastError() == WSATRY_AGAIN && --retry >= 0);
+// //
+// // gethostbyname() is thread safe on Windows, with a separate hostent per thread
+// //
+// struct hostent* entry;
+// int retry = 5;
+// do
+// {
+// entry = gethostbyname(host.c_str());
+// }
+// while(entry == 0 && WSAGetLastError() == WSATRY_AGAIN && --retry >= 0);
- if(entry == 0)
- {
- DNSException ex(__FILE__, __LINE__);
+// if(entry == 0)
+// {
+// DNSException ex(__FILE__, __LINE__);
- ex.error = WSAGetLastError();
- ex.host = host;
- throw ex;
- }
- memcpy(&addr.sin_addr, entry->h_addr, entry->h_length);
+// ex.error = WSAGetLastError();
+// ex.host = host;
+// throw ex;
+// }
+// memcpy(&addr.sin_addr, entry->h_addr, entry->h_length);
-#else
+// #else
struct addrinfo* info = 0;
int retry = 5;
struct addrinfo hints = { 0 };
hints.ai_family = PF_INET;
-
+
int rs = 0;
do
{
@@ -903,8 +897,6 @@ IceInternal::getAddress(const string& host, int port, struct sockaddr_in& addr)
addr.sin_addr.s_addr = sin->sin_addr.s_addr;
freeaddrinfo(info);
-
-#endif
}
}
@@ -1346,7 +1338,7 @@ IceInternal::addrToString(const struct sockaddr_in& addr)
}
vector<struct sockaddr_in>
-IceInternal::getAddresses(const string& host, int port)
+IceInternal::getAddresses(const string& host, int port, bool blocking)
{
vector<struct sockaddr_in> result;
@@ -1367,47 +1359,54 @@ IceInternal::getAddresses(const string& host, int port)
addr.sin_family = AF_INET;
addr.sin_port = htons(port);
-#ifdef _WIN32
-
- //
- // Windows XP has getaddrinfo(), but we don't want to require XP to run Ice.
- //
-
//
- // gethostbyname() is thread safe on Windows, with a separate hostent per thread
+ // We now use getaddrinfo() on Windows.
//
- struct hostent* entry = 0;
- int retry = 5;
+// #ifdef _WIN32
- do
- {
- entry = gethostbyname(host.c_str());
- }
- while(entry == 0 && h_errno == TRY_AGAIN && --retry >= 0);
+// //
+// // Windows XP has getaddrinfo(), but we don't want to require XP to run Ice.
+// //
+
+// //
+// // gethostbyname() is thread safe on Windows, with a separate hostent per thread
+// //
+// struct hostent* entry = 0;
+// int retry = 5;
+
+// do
+// {
+// entry = gethostbyname(host.c_str());
+// }
+// while(entry == 0 && h_errno == TRY_AGAIN && --retry >= 0);
- if(entry == 0)
- {
- DNSException ex(__FILE__, __LINE__);
- ex.error = h_errno;
- ex.host = host;
- throw ex;
- }
-
- char** p = entry->h_addr_list;
- while(*p)
- {
- memcpy(&addr.sin_addr, *p, entry->h_length);
- result.push_back(addr);
- p++;
- }
-
-#else
+// if(entry == 0)
+// {
+// DNSException ex(__FILE__, __LINE__);
+// ex.error = h_errno;
+// ex.host = host;
+// throw ex;
+// }
+
+// char** p = entry->h_addr_list;
+// while(*p)
+// {
+// memcpy(&addr.sin_addr, *p, entry->h_length);
+// result.push_back(addr);
+// p++;
+// }
+
+// #else
struct addrinfo* info = 0;
int retry = 5;
struct addrinfo hints = { 0 };
hints.ai_family = PF_INET;
+ if(!blocking)
+ {
+ hints.ai_flags = AI_NUMERICHOST;
+ }
int rs = 0;
do
@@ -1451,7 +1450,7 @@ IceInternal::getAddresses(const string& host, int port)
freeaddrinfo(info);
-#endif
+//#endif
}
return result;
diff --git a/cpp/src/Ice/Network.h b/cpp/src/Ice/Network.h
index 178e08a6e1a..5936a2cd2c0 100644
--- a/cpp/src/Ice/Network.h
+++ b/cpp/src/Ice/Network.h
@@ -96,7 +96,8 @@ ICE_API void setReuseAddress(SOCKET, bool);
ICE_API void doBind(SOCKET, struct sockaddr_in&);
ICE_API void doListen(SOCKET, int);
-ICE_API void doConnect(SOCKET, struct sockaddr_in&, int);
+ICE_API bool doConnect(SOCKET, struct sockaddr_in&, int);
+ICE_API void doFinishConnect(SOCKET, int);
ICE_API SOCKET doAccept(SOCKET, int);
ICE_API void getAddress(const std::string&, int, struct sockaddr_in&);
@@ -114,7 +115,7 @@ ICE_API void fdToLocalAddress(SOCKET, struct sockaddr_in&);
ICE_API bool fdToRemoteAddress(SOCKET, struct sockaddr_in&);
ICE_API std::string addrToString(const struct sockaddr_in&);
-ICE_API std::vector<struct sockaddr_in> getAddresses(const std::string&, int);
+ICE_API std::vector<struct sockaddr_in> getAddresses(const std::string&, int, bool = true);
ICE_API std::vector<std::string> getLocalHosts();
ICE_API void setTcpBufSize(SOCKET, const Ice::PropertiesPtr&, const Ice::LoggerPtr&);
ICE_API int getSocketErrno();
diff --git a/cpp/src/Ice/ObjectAdapterFactory.cpp b/cpp/src/Ice/ObjectAdapterFactory.cpp
index a6009d658e3..5d7f1d131f9 100644
--- a/cpp/src/Ice/ObjectAdapterFactory.cpp
+++ b/cpp/src/Ice/ObjectAdapterFactory.cpp
@@ -79,7 +79,7 @@ IceInternal::ObjectAdapterFactory::waitForShutdown()
_waitForShutdown = true;
adapters = _adapters;
}
-
+
//
// Now we wait for deactivation of each object adapter.
//
diff --git a/cpp/src/Ice/ObjectAdapterI.cpp b/cpp/src/Ice/ObjectAdapterI.cpp
index 9d7cf4c7d5c..ccd571147ec 100644
--- a/cpp/src/Ice/ObjectAdapterI.cpp
+++ b/cpp/src/Ice/ObjectAdapterI.cpp
@@ -256,7 +256,6 @@ Ice::ObjectAdapterI::waitForDeactivate()
{
IceUtil::Monitor<IceUtil::RecMutex>::Lock sync(*this);
-
if(_destroyed)
{
return;
@@ -365,7 +364,6 @@ Ice::ObjectAdapterI::destroy()
_routerInfo = 0;
_publishedEndpoints.clear();
_locatorInfo = 0;
- _connectors.clear();
objectAdapterFactory = _objectAdapterFactory;
_objectAdapterFactory = 0;
@@ -583,14 +581,6 @@ Ice::ObjectAdapterI::refreshPublishedEndpoints()
oldPublishedEndpoints = _publishedEndpoints;
_publishedEndpoints = parsePublishedEndpoints();
- _connectors.clear();
- vector<IncomingConnectionFactoryPtr>::const_iterator p;
- for(p = _incomingConnectionFactories.begin(); p != _incomingConnectionFactories.end(); ++p)
- {
- vector<ConnectorPtr> cons = (*p)->endpoint()->connectors();
- _connectors.insert(_connectors.end(), cons.begin(), cons.end());
- }
-
locatorInfo = _locatorInfo;
if(!_noConfig)
{
@@ -671,10 +661,18 @@ Ice::ObjectAdapterI::isLocal(const ObjectPrx& proxy) const
//
for(p = endpoints.begin(); p != endpoints.end(); ++p)
{
- vector<ConnectorPtr>::const_iterator q;
- for(q = _connectors.begin(); q != _connectors.end(); ++q)
+ vector<IncomingConnectionFactoryPtr>::const_iterator q;
+ for(q = _incomingConnectionFactories.begin(); q != _incomingConnectionFactories.end(); ++q)
+ {
+ if((*p)->equivalent((*q)->endpoint()))
+ {
+ return true;
+ }
+ }
+ vector<EndpointIPtr>::const_iterator r;
+ for(r = _publishedEndpoints.begin(); r != _publishedEndpoints.end(); ++r)
{
- if((*p)->equivalent(*q))
+ if((*p)->equivalent(*r))
{
return true;
}
@@ -944,9 +942,6 @@ Ice::ObjectAdapterI::ObjectAdapterI(const InstancePtr& instance, const Communica
{
IncomingConnectionFactoryPtr factory = new IncomingConnectionFactory(instance, *p, this, _name);
_incomingConnectionFactories.push_back(factory);
-
- vector<ConnectorPtr> cons = factory->endpoint()->connectors();
- _connectors.insert(_connectors.end(), cons.begin(), cons.end());
}
if(endpoints.empty())
{
diff --git a/cpp/src/Ice/Outgoing.cpp b/cpp/src/Ice/Outgoing.cpp
index 8eedeffe6a1..14fb41c7afd 100644
--- a/cpp/src/Ice/Outgoing.cpp
+++ b/cpp/src/Ice/Outgoing.cpp
@@ -9,6 +9,7 @@
#include <Ice/Outgoing.h>
#include <Ice/Object.h>
+#include <Ice/RequestHandler.h>
#include <Ice/ConnectionI.h>
#include <Ice/Reference.h>
#include <Ice/Endpoint.h>
@@ -78,16 +79,15 @@ IceInternal::LocalExceptionWrapper::retry() const
return _retry;
}
-IceInternal::Outgoing::Outgoing(ConnectionI* connection, Reference* ref, const string& operation,
- OperationMode mode, const Context* context, bool compress) :
- _connection(connection),
- _reference(ref),
+IceInternal::Outgoing::Outgoing(RequestHandler* handler, const string& operation, OperationMode mode,
+ const Context* context) :
+ _handler(handler),
_state(StateUnsent),
- _is(ref->getInstance().get()),
- _os(ref->getInstance().get()),
- _compress(compress)
+ _is(handler->getReference()->getInstance().get()),
+ _os(handler->getReference()->getInstance().get()),
+ _sent(false)
{
- switch(_reference->getMode())
+ switch(_handler->getReference()->getMode())
{
case Reference::ModeTwoway:
case Reference::ModeOneway:
@@ -100,25 +100,25 @@ IceInternal::Outgoing::Outgoing(ConnectionI* connection, Reference* ref, const s
case Reference::ModeBatchOneway:
case Reference::ModeBatchDatagram:
{
- _connection->prepareBatchRequest(&_os);
+ _handler->prepareBatchRequest(&_os);
break;
}
}
try
{
- _reference->getIdentity().__write(&_os);
+ _handler->getReference()->getIdentity().__write(&_os);
//
// For compatibility with the old FacetPath.
//
- if(_reference->getFacet().empty())
+ if(_handler->getReference()->getFacet().empty())
{
_os.write(static_cast<string*>(0), static_cast<string*>(0));
}
else
{
- string facet = _reference->getFacet();
+ string facet = _handler->getReference()->getFacet();
_os.write(&facet, &facet + 1);
}
@@ -138,11 +138,8 @@ IceInternal::Outgoing::Outgoing(ConnectionI* connection, Reference* ref, const s
//
// Implicit context
//
- const ImplicitContextIPtr& implicitContext =
- _reference->getInstance()->getImplicitContext();
-
- const Context& prxContext = _reference->getContext()->getValue();
-
+ const ImplicitContextIPtr& implicitContext = _handler->getReference()->getInstance()->getImplicitContext();
+ const Context& prxContext = _handler->getReference()->getContext()->getValue();
if(implicitContext == 0)
{
__writeContext(&_os, prxContext);
@@ -173,42 +170,33 @@ IceInternal::Outgoing::invoke()
_os.endWriteEncaps();
- switch(_reference->getMode())
+ switch(_handler->getReference()->getMode())
{
case Reference::ModeTwoway:
{
- //
- // We let all exceptions raised by sending directly
- // propagate to the caller, because they can be retried
- // without violating "at-most-once". In case of such
- // exceptions, the connection object does not call back on
- // this object, so we don't need to lock the mutex, keep
- // track of state, or save exceptions.
- //
- _connection->sendRequest(&_os, this, _compress);
-
- //
- // Wait until the request has completed, or until the
- // request times out.
- //
+ _state = StateInProgress;
- bool timedOut = false;
+ Ice::ConnectionI* connection = _handler->sendRequest(this);
+ bool timedOut = false;
+
{
IceUtil::Monitor<IceUtil::Mutex>::Lock sync(_monitor);
//
- // It's possible that the request has already
- // completed, due to a regular response, or because of
- // an exception. So we only change the state to "in
- // progress" if it is still "unsent".
+ // If the request is being sent in the background we first wait for the
+ // sent notification.
//
- if(_state == StateUnsent)
+ while(_state != StateFailed && !_sent)
{
- _state = StateInProgress;
+ _monitor.wait();
}
-
- Int timeout = _connection->timeout();
+
+ //
+ // Wait until the request has completed, or until the request times out.
+ //
+
+ Int timeout = connection->timeout();
while(_state == StateInProgress && !timedOut)
{
if(timeout >= 0)
@@ -233,7 +221,7 @@ IceInternal::Outgoing::invoke()
// Must be called outside the synchronization of this
// object.
//
- _connection->exception(TimeoutException(__FILE__, __LINE__));
+ connection->exception(TimeoutException(__FILE__, __LINE__));
//
// We must wait until the exception set above has
@@ -241,7 +229,6 @@ IceInternal::Outgoing::invoke()
//
{
IceUtil::Monitor<IceUtil::Mutex>::Lock sync(_monitor);
-
while(_state == StateInProgress)
{
_monitor.wait();
@@ -262,7 +249,8 @@ IceInternal::Outgoing::invoke()
// An ObjectNotExistException can always be retried as
// well without violating "at-most-once".
//
- if(dynamic_cast<CloseConnectionException*>(_exception.get()) ||
+ if(!_sent ||
+ dynamic_cast<CloseConnectionException*>(_exception.get()) ||
dynamic_cast<ObjectNotExistException*>(_exception.get()))
{
_exception->ice_throw();
@@ -281,25 +269,35 @@ IceInternal::Outgoing::invoke()
{
return false;
}
-
- assert(_state == StateOK);
- break;
+ else
+ {
+ assert(_state == StateOK);
+ return true;
+ }
}
-
+
case Reference::ModeOneway:
case Reference::ModeDatagram:
{
- //
- // For oneway and datagram requests, the connection object
- // never calls back on this object. Therefore we don't
- // need to lock the mutex or save exceptions. We simply
- // let all exceptions from sending propagate to the
- // caller, because such exceptions can be retried without
- // violating "at-most-once".
- //
_state = StateInProgress;
- _connection->sendRequest(&_os, 0, _compress);
- break;
+ if(_handler->sendRequest(this))
+ {
+ //
+ // If the handler returns the connection, we must wait for the sent callback.
+ //
+ IceUtil::Monitor<IceUtil::Mutex>::Lock sync(_monitor);
+ while(_state != StateFailed && !_sent)
+ {
+ _monitor.wait();
+ }
+
+ if(_exception.get())
+ {
+ assert(!_sent);
+ _exception->ice_throw();
+ }
+ }
+ return true;
}
case Reference::ModeBatchOneway:
@@ -311,12 +309,13 @@ IceInternal::Outgoing::invoke()
// apply.
//
_state = StateInProgress;
- _connection->finishBatchRequest(&_os, _compress);
- break;
+ _handler->finishBatchRequest(&_os);
+ return true;
}
}
- return true;
+ assert(false);
+ return false;
}
void
@@ -329,9 +328,10 @@ IceInternal::Outgoing::abort(const LocalException& ex)
// notify the connection about that we give up ownership of the
// batch stream.
//
- if(_reference->getMode() == Reference::ModeBatchOneway || _reference->getMode() == Reference::ModeBatchDatagram)
+ if(_handler->getReference()->getMode() == Reference::ModeBatchOneway ||
+ _handler->getReference()->getMode() == Reference::ModeBatchDatagram)
{
- _connection->abortBatchRequest();
+ _handler->abortBatchRequest();
//
// If we abort a batch requests, we cannot retry, because not
@@ -345,11 +345,30 @@ IceInternal::Outgoing::abort(const LocalException& ex)
}
void
+IceInternal::Outgoing::sent(bool notify)
+{
+ if(notify)
+ {
+ IceUtil::Monitor<IceUtil::Mutex>::Lock sync(_monitor);
+ _sent = true;
+ _monitor.notify();
+ }
+ else
+ {
+ //
+ // No synchronization is necessary if called from sendRequest() because the connection
+ // send mutex is locked and no other threads can call on Outgoing until it's released.
+ //
+ _sent = true;
+ }
+}
+
+void
IceInternal::Outgoing::finished(BasicStream& is)
{
IceUtil::Monitor<IceUtil::Mutex>::Lock sync(_monitor);
- assert(_reference->getMode() == Reference::ModeTwoway); // Can only be called for twoways.
+ assert(_handler->getReference()->getMode() == Reference::ModeTwoway); // Can only be called for twoways.
assert(_state <= StateInProgress);
@@ -514,12 +533,68 @@ void
IceInternal::Outgoing::finished(const LocalException& ex)
{
IceUtil::Monitor<IceUtil::Mutex>::Lock sync(_monitor);
-
- assert(_reference->getMode() == Reference::ModeTwoway); // Can only be called for twoways.
-
assert(_state <= StateInProgress);
- _state = StateLocalException;
+ _state = StateFailed;
+ _exception.reset(dynamic_cast<LocalException*>(ex.ice_clone()));
+ _monitor.notify();
+}
+
+IceInternal::BatchOutgoing::BatchOutgoing(RequestHandler* handler) :
+ _handler(handler),
+ _connection(0),
+ _sent(false),
+ _os(handler->getReference()->getInstance().get())
+{
+}
+
+IceInternal::BatchOutgoing::BatchOutgoing(ConnectionI* connection, Instance* instance) :
+ _handler(0),
+ _connection(connection),
+ _sent(false),
+ _os(instance)
+{
+}
+
+void
+IceInternal::BatchOutgoing::invoke()
+{
+ assert(_handler || _connection);
+ if(_handler && !_handler->flushBatchRequests(this) || _connection && !_connection->flushBatchRequests(this))
+ {
+ IceUtil::Monitor<IceUtil::Mutex>::Lock sync(_monitor);
+ while(!_exception.get() && !_sent)
+ {
+ _monitor.wait();
+ }
+
+ if(_exception.get())
+ {
+ assert(!_sent);
+ _exception->ice_throw();
+ }
+ }
+}
+
+void
+IceInternal::BatchOutgoing::sent(bool notify)
+{
+ if(notify)
+ {
+ IceUtil::Monitor<IceUtil::Mutex>::Lock sync(_monitor);
+ _sent = true;
+ _monitor.notify();
+ }
+ else
+ {
+ _sent = true;
+ }
+}
+
+void
+IceInternal::BatchOutgoing::finished(const Ice::LocalException& ex)
+{
+ IceUtil::Monitor<IceUtil::Mutex>::Lock sync(_monitor);
_exception.reset(dynamic_cast<LocalException*>(ex.ice_clone()));
_monitor.notify();
}
diff --git a/cpp/src/Ice/OutgoingAsync.cpp b/cpp/src/Ice/OutgoingAsync.cpp
index 40cb5336c23..4286cc1949c 100644
--- a/cpp/src/Ice/OutgoingAsync.cpp
+++ b/cpp/src/Ice/OutgoingAsync.cpp
@@ -10,6 +10,7 @@
#include <Ice/OutgoingAsync.h>
#include <Ice/Object.h>
#include <Ice/ConnectionI.h>
+#include <Ice/RequestHandler.h>
#include <Ice/Reference.h>
#include <Ice/Instance.h>
#include <Ice/LocalException.h>
@@ -27,9 +28,12 @@ using namespace std;
using namespace Ice;
using namespace IceInternal;
+IceUtil::Shared* IceInternal::upCast(OutgoingAsyncMessageCallback* p) { return p; }
IceUtil::Shared* IceInternal::upCast(OutgoingAsync* p) { return p; }
+IceUtil::Shared* IceInternal::upCast(BatchOutgoingAsync* p) { return p; }
IceUtil::Shared* IceInternal::upCast(AMI_Object_ice_invoke* p) { return p; }
IceUtil::Shared* IceInternal::upCast(AMI_Array_Object_ice_invoke* p) { return p; }
+IceUtil::Shared* IceInternal::upCast(AMI_Object_ice_flushBatchRequests* p) { return p; }
IceInternal::OutgoingAsync::OutgoingAsync() :
__is(0),
@@ -44,17 +48,52 @@ IceInternal::OutgoingAsync::~OutgoingAsync()
}
void
+IceInternal::OutgoingAsync::__sent(Ice::ConnectionI* connection)
+{
+ IceUtil::Monitor<IceUtil::Mutex>::Lock sync(_monitor);
+ _sent = true;
+
+ if(!_proxy->ice_isTwoway())
+ {
+ cleanup(); // No response expected, we're done with the OutgoingAsync.
+ }
+ else if(_response)
+ {
+ _monitor.notifyAll(); // If the response was already received notify finished() which is waiting.
+ }
+ else if(connection->timeout() > 0)
+ {
+ assert(!_timerTaskConnection);
+ _timerTaskConnection = connection;
+ IceUtil::Time timeout = IceUtil::Time::milliSeconds(connection->timeout());
+ _proxy->__reference()->getInstance()->timer()->schedule(this, timeout);
+ }
+}
+
+void
IceInternal::OutgoingAsync::__finished(BasicStream& is)
{
- IceUtil::Monitor<IceUtil::RecMutex>::Lock sync(_monitor);
+ assert(_proxy->ice_isTwoway()); // Can only be called for twoways.
Ice::Byte replyStatus;
-
try
{
+ IceUtil::Monitor<IceUtil::Mutex>::Lock sync(_monitor);
+ assert(__os);
+ _response = true;
+
+ if(_timerTaskConnection && _proxy->__reference()->getInstance()->timer()->cancel(this))
+ {
+ _timerTaskConnection = 0; // Timer cancelled.
+ }
+
+ while(!_sent || _timerTaskConnection)
+ {
+ _monitor.wait();
+ }
+
__is->swap(is);
__is->read(replyStatus);
-
switch(replyStatus)
{
@@ -190,43 +229,65 @@ IceInternal::OutgoingAsync::__finished(BasicStream& is)
warning();
}
+
+ IceUtil::Monitor<IceUtil::Mutex>::Lock sync(_monitor);
cleanup();
}
void
IceInternal::OutgoingAsync::__finished(const LocalException& exc)
{
- IceUtil::Monitor<IceUtil::RecMutex>::Lock sync(_monitor);
-
- if(__os) // Don't retry if cleanup() was already called.
+ bool retry = false;
{
- //
- // A CloseConnectionException indicates graceful server
- // shutdown, and is therefore always repeatable without
- // violating "at-most-once". That's because by sending a close
- // connection message, the server guarantees that all
- // outstanding requests can safely be repeated. Otherwise, we
- // can also retry if the operation mode is Nonmutating or
- // Idempotent.
- //
- // An ObjectNotExistException can always be retried as
- // well without violating "at-most-once".
- //
- if(_mode == Nonmutating || _mode == Idempotent || dynamic_cast<const CloseConnectionException*>(&exc) ||
- dynamic_cast<const ObjectNotExistException*>(&exc))
+ IceUtil::Monitor<IceUtil::Mutex>::Lock sync(_monitor);
+
+ if(__os) // Might be called from __prepare or before __prepare
{
- try
+ if(_timerTaskConnection && _proxy->__reference()->getInstance()->timer()->cancel(this))
{
- _proxy->__handleException(_delegate, exc, _cnt);
- __send();
- return;
+ _timerTaskConnection = 0; // Timer cancelled.
}
- catch(const LocalException&)
+
+ while(_timerTaskConnection)
+ {
+ _monitor.wait();
+ }
+
+ //
+ // A CloseConnectionException indicates graceful server
+ // shutdown, and is therefore always repeatable without
+ // violating "at-most-once". That's because by sending a close
+ // connection message, the server guarantees that all
+ // outstanding requests can safely be repeated. Otherwise, we
+ // can also retry if the operation mode is Nonmutating or
+ // Idempotent.
+ //
+ // An ObjectNotExistException can always be retried as
+ // well without violating "at-most-once".
+ //
+ if(!_sent ||
+ _mode == Nonmutating || _mode == Idempotent ||
+ dynamic_cast<const CloseConnectionException*>(&exc) ||
+ dynamic_cast<const ObjectNotExistException*>(&exc))
{
+ retry = true;
}
}
}
+ if(retry)
+ {
+ try
+ {
+ _proxy->__handleException(_delegate, exc, _cnt);
+ __send();
+ return;
+ }
+ catch(const LocalException&)
+ {
+ }
+ }
+
try
{
ice_exception(exc);
@@ -240,14 +301,58 @@ IceInternal::OutgoingAsync::__finished(const LocalException& exc)
warning();
}
+ IceUtil::Monitor<IceUtil::Mutex>::Lock sync(_monitor);
cleanup();
}
void
+IceInternal::OutgoingAsync::__finished(const LocalExceptionWrapper& ex)
+{
+ //
+ // NOTE: This is called if sendRequest/sendAsyncRequest fails with
+ // a LocalExceptionWrapper exception. It's not possible for the
+ // timer to be set at this point because the request couldn't be
+ // sent.
+ //
+ assert(!_sent && !_timerTaskConnection);
+
+ try
+ {
+ if(_mode == Nonmutating || _mode == Idempotent)
+ {
+ _proxy->__handleExceptionWrapperRelaxed(_delegate, ex, _cnt);
+ }
+ else
+ {
+ _proxy->__handleExceptionWrapper(_delegate, ex);
+ }
+ __send();
+ }
+ catch(const Ice::LocalException& exc)
+ {
+ try
+ {
+ ice_exception(exc);
+ }
+ catch(const std::exception& ex)
+ {
+ warning(ex);
+ }
+ catch(...)
+ {
+ warning();
+ }
+
+ IceUtil::Monitor<IceUtil::Mutex>::Lock sync(_monitor);
+ cleanup();
+ }
+}
+
+void
IceInternal::OutgoingAsync::__prepare(const ObjectPrx& prx, const string& operation, OperationMode mode,
const Context* context)
{
- IceUtil::Monitor<IceUtil::RecMutex>::Lock sync(_monitor);
+ IceUtil::Monitor<IceUtil::Mutex>::Lock sync(_monitor);
try
{
@@ -258,16 +363,20 @@ IceInternal::OutgoingAsync::__prepare(const ObjectPrx& prx, const string& operat
{
_monitor.wait();
}
-
+
//
- // Can't call async via a oneway proxy.
+ // Can't call async via a batch proxy.
//
- prx->__checkTwowayOnly(operation);
-
_proxy = prx;
+ if(_proxy->ice_isBatchOneway() || _proxy->ice_isBatchDatagram())
+ {
+ throw Ice::FeatureNotSupportedException(__FILE__, __LINE__, "can't send batch requests with AMI");
+ }
_delegate = 0;
_cnt = 0;
_mode = mode;
+ _sent = false;
+ _response = false;
ReferencePtr ref = _proxy->__reference();
assert(!__is);
@@ -308,11 +417,8 @@ IceInternal::OutgoingAsync::__prepare(const ObjectPrx& prx, const string& operat
//
// Implicit context
//
- const ImplicitContextIPtr& implicitContext =
- ref->getInstance()->getImplicitContext();
-
+ const ImplicitContextIPtr& implicitContext = ref->getInstance()->getImplicitContext();
const Context& prxContext = ref->getContext()->getValue();
-
if(implicitContext == 0)
{
__writeContext(__os, prxContext);
@@ -335,41 +441,45 @@ IceInternal::OutgoingAsync::__prepare(const ObjectPrx& prx, const string& operat
void
IceInternal::OutgoingAsync::__send()
{
- IceUtil::Monitor<IceUtil::RecMutex>::Lock sync(_monitor);
-
+ //
+ // NOTE: no synchronization needed. At this point, no other threads can be calling on this object.
+ //
+ RequestHandler* handler;
try
{
- while(true)
+ _delegate = _proxy->__getDelegate(true);
+ handler = _delegate->__getRequestHandler().get();
+ }
+ catch(const Ice::LocalException& ex)
+ {
+ __finished(ex);
+ return;
+ }
+
+ _sent = false;
+ _response = false;
+ handler->sendAsyncRequest(this);
+}
+
+void
+IceInternal::OutgoingAsync::runTimerTask() // Implementation of TimerTask::runTimerTask()
+{
+ Ice::ConnectionIPtr connection;
+ {
+ IceUtil::Monitor<IceUtil::Mutex>::Lock sync(_monitor);
+ assert(_timerTaskConnection && _sent); // Can only be set once the request is sent.
+
+ if(!_response) // If the response was just received, don't close the connection.
{
- bool compress;
- _delegate = _proxy->__getDelegate();
- Ice::ConnectionIPtr connection = _delegate->__getConnection(compress);
- try
- {
- connection->sendAsyncRequest(__os, this, compress);
-
- //
- // Don't do anything after sendAsyncRequest() returned
- // without an exception. I such case, there will be
- // callbacks, i.e., calls to the __finished()
- // functions. Since there is no mutex protection, we
- // cannot modify state here and in such callbacks.
- //
- return;
- }
- catch(const LocalExceptionWrapper& ex)
- {
- _proxy->__handleExceptionWrapper(_delegate, ex);
- }
- catch(const LocalException& ex)
- {
- _proxy->__handleException(_delegate, ex, _cnt);
- }
+ connection = _timerTaskConnection;
}
+ _timerTaskConnection = 0;
+ _monitor.notifyAll();
}
- catch(const LocalException& ex)
+
+ if(connection)
{
- __finished(ex);
+ connection->exception(Ice::TimeoutException(__FILE__, __LINE__));
}
}
@@ -414,6 +524,8 @@ IceInternal::OutgoingAsync::warning() const
void
IceInternal::OutgoingAsync::cleanup()
{
+ assert(!_timerTaskConnection);
+
delete __is;
__is = 0;
delete __os;
@@ -422,6 +534,91 @@ IceInternal::OutgoingAsync::cleanup()
_monitor.notify();
}
+IceInternal::BatchOutgoingAsync::BatchOutgoingAsync() : _os(0)
+{
+}
+
+void
+IceInternal::BatchOutgoingAsync::__prepare(const InstancePtr& instance)
+{
+ IceUtil::Monitor<IceUtil::Mutex>::Lock sync(_monitor);
+ while(_os)
+ {
+ _monitor.wait();
+ }
+ _os = new BasicStream(instance.get());
+}
+
+void
+IceInternal::BatchOutgoingAsync::__sent(Ice::ConnectionI* connection)
+{
+ IceUtil::Monitor<IceUtil::Mutex>::Lock sync(_monitor);
+ cleanup();
+}
+
+void
+IceInternal::BatchOutgoingAsync::__finished(const Ice::LocalException& exc)
+{
+ try
+ {
+ ice_exception(exc);
+ }
+ catch(const std::exception& ex)
+ {
+ warning(ex);
+ }
+ catch(...)
+ {
+ warning();
+ }
+
+ IceUtil::Monitor<IceUtil::Mutex>::Lock sync(_monitor);
+ cleanup();
+}
+
+void
+IceInternal::BatchOutgoingAsync::warning(const std::exception& exc) const
+{
+ if(_os) // Don't print anything if cleanup() was already called.
+ {
+ if(_os->instance()->initializationData().properties->getPropertyAsIntWithDefault("Ice.Warn.AMICallback", 1) > 0)
+ {
+ Warning out(_os->instance()->initializationData().logger);
+ const Exception* ex = dynamic_cast<const ObjectNotExistException*>(&exc);
+ if(ex)
+ {
+ out << "Ice::Exception raised by AMI callback:\n" << ex;
+ }
+ else
+ {
+ out << "std::exception raised by AMI callback:\n" << exc.what();
+ }
+ }
+ }
+}
+
+void
+IceInternal::BatchOutgoingAsync::warning() const
+{
+ if(_os) // Don't print anything if cleanup() was already called.
+ {
+ if(_os->instance()->initializationData().properties->getPropertyAsIntWithDefault("Ice.Warn.AMICallback", 1) > 0)
+ {
+ Warning out(_os->instance()->initializationData().logger);
+ out << "unknown exception raised by AMI callback";
+ }
+ }
+}
+
+void
+IceInternal::BatchOutgoingAsync::cleanup()
+{
+ delete _os;
+ _os = 0;
+
+ _monitor.notify();
+}
+
void
Ice::AMI_Object_ice_invoke::__invoke(const ObjectPrx& prx, const string& operation, OperationMode mode,
const vector<Byte>& inParams, const Context* context)
@@ -492,3 +689,24 @@ Ice::AMI_Array_Object_ice_invoke::__response(bool ok) // ok == true means no use
}
ice_response(ok, outParams);
}
+
+void
+Ice::AMI_Object_ice_flushBatchRequests::__invoke(const ObjectPrx& prx)
+{
+ Handle< ::IceDelegate::Ice::Object> delegate;
+ RequestHandler* handler;
+ try
+ {
+ __prepare(prx->__reference()->getInstance());
+ delegate = prx->__getDelegate(true);
+ handler = delegate->__getRequestHandler().get();
+ }
+ catch(const Ice::LocalException& ex)
+ {
+ __finished(ex);
+ return;
+ }
+
+ handler->flushAsyncBatchRequests(this);
+}
+
diff --git a/cpp/src/Ice/PropertyNames.cpp b/cpp/src/Ice/PropertyNames.cpp
index 82b47e23ac6..f72db807b30 100644
--- a/cpp/src/Ice/PropertyNames.cpp
+++ b/cpp/src/Ice/PropertyNames.cpp
@@ -7,7 +7,7 @@
//
// **********************************************************************
//
-// Generated by makeprops.py from file ../config/PropertyNames.xml, Thu Nov 22 20:40:28 2007
+// Generated by makeprops.py from file ../config/PropertyNames.xml, Mon Nov 26 11:29:02 2007
// IMPORTANT: Do not edit this file -- any edits made here will be lost!
diff --git a/cpp/src/Ice/PropertyNames.h b/cpp/src/Ice/PropertyNames.h
index e326b32c07f..eeb33e1fb30 100644
--- a/cpp/src/Ice/PropertyNames.h
+++ b/cpp/src/Ice/PropertyNames.h
@@ -7,7 +7,7 @@
//
// **********************************************************************
//
-// Generated by makeprops.py from file ../config/PropertyNames.xml, Thu Nov 22 20:40:28 2007
+// Generated by makeprops.py from file ../config/PropertyNames.xml, Mon Nov 26 11:29:02 2007
// IMPORTANT: Do not edit this file -- any edits made here will be lost!
diff --git a/cpp/src/Ice/ProtocolPluginFacade.cpp b/cpp/src/Ice/ProtocolPluginFacade.cpp
index f8ff17e63e9..2134bdd6ec1 100644
--- a/cpp/src/Ice/ProtocolPluginFacade.cpp
+++ b/cpp/src/Ice/ProtocolPluginFacade.cpp
@@ -50,12 +50,24 @@ IceInternal::ProtocolPluginFacade::getNetworkTraceCategory() const
return _instance->traceLevels()->networkCat;
}
+EndpointHostResolverPtr
+IceInternal::ProtocolPluginFacade::getEndpointHostResolver() const
+{
+ return _instance->endpointHostResolver();
+}
+
void
IceInternal::ProtocolPluginFacade::addEndpointFactory(const EndpointFactoryPtr& factory) const
{
_instance->endpointFactoryManager()->add(factory);
}
+EndpointFactoryPtr
+IceInternal::ProtocolPluginFacade::getEndpointFactory(Ice::Short type) const
+{
+ return _instance->endpointFactoryManager()->get(type);
+}
+
IceInternal::ProtocolPluginFacade::ProtocolPluginFacade(const CommunicatorPtr& communicator) :
_instance(getInstance(communicator)),
_communicator(communicator)
diff --git a/cpp/src/Ice/Proxy.cpp b/cpp/src/Ice/Proxy.cpp
index 4d986ef0abc..845d40ffee5 100644
--- a/cpp/src/Ice/Proxy.cpp
+++ b/cpp/src/Ice/Proxy.cpp
@@ -14,6 +14,8 @@
#include <Ice/ObjectAdapterFactory.h>
#include <Ice/Outgoing.h>
#include <Ice/OutgoingAsync.h>
+#include <Ice/ConnectRequestHandler.h>
+#include <Ice/ConnectionRequestHandler.h>
#include <Ice/Direct.h>
#include <Ice/Reference.h>
#include <Ice/EndpointI.h>
@@ -123,7 +125,7 @@ IceProxy::Ice::Object::ice_isA(const string& typeId, const Context* context)
try
{
__checkTwowayOnly("ice_isA");
- __del = __getDelegate();
+ __del = __getDelegate(false);
return __del->ice_isA(typeId, context);
}
catch(const LocalExceptionWrapper& __ex)
@@ -146,7 +148,7 @@ IceProxy::Ice::Object::ice_ping(const Context* context)
Handle< ::IceDelegate::Ice::Object> __del;
try
{
- __del = __getDelegate();
+ __del = __getDelegate(false);
__del->ice_ping(context);
return;
}
@@ -171,7 +173,7 @@ IceProxy::Ice::Object::ice_ids(const Context* context)
try
{
__checkTwowayOnly("ice_ids");
- __del = __getDelegate();
+ __del = __getDelegate(false);
return __del->ice_ids(context);
}
catch(const LocalExceptionWrapper& __ex)
@@ -195,7 +197,7 @@ IceProxy::Ice::Object::ice_id(const Context* context)
try
{
__checkTwowayOnly("ice_id");
- __del = __getDelegate();
+ __del = __getDelegate(false);
return __del->ice_id(context);
}
catch(const LocalExceptionWrapper& __ex)
@@ -244,7 +246,7 @@ IceProxy::Ice::Object::ice_invoke(const string& operation,
Handle< ::IceDelegate::Ice::Object> __del;
try
{
- __del = __getDelegate();
+ __del = __getDelegate(false);
return __del->ice_invoke(operation, mode, inParams, outParams, context);
}
catch(const LocalExceptionWrapper& __ex)
@@ -824,9 +826,8 @@ IceProxy::Ice::Object::ice_getConnection()
Handle< ::IceDelegate::Ice::Object> __del;
try
{
- __del = __getDelegate();
- bool compress;
- return __del->__getConnection(compress);
+ __del = __getDelegate(false);
+ return __del->__getRequestHandler()->getConnection(true);
}
catch(const LocalException& __ex)
{
@@ -848,8 +849,7 @@ IceProxy::Ice::Object::ice_getCachedConnection() const
{
try
{
- bool compress;
- return __del->__getConnection(compress);
+ return __del->__getRequestHandler()->getConnection(false);
}
catch(const CollocationOptimizationException&)
{
@@ -858,6 +858,36 @@ IceProxy::Ice::Object::ice_getCachedConnection() const
return 0;
}
+void
+IceProxy::Ice::Object::ice_flushBatchRequests()
+{
+ int __cnt;
+ while(true)
+ {
+ Handle< ::IceDelegate::Ice::Object> __del;
+ try
+ {
+ __del = __getDelegate(false);
+ __del->ice_flushBatchRequests();
+ return;
+ }
+ catch(const LocalExceptionWrapper& __ex)
+ {
+ __handleExceptionWrapper(__del, __ex);
+ }
+ catch(const LocalException& __ex)
+ {
+ __handleException(__del, __ex, __cnt);
+ }
+ }
+}
+
+void
+IceProxy::Ice::Object::ice_flushBatchRequests_async(const AMI_Object_ice_flushBatchRequestsPtr& cb)
+{
+ cb->__invoke(this);
+}
+
ReferencePtr
IceProxy::Ice::Object::__reference() const
{
@@ -1024,7 +1054,7 @@ operator<<(ostream& os, const ::IceProxy::Ice::Object& p)
}
Handle< ::IceDelegate::Ice::Object>
-IceProxy::Ice::Object::__getDelegate()
+IceProxy::Ice::Object::__getDelegate(bool async)
{
IceUtil::Mutex::Lock sync(*this);
@@ -1048,19 +1078,8 @@ IceProxy::Ice::Object::__getDelegate()
if(!delegate)
{
Handle< ::IceDelegateM::Ice::Object> d = __createDelegateM();
- d->setup(_reference);
+ d->setup(_reference, this, async);
delegate = d;
-
- //
- // If this proxy is for a non-local object, and we are
- // using a router, then add this proxy to the router info
- // object.
- //
- RouterInfoPtr ri = _reference->getRouterInfo();
- if(ri)
- {
- ri->addProxy(this);
- }
}
if(_reference->getCacheConnection())
@@ -1076,6 +1095,26 @@ IceProxy::Ice::Object::__getDelegate()
return delegate;
}
+void
+IceProxy::Ice::Object::__setRequestHandler(const Handle< ::IceDelegate::Ice::Object>& delegate,
+ const ::IceInternal::RequestHandlerPtr& handler)
+{
+ IceUtil::Mutex::Lock sync(*this);
+ if(_delegate.get() == delegate.get())
+ {
+ if(dynamic_cast< ::IceDelegateM::Ice::Object*>(_delegate.get()))
+ {
+ _delegate = __createDelegateM();
+ _delegate->__setRequestHandler(handler);
+ }
+ else if(dynamic_cast< ::IceDelegateD::Ice::Object*>(_delegate.get()))
+ {
+ _delegate = __createDelegateD();
+ _delegate->__setRequestHandler(handler);
+ }
+ }
+}
+
Handle< ::IceDelegateM::Ice::Object>
IceProxy::Ice::Object::__createDelegateM()
{
@@ -1116,7 +1155,7 @@ bool
IceDelegateM::Ice::Object::ice_isA(const string& __id, const Context* context)
{
static const string __operation("ice_isA");
- Outgoing __og(__connection.get(), __reference.get(), __operation, ::Ice::Nonmutating, context, __compress);
+ Outgoing __og(__handler.get(), __operation, ::Ice::Nonmutating, context);
try
{
BasicStream* __os = __og.os();
@@ -1155,7 +1194,7 @@ void
IceDelegateM::Ice::Object::ice_ping(const Context* context)
{
static const string __operation("ice_ping");
- Outgoing __og(__connection.get(), __reference.get(), __operation, ::Ice::Nonmutating, context, __compress);
+ Outgoing __og(__handler.get(), __operation, ::Ice::Nonmutating, context);
bool __ok = __og.invoke();
try
{
@@ -1182,7 +1221,7 @@ vector<string>
IceDelegateM::Ice::Object::ice_ids(const Context* context)
{
static const string __operation("ice_ids");
- Outgoing __og(__connection.get(), __reference.get(), __operation, ::Ice::Nonmutating, context, __compress);
+ Outgoing __og(__handler.get(), __operation, ::Ice::Nonmutating, context);
vector<string> __ret;
bool __ok = __og.invoke();
try
@@ -1212,7 +1251,7 @@ string
IceDelegateM::Ice::Object::ice_id(const Context* context)
{
static const string __operation("ice_id");
- Outgoing __og(__connection.get(), __reference.get(), __operation, ::Ice::Nonmutating, context, __compress);
+ Outgoing __og(__handler.get(), __operation, ::Ice::Nonmutating, context);
string __ret;
bool __ok = __og.invoke();
try
@@ -1245,7 +1284,7 @@ IceDelegateM::Ice::Object::ice_invoke(const string& operation,
vector<Byte>& outParams,
const Context* context)
{
- Outgoing __og(__connection.get(), __reference.get(), operation, mode, context, __compress);
+ Outgoing __og(__handler.get(), operation, mode, context);
try
{
BasicStream* __os = __og.os();
@@ -1256,7 +1295,7 @@ IceDelegateM::Ice::Object::ice_invoke(const string& operation,
__og.abort(__ex);
}
bool ok = __og.invoke();
- if(__reference->getMode() == Reference::ModeTwoway)
+ if(__handler->getReference()->getMode() == Reference::ModeTwoway)
{
try
{
@@ -1272,11 +1311,35 @@ IceDelegateM::Ice::Object::ice_invoke(const string& operation,
return ok;
}
-ConnectionIPtr
-IceDelegateM::Ice::Object::__getConnection(bool& compress) const
+void
+IceDelegateM::Ice::Object::ice_flushBatchRequests()
{
- compress = __compress;
- return __connection;
+ BatchOutgoing __og(__handler.get());
+ try
+ {
+ __og.invoke();
+ }
+ catch(const ::Ice::LocalException& __ex)
+ {
+ //
+ // We never retry flusing the batch requests as the connection batched
+ // requests were discarded and the caller needs to be notified of the
+ // failure.
+ //
+ throw ::IceInternal::LocalExceptionWrapper(__ex, false);
+ }
+}
+
+RequestHandlerPtr
+IceDelegateM::Ice::Object::__getRequestHandler() const
+{
+ return __handler;
+}
+
+void
+IceDelegateM::Ice::Object::__setRequestHandler(const RequestHandlerPtr& handler)
+{
+ __handler = handler;
}
void
@@ -1291,28 +1354,36 @@ IceDelegateM::Ice::Object::__copyFrom(const ::IceInternal::Handle< ::IceDelegate
// No need to synchronize "*this", as this operation is only
// called upon initialization.
//
-
- assert(!__reference);
- assert(!__connection);
-
- __reference = from->__reference;
- __connection = from->__connection;
- __compress = from->__compress;
+
+ assert(!__handler);
+
+ __handler = from->__handler;
}
void
-IceDelegateM::Ice::Object::setup(const ReferencePtr& ref)
+IceDelegateM::Ice::Object::setup(const ReferencePtr& ref, const ::Ice::ObjectPrx& proxy, bool async)
{
//
// No need to synchronize "*this", as this operation is only
// called upon initialization.
//
- assert(!__reference);
- assert(!__connection);
+ assert(!__handler);
- __reference = ref;
- __connection = __reference->getConnection(__compress);
+ //
+ // If the delegate is created as a result of an AMI call or if the proxy is
+ // a batch proxy we use the connect request handler to connect the in the
+ // background.
+ //
+ if(async || ref->getMode() == Reference::ModeBatchOneway || ref->getMode() == Reference::ModeBatchDatagram)
+ {
+ IceInternal::ConnectRequestHandlerPtr handler = new ::IceInternal::ConnectRequestHandler(ref, proxy, this);
+ __handler = handler->connect();
+ }
+ else
+ {
+ __handler = new ::IceInternal::ConnectionRequestHandler(ref, proxy);
+ }
}
bool
@@ -1577,14 +1648,26 @@ IceDelegateD::Ice::Object::ice_invoke(const string&,
return false;
}
-ConnectionIPtr
-IceDelegateD::Ice::Object::__getConnection(bool&) const
+void
+IceDelegateD::Ice::Object::ice_flushBatchRequests()
+{
+ throw CollocationOptimizationException(__FILE__, __LINE__);
+}
+
+RequestHandlerPtr
+IceDelegateD::Ice::Object::__getRequestHandler() const
{
throw CollocationOptimizationException(__FILE__, __LINE__);
return 0;
}
void
+IceDelegateD::Ice::Object::__setRequestHandler(const RequestHandlerPtr&)
+{
+ throw CollocationOptimizationException(__FILE__, __LINE__);
+}
+
+void
IceDelegateD::Ice::Object::__copyFrom(const ::IceInternal::Handle< ::IceDelegateD::Ice::Object>& from)
{
//
diff --git a/cpp/src/Ice/Reference.cpp b/cpp/src/Ice/Reference.cpp
index b9e1d534836..3fe7eee422d 100644
--- a/cpp/src/Ice/Reference.cpp
+++ b/cpp/src/Ice/Reference.cpp
@@ -625,6 +625,20 @@ IceInternal::FixedReference::getConnection(bool& compress) const
return connection;
}
+void
+IceInternal::FixedReference::getConnection(const GetConnectionCallbackPtr& callback) const
+{
+ try
+ {
+ bool compress;
+ callback->setConnection(getConnection(compress), compress);
+ }
+ catch(const Ice::LocalException& ex)
+ {
+ callback->setException(ex);
+ }
+}
+
bool
IceInternal::FixedReference::operator==(const Reference& r) const
{
@@ -743,20 +757,6 @@ IceInternal::FixedReference::filterConnections(const vector<ConnectionIPtr>& all
IceUtil::Shared* IceInternal::upCast(IceInternal::RoutableReference* p) { return p; }
-vector<EndpointIPtr>
-IceInternal::RoutableReference::getRoutedEndpoints() const
-{
- if(_routerInfo)
- {
- //
- // If we route, we send everything to the router's client
- // proxy endpoints.
- //
- return _routerInfo->getClientEndpoints();
- }
- return vector<EndpointIPtr>();
-}
-
bool
IceInternal::RoutableReference::getSecure() const
{
@@ -1093,6 +1093,232 @@ IceInternal::RoutableReference::operator<(const Reference& r) const
return false;
}
+ConnectionIPtr
+IceInternal::RoutableReference::createConnection(const vector<EndpointIPtr>& allEndpoints, bool& comp) const
+{
+ vector<EndpointIPtr> endpoints = filterEndpoints(allEndpoints);
+ if(endpoints.empty())
+ {
+ throw Ice::NoEndpointException(__FILE__, __LINE__, toString());
+ }
+
+ OutgoingConnectionFactoryPtr factory = getInstance()->outgoingConnectionFactory();
+ Ice::ConnectionIPtr connection;
+ if(getCacheConnection() || endpoints.size() == 1)
+ {
+ //
+ // Get an existing connection or create one if there's no
+ // existing connection to one of the given endpoints.
+ //
+ connection = factory->create(endpoints, false, _threadPerConnection, getEndpointSelection(), comp);
+ }
+ else
+ {
+ //
+ // Go through the list of endpoints and try to create the
+ // connection until it succeeds. This is different from just
+ // calling create() with the given endpoints since this might
+ // create a new connection even if there's an existing
+ // connection for one of the endpoints.
+ //
+
+ auto_ptr<LocalException> exception;
+ vector<EndpointIPtr> endpoint;
+ endpoint.push_back(0);
+
+ for(vector<EndpointIPtr>::const_iterator p = endpoints.begin(); p != endpoints.end(); ++p)
+ {
+ try
+ {
+ endpoint.back() = *p;
+ connection = factory->create(endpoint, p + 1 == endpoints.end(), _threadPerConnection,
+ getEndpointSelection(), comp);
+ break;
+ }
+ catch(const LocalException& ex)
+ {
+ exception.reset(dynamic_cast<LocalException*>(ex.ice_clone()));
+ }
+ }
+
+ if(!connection)
+ {
+ assert(exception.get());
+ exception->ice_throw();
+ }
+ }
+
+ assert(connection);
+
+ //
+ // If we have a router, set the object adapter for this router
+ // (if any) to the new connection, so that callbacks from the
+ // router can be received over this new connection.
+ //
+ if(_routerInfo)
+ {
+ connection->setAdapter(_routerInfo->getAdapter());
+ }
+
+ return connection;
+}
+
+void
+IceInternal::RoutableReference::createConnection(const vector<EndpointIPtr>& allEndpoints,
+ const GetConnectionCallbackPtr& callback) const
+{
+ vector<EndpointIPtr> endpoints = filterEndpoints(allEndpoints);
+ if(endpoints.empty())
+ {
+ callback->setException(Ice::NoEndpointException(__FILE__, __LINE__, toString()));
+ return;
+ }
+
+ //
+ // Finally, create the connection.
+ //
+ OutgoingConnectionFactoryPtr factory = getInstance()->outgoingConnectionFactory();
+ if(getCacheConnection() || endpoints.size() == 1)
+ {
+ class CB1 : public OutgoingConnectionFactory::CreateConnectionCallback
+ {
+ public:
+
+ virtual void
+ setConnection(const Ice::ConnectionIPtr& connection, bool compress)
+ {
+ //
+ // If we have a router, set the object adapter for this router
+ // (if any) to the new connection, so that callbacks from the
+ // router can be received over this new connection.
+ //
+ if(_routerInfo)
+ {
+ connection->setAdapter(_routerInfo->getAdapter());
+ }
+ _callback->setConnection(connection, compress);
+ }
+
+ virtual void
+ setException(const Ice::LocalException& ex)
+ {
+ _callback->setException(ex);
+ }
+
+ CB1(const RouterInfoPtr& routerInfo, const GetConnectionCallbackPtr& callback) :
+ _routerInfo(routerInfo), _callback(callback)
+ {
+ }
+
+ private:
+
+ const RouterInfoPtr _routerInfo;
+ const GetConnectionCallbackPtr _callback;
+ };
+
+ //
+ // Get an existing connection or create one if there's no
+ // existing connection to one of the given endpoints.
+ //
+ factory->create(endpoints, false, _threadPerConnection, getEndpointSelection(), new CB1(_routerInfo, callback));
+ return;
+ }
+ else
+ {
+ class CB2 : public OutgoingConnectionFactory::CreateConnectionCallback
+ {
+ public:
+
+ virtual void
+ setConnection(const Ice::ConnectionIPtr& connection, bool compress)
+ {
+ //
+ // If we have a router, set the object adapter for this router
+ // (if any) to the new connection, so that callbacks from the
+ // router can be received over this new connection.
+ //
+ if(_reference->getRouterInfo())
+ {
+ connection->setAdapter(_reference->getRouterInfo()->getAdapter());
+ }
+ _callback->setConnection(connection, compress);
+ }
+
+ virtual void
+ setException(const Ice::LocalException& ex)
+ {
+ if(!_exception.get())
+ {
+ _exception.reset(dynamic_cast<Ice::LocalException*>(ex.ice_clone()));
+ }
+
+ if(++_i == _endpoints.size())
+ {
+ _callback->setException(*_exception.get());
+ return;
+ }
+
+ bool more = _i != _endpoints.size() - 1;
+ vector<EndpointIPtr> endpoint;
+ endpoint.push_back(_endpoints[_i]);
+
+ OutgoingConnectionFactoryPtr factory = _reference->getInstance()->outgoingConnectionFactory();
+ bool threadPerConnection = _reference->getThreadPerConnection();
+ EndpointSelectionType sel = _reference->getEndpointSelection();
+ factory->create(endpoint, more, threadPerConnection, sel, this);
+ }
+
+ CB2(const RoutableReferencePtr& reference, const vector<EndpointIPtr>& endpoints,
+ const GetConnectionCallbackPtr& callback) :
+ _reference(reference),
+ _endpoints(endpoints),
+ _callback(callback),
+ _i(0)
+ {
+ }
+
+ private:
+
+ const RoutableReferencePtr _reference;
+ const vector<EndpointIPtr> _endpoints;
+ const GetConnectionCallbackPtr _callback;
+ size_t _i;
+ std::auto_ptr<Ice::LocalException> _exception;
+ };
+
+ //
+ // Go through the list of endpoints and try to create the
+ // connection until it succeeds. This is different from just
+ // calling create() with the given endpoints since this might
+ // create a new connection even if there's an existing
+ // connection for one of the endpoints.
+ //
+
+ vector<EndpointIPtr> endpt;
+ endpt.push_back(endpoints[0]);
+ RoutableReference* self = const_cast<RoutableReference*>(this);
+ factory->create(endpt, true, _threadPerConnection, getEndpointSelection(), new CB2(self, endpoints, callback));
+ return;
+ }
+}
+
+void
+IceInternal::RoutableReference::applyOverrides(vector<EndpointIPtr>& endpoints) const
+{
+ for(vector<EndpointIPtr>::iterator p = endpoints.begin(); p != endpoints.end(); ++p)
+ {
+ *p = (*p)->connectionId(_connectionId);
+ if(_overrideCompress)
+ {
+ *p = (*p)->compress(_compress);
+ }
+ if(_overrideTimeout)
+ {
+ *p = (*p)->timeout(_timeout);
+ }
+ }
+}
+
IceInternal::RoutableReference::RoutableReference(const InstancePtr& inst, const CommunicatorPtr& com,
const Identity& ident, const SharedContextPtr& ctx, const string& fs,
Mode md, bool sec, bool prefSec, const RouterInfoPtr& rtrInfo,
@@ -1130,8 +1356,8 @@ IceInternal::RoutableReference::RoutableReference(const RoutableReference& r) :
{
}
-ConnectionIPtr
-IceInternal::RoutableReference::createConnection(const vector<EndpointIPtr>& allEndpoints, bool& comp) const
+vector<EndpointIPtr>
+IceInternal::RoutableReference::filterEndpoints(const vector<EndpointIPtr>& allEndpoints) const
{
vector<EndpointIPtr> endpoints = allEndpoints;
@@ -1224,75 +1450,8 @@ IceInternal::RoutableReference::createConnection(const vector<EndpointIPtr>& all
//
stable_partition(endpoints.begin(), endpoints.end(), not1(Ice::constMemFun(&EndpointI::secure)));
}
-
- if(endpoints.empty())
- {
- NoEndpointException ex(__FILE__, __LINE__);
- ex.proxy = toString();
- throw ex;
- }
-
- //
- // Finally, create the connection.
- //
- OutgoingConnectionFactoryPtr factory = getInstance()->outgoingConnectionFactory();
- if(getCacheConnection() || endpoints.size() == 1)
- {
- //
- // Get an existing connection or create one if there's no
- // existing connection to one of the given endpoints.
- //
- return factory->create(endpoints, false, _threadPerConnection, getEndpointSelection(), comp);
- }
- else
- {
- //
- // Go through the list of endpoints and try to create the
- // connection until it succeeds. This is different from just
- // calling create() with the given endpoints since this might
- // create a new connection even if there's an existing
- // connection for one of the endpoints.
- //
-
- auto_ptr<LocalException> exception;
- vector<EndpointIPtr> endpoint;
- endpoint.push_back(0);
-
- for(vector<EndpointIPtr>::const_iterator p = endpoints.begin(); p != endpoints.end(); ++p)
- {
- try
- {
- endpoint.back() = *p;
- return factory->create(endpoint, p + 1 == endpoints.end(), _threadPerConnection,
- getEndpointSelection(), comp);
- }
- catch(const LocalException& ex)
- {
- exception.reset(dynamic_cast<LocalException*>(ex.ice_clone()));
- }
- }
-
- assert(exception.get());
- exception->ice_throw();
- return 0; // Keeps the compiler happy.
- }
-}
-
-void
-IceInternal::RoutableReference::applyOverrides(vector<EndpointIPtr>& endpoints) const
-{
- for(vector<EndpointIPtr>::iterator p = endpoints.begin(); p != endpoints.end(); ++p)
- {
- *p = (*p)->connectionId(_connectionId);
- if(_overrideCompress)
- {
- *p = (*p)->compress(_compress);
- }
- if(_overrideTimeout)
- {
- *p = (*p)->timeout(_timeout);
- }
- }
+
+ return endpoints;
}
IceUtil::Shared* IceInternal::upCast(IceInternal::DirectReference* p) { return p; }
@@ -1403,7 +1562,8 @@ IceInternal::DirectReference::changeAdapterId(const string& newAdapterId) const
getSecure(), getPreferSecure(), newAdapterId, getRouterInfo(),
locatorInfo, getCollocationOptimization(),
getCacheConnection(), getEndpointSelection(),
- getThreadPerConnection(), getLocatorCacheTimeout());
+ getThreadPerConnection(),
+ getLocatorCacheTimeout());
}
else
{
@@ -1472,28 +1632,68 @@ IceInternal::DirectReference::toString() const
ConnectionIPtr
IceInternal::DirectReference::getConnection(bool& comp) const
{
- vector<EndpointIPtr> endpts = RoutableReference::getRoutedEndpoints();
- applyOverrides(endpts);
-
- if(endpts.empty())
+ if(getRouterInfo())
{
- endpts = _endpoints; // Endpoint overrides are already applied on these endpoints.
+ vector<EndpointIPtr> endpts = getRouterInfo()->getClientEndpoints();
+ if(!endpts.empty())
+ {
+ applyOverrides(endpts);
+ return createConnection(endpts, comp);
+ }
}
- ConnectionIPtr connection = createConnection(endpts, comp);
+ return createConnection(_endpoints, comp);
+}
+
+void
+IceInternal::DirectReference::getConnection(const GetConnectionCallbackPtr& callback) const
+{
+ class Callback : public RouterInfo::GetClientEndpointsCallback
+ {
+ public:
+
+ virtual void
+ setEndpoints(const vector<EndpointIPtr>& endpoints)
+ {
+ vector<EndpointIPtr> endpts = endpoints;
+ if(!endpts.empty())
+ {
+ _reference->applyOverrides(endpts);
+ _reference->createConnection(endpts, _callback);
+ return;
+ }
+
+ _reference->createConnection(_reference->getEndpoints(), _callback);
+ }
+
+ virtual void
+ setException(const Ice::LocalException& ex)
+ {
+ _callback->setException(ex);
+ }
+
+ Callback(const DirectReferencePtr& reference, const GetConnectionCallbackPtr& callback) :
+ _reference(reference), _callback(callback)
+ {
+ }
+
+ private:
+
+ const DirectReferencePtr _reference;
+ const GetConnectionCallbackPtr _callback;
+ };
- //
- // If we have a router, set the object adapter for this router
- // (if any) to the new connection, so that callbacks from the
- // router can be received over this new connection.
- //
if(getRouterInfo())
{
- connection->setAdapter(getRouterInfo()->getAdapter());
+ //
+ // If we route, we send everything to the router's client
+ // proxy endpoints.
+ //
+ getRouterInfo()->getClientEndpoints(new Callback(const_cast<DirectReference*>(this), callback));
+ return;
}
- assert(connection);
- return connection;
+ createConnection(_endpoints, callback);
}
bool
@@ -1699,77 +1899,223 @@ IceInternal::IndirectReference::toString() const
ConnectionIPtr
IceInternal::IndirectReference::getConnection(bool& comp) const
{
- ConnectionIPtr connection;
+ if(getRouterInfo())
+ {
+ //
+ // If we route, we send everything to the router's client
+ // proxy endpoints.
+ //
+ vector<EndpointIPtr> endpts = getRouterInfo()->getClientEndpoints();
+ if(!endpts.empty())
+ {
+ applyOverrides(endpts);
+ return createConnection(endpts, comp);
+ }
+ }
while(true)
{
- vector<EndpointIPtr> endpts = RoutableReference::getRoutedEndpoints();
bool cached = false;
- if(endpts.empty() && _locatorInfo)
+ vector<EndpointIPtr> endpts;
+ if(_locatorInfo)
{
- const IndirectReferencePtr self = const_cast<IndirectReference*>(this);
- endpts = _locatorInfo->getEndpoints(self, _locatorCacheTimeout, cached);
+ endpts = _locatorInfo->getEndpoints(const_cast<IndirectReference*>(this), _locatorCacheTimeout, cached);
+ applyOverrides(endpts);
}
- applyOverrides(endpts);
+ if(endpts.empty())
+ {
+ throw Ice::NoEndpointException(__FILE__, __LINE__, toString());
+ }
try
{
- connection = createConnection(endpts, comp);
- assert(connection);
+ return createConnection(endpts, comp);
}
- catch(const NoEndpointException& ex)
+ catch(const NoEndpointException&)
{
- throw ex; // No need to retry if there's no endpoints.
+ throw; // No need to retry if there's no endpoints.
}
catch(const LocalException& ex)
{
- if(!getRouterInfo())
+ assert(_locatorInfo);
+ _locatorInfo->clearCache(const_cast<IndirectReference*>(this));
+
+ if(cached)
{
- assert(_locatorInfo);
-
- // COMPILERFIX: Braces needed to prevent BCB from causing Reference refCount from
+ // COMPILERFIX: Braces needed to prevent BCB from causing TraceLevels refCount from
// being decremented twice when loop continues.
{
- const IndirectReferencePtr self = const_cast<IndirectReference*>(this);
- _locatorInfo->clearCache(self);
+ TraceLevelsPtr traceLevels = getInstance()->traceLevels();
+ if(traceLevels->retry >= 2)
+ {
+ Trace out(getInstance()->initializationData().logger, traceLevels->retryCat);
+ out << "connection to cached endpoints failed\n"
+ << "removing endpoints from cache and trying one more time\n" << ex;
+ }
}
+ continue;
+ }
+ throw;
+ }
+ }
+
+ assert(false);
+ return 0;
+}
+
+void
+IceInternal::IndirectReference::getConnection(const GetConnectionCallbackPtr& callback) const
+{
+ class Callback : public RouterInfo::GetClientEndpointsCallback
+ {
+ public:
+
+ virtual void
+ setEndpoints(const vector<EndpointIPtr>& endpoints)
+ {
+ vector<EndpointIPtr> endpts = endpoints;
+ if(!endpts.empty())
+ {
+ _reference->applyOverrides(endpts);
+ _reference->createConnection(endpts, _callback);
+ return;
+ }
+
+ _reference->getConnectionNoRouterInfo(_callback);
+ }
+
+ virtual void
+ setException(const Ice::LocalException& ex)
+ {
+ _callback->setException(ex);
+ }
+
+ Callback(const IndirectReferencePtr& reference, const GetConnectionCallbackPtr& callback) :
+ _reference(reference), _callback(callback)
+ {
+ }
+
+ private:
+
+ const IndirectReferencePtr _reference;
+ const GetConnectionCallbackPtr _callback;
+ };
- if(cached)
+ if(getRouterInfo())
+ {
+ //
+ // If we route, we send everything to the router's client
+ // proxy endpoints.
+ //
+ getRouterInfo()->getClientEndpoints(new Callback(const_cast<IndirectReference*>(this), callback));
+ return;
+ }
+
+ getConnectionNoRouterInfo(callback);
+}
+
+void
+IceInternal::IndirectReference::getConnectionNoRouterInfo(const GetConnectionCallbackPtr& callback) const
+{
+ class Callback2 : public Reference::GetConnectionCallback
+ {
+ public:
+
+ virtual void
+ setConnection(const Ice::ConnectionIPtr& connection, bool compress)
+ {
+ _callback->setConnection(connection, compress);
+ }
+
+ virtual void
+ setException(const Ice::LocalException& exc)
+ {
+ try
+ {
+ exc.ice_throw();
+ }
+ catch(const Ice::NoEndpointException& ex)
+ {
+ _callback->setException(ex); // No need to retry if there's no endpoints.
+ }
+ catch(const Ice::LocalException& ex)
+ {
+ LocatorInfoPtr locatorInfo = _reference->getLocatorInfo();
+ assert(locatorInfo);
+ locatorInfo->clearCache(_reference);
+ if(_cached)
{
- // COMPILERFIX: Braces needed to prevent BCB from causing TraceLevels refCount from
- // being decremented twice when loop continues.
+ TraceLevelsPtr traceLvls = _reference->getInstance()->traceLevels();
+ if(traceLvls->retry >= 2)
{
- TraceLevelsPtr traceLevels = getInstance()->traceLevels();
- if(traceLevels->retry >= 2)
- {
- Trace out(getInstance()->initializationData().logger, traceLevels->retryCat);
- out << "connection to cached endpoints failed\n"
- << "removing endpoints from cache and trying one more time\n" << ex;
- }
+ Trace out(_reference->getInstance()->initializationData().logger, traceLvls->retryCat);
+ out << "connection to cached endpoints failed\n"
+ << "removing endpoints from cache and trying one more time\n" << ex;
}
- continue;
+ _reference->getConnectionNoRouterInfo(_callback); // Retry.
+ return;
}
+ _callback->setException(ex);
}
+ }
- throw;
+ Callback2(const IndirectReferencePtr& reference, const GetConnectionCallbackPtr& callback, bool cached):
+ _reference(reference), _callback(callback), _cached(cached)
+ {
}
+
+ private:
+
+ const IndirectReferencePtr _reference;
+ const GetConnectionCallbackPtr _callback;
+ const bool _cached;
+ };
+
+ class Callback : public LocatorInfo::GetEndpointsCallback
+ {
+ public:
- break;
- }
+ virtual void
+ setEndpoints(const vector<EndpointIPtr>& endpoints, bool cached)
+ {
+ if(endpoints.empty())
+ {
+ _callback->setException(Ice::NoEndpointException(__FILE__, __LINE__, _reference->toString()));
+ return;
+ }
+
+ vector<EndpointIPtr> endpts = endpoints;
+ _reference->applyOverrides(endpts);
+ _reference->createConnection(endpts, new Callback2(_reference, _callback, cached));
+ }
+
+ virtual void
+ setException(const Ice::LocalException& ex)
+ {
+ _callback->setException(ex);
+ }
- //
- // If we have a router, set the object adapter for this router
- // (if any) to the new connection, so that callbacks from the
- // router can be received over this new connection.
- //
- if(getRouterInfo())
+ Callback(const IndirectReferencePtr& reference, const GetConnectionCallbackPtr& callback) :
+ _reference(reference), _callback(callback)
+ {
+ }
+
+ private:
+
+ const IndirectReferencePtr _reference;
+ const GetConnectionCallbackPtr _callback;
+ };
+
+ if(_locatorInfo)
{
- connection->setAdapter(getRouterInfo()->getAdapter());
+ IndirectReference* self = const_cast<IndirectReference*>(this);
+ _locatorInfo->getEndpoints(self, _locatorCacheTimeout, new Callback(self, callback));
+ }
+ else
+ {
+ callback->setException(Ice::NoEndpointException(__FILE__, __LINE__, toString()));
}
-
- assert(connection);
- return connection;
}
int
diff --git a/cpp/src/Ice/Reference.h b/cpp/src/Ice/Reference.h
index 1430ebf7278..95715300787 100644
--- a/cpp/src/Ice/Reference.h
+++ b/cpp/src/Ice/Reference.h
@@ -33,6 +33,15 @@ class Reference : public IceUtil::Shared
{
public:
+ class GetConnectionCallback : virtual public IceUtil::Shared
+ {
+ public:
+
+ virtual void setConnection(const Ice::ConnectionIPtr&, bool) = 0;
+ virtual void setException(const Ice::LocalException&) = 0;
+ };
+ typedef IceUtil::Handle<GetConnectionCallback> GetConnectionCallbackPtr;
+
enum Type
{
TypeDirect,
@@ -115,6 +124,7 @@ public:
// Get a suitable connection for this reference.
//
virtual Ice::ConnectionIPtr getConnection(bool&) const = 0;
+ virtual void getConnection(const GetConnectionCallbackPtr&) const = 0;
virtual bool operator==(const Reference&) const = 0;
virtual bool operator!=(const Reference&) const = 0;
@@ -180,6 +190,7 @@ public:
virtual std::string toString() const;
virtual Ice::ConnectionIPtr getConnection(bool&) const;
+ virtual void getConnection(const GetConnectionCallbackPtr&) const;
virtual bool operator==(const Reference&) const;
virtual bool operator!=(const Reference&) const;
@@ -203,7 +214,6 @@ class RoutableReference : public Reference
public:
virtual RouterInfoPtr getRouterInfo() const { return _routerInfo; }
- std::vector<EndpointIPtr> getRoutedEndpoints() const;
virtual bool getSecure() const;
virtual bool getPreferSecure() const;
@@ -223,8 +233,6 @@ public:
virtual ReferencePtr changeEndpointSelection(Ice::EndpointSelectionType) const;
virtual ReferencePtr changeThreadPerConnection(bool) const;
- virtual Ice::ConnectionIPtr getConnection(bool&) const = 0;
-
virtual int hash() const;
virtual bool operator==(const Reference&) const = 0;
@@ -233,6 +241,10 @@ public:
virtual ReferencePtr clone() const = 0;
+ Ice::ConnectionIPtr createConnection(const std::vector<EndpointIPtr>&, bool&) const;
+ void createConnection(const std::vector<EndpointIPtr>&, const GetConnectionCallbackPtr&) const;
+ void applyOverrides(std::vector<EndpointIPtr>&) const;
+
protected:
RoutableReference(const InstancePtr&, const Ice::CommunicatorPtr&, const Ice::Identity&, const SharedContextPtr&,
@@ -240,8 +252,7 @@ protected:
Ice::EndpointSelectionType, bool);
RoutableReference(const RoutableReference&);
- Ice::ConnectionIPtr createConnection(const std::vector<EndpointIPtr>&, bool&) const;
- void applyOverrides(std::vector<EndpointIPtr>&) const;
+ std::vector<EndpointIPtr> filterEndpoints(const std::vector<EndpointIPtr>&) const;
private:
@@ -284,6 +295,7 @@ public:
virtual void streamWrite(BasicStream*) const;
virtual std::string toString() const;
virtual Ice::ConnectionIPtr getConnection(bool&) const;
+ virtual void getConnection(const GetConnectionCallbackPtr&) const;
virtual bool operator==(const Reference&) const;
virtual bool operator!=(const Reference&) const;
@@ -323,6 +335,8 @@ public:
virtual void streamWrite(BasicStream*) const;
virtual std::string toString() const;
virtual Ice::ConnectionIPtr getConnection(bool&) const;
+ virtual void getConnection(const GetConnectionCallbackPtr&) const;
+ virtual void getConnectionNoRouterInfo(const GetConnectionCallbackPtr&) const;
virtual int hash() const; // Conceptually const.
diff --git a/cpp/src/Ice/ReferenceFactory.cpp b/cpp/src/Ice/ReferenceFactory.cpp
index 4c055017f68..0e894056597 100644
--- a/cpp/src/Ice/ReferenceFactory.cpp
+++ b/cpp/src/Ice/ReferenceFactory.cpp
@@ -623,8 +623,7 @@ IceInternal::ReferenceFactory::createFromProperties(const string& propertyPrefix
}
else
{
- ref = ref->changeRouter(
- RouterPrx::uncheckedCast(_communicator->propertyToProxy(property)));
+ ref = ref->changeRouter(RouterPrx::uncheckedCast(_communicator->propertyToProxy(property)));
}
}
diff --git a/cpp/src/Ice/RequestHandler.cpp b/cpp/src/Ice/RequestHandler.cpp
new file mode 100644
index 00000000000..cf2845c77ae
--- /dev/null
+++ b/cpp/src/Ice/RequestHandler.cpp
@@ -0,0 +1,23 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2007 ZeroC, Inc. All rights reserved.
+//
+// This copy of Ice is licensed to you under the terms described in the
+// ICE_LICENSE file included in this distribution.
+//
+// **********************************************************************
+
+#include <Ice/RequestHandler.h>
+
+using namespace std;
+using namespace IceInternal;
+
+IceUtil::Shared* IceInternal::upCast(RequestHandler* obj) { return obj; }
+
+RequestHandler::~RequestHandler()
+{
+}
+
+RequestHandler::RequestHandler(const ReferencePtr& reference) : _reference(reference)
+{
+}
diff --git a/cpp/src/Ice/RequestHandler.h b/cpp/src/Ice/RequestHandler.h
new file mode 100644
index 00000000000..1b22794930c
--- /dev/null
+++ b/cpp/src/Ice/RequestHandler.h
@@ -0,0 +1,55 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2007 ZeroC, Inc. All rights reserved.
+//
+// This copy of Ice is licensed to you under the terms described in the
+// ICE_LICENSE file included in this distribution.
+//
+// **********************************************************************
+
+#ifndef ICE_REQUEST_HANDLER_H
+#define ICE_REQUEST_HANDLER_H
+
+#include <IceUtil/Shared.h>
+
+#include <Ice/RequestHandlerF.h>
+#include <Ice/ReferenceF.h>
+#include <Ice/OutgoingAsyncF.h>
+#include <Ice/ConnectionIF.h>
+
+namespace IceInternal
+{
+
+class BasicStream;
+class Outgoing;
+class BatchOutgoing;
+
+class RequestHandler : virtual public ::IceUtil::Shared
+{
+public:
+
+ virtual ~RequestHandler();
+
+ virtual void prepareBatchRequest(BasicStream*) = 0;
+ virtual void finishBatchRequest(BasicStream*) = 0;
+ virtual void abortBatchRequest() = 0;
+
+ virtual Ice::ConnectionI* sendRequest(Outgoing*) = 0;
+ virtual void sendAsyncRequest(const OutgoingAsyncPtr&) = 0;
+
+ virtual bool flushBatchRequests(BatchOutgoing*) = 0;
+ virtual void flushAsyncBatchRequests(const BatchOutgoingAsyncPtr&) = 0;
+
+ const ReferencePtr& getReference() const { return _reference; } // Inlined for performances.
+
+ virtual Ice::ConnectionIPtr getConnection(bool) = 0;
+
+protected:
+
+ RequestHandler(const ReferencePtr&);
+ const ReferencePtr _reference;
+};
+
+}
+
+#endif
diff --git a/cpp/src/Ice/RouterInfo.cpp b/cpp/src/Ice/RouterInfo.cpp
index fd2e9ea5300..4ab5323593a 100644
--- a/cpp/src/Ice/RouterInfo.cpp
+++ b/cpp/src/Ice/RouterInfo.cpp
@@ -154,12 +154,168 @@ IceInternal::RouterInfo::getRouter() const
vector<EndpointIPtr>
IceInternal::RouterInfo::getClientEndpoints()
{
+ {
+ IceUtil::Mutex::Lock sync(*this);
+ if(!_clientEndpoints.empty())
+ {
+ return _clientEndpoints;
+ }
+ }
+
+ return setClientEndpoints(_router->getClientProxy());
+}
+
+void
+IceInternal::RouterInfo::getClientEndpoints(const GetClientEndpointsCallbackPtr& callback)
+{
+ vector<EndpointIPtr> clientEndpoints;
+ {
+ IceUtil::Mutex::Lock sync(*this);
+ clientEndpoints = _clientEndpoints;
+ }
+
+ if(!clientEndpoints.empty())
+ {
+ callback->setEndpoints(clientEndpoints);
+ return;
+ }
+
+ class Callback : public AMI_Router_getClientProxy
+ {
+ public:
+
+ virtual void
+ ice_response(const Ice::ObjectPrx& clientProxy)
+ {
+ _callback->setEndpoints(_routerInfo->setClientEndpoints(clientProxy));
+ }
+
+ virtual void
+ ice_exception(const Ice::Exception& ex)
+ {
+ _callback->setException(dynamic_cast<const Ice::LocalException&>(ex));
+ }
+
+ Callback(const RouterInfoPtr& routerInfo, const GetClientEndpointsCallbackPtr& callback) :
+ _routerInfo(routerInfo), _callback(callback)
+ {
+ }
+
+ private:
+
+ const RouterInfoPtr _routerInfo;
+ const GetClientEndpointsCallbackPtr _callback;
+ };
+
+ _router->getClientProxy_async(new Callback(this, callback));
+}
+
+vector<EndpointIPtr>
+IceInternal::RouterInfo::getServerEndpoints()
+{
+ {
+ IceUtil::Mutex::Lock sync(*this);
+ if(!_serverEndpoints.empty())
+ {
+ return _serverEndpoints;
+ }
+ }
+
+ return setServerEndpoints(_router->getServerProxy());
+}
+
+void
+IceInternal::RouterInfo::addProxy(const ObjectPrx& proxy)
+{
+ assert(proxy); // Must not be called for null proxies.
+
+ {
+ IceUtil::Mutex::Lock sync(*this);
+ if(_identities.find(proxy->ice_getIdentity()) != _identities.end())
+ {
+ //
+ // Only add the proxy to the router if it's not already in our local map.
+ //
+ return;
+ }
+ }
+
+ ObjectProxySeq proxies;
+ proxies.push_back(proxy);
+ addAndEvictProxies(proxy, _router->addProxies(proxies));
+}
+
+bool
+IceInternal::RouterInfo::addProxy(const Ice::ObjectPrx& proxy, const AddProxyCallbackPtr& callback)
+{
+ assert(proxy);
+ {
+ IceUtil::Mutex::Lock sync(*this);
+ if(_identities.find(proxy->ice_getIdentity()) == _identities.end())
+ {
+ //
+ // Only add the proxy to the router if it's not already in our local map.
+ //
+ return true;
+ }
+ }
+
+ class Callback : public AMI_Router_addProxies
+ {
+ public:
+
+ virtual void
+ ice_response(const Ice::ObjectProxySeq& evictedProxies)
+ {
+ _routerInfo->addAndEvictProxies(_proxy, evictedProxies);
+ _callback->addedProxy();
+ }
+
+ virtual void
+ ice_exception(const Ice::Exception& ex)
+ {
+ _callback->setException(dynamic_cast<const Ice::LocalException&>(ex));
+ }
+
+ Callback(const RouterInfoPtr& routerInfo, const Ice::ObjectPrx& proxy, const AddProxyCallbackPtr& callback) :
+ _routerInfo(routerInfo), _proxy(proxy), _callback(callback)
+ {
+ }
+
+ private:
+
+ const RouterInfoPtr _routerInfo;
+ const Ice::ObjectPrx _proxy;
+ const AddProxyCallbackPtr _callback;
+ };
+
+ Ice::ObjectProxySeq proxies;
+ proxies.push_back(proxy);
+ _router->addProxies_async(new Callback(this, proxy, callback), proxies);
+ return false;
+}
+
+void
+IceInternal::RouterInfo::setAdapter(const ObjectAdapterPtr& adapter)
+{
IceUtil::Mutex::Lock sync(*this);
-
- if(_clientEndpoints.size() == 0) // Lazy initialization.
+ _adapter = adapter;
+}
+
+ObjectAdapterPtr
+IceInternal::RouterInfo::getAdapter() const
+{
+ IceUtil::Mutex::Lock sync(*this);
+ return _adapter;
+}
+
+vector<EndpointIPtr>
+IceInternal::RouterInfo::setClientEndpoints(const Ice::ObjectPrx& proxy)
+{
+ IceUtil::Mutex::Lock sync(*this);
+ if(_clientEndpoints.empty())
{
- ObjectPrx clientProxy = _router->getClientProxy();
- if(!clientProxy)
+ if(!proxy)
{
//
// If getClientProxy() return nil, use router endpoints.
@@ -168,7 +324,7 @@ IceInternal::RouterInfo::getClientEndpoints()
}
else
{
- clientProxy = clientProxy->ice_router(0); // The client proxy cannot be routed.
+ Ice::ObjectPrx clientProxy = proxy->ice_router(0); // The client proxy cannot be routed.
//
// In order to avoid creating a new connection to the router,
@@ -187,16 +343,15 @@ IceInternal::RouterInfo::getClientEndpoints()
_clientEndpoints = clientProxy->__reference()->getEndpoints();
}
}
-
return _clientEndpoints;
}
+
vector<EndpointIPtr>
-IceInternal::RouterInfo::getServerEndpoints()
+IceInternal::RouterInfo::setServerEndpoints(const Ice::ObjectPrx& serverProxy)
{
IceUtil::Mutex::Lock sync(*this);
-
- if(_serverEndpoints.size() == 0) // Lazy initialization.
+ if(_serverEndpoints.empty()) // Lazy initialization.
{
ObjectPrx serverProxy = _router->getServerProxy();
if(!serverProxy)
@@ -208,53 +363,45 @@ IceInternal::RouterInfo::getServerEndpoints()
_serverEndpoints = serverProxy->__reference()->getEndpoints();
}
-
return _serverEndpoints;
}
void
-IceInternal::RouterInfo::addProxy(const ObjectPrx& proxy)
+IceInternal::RouterInfo::addAndEvictProxies(const Ice::ObjectPrx& proxy, const Ice::ObjectProxySeq& evictedProxies)
{
- assert(proxy); // Must not be called for null proxies.
-
IceUtil::Mutex::Lock sync(*this);
- set<Identity>::iterator p = _identities.find(proxy->ice_getIdentity());
-
- if(p == _identities.end())
+ //
+ // Check if the proxy hasn't already been evicted by a concurrent addProxies call.
+ // If it's the case, don't add it to our local map.
+ //
+ multiset<Identity>::iterator p = _evictedIdentities.find(proxy->ice_getIdentity());
+ if(p != _evictedIdentities.end())
+ {
+ _evictedIdentities.erase(p);
+ }
+ else
{
//
- // Only add the proxy to the router if it's not already in our local map.
- //
- ObjectProxySeq proxies;
- proxies.push_back(proxy);
- ObjectProxySeq evictedProxies = _router->addProxies(proxies);
-
- //
- // If we successfully added the proxy to the router, we add it to our local map.
- //
- _identities.insert(_identities.begin(), proxy->ice_getIdentity());
-
- //
- // We also must remove whatever proxies the router evicted.
+ // If we successfully added the proxy to the router,
+ // we add it to our local map.
//
- for(ObjectProxySeq::iterator q = evictedProxies.begin(); q != evictedProxies.end(); ++q)
+ _identities.insert(proxy->ice_getIdentity());
+ }
+
+ //
+ // We also must remove whatever proxies the router evicted.
+ //
+ for(Ice::ObjectProxySeq::const_iterator q = evictedProxies.begin(); q != evictedProxies.end(); ++q)
+ {
+ if(_identities.erase((*q)->ice_getIdentity()) == 0)
{
- _identities.erase((*q)->ice_getIdentity());
+ //
+ // It's possible for the proxy to not have been
+ // added yet in the local map if two threads
+ // concurrently call addProxies.
+ //
+ _evictedIdentities.insert((*q)->ice_getIdentity());
}
}
}
-
-void
-IceInternal::RouterInfo::setAdapter(const ObjectAdapterPtr& adapter)
-{
- IceUtil::Mutex::Lock sync(*this);
- _adapter = adapter;
-}
-
-ObjectAdapterPtr
-IceInternal::RouterInfo::getAdapter() const
-{
- IceUtil::Mutex::Lock sync(*this);
- return _adapter;
-}
diff --git a/cpp/src/Ice/RouterInfo.h b/cpp/src/Ice/RouterInfo.h
index f7a6d9d773f..7a05dacddd2 100644
--- a/cpp/src/Ice/RouterInfo.h
+++ b/cpp/src/Ice/RouterInfo.h
@@ -16,6 +16,7 @@
#include <Ice/RouterF.h>
#include <Ice/ProxyF.h>
#include <Ice/EndpointIF.h>
+#include <Ice/BuiltinSequences.h>
#include <set>
@@ -47,6 +48,24 @@ class RouterInfo : public IceUtil::Shared, public IceUtil::Mutex
{
public:
+ class GetClientEndpointsCallback : virtual public IceUtil::Shared
+ {
+ public:
+
+ virtual void setEndpoints(const std::vector<EndpointIPtr>&) = 0;
+ virtual void setException(const Ice::LocalException&) = 0;
+ };
+ typedef IceUtil::Handle<GetClientEndpointsCallback> GetClientEndpointsCallbackPtr;
+
+ class AddProxyCallback : virtual public IceUtil::Shared
+ {
+ public:
+
+ virtual void addedProxy() = 0;
+ virtual void setException(const Ice::LocalException&) = 0;
+ };
+ typedef IceUtil::Handle<AddProxyCallback> AddProxyCallbackPtr;
+
RouterInfo(const Ice::RouterPrx&);
void destroy();
@@ -56,19 +75,27 @@ public:
bool operator<(const RouterInfo&) const;
Ice::RouterPrx getRouter() const;
- std::vector<IceInternal::EndpointIPtr> getClientEndpoints();
- std::vector<IceInternal::EndpointIPtr> getServerEndpoints();
+ std::vector<EndpointIPtr> getClientEndpoints();
+ void getClientEndpoints(const GetClientEndpointsCallbackPtr&);
+ std::vector<EndpointIPtr> getServerEndpoints();
void addProxy(const Ice::ObjectPrx&);
+ bool addProxy(const Ice::ObjectPrx&, const AddProxyCallbackPtr&);
+
void setAdapter(const Ice::ObjectAdapterPtr&);
Ice::ObjectAdapterPtr getAdapter() const;
private:
+ std::vector<EndpointIPtr> setClientEndpoints(const Ice::ObjectPrx&);
+ std::vector<EndpointIPtr> setServerEndpoints(const Ice::ObjectPrx&);
+ void addAndEvictProxies(const Ice::ObjectPrx&, const Ice::ObjectProxySeq&);
+
const Ice::RouterPrx _router;
- std::vector<IceInternal::EndpointIPtr> _clientEndpoints;
- std::vector<IceInternal::EndpointIPtr> _serverEndpoints;
+ std::vector<EndpointIPtr> _clientEndpoints;
+ std::vector<EndpointIPtr> _serverEndpoints;
Ice::ObjectAdapterPtr _adapter;
std::set<Ice::Identity> _identities;
+ std::multiset<Ice::Identity> _evictedIdentities;
};
}
diff --git a/cpp/src/Ice/Selector.cpp b/cpp/src/Ice/Selector.cpp
new file mode 100644
index 00000000000..5e82c2f7ee3
--- /dev/null
+++ b/cpp/src/Ice/Selector.cpp
@@ -0,0 +1,497 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2007 ZeroC, Inc. All rights reserved.
+//
+// This copy of Ice is licensed to you under the terms described in the
+// ICE_LICENSE file included in this distribution.
+//
+// **********************************************************************
+
+#include <IceUtil/DisableWarnings.h>
+#include <Ice/Selector.h>
+#include <Ice/Network.h>
+#include <Ice/Instance.h>
+#include <Ice/LoggerUtil.h>
+
+using namespace std;
+using namespace Ice;
+using namespace IceInternal;
+
+IceInternal::Selector::Selector(const InstancePtr& instance, int timeout) :
+ _instance(instance),
+ _timeout(timeout)
+{
+#if defined(_WIN32)
+ _fdsInUse = 0;
+ FD_ZERO(&_readFdSet);
+ FD_ZERO(&_writeFdSet);
+ FD_ZERO(&_errorFdSet);
+#elif defined(ICE_USE_EPOLL)
+ _epollFd = epoll_create(1);
+ if(_epollFd < 0)
+ {
+ SocketException ex(__FILE__, __LINE__);
+ ex.error = getSocketErrno();
+ throw ex;
+ }
+#elif defined(__APPLE__)
+ _kqueueFd = kqueue();
+ if(_kqueueFd < 0)
+ {
+ SocketException ex(__FILE__, __LINE__);
+ ex.error = getSocketErrno();
+ throw ex;
+ }
+#endif
+
+ SOCKET fds[2];
+ createPipe(fds);
+ _fdIntrRead = fds[0];
+ _fdIntrWrite = fds[1];
+ setBlock(_fdIntrRead, false);
+ _maxFd = _fdIntrRead;
+ add(_fdIntrRead, NeedRead);
+#if defined(_WIN32)
+ ++_fdsInUse;
+#endif
+
+ _lastFd = _fdIntrRead;
+}
+
+IceInternal::Selector::~Selector()
+{
+#if defined(ICE_USE_EPOLL)
+ try
+ {
+ closeSocket(_epollFd);
+ }
+ catch(const LocalException& ex)
+ {
+ Error out(_instance->initializationData().logger);
+ out << "exception in selector while calling closeSocket():\n" << ex;
+ }
+#elif defined(__APPLE__)
+ try
+ {
+ closeSocket(_kqueueFd);
+ }
+ catch(const LocalException& ex)
+ {
+ Error out(_instance->initializationData().logger);
+ out << "exception in selector while calling closeSocket():\n" << ex;
+ }
+#endif
+
+
+ try
+ {
+ closeSocket(_fdIntrWrite);
+ }
+ catch(const LocalException& ex)
+ {
+ Error out(_instance->initializationData().logger);
+ out << "exception in selector while calling closeSocket():\n" << ex;
+ }
+
+ try
+ {
+ closeSocket(_fdIntrRead);
+ }
+ catch(const LocalException& ex)
+ {
+ Error out(_instance->initializationData().logger);
+ out << "exception in selector while calling closeSocket():\n" << ex;
+ }
+}
+
+void
+IceInternal::Selector::add(SOCKET fd, SocketStatus status)
+{
+ if(fd > _maxFd)
+ {
+ _maxFd = fd;
+ }
+#if defined(_WIN32)
+ switch(status)
+ {
+ case NeedRead:
+ FD_SET(fd, &_readFdSet);
+ break;
+ case NeedWrite:
+ FD_SET(fd, &_writeFdSet);
+ break;
+ case NeedConnect:
+ FD_SET(fd, &_writeFdSet);
+ FD_SET(fd, &_errorFdSet);
+ break;
+ case Finished:
+ assert(false);
+ }
+#elif defined(ICE_USE_EPOLL)
+ epoll_event event;
+ switch(status)
+ {
+ case NeedRead:
+ event.events = EPOLLIN;
+ break;
+ case NeedWrite:
+ case NeedConnect:
+ event.events = EPOLLOUT;
+ break;
+ case Finished:
+ assert(false);
+ }
+ event.data.fd = fd;
+ if(epoll_ctl(_epollFd, EPOLL_CTL_ADD, fd, &event) != 0)
+ {
+ Error out(_instance->initializationData().logger);
+ out << "error while adding filedescriptor to epoll set:\n";
+ out << errorToString(getSocketErrno());
+ }
+ _events.resize(_events.size() + 1);
+#elif defined(__APPLE__)
+ struct kevent event;
+ switch(status)
+ {
+ case NeedRead:
+ EV_SET(&event, fd, EVFILT_READ, EV_ADD, 0, 0, 0);
+ break;
+ case NeedWrite:
+ case NeedConnect:
+ EV_SET(&event, fd, EVFILT_WRITE, EV_ADD, 0, 0, 0);
+ break;
+ case Finished:
+ assert(false);
+ }
+ if(kevent(_kqueueFd, &event, 1, 0, 0, 0) < 0)
+ {
+ Error out(_instance->initializationData().logger);
+ out << "error while adding filedescriptor to kqueue:\n";
+ out << errorToString(getSocketErrno());
+ }
+ _events.resize(_events.size() + 1);
+#else
+ struct pollfd pollFd;
+ pollFd.fd = fd;
+ switch(status)
+ {
+ case NeedRead:
+ pollFd.events = POLLIN;
+ break;
+ case NeedWrite:
+ case NeedConnect:
+ pollFd.events = POLLOUT;
+ break;
+ case Finished:
+ assert(false);
+ }
+ _pollFdSet.push_back(pollFd);
+#endif
+}
+
+void
+Selector::remove(SOCKET fd, SocketStatus status)
+{
+#if defined(_WIN32)
+ switch(status)
+ {
+ case NeedRead:
+ FD_CLR(fd, &_readFdSet);
+ break;
+ case NeedWrite:
+ FD_CLR(fd, &_writeFdSet);
+ break;
+ case NeedConnect:
+ FD_CLR(fd, &_writeFdSet);
+ FD_CLR(fd, &_errorFdSet);
+ break;
+ case Finished:
+ assert(false);
+ }
+#elif defined(ICE_USE_EPOLL)
+ epoll_event event;
+ event.events = 0;
+ int rs = epoll_ctl(_epollFd, EPOLL_CTL_DEL, fd, &event);
+ if(rs < 0)
+ {
+ //
+ // It's possible for the socket to already be closed at this point.
+ //
+// Error out(_instance->initializationData().logger);
+// out << "error while removing filedescriptor from epoll set:\n";
+// out << errorToString(getSocketErrno());
+ }
+ _events.resize(_events.size() - 1);
+#elif defined(__APPLE__)
+ struct kevent event;
+ switch(status)
+ {
+ case NeedRead:
+ EV_SET(&event, fd, EVFILT_READ, EV_DELETE, 0, 0, 0);
+ break;
+ case NeedWrite:
+ case NeedConnect:
+ EV_SET(&event, fd, EVFILT_WRITE, EV_DELETE, 0, 0, 0);
+ break;
+ case Finished:
+ assert(false);
+ }
+ int rs = kevent(_kqueueFd, &event, 1, 0, 0, 0);
+ if(rs < 0)
+ {
+ //
+ // It's possible for the socket to already be closed at this point.
+ //
+// Error out(_instance->initializationData().logger);
+// out << "error while removing filedescriptor from kqueue:\n";
+// out << errorToString(getSocketErrno());
+ }
+ _events.resize(_events.size() - 1);
+#else
+ for(vector<struct pollfd>::iterator p = _pollFdSet.begin(); p != _pollFdSet.end(); ++p)
+ {
+ if(p->fd == fd)
+ {
+ _pollFdSet.erase(p);
+ break;
+ }
+ }
+#endif
+}
+
+SOCKET
+IceInternal::Selector::getNextSelected()
+{
+ assert(_nSelected > 0);
+ if(_nSelectedReturned == _nSelected)
+ {
+ return INVALID_SOCKET;
+ }
+
+ //
+ // Round robin for the filedescriptors.
+ //
+ SOCKET largerFd = _maxFd + 1;
+ SOCKET smallestFd = _maxFd + 1;
+#if defined(_WIN32)
+ if(_selectedReadFdSet.fd_count == 0 && _selectedWriteFdSet.fd_count == 0 && _selectedErrorFdSet.fd_count == 0)
+ {
+ Error out(_instance->initializationData().logger);
+ out << "select() in selector returned " << _nSelected << " but no filedescriptor is ready";
+ return INVALID_SOCKET;
+ }
+
+ const fd_set* fdSet;
+ if(_nSelectedReturned < _selectedReadFdSet.fd_count)
+ {
+ fdSet = &_selectedReadFdSet;
+ }
+ else if(_nSelectedReturned < _selectedWriteFdSet.fd_count + _selectedReadFdSet.fd_count)
+ {
+ fdSet = &_selectedWriteFdSet;
+ }
+ else
+ {
+ fdSet = &_selectedErrorFdSet;
+ }
+
+ for(u_short i = 0; i < fdSet->fd_count; ++i)
+ {
+ SOCKET fd = fdSet->fd_array[i];
+#elif defined(ICE_USE_EPOLL)
+ for(unsigned int i = 0; i < _nSelected; ++i)
+ {
+ SOCKET fd = _events[i].data.fd;
+#elif defined(__APPLE__)
+ for(unsigned int i = 0; i < _nSelected; ++i)
+ {
+ SOCKET fd = _events[i].ident;
+#else
+ for(vector<struct pollfd>::const_iterator p = _pollFdSet.begin(); p != _pollFdSet.end(); ++p)
+ {
+ if(p->revents == 0)
+ {
+ continue;
+ }
+ SOCKET fd = p->fd;
+#endif
+ assert(fd != INVALID_SOCKET);
+ if(fd > _lastFd)
+ {
+ largerFd = min(largerFd, fd);
+ }
+
+ smallestFd = min(smallestFd, fd);
+ }
+#ifdef never // To match ICE_USE_EPOLL __APPLE
+ }}}
+#endif
+
+ if(largerFd <= _maxFd)
+ {
+ _lastFd = largerFd;
+ }
+ else
+ {
+ assert(smallestFd <= _maxFd);
+ _lastFd = smallestFd;
+ }
+ ++_nSelectedReturned;
+ return _lastFd;
+}
+
+int
+IceInternal::Selector::select()
+{
+ while(true)
+ {
+ int ret;
+ _nSelectedReturned = 0;
+ _nSelected = 0;
+#if defined(_WIN32)
+ fd_set* rFdSet = fdSetCopy(_selectedReadFdSet, _readFdSet);
+ fd_set* wFdSet = fdSetCopy(_selectedWriteFdSet, _writeFdSet);
+ fd_set* eFdSet = fdSetCopy(_selectedErrorFdSet, _errorFdSet);
+
+ if(_timeout > 0)
+ {
+ struct timeval tv;
+ tv.tv_sec = _timeout;
+ tv.tv_usec = 0;
+ ret = ::select(0, rFdSet, wFdSet, eFdSet, &tv); // The first parameter is ignored on Windows
+ }
+ else
+ {
+ ret = ::select(0, rFdSet, wFdSet, eFdSet, 0); // The first parameter is ignored on Windows
+ }
+#elif defined(ICE_USE_EPOLL)
+ ret = epoll_wait(_epollFd, &_events[0], _events.size(), _timeout > 0 ? _timeout * 1000 : -1);
+#elif defined(__APPLE__)
+ assert(!_events.empty());
+ if(_timeout > 0)
+ {
+ struct timespec ts;
+ ts.tv_sec = _timeout;
+ ts.tv_nsec = 0;
+ ret = kevent(_kqueueFd, 0, 0, &_events[0], _events.size(), &ts);
+ }
+ else
+ {
+ ret = kevent(_kqueueFd, 0, 0, &_events[0], _events.size(), 0);
+ }
+#else
+ ret = poll(&_pollFdSet[0], _pollFdSet.size(), _timeout > 0 ? _timeout * 1000 : -1);
+#endif
+ if(ret == SOCKET_ERROR)
+ {
+ if(interrupted())
+ {
+ continue;
+ }
+
+ SocketException ex(__FILE__, __LINE__);
+ ex.error = getSocketErrno();
+ throw ex;
+ }
+
+ assert(ret >= 0);
+ _nSelected = static_cast<unsigned int>(ret);
+ if(_nSelected == 0)
+ {
+ assert(_timeout > 0);
+ _timeout = 0;
+ }
+ return _nSelected;
+ }
+}
+
+void
+IceInternal::Selector::setInterrupt()
+{
+ char c = 0;
+ while(true)
+ {
+#ifdef _WIN32
+ if(::send(_fdIntrWrite, &c, 1, 0) == SOCKET_ERROR)
+#else
+ if(::write(_fdIntrWrite, &c, 1) == SOCKET_ERROR)
+#endif
+ {
+ if(interrupted())
+ {
+ continue;
+ }
+
+ SocketException ex(__FILE__, __LINE__);
+ ex.error = getSocketErrno();
+ throw ex;
+ }
+ break;
+ }
+}
+
+void
+IceInternal::Selector::clearInterrupt()
+{
+ char c;
+
+ while(true)
+ {
+ ssize_t ret;
+#ifdef _WIN32
+ ret = ::recv(_fdIntrRead, &c, 1, 0);
+#else
+ ret = ::read(_fdIntrRead, &c, 1);
+#endif
+ if(ret == SOCKET_ERROR)
+ {
+ if(interrupted())
+ {
+ continue;
+ }
+
+ SocketException ex(__FILE__, __LINE__);
+ ex.error = getSocketErrno();
+ throw ex;
+ }
+ break;
+ }
+}
+
+#ifdef _WIN32
+void
+IceInternal::Selector::incFdsInUse()
+{
+ // This is windows specific since every other platform uses an API
+ // that doesn't have a specific FD limit.
+ if(_fdsInUse + 1 > FD_SETSIZE)
+ {
+ Warning warn(_instance->initializationData().logger);
+ warn << "maximum number of connections exceeded";
+
+ //
+ // No appropriate errno.
+ //
+ SocketException ex(__FILE__, __LINE__);
+ ex.error = 0;
+ throw ex;
+ }
+ ++_fdsInUse;
+}
+#endif
+
+#ifdef _WIN32
+void
+IceInternal::Selector::decFdsInUse()
+{
+ // This is windows specific since every other platform uses an API
+ // that doesn't have a specific FD limit.
+ if(_fdsInUse <= 1)
+ {
+ Trace trace(_instance->initializationData().logger, "ThreadPool");
+ trace << "selector: about to assert";
+ }
+ --_fdsInUse;
+}
+#endif
+
diff --git a/cpp/src/Ice/Selector.h b/cpp/src/Ice/Selector.h
new file mode 100644
index 00000000000..4d680f14302
--- /dev/null
+++ b/cpp/src/Ice/Selector.h
@@ -0,0 +1,137 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2007 ZeroC, Inc. All rights reserved.
+//
+// This copy of Ice is licensed to you under the terms described in the
+// ICE_LICENSE file included in this distribution.
+//
+// **********************************************************************
+
+#ifndef ICE_SELECTOR_H
+#define ICE_SELECTOR_H
+
+#include <Ice/Config.h>
+#include <Ice/InstanceF.h>
+
+#if defined(_WIN32)
+# include <winsock2.h>
+#else
+# define SOCKET int
+# if defined(ICE_USE_EPOLL)
+# include <sys/epoll.h>
+# elif defined(__APPLE__)
+# include <sys/event.h>
+# else
+# include <sys/poll.h>
+# endif
+#endif
+
+
+namespace IceInternal
+{
+
+enum SocketStatus
+{
+ Finished,
+ NeedConnect,
+ NeedRead,
+ NeedWrite
+};
+
+class Selector
+{
+public:
+
+ Selector(const InstancePtr&, int = 0);
+ ~Selector();
+
+ void add(SOCKET, SocketStatus);
+ void remove(SOCKET, SocketStatus);
+
+ int select();
+ SOCKET getNextSelected();
+
+ bool isInterrupted()
+ {
+ assert(_nSelected > 0);
+#if defined(_WIN32)
+ return FD_ISSET(_fdIntrRead, &_selectedReadFdSet);
+#elif defined(ICE_USE_EPOLL)
+ for(unsigned int i = 0; i < _nSelected; ++i)
+ {
+ if(_events[i].data.fd == _fdIntrRead)
+ {
+ return true;
+ }
+ }
+ return false;
+#elif defined(__APPLE__)
+ for(unsigned int i = 0; i < _nSelected; ++i)
+ {
+ if(_events[i].ident == static_cast<unsigned int>(_fdIntrRead))
+ {
+ return true;
+ }
+ }
+ return false;
+#else
+ assert(_pollFdSet[0]->fd == _fdIntrRead);
+ return _pollFdSet[0]->revents != 0;
+#endif
+ }
+ void setInterrupt();
+ void clearInterrupt();
+
+ void updateMinMax(SOCKET minFd, SOCKET maxFd);
+ void clearMinMax();
+
+#if defined(_WIN32)
+ void incFdsInUse();
+ void decFdsInUse();
+#endif
+
+private:
+
+ InstancePtr _instance;
+ int _timeout;
+ SOCKET _maxFd;
+ SOCKET _lastFd;
+ unsigned int _nSelected;
+ unsigned int _nSelectedReturned;
+ SOCKET _fdIntrRead;
+ SOCKET _fdIntrWrite;
+#if defined(_WIN32)
+ fd_set _readFdSet;
+ fd_set _writeFdSet;
+ fd_set _errorFdSet;
+ fd_set _selectedReadFdSet;
+ fd_set _selectedWriteFdSet;
+ fd_set _selectedErrorFdSet;
+ int _fdsInUse;
+
+ fd_set*
+ fdSetCopy(fd_set& dest, fd_set& src)
+ {
+ if(src.fd_count > 0)
+ {
+ dest.fd_count = src.fd_count;
+ memcpy(dest.fd_array, src.fd_array, sizeof(SOCKET) * src.fd_count);
+ return &dest;
+ }
+ return 0;
+ }
+
+#elif defined(ICE_USE_EPOLL)
+ int _epollFd;
+ std::vector<struct epoll_event> _events;
+#elif defined(__APPLE__)
+ int _kqueueFd;
+ std::vector<struct kevent> _events;
+#else
+ std::vector<struct pollfd> _pollFdSet;
+#endif
+};
+
+}
+
+#endif
diff --git a/cpp/src/Ice/SelectorThread.cpp b/cpp/src/Ice/SelectorThread.cpp
new file mode 100644
index 00000000000..b0eb5007257
--- /dev/null
+++ b/cpp/src/Ice/SelectorThread.cpp
@@ -0,0 +1,309 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2007 ZeroC, Inc. All rights reserved.
+//
+// This copy of Ice is licensed to you under the terms described in the
+// ICE_LICENSE file included in this distribution.
+//
+// **********************************************************************
+
+#include <IceUtil/DisableWarnings.h>
+#include <Ice/SelectorThread.h>
+#include <Ice/Network.h>
+#include <Ice/Instance.h>
+#include <Ice/LoggerUtil.h>
+
+using namespace std;
+using namespace Ice;
+using namespace IceInternal;
+
+IceUtil::Shared* IceInternal::upCast(SelectorThread* p) { return p; }
+
+IceInternal::SelectorThread::SelectorThread(const InstancePtr& instance) :
+ _instance(instance),
+ _destroyed(false),
+ _selector(instance),
+ _timer(_instance->timer())
+{
+
+ __setNoDelete(true);
+ try
+ {
+ _thread = new HelperThread(this);
+ _thread->start();
+ }
+ catch(const IceUtil::Exception& ex)
+ {
+ {
+ Error out(_instance->initializationData().logger);
+ out << "cannot create thread for selector thread:\n" << ex;
+ }
+ __setNoDelete(false);
+ throw;
+ }
+ catch(...)
+ {
+ __setNoDelete(false);
+ throw;
+ }
+ __setNoDelete(false);
+}
+
+IceInternal::SelectorThread::~SelectorThread()
+{
+ assert(_destroyed);
+}
+
+void
+IceInternal::SelectorThread::destroy()
+{
+ IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this);
+ assert(!_destroyed);
+ _destroyed = true;
+ _selector.setInterrupt();
+}
+
+void
+IceInternal::SelectorThread::incFdsInUse()
+{
+ // This is windows specific since every other platform uses an API
+ // that doesn't have a specific FD limit.
+#ifdef _WIN32
+ IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this);
+ assert(!_destroyed);
+ _selector.incFdsInUse();
+#endif
+}
+
+void
+IceInternal::SelectorThread::decFdsInUse()
+{
+ // This is windows specific since every other platform uses an API
+ // that doesn't have a specific FD limit.
+#ifdef _WIN32
+ IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this);
+ assert(!_destroyed);
+ _selector.decFdsInUse();
+#endif
+}
+
+void
+IceInternal::SelectorThread::_register(SOCKET fd, const SocketReadyCallbackPtr& cb, SocketStatus status, int timeout)
+{
+ IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this);
+ assert(!_destroyed); // The selector thread is destroyed after the incoming/outgoing connection factories.
+ assert(status != Finished);
+ SocketInfo info(fd, cb, status, timeout);
+ _changes.push_back(info);
+ if(info.timeout >= 0)
+ {
+ _timer->schedule(info.cb, IceUtil::Time::milliSeconds(info.timeout));
+ }
+ _selector.setInterrupt();
+}
+
+void
+IceInternal::SelectorThread::unregister(SOCKET fd)
+{
+ IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this);
+ assert(!_destroyed); // The selector thread is destroyed after the incoming/outgoing connection factories.
+ _changes.push_back(SocketInfo(fd, 0, Finished, 0));
+ _selector.setInterrupt();
+}
+
+void
+IceInternal::SelectorThread::joinWithThread()
+{
+ assert(_destroyed);
+ if(_thread)
+ {
+ _thread->getThreadControl().join();
+ }
+}
+
+void
+IceInternal::SelectorThread::run()
+{
+ std::map<SOCKET, SocketInfo> socketMap;
+ vector<SocketInfo*> readyList;
+ vector<SocketInfo*> finishedList;
+ while(true)
+ {
+ try
+ {
+ _selector.select();
+ }
+ catch(const Ice::LocalException& ex)
+ {
+ Error out(_instance->initializationData().logger);
+ out << "exception in selector thread:\n" << ex;
+ continue;
+ }
+
+ assert(readyList.empty() && finishedList.empty());
+
+ {
+ if(_selector.isInterrupted())
+ {
+ IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this);
+
+ //
+ // There are two possiblities for an interrupt:
+ //
+ // 1. The selector thread has been destroyed.
+ // 2. A socket was registered or unregistered.
+ //
+
+ //
+ // Thread destroyed?
+ //
+ if(_destroyed)
+ {
+ break;
+ }
+
+ _selector.clearInterrupt();
+
+ SocketInfo& change = _changes.front();
+ if(change.cb) // Registration
+ {
+ _selector.add(change.fd, change.status);
+ assert(socketMap.find(change.fd) == socketMap.end());
+ socketMap.insert(make_pair(change.fd, change));
+ _maxFd = max(_maxFd, change.fd);
+ _minFd = min(_minFd, change.fd);
+ }
+ else // Unregistration
+ {
+ map<SOCKET, SocketInfo>::iterator r = socketMap.find(change.fd);
+ if(r != socketMap.end() && r->second.status != Finished)
+ {
+ if(r->second.timeout >= 0)
+ {
+ _timer->cancel(r->second.cb);
+ }
+ assert(r->second.status != Finished);
+ _selector.remove(r->second.fd, r->second.status);
+ r->second.status = Finished;
+ readyList.push_back(&(r->second));
+ }
+ }
+ _changes.pop_front();
+ }
+ else
+ {
+
+ //
+ // Examine the selection key set.
+ //
+ SOCKET fd;
+ while((fd = _selector.getNextSelected()) != INVALID_SOCKET)
+ {
+ map<SOCKET, SocketInfo>::iterator r = socketMap.find(fd);
+ if(r != socketMap.end())
+ {
+ if(r->second.timeout >= 0)
+ {
+ _timer->cancel(r->second.cb);
+ }
+
+ readyList.push_back(&(r->second));
+ }
+ }
+ }
+ }
+
+ for(vector<SocketInfo*>::iterator p = readyList.begin(); p != readyList.end(); ++p)
+ {
+ SocketInfo* info = *p;
+ SocketStatus status;
+ try
+ {
+ status = info->cb->socketReady(info->status == Finished);
+ }
+ catch(const std::exception& ex)
+ {
+ Error out(_instance->initializationData().logger);
+ out << "exception in selector thread while calling socketReady():\n" << ex.what();
+ status = Finished;
+ }
+ catch(...)
+ {
+ Error out(_instance->initializationData().logger);
+ out << "unknown exception in selector thread while calling socketReady()";
+ status = Finished;
+ }
+
+ if(status == Finished)
+ {
+ finishedList.push_back(info);
+ }
+ else if(status != info->status)
+ {
+ assert(info->status != Finished);
+ _selector.remove(info->fd, info->status);
+ info->status = status;
+ _selector.add(info->fd, info->status);
+ if(info->timeout >= 0)
+ {
+ _timer->schedule(info->cb, IceUtil::Time::milliSeconds(info->timeout));
+ }
+ }
+ }
+
+ readyList.clear();
+
+ if(finishedList.empty())
+ {
+ continue;
+ }
+
+ for(vector<SocketInfo*>::const_iterator p = finishedList.begin(); p != finishedList.end(); ++p)
+ {
+ if((*p)->status != Finished)
+ {
+ _selector.remove((*p)->fd, (*p)->status);
+ }
+ socketMap.erase((*p)->fd);
+ }
+ finishedList.clear();
+ }
+
+ assert(_destroyed);
+}
+
+IceInternal::SelectorThread::HelperThread::HelperThread(const SelectorThreadPtr& selectorThread) :
+ _selectorThread(selectorThread)
+{
+}
+
+void
+IceInternal::SelectorThread::HelperThread::run()
+{
+ if(_selectorThread->_instance->initializationData().threadHook)
+ {
+ _selectorThread->_instance->initializationData().threadHook->start();
+ }
+
+ try
+ {
+ _selectorThread->run();
+ }
+ catch(const std::exception& ex)
+ {
+ Error out(_selectorThread->_instance->initializationData().logger);
+ out << "exception in selector thread:\n" << ex.what();
+ }
+ catch(...)
+ {
+ Error out(_selectorThread->_instance->initializationData().logger);
+ out << "unknown exception in selector thread";
+ }
+
+ if(_selectorThread->_instance->initializationData().threadHook)
+ {
+ _selectorThread->_instance->initializationData().threadHook->stop();
+ }
+
+ _selectorThread = 0; // Break cyclic dependency.
+}
diff --git a/cpp/src/Ice/SelectorThread.h b/cpp/src/Ice/SelectorThread.h
new file mode 100644
index 00000000000..ccf5423984e
--- /dev/null
+++ b/cpp/src/Ice/SelectorThread.h
@@ -0,0 +1,137 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2007 ZeroC, Inc. All rights reserved.
+//
+// This copy of Ice is licensed to you under the terms described in the
+// ICE_LICENSE file included in this distribution.
+//
+// **********************************************************************
+
+#ifndef ICE_SELECTOR_THREAD_H
+#define ICE_SELECTOR_THREAD_H
+
+#include <IceUtil/Shared.h>
+#include <IceUtil/Handle.h>
+#include <IceUtil/Mutex.h>
+#include <IceUtil/Monitor.h>
+#include <IceUtil/Thread.h>
+#include <IceUtil/Timer.h>
+
+#include <Ice/Config.h>
+#include <Ice/SelectorThreadF.h>
+#include <Ice/InstanceF.h>
+#include <Ice/Selector.h>
+
+#if defined(_WIN32)
+# include <winsock2.h>
+#else
+# define SOCKET int
+# if defined(ICE_USE_EPOLL)
+# include <sys/epoll.h>
+# elif defined(__APPLE__)
+# include <sys/event.h>
+# else
+# include <sys/poll.h>
+# endif
+#endif
+
+#include <deque>
+
+namespace IceInternal
+{
+
+class SocketReadyCallback : public IceUtil::TimerTask
+{
+public:
+
+ //
+ // The selector thread unregisters the callback when socketReady returns SocketStatus.Finished.
+ //
+ virtual SocketStatus socketReady(bool) = 0;
+
+ //
+ // The selector thread doesn't unregister the callback when sockectTimeout is called; socketTimeout
+ // must unregister the callback either explicitly with unregister() or by shutting down the socket
+ // (if necessary).
+ //
+ virtual void socketTimeout() = 0;
+
+private:
+
+ void
+ runTimerTask()
+ {
+ this->socketTimeout();
+ }
+
+ friend class SelectorThread;
+};
+typedef IceUtil::Handle<SocketReadyCallback> SocketReadyCallbackPtr;
+
+class SelectorThread : public IceUtil::Shared, public IceUtil::Monitor<IceUtil::Mutex>
+{
+public:
+
+ SelectorThread(const InstancePtr&);
+ virtual ~SelectorThread();
+
+ void destroy();
+
+ void incFdsInUse();
+ void decFdsInUse();
+
+ void _register(SOCKET, const SocketReadyCallbackPtr&, SocketStatus status, int timeout);
+ void unregister(SOCKET);
+ void joinWithThread();
+
+private:
+
+ void run();
+
+ struct SocketInfo
+ {
+ SOCKET fd;
+ SocketReadyCallbackPtr cb;
+ SocketStatus status;
+ int timeout;
+
+ SocketInfo(SOCKET fd, const SocketReadyCallbackPtr& cb, SocketStatus status, int timeout)
+ {
+ this->fd = fd;
+ this->cb = cb;
+ this->status = status;
+ this->timeout = timeout;
+ }
+ };
+
+ class HelperThread : public IceUtil::Thread
+ {
+ public:
+
+ HelperThread(const SelectorThreadPtr&);
+ virtual void run();
+
+ private:
+
+ SelectorThreadPtr _selectorThread;
+ };
+ friend class HelperThread;
+
+ InstancePtr _instance;
+ bool _destroyed;
+
+ SOCKET _maxFd;
+ SOCKET _minFd;
+ SOCKET _fdIntrRead;
+ SOCKET _fdIntrWrite;
+ Selector _selector;
+
+ std::deque<SocketInfo> _changes;
+
+ IceUtil::ThreadPtr _thread;
+ IceUtil::TimerPtr _timer;
+};
+
+}
+
+#endif
diff --git a/cpp/src/Ice/SelectorThreadF.h b/cpp/src/Ice/SelectorThreadF.h
new file mode 100644
index 00000000000..1e80b87a8b0
--- /dev/null
+++ b/cpp/src/Ice/SelectorThreadF.h
@@ -0,0 +1,26 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2007 ZeroC, Inc. All rights reserved.
+//
+// This copy of Ice is licensed to you under the terms described in the
+// ICE_LICENSE file included in this distribution.
+//
+// **********************************************************************
+
+#ifndef ICE_SELECTOR_THREAD_F_H
+#define ICE_SELECTOR_THREAD_F_H
+
+#include <IceUtil/Shared.h>
+
+#include <Ice/Handle.h>
+
+namespace IceInternal
+{
+
+class SelectorThread;
+IceUtil::Shared* upCast(SelectorThread*);
+typedef Handle<SelectorThread> SelectorThreadPtr;
+
+}
+
+#endif
diff --git a/cpp/src/Ice/TcpAcceptor.cpp b/cpp/src/Ice/TcpAcceptor.cpp
index fd233738286..baa93aa594a 100644
--- a/cpp/src/Ice/TcpAcceptor.cpp
+++ b/cpp/src/Ice/TcpAcceptor.cpp
@@ -72,7 +72,7 @@ IceInternal::TcpAcceptor::accept(int timeout)
out << "accepted tcp connection\n" << fdToString(fd);
}
- return new TcpTransceiver(_instance, fd);
+ return new TcpTransceiver(_instance, fd, true);
}
void
diff --git a/cpp/src/Ice/TcpConnector.cpp b/cpp/src/Ice/TcpConnector.cpp
index 5979914fedd..a4394598ba9 100644
--- a/cpp/src/Ice/TcpConnector.cpp
+++ b/cpp/src/Ice/TcpConnector.cpp
@@ -32,15 +32,16 @@ IceInternal::TcpConnector::connect(int timeout)
SOCKET fd = createSocket(false);
setBlock(fd, false);
setTcpBufSize(fd, _instance->initializationData().properties, _logger);
- doConnect(fd, _addr, timeout);
-
- if(_traceLevels->network >= 1)
+ bool connected = doConnect(fd, _addr, timeout);
+ if(connected)
{
- Trace out(_logger, _traceLevels->networkCat);
- out << "tcp connection established\n" << fdToString(fd);
+ if(_traceLevels->network >= 1)
+ {
+ Trace out(_logger, _traceLevels->networkCat);
+ out << "tcp connection established\n" << fdToString(fd);
+ }
}
-
- return new TcpTransceiver(_instance, fd);
+ return new TcpTransceiver(_instance, fd, connected);
}
Short
@@ -118,21 +119,6 @@ IceInternal::TcpConnector::operator<(const Connector& r) const
return compareAddress(_addr, p->_addr) == -1;
}
-bool
-IceInternal::TcpConnector::equivalent(const string& host, int port) const
-{
- struct sockaddr_in addr;
- try
- {
- getAddress(host, port, addr);
- }
- catch(const DNSException&)
- {
- return false;
- }
- return compareAddress(addr, _addr) == 0;
-}
-
IceInternal::TcpConnector::TcpConnector(const InstancePtr& instance, const struct sockaddr_in& addr, Ice::Int timeout,
const string& connectionId) :
_instance(instance),
diff --git a/cpp/src/Ice/TcpConnector.h b/cpp/src/Ice/TcpConnector.h
index ae0bc1a72a8..2147f30cccc 100644
--- a/cpp/src/Ice/TcpConnector.h
+++ b/cpp/src/Ice/TcpConnector.h
@@ -16,8 +16,8 @@
#include <Ice/LoggerF.h>
#include <Ice/Connector.h>
-#ifdef _WIN32
-# include <winsock2.h>
+#ifdef _WIN32
+# include <winsock2.h>
#else
# include <netinet/in.h> // For struct sockaddr_in
#endif
@@ -30,6 +30,7 @@ class TcpConnector : public Connector
public:
virtual TransceiverPtr connect(int);
+
virtual Ice::Short type() const;
virtual std::string toString() const;
@@ -37,8 +38,6 @@ public:
virtual bool operator!=(const Connector&) const;
virtual bool operator<(const Connector&) const;
- bool equivalent(const std::string&, int) const;
-
private:
TcpConnector(const InstancePtr&, const struct sockaddr_in&, Ice::Int, const std::string&);
diff --git a/cpp/src/Ice/TcpEndpointI.cpp b/cpp/src/Ice/TcpEndpointI.cpp
index 073ece450a4..0cab29774ad 100644
--- a/cpp/src/Ice/TcpEndpointI.cpp
+++ b/cpp/src/Ice/TcpEndpointI.cpp
@@ -292,13 +292,13 @@ IceInternal::TcpEndpointI::transceiver(EndpointIPtr& endp) const
vector<ConnectorPtr>
IceInternal::TcpEndpointI::connectors() const
{
- vector<ConnectorPtr> connectors;
- vector<struct sockaddr_in> addresses = getAddresses(_host, _port);
- for(unsigned int i = 0; i < addresses.size(); ++i)
- {
- connectors.push_back(new TcpConnector(_instance, addresses[i], _timeout, _connectionId));
- }
- return connectors;
+ return connectors(getAddresses(_host, _port));
+}
+
+void
+IceInternal::TcpEndpointI::connectors_async(const EndpointI_connectorsPtr& callback) const
+{
+ _instance->endpointHostResolver()->resolve(_host, _port, const_cast<TcpEndpointI*>(this), callback);
}
AcceptorPtr
@@ -333,14 +333,14 @@ IceInternal::TcpEndpointI::expand() const
}
bool
-IceInternal::TcpEndpointI::equivalent(const ConnectorPtr& connector) const
+IceInternal::TcpEndpointI::equivalent(const EndpointIPtr& endpoint) const
{
- const TcpConnector* tcpConnector = dynamic_cast<const TcpConnector*>(connector.get());
- if(!tcpConnector)
+ const TcpEndpointI* tcpEndpointI = dynamic_cast<const TcpEndpointI*>(endpoint.get());
+ if(!tcpEndpointI)
{
return false;
}
- return tcpConnector->equivalent(_host, _port);
+ return tcpEndpointI->_host == _host && tcpEndpointI->_port == _port;
}
bool
@@ -453,6 +453,17 @@ IceInternal::TcpEndpointI::operator<(const EndpointI& r) const
return false;
}
+vector<ConnectorPtr>
+IceInternal::TcpEndpointI::connectors(const vector<struct sockaddr_in>& addresses) const
+{
+ vector<ConnectorPtr> connectors;
+ for(unsigned int i = 0; i < addresses.size(); ++i)
+ {
+ connectors.push_back(new TcpConnector(_instance, addresses[i], _timeout, _connectionId));
+ }
+ return connectors;
+}
+
IceInternal::TcpEndpointFactory::TcpEndpointFactory(const InstancePtr& instance)
: _instance(instance)
{
diff --git a/cpp/src/Ice/TcpEndpointI.h b/cpp/src/Ice/TcpEndpointI.h
index 7ea83d790d9..361d7150de8 100644
--- a/cpp/src/Ice/TcpEndpointI.h
+++ b/cpp/src/Ice/TcpEndpointI.h
@@ -39,9 +39,10 @@ public:
virtual bool unknown() const;
virtual TransceiverPtr transceiver(EndpointIPtr&) const;
virtual std::vector<ConnectorPtr> connectors() const;
+ virtual void connectors_async(const EndpointI_connectorsPtr&) const;
virtual AcceptorPtr acceptor(EndpointIPtr&, const std::string&) const;
virtual std::vector<EndpointIPtr> expand() const;
- virtual bool equivalent(const ConnectorPtr&) const;
+ virtual bool equivalent(const EndpointIPtr&) const;
virtual bool operator==(const EndpointI&) const;
virtual bool operator!=(const EndpointI&) const;
@@ -49,6 +50,8 @@ public:
private:
+ virtual std::vector<ConnectorPtr> connectors(const std::vector<struct sockaddr_in>&) const;
+
#if defined(__SUNPRO_CC)
//
// COMPILERFIX: prevent the compiler from emitting a warning about
diff --git a/cpp/src/Ice/TcpTransceiver.cpp b/cpp/src/Ice/TcpTransceiver.cpp
index 200778293c6..09f54e846fa 100644
--- a/cpp/src/Ice/TcpTransceiver.cpp
+++ b/cpp/src/Ice/TcpTransceiver.cpp
@@ -52,6 +52,11 @@ IceInternal::TcpTransceiver::close()
void
IceInternal::TcpTransceiver::shutdownWrite()
{
+ if(_state < StateConnected)
+ {
+ return;
+ }
+
if(_traceLevels->network >= 2)
{
Trace out(_logger, _traceLevels->networkCat);
@@ -65,6 +70,11 @@ IceInternal::TcpTransceiver::shutdownWrite()
void
IceInternal::TcpTransceiver::shutdownReadWrite()
{
+ if(_state < StateConnected)
+ {
+ return;
+ }
+
if(_traceLevels->network >= 2)
{
Trace out(_logger, _traceLevels->networkCat);
@@ -75,7 +85,7 @@ IceInternal::TcpTransceiver::shutdownReadWrite()
shutdownSocketReadWrite(_fd);
}
-void
+bool
IceInternal::TcpTransceiver::write(Buffer& buf, int timeout)
{
// Its impossible for the packetSize to be more than an Int.
@@ -118,6 +128,11 @@ IceInternal::TcpTransceiver::write(Buffer& buf, int timeout)
if(wouldBlock())
{
+ if(timeout == 0)
+ {
+ return false;
+ }
+
repeatSelect:
int rs;
@@ -194,9 +209,11 @@ IceInternal::TcpTransceiver::write(Buffer& buf, int timeout)
packetSize = static_cast<int>(buf.b.end() - buf.i);
}
}
+
+ return true;
}
-void
+bool
IceInternal::TcpTransceiver::read(Buffer& buf, int timeout)
{
// Its impossible for the packetSize to be more than an Int.
@@ -240,6 +257,11 @@ IceInternal::TcpTransceiver::read(Buffer& buf, int timeout)
if(wouldBlock())
{
+ if(timeout == 0)
+ {
+ return false;
+ }
+
repeatSelect:
int rs;
@@ -324,6 +346,8 @@ IceInternal::TcpTransceiver::read(Buffer& buf, int timeout)
packetSize = static_cast<int>(buf.b.end() - buf.i);
}
}
+
+ return true;
}
string
@@ -338,9 +362,27 @@ IceInternal::TcpTransceiver::toString() const
return _desc;
}
-void
-IceInternal::TcpTransceiver::initialize(int)
+SocketStatus
+IceInternal::TcpTransceiver::initialize(int timeout)
{
+ if(_state == StateNeedConnect && timeout == 0)
+ {
+ _state = StateConnectPending;
+ return NeedConnect;
+ }
+ else if(_state <= StateConnectPending)
+ {
+ doFinishConnect(_fd, timeout);
+ _state = StateConnected;
+ _desc = fdToString(_fd);
+ if(_traceLevels->network >= 1)
+ {
+ Trace out(_logger, _traceLevels->networkCat);
+ out << "tcp connection established\n" << _desc;
+ }
+ }
+ assert(_state == StateConnected);
+ return Finished;
}
void
@@ -352,12 +394,13 @@ IceInternal::TcpTransceiver::checkSendSize(const Buffer& buf, size_t messageSize
}
}
-IceInternal::TcpTransceiver::TcpTransceiver(const InstancePtr& instance, SOCKET fd) :
+IceInternal::TcpTransceiver::TcpTransceiver(const InstancePtr& instance, SOCKET fd, bool connected) :
_traceLevels(instance->traceLevels()),
_logger(instance->initializationData().logger),
_stats(instance->initializationData().stats),
_fd(fd),
- _desc(fdToString(fd))
+ _state(connected ? StateConnected : StateNeedConnect),
+ _desc(fdToString(_fd))
{
FD_ZERO(&_rFdSet);
FD_ZERO(&_wFdSet);
diff --git a/cpp/src/Ice/TcpTransceiver.h b/cpp/src/Ice/TcpTransceiver.h
index fe4f78d1724..e86464df408 100644
--- a/cpp/src/Ice/TcpTransceiver.h
+++ b/cpp/src/Ice/TcpTransceiver.h
@@ -24,22 +24,29 @@ class TcpAcceptor;
class TcpTransceiver : public Transceiver
{
+ enum State
+ {
+ StateNeedConnect,
+ StateConnectPending,
+ StateConnected
+ };
+
public:
virtual SOCKET fd();
virtual void close();
virtual void shutdownWrite();
virtual void shutdownReadWrite();
- virtual void write(Buffer&, int);
- virtual void read(Buffer&, int);
+ virtual bool write(Buffer&, int);
+ virtual bool read(Buffer&, int);
virtual std::string type() const;
virtual std::string toString() const;
- virtual void initialize(int);
+ virtual SocketStatus initialize(int);
virtual void checkSendSize(const Buffer&, size_t);
private:
- TcpTransceiver(const InstancePtr&, SOCKET);
+ TcpTransceiver(const InstancePtr&, SOCKET, bool);
virtual ~TcpTransceiver();
friend class TcpConnector;
friend class TcpAcceptor;
@@ -51,8 +58,8 @@ private:
SOCKET _fd;
fd_set _rFdSet;
fd_set _wFdSet;
-
- const std::string _desc;
+ State _state;
+ std::string _desc;
#ifdef _WIN32
int _maxPacketSize;
#endif
diff --git a/cpp/src/Ice/ThreadPool.cpp b/cpp/src/Ice/ThreadPool.cpp
index 9d2cd3bff6a..3f192fe2e7e 100644
--- a/cpp/src/Ice/ThreadPool.cpp
+++ b/cpp/src/Ice/ThreadPool.cpp
@@ -29,8 +29,7 @@ IceInternal::ThreadPool::ThreadPool(const InstancePtr& instance, const string& p
_instance(instance),
_destroyed(false),
_prefix(prefix),
- _lastFd(INVALID_SOCKET),
- _timeout(timeout),
+ _selector(instance, timeout),
_size(0),
_sizeMax(0),
_sizeWarn(0),
@@ -41,59 +40,6 @@ IceInternal::ThreadPool::ThreadPool(const InstancePtr& instance, const string& p
_promote(true),
_warnUdp(_instance->initializationData().properties->getPropertyAsInt("Ice.Warn.Datagrams") > 0)
{
- SOCKET fds[2];
- createPipe(fds);
- _fdIntrRead = fds[0];
- _fdIntrWrite = fds[1];
- setBlock(_fdIntrRead, false);
- _maxFd = _fdIntrRead;
- _minFd = _fdIntrRead;
-
-#if defined(_WIN32)
- _fdsInUse = 1; // _fdIntrRead is always in use.
- FD_ZERO(&_fdSet);
- FD_SET(_fdIntrRead, &_fdSet);
-#elif defined(ICE_USE_EPOLL)
- _epollFd = epoll_create(1);
- if(_epollFd < 0)
- {
- SocketException ex(__FILE__, __LINE__);
- ex.error = getSocketErrno();
- throw ex;
- }
- _events.resize(1);
- struct epoll_event event;
- event.events = EPOLLIN;
- event.data.fd = _fdIntrRead;
- if(epoll_ctl(_epollFd, EPOLL_CTL_ADD, _fdIntrRead, &event) != 0)
- {
- SocketException ex(__FILE__, __LINE__);
- ex.error = getSocketErrno();
- throw ex;
- }
-#elif defined(__APPLE__)
- _kqueueFd = kqueue();
- if(_kqueueFd < 0)
- {
- SocketException ex(__FILE__, __LINE__);
- ex.error = getSocketErrno();
- throw ex;
- }
- _events.resize(1);
- struct kevent event;
- EV_SET(&event, _fdIntrRead, EVFILT_READ, EV_ADD, 0, 0, 0);
- if(kevent(_kqueueFd, &event, 1, 0, 0, 0) < 0)
- {
- SocketException ex(__FILE__, __LINE__);
- ex.error = getSocketErrno();
- throw ex;
- }
-#else
- _pollFdSet.resize(1);
- _pollFdSet[0].fd = _fdIntrRead;
- _pollFdSet[0].events = POLLIN;
-#endif
-
//
// We use just one thread as the default. This is the fastest
// possible setting, still allows one level of nesting, and
@@ -172,48 +118,6 @@ IceInternal::ThreadPool::ThreadPool(const InstancePtr& instance, const string& p
IceInternal::ThreadPool::~ThreadPool()
{
assert(_destroyed);
-
- try
- {
- closeSocket(_fdIntrWrite);
- }
- catch(const LocalException& ex)
- {
- Error out(_instance->initializationData().logger);
- out << "exception in `" << _prefix << "' while calling closeSocket():\n" << ex;
- }
-
- try
- {
- closeSocket(_fdIntrRead);
- }
- catch(const LocalException& ex)
- {
- Error out(_instance->initializationData().logger);
- out << "exception in `" << _prefix << "' while calling closeSocket():\n" << ex;
- }
-
-#if defined(ICE_USE_EPOLL)
- try
- {
- closeSocket(_epollFd);
- }
- catch(const LocalException& ex)
- {
- Error out(_instance->initializationData().logger);
- out << "exception in `" << _prefix << "' while calling closeSocket():\n" << ex;
- }
-#elif defined(__APPLE__)
- try
- {
- closeSocket(_kqueueFd);
- }
- catch(const LocalException& ex)
- {
- Error out(_instance->initializationData().logger);
- out << "exception in `" << _prefix << "' while calling closeSocket():\n" << ex;
- }
-#endif
}
void
@@ -223,8 +127,9 @@ IceInternal::ThreadPool::destroy()
assert(!_destroyed);
assert(_handlerMap.empty());
assert(_changes.empty());
+ assert(_workItems.empty());
_destroyed = true;
- setInterrupt();
+ _selector.setInterrupt();
}
void
@@ -234,20 +139,7 @@ IceInternal::ThreadPool::incFdsInUse()
// that doesn't have a specific FD limit.
#ifdef _WIN32
IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this);
- assert(!_destroyed);
- if(_fdsInUse + 1 > FD_SETSIZE)
- {
- Warning warn(_instance->initializationData().logger);
- warn << "maximum number of connections exceeded";
-
- //
- // No appropriate errno.
- //
- SocketException ex(__FILE__, __LINE__);
- ex.error = 0;
- throw ex;
- }
- ++_fdsInUse;
+ _selector.incFdsInUse();
#endif
}
@@ -258,14 +150,7 @@ IceInternal::ThreadPool::decFdsInUse()
// that doesn't have a specific FD limit.
#ifdef _WIN32
IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this);
- assert(!_destroyed);
- if(_fdsInUse <= 1)
- {
- Trace trace(_instance->initializationData().logger, "ThreadPool");
- trace << _prefix << ": about to assert";
- }
- assert(_fdsInUse > 1); // _fdIntrRead is always in use.
- --_fdsInUse;
+ _selector.decFdsInUse();
#endif
}
@@ -275,7 +160,7 @@ IceInternal::ThreadPool::_register(SOCKET fd, const EventHandlerPtr& handler)
IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this);
assert(!_destroyed);
_changes.push_back(make_pair(fd, handler));
- setInterrupt();
+ _selector.setInterrupt();
}
void
@@ -284,7 +169,16 @@ IceInternal::ThreadPool::unregister(SOCKET fd)
IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this);
assert(!_destroyed);
_changes.push_back(make_pair(fd, EventHandlerPtr(0)));
- setInterrupt();
+ _selector.setInterrupt();
+}
+
+void
+IceInternal::ThreadPool::execute(const ThreadPoolWorkItemPtr& workItem)
+{
+ IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this);
+ assert(!_destroyed);
+ _workItems.push_back(workItem);
+ _selector.setInterrupt();
}
void
@@ -352,74 +246,6 @@ IceInternal::ThreadPool::prefix() const
return _prefix;
}
-void
-IceInternal::ThreadPool::clearInterrupt()
-{
- char c;
-
-repeat:
-
-#ifdef _WIN32
- if(::recv(_fdIntrRead, &c, 1, 0) == SOCKET_ERROR)
- {
- if(interrupted())
- {
- goto repeat;
- }
-
- SocketException ex(__FILE__, __LINE__);
- ex.error = getSocketErrno();
- throw ex;
- }
-#else
- if(::read(_fdIntrRead, &c, 1) == -1)
- {
- if(interrupted())
- {
- goto repeat;
- }
-
- SyscallException ex(__FILE__, __LINE__);
- ex.error = getSystemErrno();
- throw ex;
- }
-#endif
-}
-
-void
-IceInternal::ThreadPool::setInterrupt()
-{
- char c = 0;
-
-repeat:
-
-#ifdef _WIN32
- if(::send(_fdIntrWrite, &c, 1, 0) == SOCKET_ERROR)
- {
- if(interrupted())
- {
- goto repeat;
- }
-
- SocketException ex(__FILE__, __LINE__);
- ex.error = getSocketErrno();
- throw ex;
- }
-#else
- if(::write(_fdIntrWrite, &c, 1) == -1)
- {
- if(interrupted())
- {
- goto repeat;
- }
-
- SyscallException ex(__FILE__, __LINE__);
- ex.error = getSystemErrno();
- throw ex;
- }
-#endif
-}
-
bool
IceInternal::ThreadPool::run()
{
@@ -440,54 +266,19 @@ IceInternal::ThreadPool::run()
while(true)
{
int ret;
-#if defined(_WIN32)
- fd_set fdSet;
- memcpy(&fdSet, &_fdSet, sizeof(fd_set));
- if(_timeout > 0)
- {
- struct timeval tv;
- tv.tv_sec = _timeout;
- tv.tv_usec = 0;
- ret = ::select(static_cast<int>(_maxFd + 1), &fdSet, 0, 0, &tv);
- }
- else
- {
- ret = ::select(static_cast<int>(_maxFd + 1), &fdSet, 0, 0, 0);
- }
-#elif defined(ICE_USE_EPOLL)
- ret = epoll_wait(_epollFd, &_events[0], _events.size(), _timeout > 0 ? _timeout * 1000 : -1);
-#elif defined(__APPLE__)
- if(_timeout > 0)
+ try
{
- struct timespec ts;
- ts.tv_sec = _timeout;
- ts.tv_nsec = 0;
- ret = kevent(_kqueueFd, 0, 0, &_events[0], _events.size(), &ts);
+ ret = _selector.select();
}
- else
+ catch(const Ice::LocalException& ex)
{
- ret = kevent(_kqueueFd, 0, 0, &_events[0], _events.size(), 0);
- }
-#else
- ret = poll(&_pollFdSet[0], _pollFdSet.size(), _timeout > 0 ? _timeout * 1000 : -1);
-#endif
-
- if(ret == SOCKET_ERROR)
- {
- if(interrupted())
- {
- continue;
- }
-
- SocketException ex(__FILE__, __LINE__);
- ex.error = getSocketErrno();
- //throw ex;
Error out(_instance->initializationData().logger);
out << "exception in `" << _prefix << "':\n" << ex;
continue;
}
-
+
EventHandlerPtr handler;
+ ThreadPoolWorkItemPtr workItem;
bool finished = false;
bool shutdown = false;
@@ -496,38 +287,11 @@ IceInternal::ThreadPool::run()
if(ret == 0) // We initiate a shutdown if there is a thread pool timeout.
{
- assert(_timeout > 0);
- _timeout = 0;
shutdown = true;
}
else
{
- bool interrupted = false;
-#if defined(_WIN32)
- interrupted = FD_ISSET(_fdIntrRead, &fdSet);
-#elif defined(ICE_USE_EPOLL)
- for(int i = 0; i < ret; ++i)
- {
- if(_events[i].data.fd == _fdIntrRead)
- {
- interrupted = true;
- break;
- }
- }
-#elif defined(__APPLE__)
- for(int i = 0; i < ret; ++i)
- {
- if(_events[i].ident == static_cast<unsigned int>(_fdIntrRead))
- {
- interrupted = true;
- break;
- }
- }
-#else
- assert(_pollFdSet[0].fd == _fdIntrRead);
- interrupted = _pollFdSet[0].revents != 0;
-#endif
- if(interrupted)
+ if(_selector.isInterrupted())
{
//
// There are two possiblities for an interrupt:
@@ -536,7 +300,9 @@ IceInternal::ThreadPool::run()
//
// 2. An event handler was registered or unregistered.
//
-
+ // 3. A work item has been schedulded.
+ //
+
//
// Thread pool destroyed?
//
@@ -549,169 +315,52 @@ IceInternal::ThreadPool::run()
return true;
}
- clearInterrupt();
+ _selector.clearInterrupt();
//
// An event handler must have been registered or
// unregistered.
//
- assert(!_changes.empty());
- pair<SOCKET, EventHandlerPtr> change = _changes.front();
- _changes.pop_front();
-
- if(change.second) // Addition if handler is set.
+ if(_changes.empty())
{
- _handlerMap.insert(change);
-#if defined(_WIN32)
- FD_SET(change.first, &_fdSet);
-#elif defined(ICE_USE_EPOLL)
- epoll_event event;
- event.events = EPOLLIN;
- event.data.fd = change.first;
- if(epoll_ctl(_epollFd, EPOLL_CTL_ADD, change.first, &event) != 0)
- {
- Error out(_instance->initializationData().logger);
- out << "error while adding filedescriptor to epoll set:\n";
- out << errorToString(getSocketErrno());
- continue;
- }
- _events.resize(_handlerMap.size() + 1);
-#elif defined(__APPLE__)
- struct kevent event;
- EV_SET(&event, change.first, EVFILT_READ, EV_ADD, 0, 0, 0);
- if(kevent(_kqueueFd, &event, 1, 0, 0, 0) < 0)
- {
- Error out(_instance->initializationData().logger);
- out << "error while adding filedescriptor to kqueue:\n";
- out << errorToString(getSocketErrno());
- continue;
- }
- _events.resize(_handlerMap.size() + 1);
-#else
- struct pollfd pollFd;
- pollFd.fd = change.first;
- pollFd.events = POLLIN;
- _pollFdSet.push_back(pollFd);
-#endif
- _maxFd = max(_maxFd, change.first);
- _minFd = min(_minFd, change.first);
- continue;
+ assert(!_workItems.empty());
+ workItem = _workItems.front();
+ _workItems.pop_front();
}
- else // Removal if handler is not set.
+ else
{
- map<SOCKET, EventHandlerPtr>::iterator p = _handlerMap.find(change.first);
- assert(p != _handlerMap.end());
- handler = p->second;
- finished = true;
- _handlerMap.erase(p);
-#if defined(_WIN32)
- FD_CLR(change.first, &_fdSet);
-#elif defined(ICE_USE_EPOLL)
- epoll_event event;
- event.events = 0;
- if(epoll_ctl(_epollFd, EPOLL_CTL_DEL, change.first, &event) != 0)
+ assert(!_changes.empty());
+ pair<SOCKET, EventHandlerPtr> change = _changes.front();
+ _changes.pop_front();
+
+ if(change.second) // Addition if handler is set.
{
- Error out(_instance->initializationData().logger);
- out << "error while adding filedescriptor from epoll set:\n";
- out << errorToString(getSocketErrno());
+ _handlerMap.insert(change);
+ _selector.add(change.first, NeedRead);
continue;
}
- _events.resize(_handlerMap.size() + 1);
-#elif defined(__APPLE__)
- struct kevent event;
- EV_SET(&event, change.first, EVFILT_READ, EV_DELETE, 0, 0, 0);
- if(kevent(_kqueueFd, &event, 1, 0, 0, 0) < 0)
- {
- Error out(_instance->initializationData().logger);
- out << "error while removing filedescriptor from kqueue:\n";
- out << errorToString(getSocketErrno());
- continue;
- }
- _events.resize(_handlerMap.size() + 1);
-#else
- for(vector<struct pollfd>::iterator p = _pollFdSet.begin(); p != _pollFdSet.end(); ++p)
- {
- if(p->fd == change.first)
- {
- _pollFdSet.erase(p);
- break;
- }
- }
-#endif
- _maxFd = _fdIntrRead;
- _minFd = _fdIntrRead;
- if(!_handlerMap.empty())
+ else // Removal if handler is not set.
{
- _maxFd = max(_maxFd, (--_handlerMap.end())->first);
- _minFd = min(_minFd, _handlerMap.begin()->first);
+ map<SOCKET, EventHandlerPtr>::iterator p = _handlerMap.find(change.first);
+ assert(p != _handlerMap.end());
+ handler = p->second;
+ finished = true;
+ _handlerMap.erase(p);
+ _selector.remove(change.first, NeedRead);
+ // Don't continue; we have to call
+ // finished() on the event handler below, outside
+ // the thread synchronization.
}
- // Don't continue; we have to call
- // finished() on the event handler below, outside
- // the thread synchronization.
}
}
else
{
- //
- // Round robin for the filedescriptors.
- //
- SOCKET largerFd = _maxFd + 1;
- SOCKET smallestFd = _maxFd + 1;
-#if defined(_WIN32)
- if(fdSet.fd_count == 0)
- {
- Error out(_instance->initializationData().logger);
- out << "select() in `" << _prefix << "' returned " << ret
- << " but no filedescriptor is readable";
- continue;
- }
- for(u_short i = 0; i < fdSet.fd_count; ++i)
- {
- SOCKET fd = fdSet.fd_array[i];
-#elif defined(ICE_USE_EPOLL)
- for(int i = 0; i < ret; ++i)
- {
- SOCKET fd = _events[i].data.fd;
-#elif defined(__APPLE__)
- for(int i = 0; i < ret; ++i)
- {
- SOCKET fd = _events[i].ident;
-#else
- for(vector<struct pollfd>::const_iterator p = _pollFdSet.begin(); p != _pollFdSet.end(); ++p)
- {
- if(p->revents == 0)
- {
- continue;
- }
- SOCKET fd = p->fd;
-#endif
- assert(fd != INVALID_SOCKET);
- if(fd > _lastFd || _lastFd == INVALID_SOCKET)
- {
- largerFd = min(largerFd, fd);
- }
-
- smallestFd = min(smallestFd, fd);
- }
-#ifdef never // To match ICE_USE_EPOLL __APPLE
- }}}
-#endif
- if(largerFd <= _maxFd)
- {
- assert(largerFd >= _minFd);
- _lastFd = largerFd;
- }
- else
- {
- assert(smallestFd >= _minFd && smallestFd <= _maxFd);
- _lastFd = smallestFd;
- }
- assert(_lastFd != _fdIntrRead);
- map<SOCKET, EventHandlerPtr>::iterator p = _handlerMap.find(_lastFd);
+ SOCKET fd = _selector.getNextSelected();
+ map<SOCKET, EventHandlerPtr>::iterator p = _handlerMap.find(fd);
if(p == _handlerMap.end())
{
Error out(_instance->initializationData().logger);
- out << "filedescriptor " << _lastFd << " not registered with `" << _prefix << "'";
+ out << "filedescriptor " << fd << " not registered with `" << _prefix << "'";
continue;
}
@@ -747,6 +396,29 @@ IceInternal::ThreadPool::run()
// promoteFollower().
//
}
+ else if(workItem)
+ {
+ try
+ {
+ //
+ // "self" is faster than "this", as the reference
+ // count is not modified.
+ //
+ workItem->execute(self);
+ }
+ catch(const LocalException& ex)
+ {
+ Error out(_instance->initializationData().logger);
+ out << "exception in `" << _prefix << "' while calling execute():\n" << ex;
+ }
+
+ //
+ // No "continue", because we want execute() to be
+ // called in its own thread from this pool. Note that
+ // this means that execute() must call
+ // promoteFollower().
+ //
+ }
else
{
assert(handler);
@@ -790,10 +462,14 @@ IceInternal::ThreadPool::run()
{
try
{
- read(handler);
+ if(!read(handler))
+ {
+ continue; // Can't read without blocking.
+ }
}
- catch(const TimeoutException&) // Expected.
+ catch(const TimeoutException&)
{
+ assert(false); // This shouldn't occur as we only perform non-blocking reads.
continue;
}
catch(const DatagramLimitException&) // Expected.
@@ -809,8 +485,7 @@ IceInternal::ThreadPool::run()
{
if(handler->datagram())
{
- if(_instance->initializationData().properties->
- getPropertyAsInt("Ice.Warn.Connections") > 0)
+ if(_instance->initializationData().properties->getPropertyAsInt("Ice.Warn.Connections") > 0)
{
Warning out(_instance->initializationData().logger);
out << "datagram connection exception:\n" << ex << '\n' << handler->toString();
@@ -939,7 +614,7 @@ IceInternal::ThreadPool::run()
}
}
-void
+bool
IceInternal::ThreadPool::read(const EventHandlerPtr& handler)
{
BasicStream& stream = handler->_stream;
@@ -952,7 +627,10 @@ IceInternal::ThreadPool::read(const EventHandlerPtr& handler)
if(stream.i != stream.b.end())
{
- handler->read(stream);
+ if(!handler->read(stream))
+ {
+ return false;
+ }
assert(stream.i == stream.b.end());
}
@@ -1036,10 +714,15 @@ IceInternal::ThreadPool::read(const EventHandlerPtr& handler)
}
else
{
- handler->read(stream);
+ if(!handler->read(stream))
+ {
+ return false;
+ }
assert(stream.i == stream.b.end());
}
}
+
+ return true;
}
IceInternal::ThreadPool::EventHandlerThread::EventHandlerThread(const ThreadPoolPtr& pool) :
diff --git a/cpp/src/Ice/ThreadPool.h b/cpp/src/Ice/ThreadPool.h
index 7f7aae48e19..9e520d60ec9 100644
--- a/cpp/src/Ice/ThreadPool.h
+++ b/cpp/src/Ice/ThreadPool.h
@@ -15,31 +15,15 @@
#include <IceUtil/Monitor.h>
#include <IceUtil/Thread.h>
+#include <Ice/Config.h>
#include <Ice/ThreadPoolF.h>
#include <Ice/InstanceF.h>
#include <Ice/LoggerF.h>
#include <Ice/PropertiesF.h>
#include <Ice/EventHandlerF.h>
+#include <Ice/Selector.h>
#include <list>
-#if defined(__linux) && !defined(ICE_NO_EPOLL)
-# define ICE_USE_EPOLL 1
-#endif
-
-#if defined(_WIN32)
-# include <winsock2.h>
-#else
-# define SOCKET int
-# if defined(ICE_USE_EPOLL)
-# include <sys/epoll.h>
-# elif defined(__APPLE__)
-# include <sys/event.h>
-# else
-# include <sys/poll.h>
-# endif
-#endif
-
-
namespace IceInternal
{
@@ -59,6 +43,7 @@ public:
void _register(SOCKET, const EventHandlerPtr&);
void unregister(SOCKET);
+ void execute(const ThreadPoolWorkItemPtr&);
void promoteFollower();
void joinWithAllThreads();
@@ -66,40 +51,19 @@ public:
private:
- void clearInterrupt();
- void setInterrupt();
-
bool run(); // Returns true if a follower should be promoted.
- void read(const EventHandlerPtr&);
+ bool read(const EventHandlerPtr&);
InstancePtr _instance;
bool _destroyed;
const std::string _prefix;
- SOCKET _maxFd;
- SOCKET _minFd;
- SOCKET _lastFd;
- SOCKET _fdIntrRead;
- SOCKET _fdIntrWrite;
-#if defined(_WIN32)
- fd_set _fdSet;
- int _fdsInUse;
-#elif defined(ICE_USE_EPOLL)
- int _epollFd;
- std::vector<struct epoll_event> _events;
-#elif defined(__APPLE__)
- int _kqueueFd;
- std::vector<struct kevent> _events;
-#else
- std::vector<struct pollfd> _pollFdSet;
-#endif
+ Selector _selector;
std::list<std::pair<SOCKET, EventHandlerPtr> > _changes; // Event handler set for addition; null for removal.
-
+ std::list<ThreadPoolWorkItemPtr> _workItems;
std::map<SOCKET, EventHandlerPtr> _handlerMap;
- int _timeout;
-
class EventHandlerThread : public IceUtil::Thread
{
public:
diff --git a/cpp/src/Ice/TraceUtil.cpp b/cpp/src/Ice/TraceUtil.cpp
index cb371f4e35a..b8c4d1f10b1 100644
--- a/cpp/src/Ice/TraceUtil.cpp
+++ b/cpp/src/Ice/TraceUtil.cpp
@@ -44,6 +44,26 @@ printIdentityFacetOperation(ostream& s, BasicStream& stream)
s << "\noperation = " << operation;
}
+static string
+getMessageTypeAsString(Byte type)
+{
+ switch(type)
+ {
+ case requestMsg:
+ return "request";
+ case requestBatchMsg:
+ return "batch request";
+ case replyMsg:
+ return "reply";
+ case closeConnectionMsg:
+ return "close connection";
+ case validateConnectionMsg:
+ return "validate connection";
+ default:
+ return "unknown";
+ }
+}
+
static void
printRequestHeader(ostream& s, BasicStream& stream)
{
@@ -95,7 +115,7 @@ printRequestHeader(ostream& s, BasicStream& stream)
}
}
-static void
+static Byte
printHeader(ostream& s, BasicStream& stream)
{
Byte magicNumber;
@@ -120,105 +140,238 @@ printHeader(ostream& s, BasicStream& stream)
Byte type;
stream.read(type);
- s << "\nmessage type = " << static_cast<int>(type) << ' ';
+ s << "\nmessage type = " << static_cast<int>(type) << " (" << getMessageTypeAsString(type) << ')';
- switch(type)
+ Byte compress;
+ stream.read(compress);
+ s << "\ncompression status = " << static_cast<int>(compress) << ' ';
+
+ switch(compress)
{
- case requestMsg:
+ case 0:
{
- s << "(request)";
+ s << "(not compressed; do not compress response, if any)";
break;
}
- case requestBatchMsg:
+ case 1:
{
- s << "(batch request)";
+ s << "(not compressed; compress response, if any)";
break;
}
- case replyMsg:
+ case 2:
{
- s << "(reply)";
+ s << "(compressed; compress response, if any)";
break;
}
- case closeConnectionMsg:
+ default:
{
- s << "(close connection)";
+ s << "(unknown)";
break;
}
+ }
- case validateConnectionMsg:
+ Int size;
+ stream.read(size);
+ s << "\nmessage size = " << size;
+
+ return type;
+}
+
+static void
+printRequest(ostream& s, BasicStream& stream)
+{
+ Int requestId;
+ stream.read(requestId);
+ s << "\nrequest id = " << requestId;
+ if(requestId == 0)
+ {
+ s << " (oneway)";
+ }
+
+ printRequestHeader(s, stream);
+}
+
+static void
+printBatchRequest(ostream& s, BasicStream& stream)
+{
+ int batchRequestNum;
+ stream.read(batchRequestNum);
+ s << "\nnumber of requests = " << batchRequestNum;
+
+ for(int i = 0; i < batchRequestNum; ++i)
+ {
+ s << "\nrequest #" << i << ':';
+ printRequestHeader(s, stream);
+ stream.skipEncaps();
+ }
+}
+
+static void
+printReply(ostream& s, BasicStream& stream)
+{
+ Int requestId;
+ stream.read(requestId);
+ s << "\nrequest id = " << requestId;
+
+ Byte replyStatus;
+ stream.read(replyStatus);
+ s << "\nreply status = " << static_cast<int>(replyStatus) << ' ';
+ switch(replyStatus)
+ {
+ case replyOK:
+ {
+ s << "(ok)";
+ break;
+ }
+
+ case replyUserException:
+ {
+ s << "(user exception)";
+ break;
+ }
+
+ case replyObjectNotExist:
+ case replyFacetNotExist:
+ case replyOperationNotExist:
+ {
+ switch(replyStatus)
+ {
+ case replyObjectNotExist:
+ {
+ s << "(object not exist)";
+ break;
+ }
+
+ case replyFacetNotExist:
+ {
+ s << "(facet not exist)";
+ break;
+ }
+
+ case replyOperationNotExist:
{
- s << "(validate connection)";
+ s << "(operation not exist)";
break;
}
default:
{
- s << "(unknown)";
+ assert(false);
break;
}
- }
+ }
- Byte compress;
- stream.read(compress);
- s << "\ncompression status = " << static_cast<int>(compress) << ' ';
+ printIdentityFacetOperation(s, stream);
+ break;
+ }
- switch(compress)
+ case replyUnknownException:
+ case replyUnknownLocalException:
+ case replyUnknownUserException:
{
- case 0:
+ switch(replyStatus)
{
- s << "(not compressed; do not compress response, if any)";
+ case replyUnknownException:
+ {
+ s << "(unknown exception)";
break;
}
- case 1:
+ case replyUnknownLocalException:
{
- s << "(not compressed; compress response, if any)";
+ s << "(unknown local exception)";
break;
}
- case 2:
+ case replyUnknownUserException:
{
- s << "(compressed; compress response, if any)";
+ s << "(unknown user exception)";
break;
}
default:
{
- s << "(unknown)";
+ assert(false);
break;
}
+ }
+
+ string unknown;
+ stream.read(unknown, false);
+ s << "\nunknown = " << unknown;
+ break;
}
- Int size;
- stream.read(size);
- s << "\nmessage size = " << size;
+ default:
+ {
+ s << "(unknown)";
+ break;
+ }
+ }
}
-void
-IceInternal::traceHeader(const char* heading, const BasicStream& str, const LoggerPtr& logger,
- const TraceLevelsPtr& tl)
+static Byte
+printMessage(ostream& s, BasicStream& stream)
{
- if(tl->protocol >= 1)
+ Byte type = printHeader(s, stream);
+
+ switch(type)
{
- BasicStream& stream = const_cast<BasicStream&>(str);
- BasicStream::Container::iterator p = stream.i;
- stream.i = stream.b.begin();
+ case closeConnectionMsg:
+ case validateConnectionMsg:
+ {
+ // We're done.
+ break;
+ }
+
+ case requestMsg:
+ {
+ printRequest(s, stream);
+ break;
+ }
+
+ case requestBatchMsg:
+ {
+ printBatchRequest(s, stream);
+ break;
+ }
+
+ case replyMsg:
+ {
+ printReply(s, stream);
+ break;
+ }
+
+ default:
+ {
+ break;
+ }
+ }
- ostringstream s;
- s << heading;
- printHeader(s, stream);
+ return type;
+}
- logger->trace(tl->protocolCat, s.str());
- stream.i = p;
+static IceUtil::StaticMutex slicingMutex = ICE_STATIC_MUTEX_INITIALIZER;
+
+void
+IceInternal::traceSlicing(const char* kind, const string& typeId, const char* slicingCat, const LoggerPtr& logger)
+{
+ IceUtil::StaticMutex::Lock lock(slicingMutex);
+ static set<string> slicingIds;
+ if(slicingIds.insert(typeId).second)
+ {
+ string s("unknown ");
+ s += kind;
+ s += " type `" + typeId + "'";
+ logger->trace(slicingCat, s);
}
}
void
-IceInternal::traceRequest(const char* heading, const BasicStream& str, const LoggerPtr& logger,
- const TraceLevelsPtr& tl)
+IceInternal::traceSend(const BasicStream& str, const LoggerPtr& logger, const TraceLevelsPtr& tl)
{
if(tl->protocol >= 1)
{
@@ -227,27 +380,15 @@ IceInternal::traceRequest(const char* heading, const BasicStream& str, const Log
stream.i = stream.b.begin();
ostringstream s;
- s << heading;
- printHeader(s, stream);
+ Byte type = printMessage(s, stream);
- Int requestId;
- stream.read(requestId);
- s << "\nrequest id = " << requestId;
- if(requestId == 0)
- {
- s << " (oneway)";
- }
-
- printRequestHeader(s, stream);
-
- logger->trace(tl->protocolCat, s.str());
+ logger->trace(tl->protocolCat, "sending " + getMessageTypeAsString(type) + " " + s.str());
stream.i = p;
}
}
void
-IceInternal::traceBatchRequest(const char* heading, const BasicStream& str, const LoggerPtr& logger,
- const TraceLevelsPtr& tl)
+IceInternal::traceRecv(const BasicStream& str, const LoggerPtr& logger, const TraceLevelsPtr& tl)
{
if(tl->protocol >= 1)
{
@@ -256,28 +397,15 @@ IceInternal::traceBatchRequest(const char* heading, const BasicStream& str, cons
stream.i = stream.b.begin();
ostringstream s;
- s << heading;
- printHeader(s, stream);
+ Byte type = printMessage(s, stream);
- int batchRequestNum;
- stream.read(batchRequestNum);
- s << "\nnumber of requests = " << batchRequestNum;
-
- for(int i = 0; i < batchRequestNum; ++i)
- {
- s << "\nrequest #" << i << ':';
- printRequestHeader(s, stream);
- stream.skipEncaps();
- }
-
- logger->trace(tl->protocolCat, s.str());
+ logger->trace(tl->protocolCat, "received " + getMessageTypeAsString(type) + " " + s.str());
stream.i = p;
}
}
void
-IceInternal::traceReply(const char* heading, const BasicStream& str, const LoggerPtr& logger,
- const TraceLevelsPtr& tl)
+IceInternal::trace(const char* heading, const BasicStream& str, const LoggerPtr& logger, const TraceLevelsPtr& tl)
{
if(tl->protocol >= 1)
{
@@ -287,125 +415,10 @@ IceInternal::traceReply(const char* heading, const BasicStream& str, const Logge
ostringstream s;
s << heading;
- printHeader(s, stream);
-
- Int requestId;
- stream.read(requestId);
- s << "\nrequest id = " << requestId;
-
- Byte replyStatus;
- stream.read(replyStatus);
- s << "\nreply status = " << static_cast<int>(replyStatus) << ' ';
- switch(replyStatus)
- {
- case replyOK:
- {
- s << "(ok)";
- break;
- }
-
- case replyUserException:
- {
- s << "(user exception)";
- break;
- }
-
- case replyObjectNotExist:
- case replyFacetNotExist:
- case replyOperationNotExist:
- {
- switch(replyStatus)
- {
- case replyObjectNotExist:
- {
- s << "(object not exist)";
- break;
- }
-
- case replyFacetNotExist:
- {
- s << "(facet not exist)";
- break;
- }
-
- case replyOperationNotExist:
- {
- s << "(operation not exist)";
- break;
- }
-
- default:
- {
- assert(false);
- break;
- }
- }
-
- printIdentityFacetOperation(s, stream);
- break;
- }
-
- case replyUnknownException:
- case replyUnknownLocalException:
- case replyUnknownUserException:
- {
- switch(replyStatus)
- {
- case replyUnknownException:
- {
- s << "(unknown exception)";
- break;
- }
-
- case replyUnknownLocalException:
- {
- s << "(unknown local exception)";
- break;
- }
-
- case replyUnknownUserException:
- {
- s << "(unknown user exception)";
- break;
- }
-
- default:
- {
- assert(false);
- break;
- }
- }
-
- string unknown;
- stream.read(unknown, false);
- s << "\nunknown = " << unknown;
- break;
- }
-
- default:
- {
- s << "(unknown)";
- break;
- }
- }
+ printMessage(s, stream);
logger->trace(tl->protocolCat, s.str());
stream.i = p;
}
}
-static IceUtil::StaticMutex slicingMutex = ICE_STATIC_MUTEX_INITIALIZER;
-
-void
-IceInternal::traceSlicing(const char* kind, const string& typeId, const char* slicingCat, const LoggerPtr& logger)
-{
- IceUtil::StaticMutex::Lock lock(slicingMutex);
- static set<string> slicingIds;
- if(slicingIds.insert(typeId).second)
- {
- string s("unknown ");
- s += kind;
- s += " type `" + typeId + "'";
- logger->trace(slicingCat, s);
- }
-}
diff --git a/cpp/src/Ice/TraceUtil.h b/cpp/src/Ice/TraceUtil.h
index d61af61e1eb..01db5958af0 100644
--- a/cpp/src/Ice/TraceUtil.h
+++ b/cpp/src/Ice/TraceUtil.h
@@ -18,10 +18,9 @@ namespace IceInternal
class BasicStream;
-void traceHeader(const char*, const BasicStream&, const ::Ice::LoggerPtr&, const TraceLevelsPtr&);
-void traceRequest(const char*, const BasicStream&, const ::Ice::LoggerPtr&, const TraceLevelsPtr&);
-void traceBatchRequest(const char*, const BasicStream&, const ::Ice::LoggerPtr&, const TraceLevelsPtr&);
-void traceReply(const char*, const BasicStream&, const ::Ice::LoggerPtr&, const TraceLevelsPtr&);
+void traceSend(const BasicStream&, const ::Ice::LoggerPtr&, const TraceLevelsPtr&);
+void traceRecv(const BasicStream&, const ::Ice::LoggerPtr&, const TraceLevelsPtr&);
+void trace(const char*, const BasicStream&, const ::Ice::LoggerPtr&, const TraceLevelsPtr&);
void traceSlicing(const char*, const ::std::string&, const char *, const ::Ice::LoggerPtr&);
}
diff --git a/cpp/src/Ice/Transceiver.h b/cpp/src/Ice/Transceiver.h
index 1e3d637c9f0..8670779213d 100644
--- a/cpp/src/Ice/Transceiver.h
+++ b/cpp/src/Ice/Transceiver.h
@@ -12,9 +12,10 @@
#include <IceUtil/Shared.h>
#include <Ice/TransceiverF.h>
+#include <Ice/Selector.h>
#ifdef _WIN32
-# include <winsock2.h>
+# include <winsock2.h>
typedef int ssize_t;
#else
# define SOCKET int
@@ -33,11 +34,11 @@ public:
virtual void close() = 0;
virtual void shutdownWrite() = 0;
virtual void shutdownReadWrite() = 0;
- virtual void write(Buffer&, int) = 0;
- virtual void read(Buffer&, int) = 0;
+ virtual bool write(Buffer&, int) = 0;
+ virtual bool read(Buffer&, int) = 0;
virtual std::string type() const = 0;
virtual std::string toString() const = 0;
- virtual void initialize(int) = 0;
+ virtual SocketStatus initialize(int) = 0;
virtual void checkSendSize(const Buffer&, size_t) = 0;
};
diff --git a/cpp/src/Ice/UdpConnector.cpp b/cpp/src/Ice/UdpConnector.cpp
index 128fca83447..05c202a8310 100644
--- a/cpp/src/Ice/UdpConnector.cpp
+++ b/cpp/src/Ice/UdpConnector.cpp
@@ -168,21 +168,6 @@ IceInternal::UdpConnector::operator<(const Connector& r) const
return compareAddress(_addr, p->_addr) == -1;
}
-bool
-IceInternal::UdpConnector::equivalent(const string& host, int port) const
-{
- struct sockaddr_in addr;
- try
- {
- getAddress(host, port, addr);
- }
- catch(const DNSException&)
- {
- return false;
- }
- return compareAddress(addr, _addr) == 0;
-}
-
IceInternal::UdpConnector::UdpConnector(const InstancePtr& instance, const struct sockaddr_in& addr,
const string& mcastInterface, int mcastTtl, Ice::Byte protocolMajor,
Ice::Byte protocolMinor, Ice::Byte encodingMajor, Ice::Byte encodingMinor,
diff --git a/cpp/src/Ice/UdpConnector.h b/cpp/src/Ice/UdpConnector.h
index fa33c3cb330..77d73bba277 100644
--- a/cpp/src/Ice/UdpConnector.h
+++ b/cpp/src/Ice/UdpConnector.h
@@ -28,6 +28,7 @@ class UdpConnector : public Connector
public:
virtual TransceiverPtr connect(int);
+
virtual Ice::Short type() const;
virtual std::string toString() const;
@@ -35,8 +36,6 @@ public:
virtual bool operator!=(const Connector&) const;
virtual bool operator<(const Connector&) const;
- bool equivalent(const std::string&, int) const;
-
private:
UdpConnector(const InstancePtr&, const struct sockaddr_in&, const std::string&, int, Ice::Byte, Ice::Byte,
diff --git a/cpp/src/Ice/UdpEndpointI.cpp b/cpp/src/Ice/UdpEndpointI.cpp
index 2668a589142..b5f4588714c 100644
--- a/cpp/src/Ice/UdpEndpointI.cpp
+++ b/cpp/src/Ice/UdpEndpointI.cpp
@@ -480,14 +480,13 @@ IceInternal::UdpEndpointI::transceiver(EndpointIPtr& endp) const
vector<ConnectorPtr>
IceInternal::UdpEndpointI::connectors() const
{
- vector<ConnectorPtr> connectors;
- vector<struct sockaddr_in> addresses = getAddresses(_host, _port);
- for(unsigned int i = 0; i < addresses.size(); ++i)
- {
- connectors.push_back(new UdpConnector(_instance, addresses[i], _mcastInterface, _mcastTtl, _protocolMajor,
- _protocolMinor, _encodingMajor, _encodingMinor, _connectionId));
- }
- return connectors;
+ return connectors(getAddresses(_host, _port));
+}
+
+void
+IceInternal::UdpEndpointI::connectors_async(const EndpointI_connectorsPtr& callback) const
+{
+ _instance->endpointHostResolver()->resolve(_host, _port, const_cast<UdpEndpointI*>(this), callback);
}
AcceptorPtr
@@ -522,14 +521,14 @@ IceInternal::UdpEndpointI::expand() const
}
bool
-IceInternal::UdpEndpointI::equivalent(const ConnectorPtr& connector) const
+IceInternal::UdpEndpointI::equivalent(const EndpointIPtr& endpoint) const
{
- const UdpConnector* udpConnector = dynamic_cast<const UdpConnector*>(connector.get());
- if(!udpConnector)
+ const UdpEndpointI* udpEndpointI = dynamic_cast<const UdpEndpointI*>(endpoint.get());
+ if(!udpEndpointI)
{
return false;
}
- return udpConnector->equivalent(_host, _port);
+ return udpEndpointI->_host == _host && udpEndpointI->_port == _port;
}
bool
@@ -726,6 +725,18 @@ IceInternal::UdpEndpointI::operator<(const EndpointI& r) const
return false;
}
+vector<ConnectorPtr>
+IceInternal::UdpEndpointI::connectors(const vector<struct sockaddr_in>& addresses) const
+{
+ vector<ConnectorPtr> connectors;
+ for(unsigned int i = 0; i < addresses.size(); ++i)
+ {
+ connectors.push_back(new UdpConnector(_instance, addresses[i], _mcastInterface, _mcastTtl, _protocolMajor,
+ _protocolMinor, _encodingMajor, _encodingMinor, _connectionId));
+ }
+ return connectors;
+}
+
IceInternal::UdpEndpointFactory::UdpEndpointFactory(const InstancePtr& instance)
: _instance(instance)
{
diff --git a/cpp/src/Ice/UdpEndpointI.h b/cpp/src/Ice/UdpEndpointI.h
index 80c33c873e2..07fb3daaf2d 100644
--- a/cpp/src/Ice/UdpEndpointI.h
+++ b/cpp/src/Ice/UdpEndpointI.h
@@ -40,9 +40,10 @@ public:
virtual bool unknown() const;
virtual TransceiverPtr transceiver(EndpointIPtr&) const;
virtual std::vector<ConnectorPtr> connectors() const;
+ virtual void connectors_async(const EndpointI_connectorsPtr&) const;
virtual AcceptorPtr acceptor(EndpointIPtr&, const std::string&) const;
virtual std::vector<EndpointIPtr> expand() const;
- virtual bool equivalent(const ConnectorPtr&) const;
+ virtual bool equivalent(const EndpointIPtr&) const;
virtual bool operator==(const EndpointI&) const;
virtual bool operator!=(const EndpointI&) const;
@@ -50,6 +51,8 @@ public:
private:
+ virtual std::vector<ConnectorPtr> connectors(const std::vector<struct sockaddr_in>&) const;
+
#if defined(__SUNPRO_CC)
//
// COMPILERFIX: prevent the compiler from emitting a warning about
diff --git a/cpp/src/Ice/UdpTransceiver.cpp b/cpp/src/Ice/UdpTransceiver.cpp
index 32ab7600c88..2736587f7a8 100644
--- a/cpp/src/Ice/UdpTransceiver.cpp
+++ b/cpp/src/Ice/UdpTransceiver.cpp
@@ -63,7 +63,7 @@ IceInternal::UdpTransceiver::shutdownReadWrite()
IceUtil::Mutex::Lock sync(_shutdownReadWriteMutex);
_shutdownReadWrite = true;
-#if defined(_WIN32) || defined(__sun) || defined(__hppa) || defined(_AIX)
+#if defined(_WIN32) || defined(__sun) || defined(__hppa) || defined(_AIX) || defined(__APPLE__)
//
// On certain platforms, we have to explicitly wake up a thread blocked in
// select(). This is only relevant when using thread per connection.
@@ -105,8 +105,8 @@ IceInternal::UdpTransceiver::shutdownReadWrite()
#endif
}
-void
-IceInternal::UdpTransceiver::write(Buffer& buf, int)
+bool
+IceInternal::UdpTransceiver::write(Buffer& buf, int timeout)
{
assert(buf.i == buf.b.begin());
//
@@ -120,6 +120,7 @@ IceInternal::UdpTransceiver::write(Buffer& buf, int)
//
// We don't log a warning here because the client gets an exception anyway.
//
+ cerr << packetSize << " " << _maxPacketSize << " " << _sndSize << endl;
throw DatagramLimitException(__FILE__, __LINE__);
}
@@ -127,11 +128,9 @@ repeat:
assert(_fd != INVALID_SOCKET);
#ifdef _WIN32
- ssize_t ret = ::send(_fd, reinterpret_cast<const char*>(&buf.b[0]),
- static_cast<int>(buf.b.size()), 0);
+ ssize_t ret = ::send(_fd, reinterpret_cast<const char*>(&buf.b[0]), static_cast<int>(buf.b.size()), 0);
#else
- ssize_t ret = ::send(_fd, reinterpret_cast<const char*>(&buf.b[0]),
- buf.b.size(), 0);
+ ssize_t ret = ::send(_fd, reinterpret_cast<const char*>(&buf.b[0]), buf.b.size(), 0);
#endif
if(ret == SOCKET_ERROR)
@@ -145,16 +144,33 @@ repeat:
{
repeatSelect:
+ if(timeout == 0)
+ {
+ return false;
+ }
+
+ int rs;
assert(_fd != INVALID_SOCKET);
#ifdef _WIN32
FD_SET(_fd, &_wFdSet);
- int rs = ::select(static_cast<int>(_fd + 1), 0, &_wFdSet, 0, 0);
+
+ if(timeout >= 0)
+ {
+ struct timeval tv;
+ tv.tv_sec = timeout / 1000;
+ tv.tv_usec = (timeout - tv.tv_sec * 1000) * 1000;
+ rs = ::select(static_cast<int>(_fd + 1), 0, &_wFdSet, 0, &tv);
+ }
+ else
+ {
+ rs = ::select(static_cast<int>(_fd + 1), 0, &_wFdSet, 0, 0);
+ }
#else
- struct pollfd fdSet[1];
- fdSet[0].fd = _fd;
- fdSet[0].events = POLLOUT;
- int rs = ::poll(fdSet, 1, -1);
-#endif
+ struct pollfd pollFd[1];
+ pollFd[0].fd = _fd;
+ pollFd[0].events = POLLOUT;
+ rs = ::poll(pollFd, 1, timeout);
+#endif
if(rs == SOCKET_ERROR)
{
if(interrupted())
@@ -166,6 +182,11 @@ repeat:
ex.error = getSocketErrno();
throw ex;
}
+
+ if(rs == 0)
+ {
+ throw new Ice::TimeoutException(__FILE__, __LINE__);
+ }
goto repeat;
}
@@ -188,10 +209,11 @@ repeat:
assert(ret == static_cast<ssize_t>(buf.b.size()));
buf.i = buf.b.end();
+ return true;
}
-void
-IceInternal::UdpTransceiver::read(Buffer& buf, int)
+bool
+IceInternal::UdpTransceiver::read(Buffer& buf, int timeout)
{
assert(buf.i == buf.b.begin());
@@ -270,6 +292,11 @@ repeat:
if(wouldBlock())
{
+ if(timeout == 0)
+ {
+ return false;
+ }
+
repeatSelect:
assert(_fd != INVALID_SOCKET);
@@ -295,6 +322,11 @@ repeat:
throw ex;
}
+ if(rs == 0)
+ {
+ throw TimeoutException(__FILE__, __LINE__);
+ }
+
goto repeat;
}
@@ -328,6 +360,7 @@ repeat:
buf.b.resize(ret);
buf.i = buf.b.end();
+ return true;
}
string
@@ -351,9 +384,10 @@ IceInternal::UdpTransceiver::toString() const
}
}
-void
+SocketStatus
IceInternal::UdpTransceiver::initialize(int)
{
+ return Finished;
}
void
diff --git a/cpp/src/Ice/UdpTransceiver.h b/cpp/src/Ice/UdpTransceiver.h
index 8c4c3282e3d..6fe77182793 100644
--- a/cpp/src/Ice/UdpTransceiver.h
+++ b/cpp/src/Ice/UdpTransceiver.h
@@ -36,11 +36,11 @@ public:
virtual void close();
virtual void shutdownWrite();
virtual void shutdownReadWrite();
- virtual void write(Buffer&, int);
- virtual void read(Buffer&, int);
+ virtual bool write(Buffer&, int);
+ virtual bool read(Buffer&, int);
virtual std::string type() const;
virtual std::string toString() const;
- virtual void initialize(int);
+ virtual SocketStatus initialize(int);
virtual void checkSendSize(const Buffer&, size_t);
int effectivePort() const;
diff --git a/cpp/src/Ice/UnknownEndpointI.cpp b/cpp/src/Ice/UnknownEndpointI.cpp
index c3f91d7563f..e7762649979 100644
--- a/cpp/src/Ice/UnknownEndpointI.cpp
+++ b/cpp/src/Ice/UnknownEndpointI.cpp
@@ -213,6 +213,12 @@ IceInternal::UnknownEndpointI::connectors() const
return ret;
}
+void
+IceInternal::UnknownEndpointI::connectors_async(const EndpointI_connectorsPtr& callback) const
+{
+ callback->connectors(vector<ConnectorPtr>());
+}
+
AcceptorPtr
IceInternal::UnknownEndpointI::acceptor(EndpointIPtr& endp, const string&) const
{
@@ -229,7 +235,7 @@ IceInternal::UnknownEndpointI::expand() const
}
bool
-IceInternal::UnknownEndpointI::equivalent(const ConnectorPtr&) const
+IceInternal::UnknownEndpointI::equivalent(const EndpointIPtr&) const
{
return false;
}
diff --git a/cpp/src/Ice/UnknownEndpointI.h b/cpp/src/Ice/UnknownEndpointI.h
index e9c0069f261..69f33defe0f 100644
--- a/cpp/src/Ice/UnknownEndpointI.h
+++ b/cpp/src/Ice/UnknownEndpointI.h
@@ -36,9 +36,10 @@ public:
virtual bool unknown() const;
virtual TransceiverPtr transceiver(EndpointIPtr&) const;
virtual std::vector<ConnectorPtr> connectors() const;
+ virtual void connectors_async(const EndpointI_connectorsPtr&) const;
virtual AcceptorPtr acceptor(EndpointIPtr&, const std::string&) const;
virtual std::vector<EndpointIPtr> expand() const;
- virtual bool equivalent(const ConnectorPtr&) const;
+ virtual bool equivalent(const EndpointIPtr&) const;
virtual bool operator==(const EndpointI&) const;
virtual bool operator!=(const EndpointI&) const;
diff --git a/cpp/src/IceGrid/Allocatable.cpp b/cpp/src/IceGrid/Allocatable.cpp
index 402a5cc32d6..899d20562bc 100644
--- a/cpp/src/IceGrid/Allocatable.cpp
+++ b/cpp/src/IceGrid/Allocatable.cpp
@@ -107,7 +107,7 @@ AllocationRequest::cancel(const AllocationException& ex)
}
void
-AllocationRequest::run() // TimerTask::run() method implementation
+AllocationRequest::runTimerTask() // TimerTask::runTimerTask() method implementation
{
Lock sync(*this);
switch(_state)
diff --git a/cpp/src/IceGrid/Allocatable.h b/cpp/src/IceGrid/Allocatable.h
index f052c89f4d8..3eb1b3e60ee 100644
--- a/cpp/src/IceGrid/Allocatable.h
+++ b/cpp/src/IceGrid/Allocatable.h
@@ -42,7 +42,7 @@ public:
bool pending();
bool allocate(const AllocatablePtr&, const SessionIPtr&);
void cancel(const AllocationException&);
- void run(); // Implementation of IceUtil::TimerTask::run()
+ void runTimerTask(); // Implementation of IceUtil::TimerTask::runTimerTask()
int getTimeout() const { return _timeout; }
const SessionIPtr& getSession() const { return _session; }
diff --git a/cpp/src/IceGrid/NodeCache.h b/cpp/src/IceGrid/NodeCache.h
index 1e4a1caf584..4ed6dab0399 100644
--- a/cpp/src/IceGrid/NodeCache.h
+++ b/cpp/src/IceGrid/NodeCache.h
@@ -10,7 +10,7 @@
#ifndef ICE_GRID_NODECACHE_H
#define ICE_GRID_NODECACHE_H
-#include <IceUtil/Mutex.h>
+#include <IceUtil/RecMutex.h>
#include <IceUtil/Shared.h>
#include <IceGrid/Cache.h>
#include <IceGrid/Internal.h>
diff --git a/cpp/src/IceGrid/ServerI.cpp b/cpp/src/IceGrid/ServerI.cpp
index 71315d1a6c4..507867753d8 100644
--- a/cpp/src/IceGrid/ServerI.cpp
+++ b/cpp/src/IceGrid/ServerI.cpp
@@ -194,7 +194,7 @@ public:
{
}
- virtual void run()
+ virtual void runTimerTask()
{
_command->timeout();
}
@@ -214,7 +214,7 @@ public:
{
}
- virtual void run()
+ virtual void runTimerTask()
{
try
{
diff --git a/cpp/src/IceSSL/AcceptorI.cpp b/cpp/src/IceSSL/AcceptorI.cpp
index 39d9976f9cb..7f467fee5c0 100644
--- a/cpp/src/IceSSL/AcceptorI.cpp
+++ b/cpp/src/IceSSL/AcceptorI.cpp
@@ -108,7 +108,7 @@ IceSSL::AcceptorI::accept(int timeout)
// SSL handshaking is performed in TransceiverI::initialize, since
// accept must not block.
//
- return new TransceiverI(_instance, ssl, fd, true, _adapterName);
+ return new TransceiverI(_instance, ssl, fd, true, true, _adapterName);
}
void
diff --git a/cpp/src/IceSSL/ConnectorI.cpp b/cpp/src/IceSSL/ConnectorI.cpp
index e1bad76f96b..feb4c4b4e89 100644
--- a/cpp/src/IceSSL/ConnectorI.cpp
+++ b/cpp/src/IceSSL/ConnectorI.cpp
@@ -43,7 +43,7 @@ IceSSL::ConnectorI::connect(int timeout)
SOCKET fd = IceInternal::createSocket(false);
IceInternal::setBlock(fd, false);
IceInternal::setTcpBufSize(fd, _instance->communicator()->getProperties(), _logger);
- IceInternal::doConnect(fd, _addr, timeout);
+ bool connected = IceInternal::doConnect(fd, _addr, timeout);
// This static_cast is necessary due to 64bit windows. There SOCKET is a non-int type.
BIO* bio = BIO_new_socket(static_cast<int>(fd), BIO_CLOSE);
@@ -65,112 +65,11 @@ IceSSL::ConnectorI::connect(int timeout)
}
SSL_set_bio(ssl, bio, bio);
- try
- {
- do
- {
- int result = SSL_connect(ssl);
- switch(SSL_get_error(ssl, result))
- {
- case SSL_ERROR_NONE:
- break;
- case SSL_ERROR_ZERO_RETURN:
- {
- ConnectionLostException ex(__FILE__, __LINE__);
- ex.error = IceInternal::getSocketErrno();
- throw ex;
- }
- case SSL_ERROR_WANT_READ:
- if(!selectRead(fd, timeout))
- {
- throw ConnectTimeoutException(__FILE__, __LINE__);
- }
- break;
- case SSL_ERROR_WANT_WRITE:
- if(!selectWrite(fd, timeout))
- {
- throw ConnectTimeoutException(__FILE__, __LINE__);
- }
- break;
- case SSL_ERROR_SYSCALL:
- {
- if(result == -1)
- {
- if(IceInternal::interrupted())
- {
- break;
- }
-
- if(IceInternal::wouldBlock())
- {
- if(SSL_want_read(ssl))
- {
- if(!selectRead(fd, timeout))
- {
- throw ConnectTimeoutException(__FILE__, __LINE__);
- }
- }
- else if(SSL_want_write(ssl))
- {
- if(!selectWrite(fd, timeout))
- {
- throw ConnectTimeoutException(__FILE__, __LINE__);
- }
- }
-
- continue;
- }
-
- if(IceInternal::connectionLost())
- {
- ConnectionLostException ex(__FILE__, __LINE__);
- ex.error = IceInternal::getSocketErrno();
- throw ex;
- }
- }
-
- if(result == 0)
- {
- ConnectionLostException ex(__FILE__, __LINE__);
- ex.error = 0;
- throw ex;
- }
-
- SocketException ex(__FILE__, __LINE__);
- ex.error = IceInternal::getSocketErrno();
- throw ex;
- }
- case SSL_ERROR_SSL:
- {
- ProtocolException ex(__FILE__, __LINE__);
- ex.reason = "SSL error for new outgoing connection:\nremote address = " +
- IceInternal::addrToString(_addr) + "\n" + _instance->sslErrors();
- throw ex;
- }
- }
- }
- while(!SSL_is_init_finished(ssl));
-
- _instance->verifyPeer(ssl, fd, _host, "", false);
- }
- catch(...)
- {
- SSL_free(ssl);
- throw;
- }
-
- if(_instance->networkTraceLevel() >= 1)
- {
- Trace out(_logger, _instance->networkTraceCategory());
- out << "ssl connection established\n" << IceInternal::fdToString(fd);
- }
-
- if(_instance->securityTraceLevel() >= 1)
- {
- _instance->traceConnection(ssl, false);
- }
-
- return new TransceiverI(_instance, ssl, fd, false);
+ //
+ // SSL handshaking is performed in TransceiverI::initialize, since
+ // connect must not block.
+ //
+ return new TransceiverI(_instance, ssl, fd, connected, false);
}
Short
@@ -248,21 +147,6 @@ IceSSL::ConnectorI::operator<(const IceInternal::Connector& r) const
return IceInternal::compareAddress(_addr, p->_addr) == -1;
}
-bool
-IceSSL::ConnectorI::equivalent(const string& host, int port) const
-{
- struct sockaddr_in addr;
- try
- {
- IceInternal::getAddress(host, port, addr);
- }
- catch(const DNSException&)
- {
- return false;
- }
- return IceInternal::compareAddress(_addr, addr) == 0;
-}
-
IceSSL::ConnectorI::ConnectorI(const InstancePtr& instance, const struct sockaddr_in& addr, Ice::Int timeout,
const string& connectionId) :
_instance(instance),
diff --git a/cpp/src/IceSSL/ConnectorI.h b/cpp/src/IceSSL/ConnectorI.h
index d7ae8f88494..72f7a61fb32 100644
--- a/cpp/src/IceSSL/ConnectorI.h
+++ b/cpp/src/IceSSL/ConnectorI.h
@@ -31,6 +31,7 @@ class ConnectorI : public IceInternal::Connector
public:
virtual IceInternal::TransceiverPtr connect(int);
+
virtual Ice::Short type() const;
virtual std::string toString() const;
@@ -38,8 +39,6 @@ public:
virtual bool operator!=(const IceInternal::Connector&) const;
virtual bool operator<(const IceInternal::Connector&) const;
- bool equivalent(const std::string&, int) const;
-
private:
ConnectorI(const InstancePtr&, const struct sockaddr_in&, Ice::Int, const std::string&);
@@ -52,6 +51,7 @@ private:
struct sockaddr_in _addr;
const Ice::Int _timeout;
const std::string _connectionId;
+ SOCKET _fd;
};
}
diff --git a/cpp/src/IceSSL/EndpointI.cpp b/cpp/src/IceSSL/EndpointI.cpp
index ca03a133260..fd9edd4f42d 100644
--- a/cpp/src/IceSSL/EndpointI.cpp
+++ b/cpp/src/IceSSL/EndpointI.cpp
@@ -292,13 +292,13 @@ IceSSL::EndpointI::transceiver(IceInternal::EndpointIPtr& endp) const
vector<IceInternal::ConnectorPtr>
IceSSL::EndpointI::connectors() const
{
- vector<IceInternal::ConnectorPtr> connectors;
- vector<struct sockaddr_in> addresses = IceInternal::getAddresses(_host, _port);
- for(unsigned int i = 0; i < addresses.size(); ++i)
- {
- connectors.push_back(new ConnectorI(_instance, addresses[i], _timeout, _connectionId));
- }
- return connectors;
+ return connectors(IceInternal::getAddresses(_host, _port));
+}
+
+void
+IceSSL::EndpointI::connectors_async(const IceInternal::EndpointI_connectorsPtr& callback) const
+{
+ _instance->endpointHostResolver()->resolve(_host, _port, const_cast<EndpointI*>(this), callback);
}
IceInternal::AcceptorPtr
@@ -332,14 +332,14 @@ IceSSL::EndpointI::expand() const
}
bool
-IceSSL::EndpointI::equivalent(const IceInternal::ConnectorPtr& connector) const
+IceSSL::EndpointI::equivalent(const IceInternal::EndpointIPtr& endpoint) const
{
- const ConnectorI* sslConnector = dynamic_cast<const ConnectorI*>(connector.get());
- if(!sslConnector)
+ const EndpointI* sslEndpointI = dynamic_cast<const EndpointI*>(endpoint.get());
+ if(!sslEndpointI)
{
return false;
}
- return sslConnector->equivalent(_host, _port);
+ return sslEndpointI->_host == _host && sslEndpointI->_port == _port;
}
bool
@@ -452,6 +452,17 @@ IceSSL::EndpointI::operator<(const IceInternal::EndpointI& r) const
return false;
}
+vector<IceInternal::ConnectorPtr>
+IceSSL::EndpointI::connectors(const vector<struct sockaddr_in>& addresses) const
+{
+ vector<IceInternal::ConnectorPtr> connectors;
+ for(unsigned int i = 0; i < addresses.size(); ++i)
+ {
+ connectors.push_back(new ConnectorI(_instance, addresses[i], _timeout, _connectionId));
+ }
+ return connectors;
+}
+
IceSSL::EndpointFactoryI::EndpointFactoryI(const InstancePtr& instance)
: _instance(instance)
{
diff --git a/cpp/src/IceSSL/EndpointI.h b/cpp/src/IceSSL/EndpointI.h
index c5a51375609..99e748e7782 100644
--- a/cpp/src/IceSSL/EndpointI.h
+++ b/cpp/src/IceSSL/EndpointI.h
@@ -40,9 +40,10 @@ public:
virtual bool unknown() const;
virtual IceInternal::TransceiverPtr transceiver(IceInternal::EndpointIPtr&) const;
virtual std::vector<IceInternal::ConnectorPtr> connectors() const;
+ virtual void connectors_async(const IceInternal::EndpointI_connectorsPtr&) const;
virtual IceInternal::AcceptorPtr acceptor(IceInternal::EndpointIPtr&, const std::string&) const;
virtual std::vector<IceInternal::EndpointIPtr> expand() const;
- virtual bool equivalent(const IceInternal::ConnectorPtr&) const;
+ virtual bool equivalent(const IceInternal::EndpointIPtr&) const;
virtual bool operator==(const IceInternal::EndpointI&) const;
virtual bool operator!=(const IceInternal::EndpointI&) const;
@@ -50,6 +51,8 @@ public:
private:
+ virtual std::vector<IceInternal::ConnectorPtr> connectors(const std::vector<struct sockaddr_in>&) const;
+
#if defined(__SUNPRO_CC)
//
// COMPILERFIX: prevent the compiler from emitting a warning about
diff --git a/cpp/src/IceSSL/Instance.cpp b/cpp/src/IceSSL/Instance.cpp
index a840d019d8e..a0933c5420d 100644
--- a/cpp/src/IceSSL/Instance.cpp
+++ b/cpp/src/IceSSL/Instance.cpp
@@ -532,6 +532,12 @@ IceSSL::Instance::communicator() const
return _facade->getCommunicator();
}
+IceInternal::EndpointHostResolverPtr
+IceSSL::Instance::endpointHostResolver() const
+{
+ return _facade->getEndpointHostResolver();
+}
+
string
IceSSL::Instance::defaultHost() const
{
diff --git a/cpp/src/IceSSL/Instance.h b/cpp/src/IceSSL/Instance.h
index 01ee3e8c8dd..9f3d69284ff 100644
--- a/cpp/src/IceSSL/Instance.h
+++ b/cpp/src/IceSSL/Instance.h
@@ -35,6 +35,7 @@ public:
void setPasswordPrompt(const PasswordPromptPtr&);
Ice::CommunicatorPtr communicator() const;
+ IceInternal::EndpointHostResolverPtr endpointHostResolver() const;
std::string defaultHost() const;
int networkTraceLevel() const;
std::string networkTraceCategory() const;
diff --git a/cpp/src/IceSSL/TransceiverI.cpp b/cpp/src/IceSSL/TransceiverI.cpp
index d4b86a2a427..d930c3d8cff 100644
--- a/cpp/src/IceSSL/TransceiverI.cpp
+++ b/cpp/src/IceSSL/TransceiverI.cpp
@@ -54,6 +54,11 @@ IceSSL::TransceiverI::close()
void
IceSSL::TransceiverI::shutdownWrite()
{
+ if(_state < StateConnected)
+ {
+ return;
+ }
+
if(_instance->networkTraceLevel() >= 2)
{
Trace out(_logger, _instance->networkTraceCategory());
@@ -69,6 +74,11 @@ IceSSL::TransceiverI::shutdownWrite()
void
IceSSL::TransceiverI::shutdownReadWrite()
{
+ if(_state < StateConnected)
+ {
+ return;
+ }
+
if(_instance->networkTraceLevel() >= 2)
{
Trace out(_logger, _instance->networkTraceCategory());
@@ -81,7 +91,7 @@ IceSSL::TransceiverI::shutdownReadWrite()
IceInternal::shutdownSocketReadWrite(_fd);
}
-void
+bool
IceSSL::TransceiverI::write(IceInternal::Buffer& buf, int timeout)
{
// Its impossible for the packetSize to be more than an Int.
@@ -102,12 +112,11 @@ IceSSL::TransceiverI::write(IceInternal::Buffer& buf, int timeout)
ERR_clear_error(); // Clear any spurious errors.
assert(_fd != INVALID_SOCKET);
int ret, err;
- bool wantRead, wantWrite;
+ bool wantWrite;
{
IceUtil::Mutex::Lock sync(_sslMutex);
ret = SSL_write(_ssl, reinterpret_cast<const void*>(&*buf.i), packetSize);
err = SSL_get_error(_ssl, ret);
- wantRead = SSL_want_read(_ssl);
wantWrite = SSL_want_write(_ssl);
}
@@ -126,14 +135,15 @@ IceSSL::TransceiverI::write(IceInternal::Buffer& buf, int timeout)
}
case SSL_ERROR_WANT_READ:
{
- if(!selectRead(_fd, timeout))
- {
- throw TimeoutException(__FILE__, __LINE__);
- }
- continue;
+ assert(false);
+ break;
}
case SSL_ERROR_WANT_WRITE:
{
+ if(timeout == 0)
+ {
+ return false;
+ }
if(!selectWrite(_fd, timeout))
{
throw TimeoutException(__FILE__, __LINE__);
@@ -157,15 +167,12 @@ IceSSL::TransceiverI::write(IceInternal::Buffer& buf, int timeout)
if(IceInternal::wouldBlock())
{
- if(wantRead)
+ if(wantWrite)
{
- if(!selectRead(_fd, timeout))
+ if(timeout == 0)
{
- throw TimeoutException(__FILE__, __LINE__);
+ return false;
}
- }
- else if(wantWrite)
- {
if(!selectWrite(_fd, timeout))
{
throw TimeoutException(__FILE__, __LINE__);
@@ -221,9 +228,11 @@ IceSSL::TransceiverI::write(IceInternal::Buffer& buf, int timeout)
packetSize = static_cast<int>(buf.b.end() - buf.i);
}
}
+
+ return true;
}
-void
+bool
IceSSL::TransceiverI::read(IceInternal::Buffer& buf, int timeout)
{
// It's impossible for the packetSize to be more than an Int.
@@ -234,13 +243,12 @@ IceSSL::TransceiverI::read(IceInternal::Buffer& buf, int timeout)
ERR_clear_error(); // Clear any spurious errors.
assert(_fd != INVALID_SOCKET);
int ret, err;
- bool wantRead, wantWrite;
+ bool wantRead;
{
IceUtil::Mutex::Lock sync(_sslMutex);
ret = SSL_read(_ssl, reinterpret_cast<void*>(&*buf.i), packetSize);
err = SSL_get_error(_ssl, ret);
wantRead = SSL_want_read(_ssl);
- wantWrite = SSL_want_write(_ssl);
}
if(ret <= 0)
@@ -269,6 +277,10 @@ IceSSL::TransceiverI::read(IceInternal::Buffer& buf, int timeout)
}
case SSL_ERROR_WANT_READ:
{
+ if(timeout == 0)
+ {
+ return false;
+ }
if(!selectRead(_fd, timeout))
{
throw TimeoutException(__FILE__, __LINE__);
@@ -277,11 +289,8 @@ IceSSL::TransceiverI::read(IceInternal::Buffer& buf, int timeout)
}
case SSL_ERROR_WANT_WRITE:
{
- if(!selectWrite(_fd, timeout))
- {
- throw TimeoutException(__FILE__, __LINE__);
- }
- continue;
+ assert(false);
+ break;
}
case SSL_ERROR_SYSCALL:
{
@@ -302,19 +311,15 @@ IceSSL::TransceiverI::read(IceInternal::Buffer& buf, int timeout)
{
if(wantRead)
{
- if(!selectRead(_fd, timeout))
+ if(timeout == 0)
{
- throw TimeoutException(__FILE__, __LINE__);
+ return false;
}
- }
- else if(wantWrite)
- {
- if(!selectWrite(_fd, timeout))
+ if(!selectRead(_fd, timeout))
{
throw TimeoutException(__FILE__, __LINE__);
}
}
-
continue;
}
@@ -361,8 +366,8 @@ IceSSL::TransceiverI::read(IceInternal::Buffer& buf, int timeout)
//if(ERR_GET_LIB(e) == ERR_LIB_SSL && ERR_GET_REASON(e) == SSL_R_DECRYPTION_FAILED_OR_BAD_RECORD_MAC)
//
unsigned long e = ERR_peek_error();
- if(ERR_GET_LIB(e) == ERR_LIB_SSL &&
- strcmp(ERR_reason_error_string(e), "decryption failed or bad record mac") == 0)
+ const char* estr = ERR_GET_LIB(e) == ERR_LIB_SSL ? ERR_reason_error_string(e) : 0;
+ if(estr && strcmp(estr, "decryption failed or bad record mac") == 0)
{
ConnectionLostException ex(__FILE__, __LINE__);
ex.error = 0;
@@ -396,6 +401,8 @@ IceSSL::TransceiverI::read(IceInternal::Buffer& buf, int timeout)
packetSize = static_cast<int>(buf.b.end() - buf.i);
}
}
+
+ return true;
}
string
@@ -410,129 +417,157 @@ IceSSL::TransceiverI::toString() const
return _desc;
}
-void
+IceInternal::SocketStatus
IceSSL::TransceiverI::initialize(int timeout)
{
- if(_incoming)
+ if(_state == StateNeedConnect && timeout == 0)
+ {
+ _state = StateConnectPending;
+ return IceInternal::NeedConnect;
+ }
+ else if(_state <= StateConnectPending)
+ {
+ IceInternal::doFinishConnect(_fd, timeout);
+ _state = StateConnected;
+ _desc = IceInternal::fdToString(_fd);
+ }
+ assert(_state == StateConnected);
+
+ do
{
- // TODO: The timeout is 0 when called by the thread pool.
- // Make this configurable?
- if(timeout == 0)
+ //
+ // Only one thread calls initialize(), so synchronization is not necessary here.
+ //
+ int ret = _incoming ? SSL_accept(_ssl) : SSL_connect(_ssl);
+ switch(SSL_get_error(_ssl, ret))
{
- timeout = -1;
+ case SSL_ERROR_NONE:
+ assert(SSL_is_init_finished(_ssl));
+ break;
+ case SSL_ERROR_ZERO_RETURN:
+ {
+ ConnectionLostException ex(__FILE__, __LINE__);
+ ex.error = IceInternal::getSocketErrno();
+ throw ex;
}
-
- do
+ case SSL_ERROR_WANT_READ:
{
- //
- // Only one thread calls initialize(), so synchronization is not necessary here.
- //
- int ret = SSL_accept(_ssl);
- switch(SSL_get_error(_ssl, ret))
+ if(timeout == 0)
{
- case SSL_ERROR_NONE:
- assert(SSL_is_init_finished(_ssl));
- break;
- case SSL_ERROR_ZERO_RETURN:
+ return IceInternal::NeedRead;
+ }
+ if(!selectRead(_fd, timeout))
{
- ConnectionLostException ex(__FILE__, __LINE__);
- ex.error = IceInternal::getSocketErrno();
- throw ex;
+ throw ConnectTimeoutException(__FILE__, __LINE__);
}
- case SSL_ERROR_WANT_READ:
+ break;
+ }
+ case SSL_ERROR_WANT_WRITE:
+ {
+ if(timeout == 0)
{
- if(!selectRead(_fd, timeout))
- {
- throw ConnectTimeoutException(__FILE__, __LINE__);
- }
- break;
+ return IceInternal::NeedWrite;
}
- case SSL_ERROR_WANT_WRITE:
+ if(!selectWrite(_fd, timeout))
{
- if(!selectWrite(_fd, timeout))
- {
- throw ConnectTimeoutException(__FILE__, __LINE__);
- }
- break;
+ throw ConnectTimeoutException(__FILE__, __LINE__);
}
- case SSL_ERROR_SYSCALL:
+ break;
+ }
+ case SSL_ERROR_SYSCALL:
+ {
+ if(ret == -1)
{
- if(ret == -1)
+ if(IceInternal::interrupted())
{
- if(IceInternal::interrupted())
- {
- break;
- }
-
- if(IceInternal::wouldBlock())
+ break;
+ }
+
+ if(IceInternal::wouldBlock())
+ {
+ if(SSL_want_read(_ssl))
{
- if(SSL_want_read(_ssl))
+ if(timeout == 0)
{
- if(!selectRead(_fd, timeout))
- {
- throw ConnectTimeoutException(__FILE__, __LINE__);
- }
+ return IceInternal::NeedRead;
}
- else if(SSL_want_write(_ssl))
+ if(!selectRead(_fd, timeout))
{
- if(!selectWrite(_fd, timeout))
- {
- throw ConnectTimeoutException(__FILE__, __LINE__);
- }
+ throw ConnectTimeoutException(__FILE__, __LINE__);
}
-
- break;
}
-
- if(IceInternal::connectionLost())
+ else if(SSL_want_write(_ssl))
{
- ConnectionLostException ex(__FILE__, __LINE__);
- ex.error = IceInternal::getSocketErrno();
- throw ex;
+ if(timeout == 0)
+ {
+ return IceInternal::NeedWrite;
+ }
+ if(!selectWrite(_fd, timeout))
+ {
+ throw ConnectTimeoutException(__FILE__, __LINE__);
+ }
}
+
+ break;
}
-
- if(ret == 0)
+
+ if(IceInternal::connectionLost())
{
ConnectionLostException ex(__FILE__, __LINE__);
- ex.error = 0;
+ ex.error = IceInternal::getSocketErrno();
throw ex;
}
-
- SocketException ex(__FILE__, __LINE__);
- ex.error = IceInternal::getSocketErrno();
- throw ex;
}
- case SSL_ERROR_SSL:
+
+ if(ret == 0)
{
- struct sockaddr_in remoteAddr;
- string desc;
- if(IceInternal::fdToRemoteAddress(_fd, remoteAddr))
- {
- desc = IceInternal::addrToString(remoteAddr);
- }
- ProtocolException ex(__FILE__, __LINE__);
- ex.reason = "SSL error occurred for new incoming connection:\nremote address = " + desc + "\n" +
- _instance->sslErrors();
+ ConnectionLostException ex(__FILE__, __LINE__);
+ ex.error = 0;
throw ex;
}
+
+ SocketException ex(__FILE__, __LINE__);
+ ex.error = IceInternal::getSocketErrno();
+ throw ex;
+ }
+ case SSL_ERROR_SSL:
+ {
+ struct sockaddr_in remoteAddr;
+ string desc;
+ if(IceInternal::fdToRemoteAddress(_fd, remoteAddr))
+ {
+ desc = IceInternal::addrToString(remoteAddr);
}
+ ProtocolException ex(__FILE__, __LINE__);
+ ex.reason = "SSL error occurred for new incoming connection:\nremote address = " + desc + "\n" +
+ _instance->sslErrors();
+ throw ex;
}
- while(!SSL_is_init_finished(_ssl));
-
- _instance->verifyPeer(_ssl, _fd, "", _adapterName, true);
+ }
+ }
+ while(!SSL_is_init_finished(_ssl));
+
+ _instance->verifyPeer(_ssl, _fd, "", _adapterName, _incoming);
- if(_instance->networkTraceLevel() >= 1)
+ if(_instance->networkTraceLevel() >= 1)
+ {
+ Trace out(_logger, _instance->networkTraceCategory());
+ if(_incoming)
{
- Trace out(_logger, _instance->networkTraceCategory());
out << "accepted ssl connection\n" << IceInternal::fdToString(_fd);
}
-
- if(_instance->securityTraceLevel() >= 1)
+ else
{
- _instance->traceConnection(_ssl, true);
+ out << "ssl connection established\n" << IceInternal::fdToString(_fd);
}
}
+
+ if(_instance->securityTraceLevel() >= 1)
+ {
+ _instance->traceConnection(_ssl, _incoming);
+ }
+
+ return IceInternal::Finished;
}
void
@@ -554,7 +589,7 @@ IceSSL::TransceiverI::getConnectionInfo() const
return populateConnectionInfo(_ssl, _fd, _adapterName, _incoming);
}
-IceSSL::TransceiverI::TransceiverI(const InstancePtr& instance, SSL* ssl, SOCKET fd,
+IceSSL::TransceiverI::TransceiverI(const InstancePtr& instance, SSL* ssl, SOCKET fd, bool connected,
bool incoming, const string& adapterName) :
_instance(instance),
_logger(instance->communicator()->getLogger()),
@@ -563,6 +598,7 @@ IceSSL::TransceiverI::TransceiverI(const InstancePtr& instance, SSL* ssl, SOCKET
_fd(fd),
_adapterName(adapterName),
_incoming(incoming),
+ _state(connected ? StateConnected : StateNeedConnect),
_desc(IceInternal::fdToString(fd))
{
#ifdef _WIN32
diff --git a/cpp/src/IceSSL/TransceiverI.h b/cpp/src/IceSSL/TransceiverI.h
index 298fd206538..f3d055ea3bd 100644
--- a/cpp/src/IceSSL/TransceiverI.h
+++ b/cpp/src/IceSSL/TransceiverI.h
@@ -29,24 +29,31 @@ class AcceptorI;
class TransceiverI : public IceInternal::Transceiver
{
+ enum State
+ {
+ StateNeedConnect,
+ StateConnectPending,
+ StateConnected
+ };
+
public:
virtual SOCKET fd();
virtual void close();
virtual void shutdownWrite();
virtual void shutdownReadWrite();
- virtual void write(IceInternal::Buffer&, int);
- virtual void read(IceInternal::Buffer&, int);
+ virtual bool write(IceInternal::Buffer&, int);
+ virtual bool read(IceInternal::Buffer&, int);
virtual std::string type() const;
virtual std::string toString() const;
- virtual void initialize(int);
+ virtual IceInternal::SocketStatus initialize(int);
virtual void checkSendSize(const IceInternal::Buffer&, size_t);
ConnectionInfo getConnectionInfo() const;
private:
- TransceiverI(const InstancePtr&, SSL*, SOCKET, bool, const std::string& = "");
+ TransceiverI(const InstancePtr&, SSL*, SOCKET, bool, bool, const std::string& = "");
virtual ~TransceiverI();
friend class ConnectorI;
friend class AcceptorI;
@@ -65,7 +72,8 @@ private:
const std::string _adapterName;
const bool _incoming;
- const std::string _desc;
+ State _state;
+ std::string _desc;
#ifdef _WIN32
int _maxPacketSize;
#endif
diff --git a/cpp/src/IceStorm/Subscriber.cpp b/cpp/src/IceStorm/Subscriber.cpp
index b7e5ef45aa9..ae899ee231d 100644
--- a/cpp/src/IceStorm/Subscriber.cpp
+++ b/cpp/src/IceStorm/Subscriber.cpp
@@ -233,12 +233,11 @@ SubscriberOneway::flush()
vector<Ice::Byte> dummy;
if(v.size() > 1 && !_batch)
{
+ Ice::ConnectionPtr conn = _objBatch->ice_getConnection();
for(EventDataSeq::const_iterator p = v.begin(); p != v.end(); ++p)
{
_objBatch->ice_invoke((*p)->op, (*p)->mode, (*p)->data, dummy, (*p)->context);
}
- Ice::ConnectionPtr conn = _objBatch->ice_getCachedConnection();
- assert(conn);
conn->flushBatchRequests();
}
else
diff --git a/cpp/src/IceUtil/Timer.cpp b/cpp/src/IceUtil/Timer.cpp
index 16d34ef0c0a..b440934be16 100755
--- a/cpp/src/IceUtil/Timer.cpp
+++ b/cpp/src/IceUtil/Timer.cpp
@@ -13,12 +13,6 @@
using namespace std;
using namespace IceUtil;
-bool
-TimerTask::operator<(const TimerTask& r) const
-{
- return this < &r;
-}
-
Timer::Timer() : _destroyed(false)
{
start();
@@ -96,7 +90,7 @@ Timer::cancel(const TimerTaskPtr& task)
return false;
}
- map<TimerTaskPtr, IceUtil::Time>::iterator p = _tasks.find(task);
+ map<TimerTaskPtr, IceUtil::Time, TimerTaskCompare>::iterator p = _tasks.find(task);
if(p == _tasks.end())
{
return false;
@@ -125,7 +119,7 @@ Timer::run()
//
if(token.delay != IceUtil::Time())
{
- map<TimerTaskPtr, IceUtil::Time>::iterator p = _tasks.find(token.task);
+ map<TimerTaskPtr, IceUtil::Time, TimerTaskCompare>::iterator p = _tasks.find(token.task);
if(p != _tasks.end())
{
token.scheduledTime = IceUtil::Time::now(IceUtil::Time::Monotonic) + token.delay;
@@ -176,7 +170,7 @@ Timer::run()
{
try
{
- token.task->run();
+ token.task->runTimerTask();
}
catch(const std::exception& e)
{
diff --git a/cpp/src/slice2cpp/Gen.cpp b/cpp/src/slice2cpp/Gen.cpp
index dbc34fc94f7..7179373716e 100755
--- a/cpp/src/slice2cpp/Gen.cpp
+++ b/cpp/src/slice2cpp/Gen.cpp
@@ -2258,7 +2258,7 @@ Slice::Gen::ProxyVisitor::visitOperation(const OperationPtr& p)
{
C << nl << "__checkTwowayOnly(" << p->flattenedScope() + p->name() + "_name);";
}
- C << nl << "__delBase = __getDelegate();";
+ C << nl << "__delBase = __getDelegate(false);";
C << nl << "::IceDelegate" << thisPointer << " __del = dynamic_cast< ::IceDelegate"
<< thisPointer << ">(__delBase.get());";
C << nl;
@@ -2603,8 +2603,8 @@ Slice::Gen::DelegateMVisitor::visitOperation(const OperationPtr& p)
H << sp << nl << "virtual " << retS << ' ' << name << spar << params << epar << ';';
C << sp << nl << retS << nl << "IceDelegateM" << scoped << spar << paramsDecl << epar;
C << sb;
- C << nl << "::IceInternal::Outgoing __og(__connection.get(), __reference.get(), " << flatName << ", "
- << operationModeToString(p->sendMode()) << ", __context, __compress);";
+ C << nl << "::IceInternal::Outgoing __og(__handler.get(), " << flatName << ", "
+ << operationModeToString(p->sendMode()) << ", __context);";
if(!inParams.empty())
{
C << nl << "try";
@@ -5217,6 +5217,10 @@ Slice::Gen::AsyncVisitor::visitOperation(const OperationPtr& p)
C << sb;
C << nl << "try";
C << sb;
+ if(p->returnsData())
+ {
+ C << nl << "__prx->__checkTwowayOnly(\"" << p->name() << "\");";
+ }
C << nl << "__prepare(__prx, " << flatName << ", " << operationModeToString(p->sendMode()) << ", __ctx);";
writeMarshalCode(C, inParams, 0, StringList(), true);
if(p->sendsClasses())
diff --git a/cpp/src/slice2cs/Gen.cpp b/cpp/src/slice2cs/Gen.cpp
index 1192172a13e..fc472391b7e 100755
--- a/cpp/src/slice2cs/Gen.cpp
+++ b/cpp/src/slice2cs/Gen.cpp
@@ -3100,7 +3100,7 @@ Slice::Gen::HelperVisitor::visitClassDefStart(const ClassDefPtr& p)
{
_out << nl << "checkTwowayOnly__(\"" << op->name() << "\");";
}
- _out << nl << "delBase__ = getDelegate__();";
+ _out << nl << "delBase__ = getDelegate__(false);";
_out << nl << name << "Del_ del__ = (" << name << "Del_)delBase__;";
_out << nl;
if(ret)
@@ -3834,9 +3834,8 @@ Slice::Gen::DelegateMVisitor::visitClassDefStart(const ClassDefPtr& p)
<< "_System.Collections.Generic.Dictionary<string, string> context__" << epar;
_out << sb;
- _out << nl << "IceInternal.Outgoing og__ = getOutgoing(\"" << op->name() << "\", "
- << sliceModeToIceMode(op->sendMode())
- << ", context__);";
+ _out << nl << "IceInternal.Outgoing og__ = handler__.getOutgoing(\"" << op->name() << "\", "
+ << sliceModeToIceMode(op->sendMode()) << ", context__);";
_out << nl << "try";
_out << sb;
if(!inParams.empty())
@@ -3979,7 +3978,7 @@ Slice::Gen::DelegateMVisitor::visitClassDefStart(const ClassDefPtr& p)
_out << eb;
_out << nl << "finally";
_out << sb;
- _out << nl << "reclaimOutgoing(og__);";
+ _out << nl << "handler__.reclaimOutgoing(og__);";
_out << eb;
_out << eb;
}
@@ -4411,8 +4410,11 @@ Slice::Gen::AsyncVisitor::visitOperation(const OperationPtr& p)
_out << sb;
_out << nl << "try";
_out << sb;
- _out << nl << "prepare__(prx__, \"" << name << "\", " << sliceModeToIceMode(p->sendMode())
- << ", ctx__);";
+ if(p->returnsData())
+ {
+ _out << nl << "((Ice.ObjectPrxHelperBase)prx__).checkTwowayOnly__(\"" << p->name() << "\");";
+ }
+ _out << nl << "prepare__(prx__, \"" << name << "\", " << sliceModeToIceMode(p->sendMode()) << ", ctx__);";
for(q = inParams.begin(); q != inParams.end(); ++q)
{
string typeS = typeToString(q->first);
diff --git a/cpp/src/slice2freezej/Main.cpp b/cpp/src/slice2freezej/Main.cpp
index d82468ab033..8e30f9d4097 100644
--- a/cpp/src/slice2freezej/Main.cpp
+++ b/cpp/src/slice2freezej/Main.cpp
@@ -541,9 +541,9 @@ FreezeGenerator::generate(UnitPtr& u, const Dict& dict)
{
out << nl << "__os.endWriteEncaps();";
}
- out << nl << "java.nio.ByteBuffer __buf = __os.prepareWrite();";
- out << nl << "byte[] __r = new byte[__buf.limit()];";
- out << nl << "__buf.get(__r);";
+ out << nl << "IceInternal.Buffer __buf = __os.prepareWrite();";
+ out << nl << "byte[] __r = new byte[__buf.size()];";
+ out << nl << "__buf.b.get(__r);";
out << nl << "return __r;";
out << eb;
@@ -559,10 +559,10 @@ FreezeGenerator::generate(UnitPtr& u, const Dict& dict)
out << nl << "__is.sliceObjects(false);";
}
out << nl << "__is.resize(b.length, true);";
- out << nl << "java.nio.ByteBuffer __buf = __is.prepareRead();";
- out << nl << "__buf.position(0);";
- out << nl << "__buf.put(b);";
- out << nl << "__buf.position(0);";
+ out << nl << "IceInternal.Buffer __buf = __is.getBuffer();";
+ out << nl << "__buf.b.position(0);";
+ out << nl << "__buf.b.put(b);";
+ out << nl << "__buf.b.position(0);";
if(encaps)
{
out << nl << "__is.startReadEncaps();";
@@ -696,9 +696,9 @@ FreezeGenerator::generate(UnitPtr& u, const Dict& dict)
writeMarshalUnmarshalCode(out, "", indexTypes[i], keyS, true, iter, false);
assert(!indexTypes[i]->usesClasses());
- out << nl << "java.nio.ByteBuffer buf = __os.prepareWrite();";
- out << nl << "byte[] r = new byte[buf.limit()];";
- out << nl << "buf.get(r);";
+ out << nl << "IceInternal.Buffer buf = __os.prepareWrite();";
+ out << nl << "byte[] r = new byte[buf.size()];";
+ out << nl << "buf.b.get(r);";
out << nl << "return r;";
}
out << eb;
@@ -720,10 +720,10 @@ FreezeGenerator::generate(UnitPtr& u, const Dict& dict)
{
out << nl << "IceInternal.BasicStream __is = new IceInternal.BasicStream(Ice.Util.getInstance(communicator));";
out << nl << "__is.resize(bytes.length, true);";
- out << nl << "java.nio.ByteBuffer buf = __is.prepareRead();";
- out << nl << "buf.position(0);";
- out << nl << "buf.put(bytes);";
- out << nl << "buf.position(0);";
+ out << nl << "IceInternal.Buffer buf = __is.getBuffer();";
+ out << nl << "buf.b.position(0);";
+ out << nl << "buf.b.put(bytes);";
+ out << nl << "buf.b.position(0);";
int iter = 0;
list<string> metaData;
@@ -1057,9 +1057,9 @@ FreezeGenerator::generate(UnitPtr& u, const Index& index)
{
out << nl << "__os.writePendingObjects();";
}
- out << nl << "java.nio.ByteBuffer __buf = __os.prepareWrite();";
- out << nl << "byte[] __r = new byte[__buf.limit()];";
- out << nl << "__buf.get(__r);";
+ out << nl << "IceInternal.Buffer __buf = __os.prepareWrite();";
+ out << nl << "byte[] __r = new byte[__buf.size()];";
+ out << nl << "__buf.b.get(__r);";
out << nl << "return __r;";
out << eb;
diff --git a/cpp/src/slice2java/Gen.cpp b/cpp/src/slice2java/Gen.cpp
index 37fe9a2d6d8..32a9e57a7ae 100644
--- a/cpp/src/slice2java/Gen.cpp
+++ b/cpp/src/slice2java/Gen.cpp
@@ -3398,7 +3398,7 @@ Slice::Gen::HelperVisitor::visitClassDefStart(const ClassDefPtr& p)
{
out << nl << "__checkTwowayOnly(\"" << opName << "\");";
}
- out << nl << "__delBase = __getDelegate();";
+ out << nl << "__delBase = __getDelegate(false);";
out << nl << '_' << name << "Del __del = (_" << name << "Del)__delBase;";
out << nl;
if(ret)
@@ -4164,8 +4164,8 @@ Slice::Gen::DelegateMVisitor::visitClassDefStart(const ClassDefPtr& p)
writeDelegateThrowsClause(package, throws);
out << sb;
- out << nl << "IceInternal.Outgoing __og = __connection.getOutgoing(__reference, \"" << op->name() << "\", "
- << sliceModeToIceMode(op->sendMode()) << ", __ctx, __compress);";
+ out << nl << "IceInternal.Outgoing __og = __handler.getOutgoing(\"" << op->name() << "\", "
+ << sliceModeToIceMode(op->sendMode()) << ", __ctx);";
out << nl << "try";
out << sb;
if(!inParams.empty())
@@ -4253,7 +4253,7 @@ Slice::Gen::DelegateMVisitor::visitClassDefStart(const ClassDefPtr& p)
out << eb;
out << nl << "finally";
out << sb;
- out << nl << "__connection.reclaimOutgoing(__og);";
+ out << nl << "__handler.reclaimOutgoing(__og);";
out << eb;
out << eb;
}
@@ -4987,8 +4987,11 @@ Slice::Gen::AsyncVisitor::visitOperation(const OperationPtr& p)
out << sb;
out << nl << "try";
out << sb;
- out << nl << "__prepare(__prx, \"" << p->name() << "\", "
- << sliceModeToIceMode(p->sendMode()) << ", __ctx);";
+ if(p->returnsData())
+ {
+ out << nl << "((Ice.ObjectPrxHelperBase)__prx).__checkTwowayOnly(\"" << p->name() << "\");";
+ }
+ out << nl << "__prepare(__prx, \"" << p->name() << "\", " << sliceModeToIceMode(p->sendMode()) << ", __ctx);";
iter = 0;
for(pli = inParams.begin(); pli != inParams.end(); ++pli)
{
diff --git a/cpp/test/Freeze/oldevictor/Client.cpp b/cpp/test/Freeze/oldevictor/Client.cpp
index cfafd704ef7..2dd10200004 100644
--- a/cpp/test/Freeze/oldevictor/Client.cpp
+++ b/cpp/test/Freeze/oldevictor/Client.cpp
@@ -9,6 +9,7 @@
#include <Ice/Ice.h>
#include <IceUtil/Thread.h>
+#include <IceUtil/RecMutex.h>
#include <IceUtil/Time.h>
#include <TestCommon.h>
#include <Test.h>
diff --git a/cpp/test/Glacier2/router/Client.cpp b/cpp/test/Glacier2/router/Client.cpp
index 65717e620cc..0f878bb7469 100644
--- a/cpp/test/Glacier2/router/Client.cpp
+++ b/cpp/test/Glacier2/router/Client.cpp
@@ -515,8 +515,16 @@ CallbackClient::run(int argc, char* argv[])
{
cout << "creating session with correct password... " << flush;
- session = router->createSession("userid", "abc123");
- cout << "ok" << endl;
+ try
+ {
+ session = router->createSession("userid", "abc123");
+ cout << "ok" << endl;
+ }
+ catch(const Glacier2::PermissionDeniedException& ex)
+ {
+ cerr << ex << ":\n" << ex.reason << endl;
+ test(false);
+ }
}
{
@@ -701,7 +709,7 @@ CallbackClient::run(int argc, char* argv[])
}
{
- cout << "testing buffered mode... " << flush;
+ cout << "testing with blocking clients... " << flush;
//
// Start 3 misbehaving clients.
diff --git a/cpp/test/Glacier2/router/run.py b/cpp/test/Glacier2/router/run.py
index 0edaed9d6f6..e674550143c 100755
--- a/cpp/test/Glacier2/router/run.py
+++ b/cpp/test/Glacier2/router/run.py
@@ -22,35 +22,57 @@ import TestUtil
router = os.path.join(TestUtil.getBinDir(__file__), "glacier2router")
-args = r' --Ice.Warn.Dispatch=0' + \
- r' --Ice.Warn.Connections=0' + \
- r' --Glacier2.Filter.Category.Accept="c1 c2"' + \
- r' --Glacier2.Filter.Category.AcceptUser="2"' + \
- r' --Glacier2.SessionTimeout="30"' + \
- r' --Glacier2.Client.Endpoints="default -p 12347 -t 10000"' + \
- r' --Glacier2.Server.Endpoints="tcp -h 127.0.0.1 -t 10000"' \
- r' --Ice.Admin.Endpoints="tcp -h 127.0.0.1 -p 12348 -t 10000"' + \
- r' --Ice.Admin.InstanceName="Glacier2"' + \
- r' --Glacier2.CryptPasswords="' + TestUtil.getMappingDir(__file__) + r'/test/Glacier2/router/passwords"'
-
-print "starting router...",
-if TestUtil.debug:
- print "(" + command + ")",
-starterPipe = TestUtil.startServer(router, args + " 2>&1")
-TestUtil.getServerPid(starterPipe)
-#
-# For this test we don't want to add the router to the server threads
-# since we want the the router to run over two calls to
-# mixedClientServerTest
-#
-TestUtil.getAdapterReady(starterPipe, False)
-print "ok"
+def startRouter(buffered):
+
+ args = r' --Ice.Warn.Dispatch=0' + \
+ r' --Ice.Warn.Connections=0' + \
+ r' --Glacier2.Filter.Category.Accept="c1 c2"' + \
+ r' --Glacier2.Filter.Category.AcceptUser="2"' + \
+ r' --Glacier2.SessionTimeout="30"' + \
+ r' --Glacier2.Client.Endpoints="default -p 12347 -t 10000"' + \
+ r' --Glacier2.Server.Endpoints="tcp -h 127.0.0.1 -t 10000"' \
+ r' --Ice.Admin.Endpoints="tcp -h 127.0.0.1 -p 12348 -t 10000"' + \
+ r' --Ice.Admin.InstanceName="Glacier2"' + \
+ r' --Glacier2.CryptPasswords="' + TestUtil.getMappingDir(__file__) + r'/test/Glacier2/router/passwords"'
+
+ if buffered:
+ args += ' --Glacier2.Client.Buffered=1 --Glacier2.Server.Buffered=1'
+ print "starting router in buffered mode...",
+ else:
+ args += ' --Glacier2.Client.Buffered=0 --Glacier2.Server.Buffered=0'
+ print "starting router in unbuffered mode...",
+
+ starterPipe = TestUtil.startServer(router, args + " 2>&1")
+ TestUtil.getServerPid(starterPipe)
+
+ #
+ # For this test we don't want to add the router to the server threads
+ # since we want the the router to run over two calls to
+ # mixedClientServerTest
+ #
+ TestUtil.getAdapterReady(starterPipe, False)
+ print "ok"
-starterThread = TestUtil.ReaderThread(starterPipe);
-starterThread.start()
+ routerThread = TestUtil.ReaderThread(starterPipe);
+ routerThread.start()
+
+ return routerThread
name = os.path.join("Glacier2", "router")
+#
+# We first run the test with unbuffered mode.
+#
+routerThread = startRouter(False)
+TestUtil.mixedClientServerTestWithOptions(name, "", " --shutdown")
+routerThread.join()
+if routerThread.getStatus():
+ sys.exit(1)
+
+#
+# Then we run the test in buffered mode.
+#
+routerThread = startRouter(True)
TestUtil.mixedClientServerTest(name)
#
@@ -60,8 +82,8 @@ TestUtil.mixedClientServerTest(name)
#
TestUtil.mixedClientServerTestWithOptions(name, "", " --shutdown")
-starterThread.join()
-if starterThread.getStatus():
+routerThread.join()
+if routerThread.getStatus():
sys.exit(1)
sys.exit(0)
diff --git a/cpp/test/Ice/Makefile b/cpp/test/Ice/Makefile
index 2c577b0081e..db697847888 100644
--- a/cpp/test/Ice/Makefile
+++ b/cpp/test/Ice/Makefile
@@ -32,7 +32,8 @@ SUBDIRS = proxy \
servantLocator \
threads \
interceptor \
- stringConverter
+ stringConverter \
+ background
$(EVERYTHING)::
@for subdir in $(SUBDIRS); \
diff --git a/cpp/test/Ice/Makefile.mak b/cpp/test/Ice/Makefile.mak
index dfe04be6621..f1e43713e81 100644
--- a/cpp/test/Ice/Makefile.mak
+++ b/cpp/test/Ice/Makefile.mak
@@ -32,7 +32,8 @@ SUBDIRS = proxy \
servantLocator \
threads \
interceptor \
- stringConverter
+ stringConverter \
+ background
$(EVERYTHING)::
@for %i in ( $(SUBDIRS) ) do \
diff --git a/cpp/test/Ice/background/.depend b/cpp/test/Ice/background/.depend
new file mode 100644
index 00000000000..02b0c387ca0
--- /dev/null
+++ b/cpp/test/Ice/background/.depend
@@ -0,0 +1,17 @@
+Configuration$(OBJEXT): Configuration.cpp Configuration.h ../../../include/IceUtil/Shared.h ../../../include/IceUtil/Config.h ../../../include/IceUtil/Mutex.h ../../../include/IceUtil/Lock.h ../../../include/IceUtil/ThreadException.h ../../../include/IceUtil/Exception.h ../../../include/IceUtil/Handle.h ../../../include/Ice/LocalException.h ../../../include/Ice/LocalObjectF.h ../../../include/Ice/Handle.h ../../../include/Ice/Config.h ../../../include/Ice/ProxyHandle.h ../../../include/Ice/ProxyF.h ../../../include/Ice/ObjectF.h ../../../include/Ice/GCCountMap.h ../../../include/Ice/GCShared.h ../../../include/Ice/Exception.h ../../../include/Ice/LocalObject.h ../../../include/Ice/Proxy.h ../../../include/Ice/ProxyFactoryF.h ../../../include/Ice/ConnectionIF.h ../../../include/Ice/RequestHandlerF.h ../../../include/Ice/EndpointIF.h ../../../include/Ice/Endpoint.h ../../../include/Ice/UndefSysMacros.h ../../../include/Ice/ObjectAdapterF.h ../../../include/Ice/ReferenceF.h ../../../include/Ice/OutgoingAsyncF.h ../../../include/Ice/Current.h ../../../include/Ice/ConnectionF.h ../../../include/Ice/Identity.h ../../../include/Ice/StreamF.h ../../../include/Ice/CommunicatorF.h ../../../include/Ice/BuiltinSequences.h ../../../src/Ice/Selector.h ../../../include/Ice/InstanceF.h
+Connector$(OBJEXT): Connector.cpp Connector.h ../../../src/Ice/Connector.h ../../../include/IceUtil/Shared.h ../../../include/IceUtil/Config.h ../../../include/IceUtil/Mutex.h ../../../include/IceUtil/Lock.h ../../../include/IceUtil/ThreadException.h ../../../include/IceUtil/Exception.h ../../../src/Ice/ConnectorF.h ../../../include/Ice/Handle.h ../../../include/IceUtil/Handle.h ../../../include/Ice/Config.h ../../../include/Ice/ProxyHandle.h ../../../src/Ice/TransceiverF.h Configuration.h ../../../include/Ice/LocalException.h ../../../include/Ice/LocalObjectF.h ../../../include/Ice/ProxyF.h ../../../include/Ice/ObjectF.h ../../../include/Ice/GCCountMap.h ../../../include/Ice/GCShared.h ../../../include/Ice/Exception.h ../../../include/Ice/LocalObject.h ../../../include/Ice/Proxy.h ../../../include/Ice/ProxyFactoryF.h ../../../include/Ice/ConnectionIF.h ../../../include/Ice/RequestHandlerF.h ../../../include/Ice/EndpointIF.h ../../../include/Ice/Endpoint.h ../../../include/Ice/UndefSysMacros.h ../../../include/Ice/ObjectAdapterF.h ../../../include/Ice/ReferenceF.h ../../../include/Ice/OutgoingAsyncF.h ../../../include/Ice/Current.h ../../../include/Ice/ConnectionF.h ../../../include/Ice/Identity.h ../../../include/Ice/StreamF.h ../../../include/Ice/CommunicatorF.h ../../../include/Ice/BuiltinSequences.h ../../../src/Ice/Selector.h ../../../include/Ice/InstanceF.h Transceiver.h ../../../src/Ice/Transceiver.h EndpointI.h ../../../src/Ice/EndpointI.h ../../../include/IceUtil/Thread.h ../../../include/IceUtil/Monitor.h ../../../include/IceUtil/Cond.h ../../../include/IceUtil/Time.h ../../../src/Ice/AcceptorF.h
+Acceptor$(OBJEXT): Acceptor.cpp Acceptor.h ../../../src/Ice/Acceptor.h ../../../include/IceUtil/Shared.h ../../../include/IceUtil/Config.h ../../../include/IceUtil/Mutex.h ../../../include/IceUtil/Lock.h ../../../include/IceUtil/ThreadException.h ../../../include/IceUtil/Exception.h ../../../src/Ice/AcceptorF.h ../../../include/Ice/Handle.h ../../../include/IceUtil/Handle.h ../../../include/Ice/Config.h ../../../include/Ice/ProxyHandle.h ../../../src/Ice/TransceiverF.h Transceiver.h ../../../src/Ice/Transceiver.h ../../../src/Ice/Selector.h ../../../include/Ice/InstanceF.h Configuration.h ../../../include/Ice/LocalException.h ../../../include/Ice/LocalObjectF.h ../../../include/Ice/ProxyF.h ../../../include/Ice/ObjectF.h ../../../include/Ice/GCCountMap.h ../../../include/Ice/GCShared.h ../../../include/Ice/Exception.h ../../../include/Ice/LocalObject.h ../../../include/Ice/Proxy.h ../../../include/Ice/ProxyFactoryF.h ../../../include/Ice/ConnectionIF.h ../../../include/Ice/RequestHandlerF.h ../../../include/Ice/EndpointIF.h ../../../include/Ice/Endpoint.h ../../../include/Ice/UndefSysMacros.h ../../../include/Ice/ObjectAdapterF.h ../../../include/Ice/ReferenceF.h ../../../include/Ice/OutgoingAsyncF.h ../../../include/Ice/Current.h ../../../include/Ice/ConnectionF.h ../../../include/Ice/Identity.h ../../../include/Ice/StreamF.h ../../../include/Ice/CommunicatorF.h ../../../include/Ice/BuiltinSequences.h
+EndpointI$(OBJEXT): EndpointI.cpp EndpointI.h ../../../src/Ice/EndpointI.h ../../../include/IceUtil/Shared.h ../../../include/IceUtil/Config.h ../../../include/IceUtil/Mutex.h ../../../include/IceUtil/Lock.h ../../../include/IceUtil/ThreadException.h ../../../include/IceUtil/Exception.h ../../../include/IceUtil/Thread.h ../../../include/IceUtil/Handle.h ../../../include/IceUtil/Monitor.h ../../../include/IceUtil/Cond.h ../../../include/IceUtil/Time.h ../../../include/Ice/Endpoint.h ../../../include/Ice/LocalObjectF.h ../../../include/Ice/Handle.h ../../../include/Ice/Config.h ../../../include/Ice/ProxyHandle.h ../../../include/Ice/ProxyF.h ../../../include/Ice/ObjectF.h ../../../include/Ice/GCCountMap.h ../../../include/Ice/GCShared.h ../../../include/Ice/Exception.h ../../../include/Ice/LocalObject.h ../../../include/Ice/UndefSysMacros.h ../../../include/Ice/EndpointIF.h ../../../include/Ice/InstanceF.h ../../../src/Ice/TransceiverF.h ../../../src/Ice/ConnectorF.h ../../../src/Ice/AcceptorF.h Configuration.h ../../../include/Ice/LocalException.h ../../../include/Ice/Proxy.h ../../../include/Ice/ProxyFactoryF.h ../../../include/Ice/ConnectionIF.h ../../../include/Ice/RequestHandlerF.h ../../../include/Ice/ObjectAdapterF.h ../../../include/Ice/ReferenceF.h ../../../include/Ice/OutgoingAsyncF.h ../../../include/Ice/Current.h ../../../include/Ice/ConnectionF.h ../../../include/Ice/Identity.h ../../../include/Ice/StreamF.h ../../../include/Ice/CommunicatorF.h ../../../include/Ice/BuiltinSequences.h ../../../src/Ice/Selector.h Transceiver.h ../../../src/Ice/Transceiver.h Connector.h ../../../src/Ice/Connector.h Acceptor.h ../../../src/Ice/Acceptor.h ../../../include/Ice/BasicStream.h ../../../include/Ice/ObjectFactoryF.h ../../../include/Ice/Buffer.h ../../../include/Ice/Protocol.h ../../../include/Ice/StringConverter.h ../../../include/IceUtil/Unicode.h
+Transceiver$(OBJEXT): Transceiver.cpp Transceiver.h ../../../src/Ice/Transceiver.h ../../../include/IceUtil/Shared.h ../../../include/IceUtil/Config.h ../../../include/IceUtil/Mutex.h ../../../include/IceUtil/Lock.h ../../../include/IceUtil/ThreadException.h ../../../include/IceUtil/Exception.h ../../../src/Ice/TransceiverF.h ../../../include/Ice/Handle.h ../../../include/IceUtil/Handle.h ../../../include/Ice/Config.h ../../../include/Ice/ProxyHandle.h ../../../src/Ice/Selector.h ../../../include/Ice/InstanceF.h Configuration.h ../../../include/Ice/LocalException.h ../../../include/Ice/LocalObjectF.h ../../../include/Ice/ProxyF.h ../../../include/Ice/ObjectF.h ../../../include/Ice/GCCountMap.h ../../../include/Ice/GCShared.h ../../../include/Ice/Exception.h ../../../include/Ice/LocalObject.h ../../../include/Ice/Proxy.h ../../../include/Ice/ProxyFactoryF.h ../../../include/Ice/ConnectionIF.h ../../../include/Ice/RequestHandlerF.h ../../../include/Ice/EndpointIF.h ../../../include/Ice/Endpoint.h ../../../include/Ice/UndefSysMacros.h ../../../include/Ice/ObjectAdapterF.h ../../../include/Ice/ReferenceF.h ../../../include/Ice/OutgoingAsyncF.h ../../../include/Ice/Current.h ../../../include/Ice/ConnectionF.h ../../../include/Ice/Identity.h ../../../include/Ice/StreamF.h ../../../include/Ice/CommunicatorF.h ../../../include/Ice/BuiltinSequences.h
+EndpointFactory$(OBJEXT): EndpointFactory.cpp ../../../src/Ice/Instance.h ../../../include/IceUtil/Shared.h ../../../include/IceUtil/Config.h ../../../include/IceUtil/Mutex.h ../../../include/IceUtil/Lock.h ../../../include/IceUtil/ThreadException.h ../../../include/IceUtil/Exception.h ../../../include/IceUtil/RecMutex.h ../../../include/IceUtil/Timer.h ../../../include/IceUtil/Thread.h ../../../include/IceUtil/Handle.h ../../../include/IceUtil/Monitor.h ../../../include/IceUtil/Cond.h ../../../include/IceUtil/Time.h ../../../include/Ice/InstanceF.h ../../../include/Ice/Handle.h ../../../include/Ice/Config.h ../../../include/Ice/ProxyHandle.h ../../../include/Ice/CommunicatorF.h ../../../include/Ice/LocalObjectF.h ../../../include/Ice/ProxyF.h ../../../include/Ice/ObjectF.h ../../../include/Ice/GCCountMap.h ../../../include/Ice/GCShared.h ../../../include/Ice/Exception.h ../../../include/Ice/LocalObject.h ../../../include/Ice/UndefSysMacros.h ../../../include/Ice/StatsF.h ../../../src/Ice/TraceLevelsF.h ../../../src/Ice/DefaultsAndOverridesF.h ../../../src/Ice/RouterInfoF.h ../../../src/Ice/LocatorInfoF.h ../../../src/Ice/ReferenceFactoryF.h ../../../include/Ice/ProxyFactoryF.h ../../../src/Ice/ThreadPoolF.h ../../../src/Ice/SelectorThreadF.h ../../../include/Ice/ConnectionFactoryF.h ../../../include/Ice/ConnectionMonitorF.h ../../../src/Ice/ObjectFactoryManagerF.h ../../../include/Ice/ObjectAdapterFactoryF.h ../../../src/Ice/EndpointFactoryManagerF.h ../../../include/Ice/DynamicLibraryF.h ../../../include/Ice/PluginF.h ../../../include/Ice/Initialize.h ../../../include/Ice/PropertiesF.h ../../../include/Ice/Proxy.h ../../../include/Ice/ConnectionIF.h ../../../include/Ice/RequestHandlerF.h ../../../include/Ice/EndpointIF.h ../../../include/Ice/Endpoint.h ../../../include/Ice/ObjectAdapterF.h ../../../include/Ice/ReferenceF.h ../../../include/Ice/OutgoingAsyncF.h ../../../include/Ice/Current.h ../../../include/Ice/ConnectionF.h ../../../include/Ice/Identity.h ../../../include/Ice/StreamF.h ../../../include/Ice/Object.h ../../../include/Ice/IncomingAsyncF.h ../../../include/Ice/LoggerF.h ../../../include/Ice/StringConverter.h ../../../include/Ice/BuiltinSequences.h ../../../src/Ice/SharedContext.h ../../../src/Ice/ImplicitContextI.h ../../../include/Ice/ImplicitContext.h ../../../include/Ice/LocalException.h ../../../include/Ice/FacetMap.h ../../../include/Ice/Process.h ../../../include/Ice/Outgoing.h ../../../include/Ice/BasicStream.h ../../../include/Ice/ObjectFactoryF.h ../../../include/Ice/Buffer.h ../../../include/Ice/Protocol.h ../../../include/IceUtil/Unicode.h ../../../include/Ice/OutgoingAsync.h ../../../include/Ice/Incoming.h ../../../include/Ice/ServantLocatorF.h ../../../include/Ice/ServantManagerF.h ../../../include/Ice/Direct.h ../../../src/Ice/EndpointFactoryManager.h ../../../include/Ice/EndpointFactoryF.h EndpointFactory.h ../../../include/Ice/EndpointFactory.h EndpointI.h ../../../src/Ice/EndpointI.h ../../../src/Ice/TransceiverF.h ../../../src/Ice/ConnectorF.h ../../../src/Ice/AcceptorF.h Configuration.h ../../../src/Ice/Selector.h
+PluginI$(OBJEXT): PluginI.cpp ../../../include/Ice/Initialize.h ../../../include/Ice/CommunicatorF.h ../../../include/Ice/LocalObjectF.h ../../../include/IceUtil/Shared.h ../../../include/IceUtil/Config.h ../../../include/IceUtil/Mutex.h ../../../include/IceUtil/Lock.h ../../../include/IceUtil/ThreadException.h ../../../include/IceUtil/Exception.h ../../../include/Ice/Handle.h ../../../include/IceUtil/Handle.h ../../../include/Ice/Config.h ../../../include/Ice/ProxyHandle.h ../../../include/Ice/ProxyF.h ../../../include/Ice/ObjectF.h ../../../include/Ice/GCCountMap.h ../../../include/Ice/GCShared.h ../../../include/Ice/Exception.h ../../../include/Ice/LocalObject.h ../../../include/Ice/UndefSysMacros.h ../../../include/Ice/PropertiesF.h ../../../include/Ice/Proxy.h ../../../include/Ice/ProxyFactoryF.h ../../../include/Ice/ConnectionIF.h ../../../include/Ice/RequestHandlerF.h ../../../include/Ice/EndpointIF.h ../../../include/Ice/Endpoint.h ../../../include/Ice/ObjectAdapterF.h ../../../include/Ice/ReferenceF.h ../../../include/Ice/OutgoingAsyncF.h ../../../include/Ice/Current.h ../../../include/Ice/ConnectionF.h ../../../include/Ice/Identity.h ../../../include/Ice/StreamF.h ../../../include/Ice/Object.h ../../../include/Ice/IncomingAsyncF.h ../../../include/Ice/InstanceF.h ../../../include/Ice/LoggerF.h ../../../include/Ice/StatsF.h ../../../include/Ice/StringConverter.h ../../../include/Ice/BuiltinSequences.h ../../../src/Ice/Instance.h ../../../include/IceUtil/RecMutex.h ../../../include/IceUtil/Timer.h ../../../include/IceUtil/Thread.h ../../../include/IceUtil/Monitor.h ../../../include/IceUtil/Cond.h ../../../include/IceUtil/Time.h ../../../src/Ice/TraceLevelsF.h ../../../src/Ice/DefaultsAndOverridesF.h ../../../src/Ice/RouterInfoF.h ../../../src/Ice/LocatorInfoF.h ../../../src/Ice/ReferenceFactoryF.h ../../../src/Ice/ThreadPoolF.h ../../../src/Ice/SelectorThreadF.h ../../../include/Ice/ConnectionFactoryF.h ../../../include/Ice/ConnectionMonitorF.h ../../../src/Ice/ObjectFactoryManagerF.h ../../../include/Ice/ObjectAdapterFactoryF.h ../../../src/Ice/EndpointFactoryManagerF.h ../../../include/Ice/DynamicLibraryF.h ../../../include/Ice/PluginF.h ../../../src/Ice/SharedContext.h ../../../src/Ice/ImplicitContextI.h ../../../include/Ice/ImplicitContext.h ../../../include/Ice/LocalException.h ../../../include/Ice/FacetMap.h ../../../include/Ice/Process.h ../../../include/Ice/Outgoing.h ../../../include/Ice/BasicStream.h ../../../include/Ice/ObjectFactoryF.h ../../../include/Ice/Buffer.h ../../../include/Ice/Protocol.h ../../../include/IceUtil/Unicode.h ../../../include/Ice/OutgoingAsync.h ../../../include/Ice/Incoming.h ../../../include/Ice/ServantLocatorF.h ../../../include/Ice/ServantManagerF.h ../../../include/Ice/Direct.h ../../../include/Ice/ProtocolPluginFacade.h ../../../include/Ice/ProtocolPluginFacadeF.h ../../../include/Ice/EndpointFactoryF.h ../../../src/Ice/EndpointFactoryManager.h PluginI.h ../../../include/Ice/Plugin.h Configuration.h ../../../src/Ice/Selector.h EndpointFactory.h ../../../include/Ice/EndpointFactory.h
+Configuration$(OBJEXT): Configuration.cpp Configuration.h ../../../include/IceUtil/Shared.h ../../../include/IceUtil/Config.h ../../../include/IceUtil/Mutex.h ../../../include/IceUtil/Lock.h ../../../include/IceUtil/ThreadException.h ../../../include/IceUtil/Exception.h ../../../include/IceUtil/Handle.h ../../../include/Ice/LocalException.h ../../../include/Ice/LocalObjectF.h ../../../include/Ice/Handle.h ../../../include/Ice/Config.h ../../../include/Ice/ProxyHandle.h ../../../include/Ice/ProxyF.h ../../../include/Ice/ObjectF.h ../../../include/Ice/GCCountMap.h ../../../include/Ice/GCShared.h ../../../include/Ice/Exception.h ../../../include/Ice/LocalObject.h ../../../include/Ice/Proxy.h ../../../include/Ice/ProxyFactoryF.h ../../../include/Ice/ConnectionIF.h ../../../include/Ice/RequestHandlerF.h ../../../include/Ice/EndpointIF.h ../../../include/Ice/Endpoint.h ../../../include/Ice/UndefSysMacros.h ../../../include/Ice/ObjectAdapterF.h ../../../include/Ice/ReferenceF.h ../../../include/Ice/OutgoingAsyncF.h ../../../include/Ice/Current.h ../../../include/Ice/ConnectionF.h ../../../include/Ice/Identity.h ../../../include/Ice/StreamF.h ../../../include/Ice/CommunicatorF.h ../../../include/Ice/BuiltinSequences.h ../../../src/Ice/Selector.h ../../../include/Ice/InstanceF.h
+Test$(OBJEXT): Test.cpp Test.h ../../../include/Ice/LocalObjectF.h ../../../include/IceUtil/Shared.h ../../../include/IceUtil/Config.h ../../../include/IceUtil/Mutex.h ../../../include/IceUtil/Lock.h ../../../include/IceUtil/ThreadException.h ../../../include/IceUtil/Exception.h ../../../include/Ice/Handle.h ../../../include/IceUtil/Handle.h ../../../include/Ice/Config.h ../../../include/Ice/ProxyHandle.h ../../../include/Ice/ProxyF.h ../../../include/Ice/ObjectF.h ../../../include/Ice/GCCountMap.h ../../../include/Ice/GCShared.h ../../../include/Ice/Exception.h ../../../include/Ice/LocalObject.h ../../../include/Ice/Proxy.h ../../../include/Ice/ProxyFactoryF.h ../../../include/Ice/ConnectionIF.h ../../../include/Ice/RequestHandlerF.h ../../../include/Ice/EndpointIF.h ../../../include/Ice/Endpoint.h ../../../include/Ice/UndefSysMacros.h ../../../include/Ice/ObjectAdapterF.h ../../../include/Ice/ReferenceF.h ../../../include/Ice/OutgoingAsyncF.h ../../../include/Ice/Current.h ../../../include/Ice/ConnectionF.h ../../../include/Ice/Identity.h ../../../include/Ice/StreamF.h ../../../include/Ice/CommunicatorF.h ../../../include/Ice/Object.h ../../../include/Ice/IncomingAsyncF.h ../../../include/Ice/Outgoing.h ../../../include/IceUtil/Monitor.h ../../../include/IceUtil/Cond.h ../../../include/IceUtil/Time.h ../../../include/Ice/InstanceF.h ../../../include/Ice/BasicStream.h ../../../include/Ice/ObjectFactoryF.h ../../../include/Ice/Buffer.h ../../../include/Ice/Protocol.h ../../../include/Ice/StringConverter.h ../../../include/IceUtil/Unicode.h ../../../include/Ice/OutgoingAsync.h ../../../include/IceUtil/Timer.h ../../../include/IceUtil/Thread.h ../../../include/Ice/Incoming.h ../../../include/Ice/ServantLocatorF.h ../../../include/Ice/ServantManagerF.h ../../../include/Ice/Direct.h ../../../include/Ice/BuiltinSequences.h ../../../include/Ice/LocalException.h ../../../include/Ice/ObjectFactory.h ../../../include/IceUtil/Iterator.h ../../../include/IceUtil/ScopedArray.h
+Client$(OBJEXT): Client.cpp ../../../include/Ice/Ice.h ../../../include/Ice/Initialize.h ../../../include/Ice/CommunicatorF.h ../../../include/Ice/LocalObjectF.h ../../../include/IceUtil/Shared.h ../../../include/IceUtil/Config.h ../../../include/IceUtil/Mutex.h ../../../include/IceUtil/Lock.h ../../../include/IceUtil/ThreadException.h ../../../include/IceUtil/Exception.h ../../../include/Ice/Handle.h ../../../include/IceUtil/Handle.h ../../../include/Ice/Config.h ../../../include/Ice/ProxyHandle.h ../../../include/Ice/ProxyF.h ../../../include/Ice/ObjectF.h ../../../include/Ice/GCCountMap.h ../../../include/Ice/GCShared.h ../../../include/Ice/Exception.h ../../../include/Ice/LocalObject.h ../../../include/Ice/UndefSysMacros.h ../../../include/Ice/PropertiesF.h ../../../include/Ice/Proxy.h ../../../include/Ice/ProxyFactoryF.h ../../../include/Ice/ConnectionIF.h ../../../include/Ice/RequestHandlerF.h ../../../include/Ice/EndpointIF.h ../../../include/Ice/Endpoint.h ../../../include/Ice/ObjectAdapterF.h ../../../include/Ice/ReferenceF.h ../../../include/Ice/OutgoingAsyncF.h ../../../include/Ice/Current.h ../../../include/Ice/ConnectionF.h ../../../include/Ice/Identity.h ../../../include/Ice/StreamF.h ../../../include/Ice/Object.h ../../../include/Ice/IncomingAsyncF.h ../../../include/Ice/InstanceF.h ../../../include/Ice/LoggerF.h ../../../include/Ice/StatsF.h ../../../include/Ice/StringConverter.h ../../../include/Ice/BuiltinSequences.h ../../../include/Ice/LocalException.h ../../../include/Ice/Properties.h ../../../include/Ice/Outgoing.h ../../../include/IceUtil/Monitor.h ../../../include/IceUtil/Cond.h ../../../include/IceUtil/Time.h ../../../include/Ice/BasicStream.h ../../../include/Ice/ObjectFactoryF.h ../../../include/Ice/Buffer.h ../../../include/Ice/Protocol.h ../../../include/IceUtil/Unicode.h ../../../include/Ice/Incoming.h ../../../include/Ice/ServantLocatorF.h ../../../include/Ice/ServantManagerF.h ../../../include/Ice/Direct.h ../../../include/Ice/Logger.h ../../../include/Ice/LoggerUtil.h ../../../include/Ice/Stats.h ../../../include/Ice/Communicator.h ../../../include/Ice/RouterF.h ../../../include/Ice/LocatorF.h ../../../include/Ice/PluginF.h ../../../include/Ice/ImplicitContextF.h ../../../include/Ice/ObjectFactory.h ../../../include/Ice/ObjectAdapter.h ../../../include/Ice/FacetMap.h ../../../include/Ice/ServantLocator.h ../../../include/Ice/OutgoingAsync.h ../../../include/IceUtil/Timer.h ../../../include/IceUtil/Thread.h ../../../include/Ice/IncomingAsync.h ../../../include/Ice/Process.h ../../../include/Ice/Application.h ../../../include/Ice/Connection.h ../../../include/Ice/Functional.h ../../../include/IceUtil/Functional.h ../../../include/Ice/Stream.h ../../../include/Ice/ImplicitContext.h ../../../include/Ice/Locator.h ../../../include/Ice/UserExceptionFactory.h ../../../include/Ice/FactoryTable.h ../../../include/Ice/FactoryTableDef.h ../../../include/IceUtil/StaticMutex.h ../../../include/Ice/UserExceptionFactoryF.h ../../../include/Ice/ProcessF.h ../../../include/Ice/Router.h ../../../include/Ice/DispatchInterceptor.h ../../../include/Ice/IconvStringConverter.h ../../include/TestCommon.h Test.h Configuration.h ../../../src/Ice/Selector.h
+AllTests$(OBJEXT): AllTests.cpp ../../../include/IceUtil/IceUtil.h ../../../include/IceUtil/Config.h ../../../include/IceUtil/AbstractMutex.h ../../../include/IceUtil/Lock.h ../../../include/IceUtil/ThreadException.h ../../../include/IceUtil/Exception.h ../../../include/IceUtil/Algorithm.h ../../../include/IceUtil/ArgVector.h ../../../include/IceUtil/Base64.h ../../../include/IceUtil/Cache.h ../../../include/IceUtil/Handle.h ../../../include/IceUtil/Mutex.h ../../../include/IceUtil/CountDownLatch.h ../../../include/IceUtil/Cond.h ../../../include/IceUtil/Time.h ../../../include/IceUtil/CtrlCHandler.h ../../../include/IceUtil/Functional.h ../../../include/IceUtil/InputUtil.h ../../../include/IceUtil/Iterator.h ../../../include/IceUtil/MD5.h ../../../include/IceUtil/Monitor.h ../../../include/IceUtil/Options.h ../../../include/IceUtil/RecMutex.h ../../../include/IceUtil/Shared.h ../../../include/IceUtil/OutputUtil.h ../../../include/IceUtil/RWRecMutex.h ../../../include/IceUtil/Thread.h ../../../include/IceUtil/Random.h ../../../include/IceUtil/ScopedArray.h ../../../include/IceUtil/StaticMutex.h ../../../include/IceUtil/StringUtil.h ../../../include/IceUtil/UUID.h ../../../include/IceUtil/Unicode.h ../../../include/IceUtil/Timer.h ../../../include/Ice/Ice.h ../../../include/Ice/Initialize.h ../../../include/Ice/CommunicatorF.h ../../../include/Ice/LocalObjectF.h ../../../include/Ice/Handle.h ../../../include/Ice/Config.h ../../../include/Ice/ProxyHandle.h ../../../include/Ice/ProxyF.h ../../../include/Ice/ObjectF.h ../../../include/Ice/GCCountMap.h ../../../include/Ice/GCShared.h ../../../include/Ice/Exception.h ../../../include/Ice/LocalObject.h ../../../include/Ice/UndefSysMacros.h ../../../include/Ice/PropertiesF.h ../../../include/Ice/Proxy.h ../../../include/Ice/ProxyFactoryF.h ../../../include/Ice/ConnectionIF.h ../../../include/Ice/RequestHandlerF.h ../../../include/Ice/EndpointIF.h ../../../include/Ice/Endpoint.h ../../../include/Ice/ObjectAdapterF.h ../../../include/Ice/ReferenceF.h ../../../include/Ice/OutgoingAsyncF.h ../../../include/Ice/Current.h ../../../include/Ice/ConnectionF.h ../../../include/Ice/Identity.h ../../../include/Ice/StreamF.h ../../../include/Ice/Object.h ../../../include/Ice/IncomingAsyncF.h ../../../include/Ice/InstanceF.h ../../../include/Ice/LoggerF.h ../../../include/Ice/StatsF.h ../../../include/Ice/StringConverter.h ../../../include/Ice/BuiltinSequences.h ../../../include/Ice/LocalException.h ../../../include/Ice/Properties.h ../../../include/Ice/Outgoing.h ../../../include/Ice/BasicStream.h ../../../include/Ice/ObjectFactoryF.h ../../../include/Ice/Buffer.h ../../../include/Ice/Protocol.h ../../../include/Ice/Incoming.h ../../../include/Ice/ServantLocatorF.h ../../../include/Ice/ServantManagerF.h ../../../include/Ice/Direct.h ../../../include/Ice/Logger.h ../../../include/Ice/LoggerUtil.h ../../../include/Ice/Stats.h ../../../include/Ice/Communicator.h ../../../include/Ice/RouterF.h ../../../include/Ice/LocatorF.h ../../../include/Ice/PluginF.h ../../../include/Ice/ImplicitContextF.h ../../../include/Ice/ObjectFactory.h ../../../include/Ice/ObjectAdapter.h ../../../include/Ice/FacetMap.h ../../../include/Ice/ServantLocator.h ../../../include/Ice/OutgoingAsync.h ../../../include/Ice/IncomingAsync.h ../../../include/Ice/Process.h ../../../include/Ice/Application.h ../../../include/Ice/Connection.h ../../../include/Ice/Functional.h ../../../include/Ice/Stream.h ../../../include/Ice/ImplicitContext.h ../../../include/Ice/Locator.h ../../../include/Ice/UserExceptionFactory.h ../../../include/Ice/FactoryTable.h ../../../include/Ice/FactoryTableDef.h ../../../include/Ice/UserExceptionFactoryF.h ../../../include/Ice/ProcessF.h ../../../include/Ice/Router.h ../../../include/Ice/DispatchInterceptor.h ../../../include/Ice/IconvStringConverter.h ../../include/TestCommon.h Test.h PluginI.h ../../../include/Ice/Plugin.h Configuration.h ../../../src/Ice/Selector.h
+Configuration$(OBJEXT): Configuration.cpp Configuration.h ../../../include/IceUtil/Shared.h ../../../include/IceUtil/Config.h ../../../include/IceUtil/Mutex.h ../../../include/IceUtil/Lock.h ../../../include/IceUtil/ThreadException.h ../../../include/IceUtil/Exception.h ../../../include/IceUtil/Handle.h ../../../include/Ice/LocalException.h ../../../include/Ice/LocalObjectF.h ../../../include/Ice/Handle.h ../../../include/Ice/Config.h ../../../include/Ice/ProxyHandle.h ../../../include/Ice/ProxyF.h ../../../include/Ice/ObjectF.h ../../../include/Ice/GCCountMap.h ../../../include/Ice/GCShared.h ../../../include/Ice/Exception.h ../../../include/Ice/LocalObject.h ../../../include/Ice/Proxy.h ../../../include/Ice/ProxyFactoryF.h ../../../include/Ice/ConnectionIF.h ../../../include/Ice/RequestHandlerF.h ../../../include/Ice/EndpointIF.h ../../../include/Ice/Endpoint.h ../../../include/Ice/UndefSysMacros.h ../../../include/Ice/ObjectAdapterF.h ../../../include/Ice/ReferenceF.h ../../../include/Ice/OutgoingAsyncF.h ../../../include/Ice/Current.h ../../../include/Ice/ConnectionF.h ../../../include/Ice/Identity.h ../../../include/Ice/StreamF.h ../../../include/Ice/CommunicatorF.h ../../../include/Ice/BuiltinSequences.h ../../../src/Ice/Selector.h ../../../include/Ice/InstanceF.h
+Test$(OBJEXT): Test.cpp Test.h ../../../include/Ice/LocalObjectF.h ../../../include/IceUtil/Shared.h ../../../include/IceUtil/Config.h ../../../include/IceUtil/Mutex.h ../../../include/IceUtil/Lock.h ../../../include/IceUtil/ThreadException.h ../../../include/IceUtil/Exception.h ../../../include/Ice/Handle.h ../../../include/IceUtil/Handle.h ../../../include/Ice/Config.h ../../../include/Ice/ProxyHandle.h ../../../include/Ice/ProxyF.h ../../../include/Ice/ObjectF.h ../../../include/Ice/GCCountMap.h ../../../include/Ice/GCShared.h ../../../include/Ice/Exception.h ../../../include/Ice/LocalObject.h ../../../include/Ice/Proxy.h ../../../include/Ice/ProxyFactoryF.h ../../../include/Ice/ConnectionIF.h ../../../include/Ice/RequestHandlerF.h ../../../include/Ice/EndpointIF.h ../../../include/Ice/Endpoint.h ../../../include/Ice/UndefSysMacros.h ../../../include/Ice/ObjectAdapterF.h ../../../include/Ice/ReferenceF.h ../../../include/Ice/OutgoingAsyncF.h ../../../include/Ice/Current.h ../../../include/Ice/ConnectionF.h ../../../include/Ice/Identity.h ../../../include/Ice/StreamF.h ../../../include/Ice/CommunicatorF.h ../../../include/Ice/Object.h ../../../include/Ice/IncomingAsyncF.h ../../../include/Ice/Outgoing.h ../../../include/IceUtil/Monitor.h ../../../include/IceUtil/Cond.h ../../../include/IceUtil/Time.h ../../../include/Ice/InstanceF.h ../../../include/Ice/BasicStream.h ../../../include/Ice/ObjectFactoryF.h ../../../include/Ice/Buffer.h ../../../include/Ice/Protocol.h ../../../include/Ice/StringConverter.h ../../../include/IceUtil/Unicode.h ../../../include/Ice/OutgoingAsync.h ../../../include/IceUtil/Timer.h ../../../include/IceUtil/Thread.h ../../../include/Ice/Incoming.h ../../../include/Ice/ServantLocatorF.h ../../../include/Ice/ServantManagerF.h ../../../include/Ice/Direct.h ../../../include/Ice/BuiltinSequences.h ../../../include/Ice/LocalException.h ../../../include/Ice/ObjectFactory.h ../../../include/IceUtil/Iterator.h ../../../include/IceUtil/ScopedArray.h
+TestI$(OBJEXT): TestI.cpp TestI.h Test.h ../../../include/Ice/LocalObjectF.h ../../../include/IceUtil/Shared.h ../../../include/IceUtil/Config.h ../../../include/IceUtil/Mutex.h ../../../include/IceUtil/Lock.h ../../../include/IceUtil/ThreadException.h ../../../include/IceUtil/Exception.h ../../../include/Ice/Handle.h ../../../include/IceUtil/Handle.h ../../../include/Ice/Config.h ../../../include/Ice/ProxyHandle.h ../../../include/Ice/ProxyF.h ../../../include/Ice/ObjectF.h ../../../include/Ice/GCCountMap.h ../../../include/Ice/GCShared.h ../../../include/Ice/Exception.h ../../../include/Ice/LocalObject.h ../../../include/Ice/Proxy.h ../../../include/Ice/ProxyFactoryF.h ../../../include/Ice/ConnectionIF.h ../../../include/Ice/RequestHandlerF.h ../../../include/Ice/EndpointIF.h ../../../include/Ice/Endpoint.h ../../../include/Ice/UndefSysMacros.h ../../../include/Ice/ObjectAdapterF.h ../../../include/Ice/ReferenceF.h ../../../include/Ice/OutgoingAsyncF.h ../../../include/Ice/Current.h ../../../include/Ice/ConnectionF.h ../../../include/Ice/Identity.h ../../../include/Ice/StreamF.h ../../../include/Ice/CommunicatorF.h ../../../include/Ice/Object.h ../../../include/Ice/IncomingAsyncF.h ../../../include/Ice/Outgoing.h ../../../include/IceUtil/Monitor.h ../../../include/IceUtil/Cond.h ../../../include/IceUtil/Time.h ../../../include/Ice/InstanceF.h ../../../include/Ice/BasicStream.h ../../../include/Ice/ObjectFactoryF.h ../../../include/Ice/Buffer.h ../../../include/Ice/Protocol.h ../../../include/Ice/StringConverter.h ../../../include/IceUtil/Unicode.h ../../../include/Ice/OutgoingAsync.h ../../../include/IceUtil/Timer.h ../../../include/IceUtil/Thread.h ../../../include/Ice/Incoming.h ../../../include/Ice/ServantLocatorF.h ../../../include/Ice/ServantManagerF.h ../../../include/Ice/Direct.h ../../../include/Ice/BuiltinSequences.h Configuration.h ../../../include/Ice/LocalException.h ../../../src/Ice/Selector.h ../../../include/Ice/Ice.h ../../../include/Ice/Initialize.h ../../../include/Ice/PropertiesF.h ../../../include/Ice/LoggerF.h ../../../include/Ice/StatsF.h ../../../include/Ice/Properties.h ../../../include/Ice/Logger.h ../../../include/Ice/LoggerUtil.h ../../../include/Ice/Stats.h ../../../include/Ice/Communicator.h ../../../include/Ice/RouterF.h ../../../include/Ice/LocatorF.h ../../../include/Ice/PluginF.h ../../../include/Ice/ImplicitContextF.h ../../../include/Ice/ObjectFactory.h ../../../include/Ice/ObjectAdapter.h ../../../include/Ice/FacetMap.h ../../../include/Ice/ServantLocator.h ../../../include/Ice/IncomingAsync.h ../../../include/Ice/Process.h ../../../include/Ice/Application.h ../../../include/Ice/Connection.h ../../../include/Ice/Functional.h ../../../include/IceUtil/Functional.h ../../../include/Ice/Stream.h ../../../include/Ice/ImplicitContext.h ../../../include/Ice/Locator.h ../../../include/Ice/UserExceptionFactory.h ../../../include/Ice/FactoryTable.h ../../../include/Ice/FactoryTableDef.h ../../../include/IceUtil/StaticMutex.h ../../../include/Ice/UserExceptionFactoryF.h ../../../include/Ice/ProcessF.h ../../../include/Ice/Router.h ../../../include/Ice/DispatchInterceptor.h ../../../include/Ice/IconvStringConverter.h
+Server$(OBJEXT): Server.cpp ../../../include/IceUtil/DisableWarnings.h ../../../include/Ice/Ice.h ../../../include/Ice/Initialize.h ../../../include/Ice/CommunicatorF.h ../../../include/Ice/LocalObjectF.h ../../../include/IceUtil/Shared.h ../../../include/IceUtil/Config.h ../../../include/IceUtil/Mutex.h ../../../include/IceUtil/Lock.h ../../../include/IceUtil/ThreadException.h ../../../include/IceUtil/Exception.h ../../../include/Ice/Handle.h ../../../include/IceUtil/Handle.h ../../../include/Ice/Config.h ../../../include/Ice/ProxyHandle.h ../../../include/Ice/ProxyF.h ../../../include/Ice/ObjectF.h ../../../include/Ice/GCCountMap.h ../../../include/Ice/GCShared.h ../../../include/Ice/Exception.h ../../../include/Ice/LocalObject.h ../../../include/Ice/UndefSysMacros.h ../../../include/Ice/PropertiesF.h ../../../include/Ice/Proxy.h ../../../include/Ice/ProxyFactoryF.h ../../../include/Ice/ConnectionIF.h ../../../include/Ice/RequestHandlerF.h ../../../include/Ice/EndpointIF.h ../../../include/Ice/Endpoint.h ../../../include/Ice/ObjectAdapterF.h ../../../include/Ice/ReferenceF.h ../../../include/Ice/OutgoingAsyncF.h ../../../include/Ice/Current.h ../../../include/Ice/ConnectionF.h ../../../include/Ice/Identity.h ../../../include/Ice/StreamF.h ../../../include/Ice/Object.h ../../../include/Ice/IncomingAsyncF.h ../../../include/Ice/InstanceF.h ../../../include/Ice/LoggerF.h ../../../include/Ice/StatsF.h ../../../include/Ice/StringConverter.h ../../../include/Ice/BuiltinSequences.h ../../../include/Ice/LocalException.h ../../../include/Ice/Properties.h ../../../include/Ice/Outgoing.h ../../../include/IceUtil/Monitor.h ../../../include/IceUtil/Cond.h ../../../include/IceUtil/Time.h ../../../include/Ice/BasicStream.h ../../../include/Ice/ObjectFactoryF.h ../../../include/Ice/Buffer.h ../../../include/Ice/Protocol.h ../../../include/IceUtil/Unicode.h ../../../include/Ice/Incoming.h ../../../include/Ice/ServantLocatorF.h ../../../include/Ice/ServantManagerF.h ../../../include/Ice/Direct.h ../../../include/Ice/Logger.h ../../../include/Ice/LoggerUtil.h ../../../include/Ice/Stats.h ../../../include/Ice/Communicator.h ../../../include/Ice/RouterF.h ../../../include/Ice/LocatorF.h ../../../include/Ice/PluginF.h ../../../include/Ice/ImplicitContextF.h ../../../include/Ice/ObjectFactory.h ../../../include/Ice/ObjectAdapter.h ../../../include/Ice/FacetMap.h ../../../include/Ice/ServantLocator.h ../../../include/Ice/OutgoingAsync.h ../../../include/IceUtil/Timer.h ../../../include/IceUtil/Thread.h ../../../include/Ice/IncomingAsync.h ../../../include/Ice/Process.h ../../../include/Ice/Application.h ../../../include/Ice/Connection.h ../../../include/Ice/Functional.h ../../../include/IceUtil/Functional.h ../../../include/Ice/Stream.h ../../../include/Ice/ImplicitContext.h ../../../include/Ice/Locator.h ../../../include/Ice/UserExceptionFactory.h ../../../include/Ice/FactoryTable.h ../../../include/Ice/FactoryTableDef.h ../../../include/IceUtil/StaticMutex.h ../../../include/Ice/UserExceptionFactoryF.h ../../../include/Ice/ProcessF.h ../../../include/Ice/Router.h ../../../include/Ice/DispatchInterceptor.h ../../../include/Ice/IconvStringConverter.h TestI.h Test.h Configuration.h ../../../src/Ice/Selector.h PluginI.h ../../../include/Ice/Plugin.h
+Test.cpp: Test.ice ../../../../slice/Ice/BuiltinSequences.ice
+Test.ice: $(SLICE2CPP) $(SLICEPARSERLIB)
diff --git a/cpp/test/Ice/background/.gitignore b/cpp/test/Ice/background/.gitignore
new file mode 100644
index 00000000000..67872faa673
--- /dev/null
+++ b/cpp/test/Ice/background/.gitignore
@@ -0,0 +1,7 @@
+// Generated by makegitignore.py
+
+// IMPORTANT: Do not edit this file -- any edits made here will be lost!
+client
+server
+Test.cpp
+Test.h
diff --git a/cpp/test/Ice/background/Acceptor.cpp b/cpp/test/Ice/background/Acceptor.cpp
new file mode 100644
index 00000000000..d7158bdc4d4
--- /dev/null
+++ b/cpp/test/Ice/background/Acceptor.cpp
@@ -0,0 +1,54 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2007 ZeroC, Inc. All rights reserved.
+//
+// This copy of Ice is licensed to you under the terms described in the
+// ICE_LICENSE file included in this distribution.
+//
+// **********************************************************************
+
+#include <Acceptor.h>
+#include <Transceiver.h>
+
+using namespace std;
+
+SOCKET
+Acceptor::fd()
+{
+ return _acceptor->fd();
+}
+
+void
+Acceptor::close()
+{
+ _acceptor->close();
+}
+
+void
+Acceptor::listen()
+{
+ _acceptor->listen();
+}
+
+IceInternal::TransceiverPtr
+Acceptor::accept(int timeout)
+{
+ return new Transceiver(_acceptor->accept(timeout));
+}
+
+void
+Acceptor::connectToSelf()
+{
+ _acceptor->connectToSelf();
+}
+
+string
+Acceptor::toString() const
+{
+ return _acceptor->toString();
+}
+
+Acceptor::Acceptor(const IceInternal::AcceptorPtr& acceptor) : _acceptor(acceptor)
+{
+}
+
diff --git a/cpp/test/Ice/background/Acceptor.h b/cpp/test/Ice/background/Acceptor.h
new file mode 100644
index 00000000000..a6fa166cd7f
--- /dev/null
+++ b/cpp/test/Ice/background/Acceptor.h
@@ -0,0 +1,34 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2007 ZeroC, Inc. All rights reserved.
+//
+// This copy of Ice is licensed to you under the terms described in the
+// ICE_LICENSE file included in this distribution.
+//
+// **********************************************************************
+
+#ifndef TEST_ACCEPTOR_H
+#define TEST_ACCEPTOR_H
+
+#include <Ice/Acceptor.h>
+
+class Acceptor : public IceInternal::Acceptor
+{
+public:
+
+ virtual SOCKET fd();
+ virtual void close();
+ virtual void listen();
+ virtual IceInternal::TransceiverPtr accept(int);
+ virtual void connectToSelf();
+ virtual std::string toString() const;
+
+private:
+
+ Acceptor(const IceInternal::AcceptorPtr&);
+ friend class EndpointI;
+
+ const IceInternal::AcceptorPtr _acceptor;
+};
+
+#endif
diff --git a/cpp/test/Ice/background/AllTests.cpp b/cpp/test/Ice/background/AllTests.cpp
new file mode 100644
index 00000000000..a4f0464575b
--- /dev/null
+++ b/cpp/test/Ice/background/AllTests.cpp
@@ -0,0 +1,1171 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2007 ZeroC, Inc. All rights reserved.
+//
+// This copy of Ice is licensed to you under the terms described in the
+// ICE_LICENSE file included in this distribution.
+//
+// **********************************************************************
+
+#include <IceUtil/IceUtil.h>
+#include <Ice/Ice.h>
+#include <TestCommon.h>
+#include <Test.h>
+#include <PluginI.h>
+#include <Configuration.h>
+
+using namespace std;
+using namespace Test;
+
+class Callback : public IceUtil::Monitor<IceUtil::Mutex>
+{
+public:
+
+ Callback() : _called(false)
+ {
+ }
+
+ bool
+ check(bool wait)
+ {
+ if(wait)
+ {
+ Lock sync(*this);
+ while(!_called)
+ {
+ timedWait(IceUtil::Time::seconds(5));
+ if(!_called)
+ {
+ return false; // Must be timeout.
+ }
+ }
+ _called = false;
+ return true;
+ }
+ return _called;
+ }
+
+ void
+ called()
+ {
+ Lock sync(*this);
+ assert(!_called);
+ _called = true;
+ notify();
+ }
+
+private:
+
+ bool _called;
+};
+
+class OpAMICallback : public Test::AMI_Background_op
+{
+public:
+
+ virtual void
+ ice_response()
+ {
+ callback.called();
+ }
+
+ virtual void
+ ice_exception(const Ice::Exception& ex)
+ {
+ cerr << ex << endl;
+ test(false);
+ }
+
+ bool
+ response(bool wait)
+ {
+ return callback.check(wait);
+ }
+
+private:
+
+ Callback callback;
+};
+typedef IceUtil::Handle<OpAMICallback> OpAMICallbackPtr;
+
+class FlushBatchRequestsCallback : public Ice::AMI_Object_ice_flushBatchRequests
+{
+public:
+
+ virtual void
+ ice_exception(const Ice::Exception& ex)
+ {
+ cerr << ex << endl;
+ test(false);
+ }
+};
+typedef IceUtil::Handle<FlushBatchRequestsCallback> FlushBatchRequestsCallbackPtr;
+
+class OpExAMICallback : public Test::AMI_Background_op
+{
+public:
+
+ virtual void
+ ice_response()
+ {
+ test(false);
+ }
+
+ virtual void
+ ice_exception(const Ice::Exception& ex)
+ {
+ callback.called();
+ }
+
+ bool
+ exception(bool wait)
+ {
+ return callback.check(wait);
+ }
+
+private:
+
+ Callback callback;
+};
+typedef IceUtil::Handle<OpExAMICallback> OpExAMICallbackPtr;
+
+class OpWithPayloadOnewayAMICallback : public Test::AMI_Background_opWithPayload
+{
+public:
+
+ virtual void
+ ice_response()
+ {
+ test(false);
+ }
+
+ virtual void
+ ice_exception(const Ice::Exception& ex)
+ {
+ cerr << ex << endl;
+ test(false);
+ }
+};
+typedef IceUtil::Handle<OpWithPayloadOnewayAMICallback> OpWithPayloadOnewayAMICallbackPtr;
+
+class OpThread : public IceUtil::Thread, public IceUtil::Mutex
+{
+public:
+
+ OpThread(const BackgroundPrx& background) :
+ _destroyed(false),
+ _background(BackgroundPrx::uncheckedCast(background->ice_oneway()))
+ {
+ start();
+ }
+
+ void
+ run()
+ {
+ int count = 0;
+ while(true)
+ {
+ {
+ IceUtil::Mutex::Lock sync(*this);
+ if(_destroyed)
+ {
+ return;
+ }
+ }
+
+ try
+ {
+ if(++count == 10) // Don't blast the connection with only oneway's
+ {
+ count = 0;
+ _background->ice_twoway()->ice_ping();
+ }
+ _background->op_async(new OpExAMICallback());
+ IceUtil::ThreadControl::sleep(IceUtil::Time::milliSeconds(1));
+ }
+ catch(const Ice::LocalException&)
+ {
+ }
+ }
+ }
+
+ void
+ destroy()
+ {
+ IceUtil::Mutex::Lock sync(*this);
+ _destroyed = true;
+ }
+
+private:
+
+ bool _destroyed;
+ BackgroundPrx _background;
+};
+typedef IceUtil::Handle<OpThread> OpThreadPtr;
+
+void connectTests(const ConfigurationPtr&, const Test::BackgroundPrx&);
+void initializeTests(const ConfigurationPtr&, const Test::BackgroundPrx&, const Test::BackgroundControllerPrx&);
+void validationTests(const ConfigurationPtr&, const Test::BackgroundPrx&, const Test::BackgroundControllerPrx&);
+void readWriteTests(const ConfigurationPtr&, const Test::BackgroundPrx&, const Test::BackgroundControllerPrx&);
+
+BackgroundPrx
+allTests(const Ice::CommunicatorPtr& communicator)
+{
+ string sref = "background:default -p 12010 -t 10000";
+ Ice::ObjectPrx obj = communicator->stringToProxy(sref);
+ test(obj);
+
+ BackgroundPrx background = BackgroundPrx::uncheckedCast(obj);
+
+ sref = "backgroundController:tcp -p 12011 -t 10000";
+ obj = communicator->stringToProxy(sref);
+ test(obj);
+
+ BackgroundControllerPrx backgroundController = BackgroundControllerPrx::uncheckedCast(obj);
+
+ PluginI* plugin = dynamic_cast<PluginI*>(communicator->getPluginManager()->getPlugin("Test").get());
+ assert(plugin);
+ ConfigurationPtr configuration = plugin->getConfiguration();
+
+ cout << "testing connect... " << flush;
+ {
+ connectTests(configuration, background);
+ }
+ cout << "ok" << endl;
+
+ cout << "testing initialization... " << flush;
+ {
+ initializeTests(configuration, background, backgroundController);
+ }
+ cout << "ok" << endl;
+
+ cout << "testing connection validation... " << flush;
+ {
+ validationTests(configuration, background, backgroundController);
+ }
+ cout << "ok" << endl;
+
+ cout << "testing read/write... " << flush;
+ {
+ readWriteTests(configuration, background, backgroundController);
+ }
+ cout << "ok" << endl;
+
+ cout << "testing locator... " << flush;
+ {
+ Ice::LocatorPrx locator;
+ obj = communicator->stringToProxy("locator:default -p 12010 -t 500");
+ locator = Ice::LocatorPrx::uncheckedCast(obj);
+ obj = communicator->stringToProxy("background@Test")->ice_locator(locator)->ice_oneway();
+
+ //
+ // TODO: The following test doesn't work on Windows because of a bug
+ // in thread per connection mode where the thread per connection read
+ // call doesn't return when the transceiver is shutdown.
+ //
+#ifdef _WIN32
+ if(communicator->getProperties()->getPropertyAsInt("Ice.ThreadPerConnection") == 0)
+ {
+#endif
+ backgroundController->pauseCall("findAdapterById");
+ try
+ {
+ obj->ice_ping();
+ test(false);
+ }
+ catch(const Ice::TimeoutException&)
+ {
+ }
+ backgroundController->resumeCall("findAdapterById");
+#ifdef _WIN32
+ }
+#endif
+
+ obj = communicator->stringToProxy("locator:default -p 12010 -t 10000");
+ locator = Ice::LocatorPrx::uncheckedCast(obj);
+ obj = obj->ice_locator(locator);
+ obj->ice_ping();
+
+ obj = communicator->stringToProxy("background@Test")->ice_locator(locator);
+ BackgroundPrx bg = BackgroundPrx::uncheckedCast(obj);
+
+ backgroundController->pauseCall("findAdapterById");
+ OpAMICallbackPtr cb = new OpAMICallback();
+ bg->op_async(cb);
+ OpAMICallbackPtr cb2 = new OpAMICallback();
+ bg->op_async(cb2);
+ test(!cb->response(false));
+ test(!cb2->response(false));
+ backgroundController->resumeCall("findAdapterById");
+ test(cb->response(true));
+ test(cb2->response(true));
+ }
+ cout << "ok" << endl;
+
+ cout << "testing router... " << flush;
+ {
+ Ice::RouterPrx router;
+
+ obj = communicator->stringToProxy("router:default -p 12010 -t 500");
+ router = Ice::RouterPrx::uncheckedCast(obj);
+ obj = communicator->stringToProxy("background@Test")->ice_router(router)->ice_oneway();
+
+ //
+ // TODO: The following test doesn't work on Windows because of a bug
+ // in thread per connection mode where the thread per connection read
+ // call doesn't return when the transceiver is shutdown.
+ //
+#ifdef _WIN32
+ if(communicator->getProperties()->getPropertyAsInt("Ice.ThreadPerConnection") == 0)
+ {
+#endif
+ backgroundController->pauseCall("getClientProxy");
+ try
+ {
+ obj->ice_ping();
+ test(false);
+ }
+ catch(const Ice::TimeoutException&)
+ {
+ }
+ backgroundController->resumeCall("getClientProxy");
+#ifdef _WIN32
+ }
+#endif
+
+ obj = communicator->stringToProxy("router:default -p 12010 -t 10000");
+ router = Ice::RouterPrx::uncheckedCast(obj);
+ obj = communicator->stringToProxy("background@Test")->ice_router(router);
+ BackgroundPrx bg = BackgroundPrx::uncheckedCast(obj);
+ test(bg->ice_getRouter());
+
+ backgroundController->pauseCall("getClientProxy");
+ OpAMICallbackPtr cb = new OpAMICallback();
+ bg->op_async(cb);
+ OpAMICallbackPtr cb2 = new OpAMICallback();
+ bg->op_async(cb2);
+ test(!cb->response(false));
+ test(!cb2->response(false));
+ backgroundController->resumeCall("getClientProxy");
+ test(cb->response(true));
+ test(cb2->response(true));
+ }
+ cout << "ok" << endl;
+
+ return background;
+}
+
+void
+connectTests(const ConfigurationPtr& configuration, const Test::BackgroundPrx& background)
+{
+ try
+ {
+ background->op();
+ }
+ catch(const Ice::LocalException&)
+ {
+ test(false);
+ }
+ background->ice_getConnection()->close(false);
+
+ try
+ {
+ configuration->connectorsException(new Ice::DNSException(__FILE__, __LINE__));
+ background->op();
+ test(false);
+ }
+ catch(const Ice::DNSException&)
+ {
+ configuration->connectorsException(0);
+ }
+
+ OpExAMICallbackPtr cbEx = new OpExAMICallback();
+
+ configuration->connectorsException(new Ice::DNSException(__FILE__, __LINE__));
+ background->op_async(cbEx);
+ test(cbEx->exception(true));
+ configuration->connectorsException(0);
+
+ configuration->connectorsException(new Ice::DNSException(__FILE__, __LINE__));
+ background->ice_oneway()->op_async(cbEx);
+ test(cbEx->exception(true));
+ configuration->connectorsException(0);
+
+ try
+ {
+ configuration->connectException(new Ice::SocketException(__FILE__, __LINE__));
+ background->op();
+ test(false);
+ }
+ catch(const Ice::SocketException&)
+ {
+ configuration->connectException(0);
+ }
+
+ configuration->connectException(new Ice::SocketException(__FILE__, __LINE__));
+ background->op_async(cbEx);
+ test(cbEx->exception(true));
+ configuration->connectException(0);
+
+ configuration->connectException(new Ice::SocketException(__FILE__, __LINE__));
+ background->ice_oneway()->op_async(cbEx);
+ test(cbEx->exception(true));
+ configuration->connectException(0);
+
+ OpThreadPtr thread1 = new OpThread(background);
+ OpThreadPtr thread2 = new OpThread(background);
+
+ for(int i = 0; i < 5; i++)
+ {
+ try
+ {
+ background->ice_ping();
+ }
+ catch(const Ice::LocalException&)
+ {
+ test(false);
+ }
+
+ configuration->connectException(new Ice::SocketException(__FILE__, __LINE__));
+ background->ice_getCachedConnection()->close(true);
+ IceUtil::ThreadControl::sleep(IceUtil::Time::milliSeconds(10));
+ configuration->connectException(0);
+ try
+ {
+ background->ice_ping();
+ }
+ catch(const Ice::LocalException&)
+ {
+ }
+ }
+
+ thread1->destroy();
+ thread2->destroy();
+
+ thread1->getThreadControl().join();
+ thread2->getThreadControl().join();
+}
+
+void
+initializeTests(const ConfigurationPtr& configuration,
+ const Test::BackgroundPrx& background,
+ const Test::BackgroundControllerPrx& ctl)
+{
+ try
+ {
+ background->op();
+ }
+ catch(const Ice::LocalException& ex)
+ {
+ cerr << ex << endl;
+ test(false);
+ }
+ background->ice_getConnection()->close(false);
+
+ try
+ {
+ configuration->initializeException(new Ice::SocketException(__FILE__, __LINE__));
+ background->op();
+ test(false);
+ }
+ catch(const Ice::SocketException&)
+ {
+ configuration->initializeException(0);
+ }
+
+ OpExAMICallbackPtr cbEx = new OpExAMICallback();
+
+ configuration->initializeException(new Ice::SocketException(__FILE__, __LINE__));
+ background->op_async(cbEx);
+ test(cbEx->exception(true));
+ configuration->initializeException(0);
+
+ configuration->initializeException(new Ice::SocketException(__FILE__, __LINE__));
+ background->ice_oneway()->op_async(cbEx);
+ test(cbEx->exception(true));
+ configuration->initializeException(0);
+
+ try
+ {
+ configuration->initializeSocketStatus(IceInternal::NeedWrite);
+ background->op();
+ configuration->initializeSocketStatus(IceInternal::Finished);
+ }
+ catch(const Ice::LocalException&)
+ {
+ test(false);
+ }
+ background->ice_getConnection()->close(false);
+
+ try
+ {
+ configuration->initializeSocketStatus(IceInternal::NeedConnect);
+ background->op();
+ configuration->initializeSocketStatus(IceInternal::Finished);
+ }
+ catch(const Ice::LocalException&)
+ {
+ test(false);
+ }
+ background->ice_getConnection()->close(false);
+
+ try
+ {
+ configuration->initializeSocketStatus(IceInternal::NeedWrite);
+ configuration->initializeException(new Ice::SocketException(__FILE__, __LINE__));
+ background->op();
+ test(false);
+ }
+ catch(const Ice::SocketException&)
+ {
+ configuration->initializeException(0);
+ configuration->initializeSocketStatus(IceInternal::Finished);
+ }
+
+ configuration->initializeSocketStatus(IceInternal::NeedWrite);
+ configuration->initializeException(new Ice::SocketException(__FILE__, __LINE__));
+ background->op_async(cbEx);
+ test(cbEx->exception(true));
+ configuration->initializeException(0);
+ configuration->initializeSocketStatus(IceInternal::Finished);
+
+ configuration->initializeSocketStatus(IceInternal::NeedWrite);
+ configuration->initializeException(new Ice::SocketException(__FILE__, __LINE__));
+ background->ice_oneway()->op_async(cbEx);
+ test(cbEx->exception(true));
+ configuration->initializeException(0);
+ configuration->initializeSocketStatus(IceInternal::Finished);
+
+ //
+ // Now run the same tests with the server side.
+ //
+
+ try
+ {
+ ctl->initializeException(true);
+ background->op();
+ test(false);
+ }
+ catch(const Ice::ConnectionLostException&)
+ {
+ ctl->initializeException(false);
+ }
+ catch(const Ice::SecurityException&)
+ {
+ ctl->initializeException(false);
+ }
+
+ try
+ {
+ ctl->initializeSocketStatus(IceInternal::NeedWrite);
+ background->op();
+ ctl->initializeSocketStatus(IceInternal::Finished);
+ }
+ catch(const Ice::LocalException&)
+ {
+ test(false);
+ }
+ background->ice_getConnection()->close(false);
+
+ try
+ {
+ ctl->initializeSocketStatus(IceInternal::NeedWrite);
+ ctl->initializeException(true);
+ background->op();
+ test(false);
+ }
+ catch(const Ice::ConnectionLostException&)
+ {
+ ctl->initializeException(false);
+ ctl->initializeSocketStatus(IceInternal::Finished);
+ }
+ catch(const Ice::SecurityException&)
+ {
+ ctl->initializeException(false);
+ ctl->initializeSocketStatus(IceInternal::Finished);
+ }
+
+ OpThreadPtr thread1 = new OpThread(background);
+ OpThreadPtr thread2 = new OpThread(background);
+
+ for(int i = 0; i < 5; i++)
+ {
+ try
+ {
+ background->ice_ping();
+ }
+ catch(const Ice::LocalException&)
+ {
+ test(false);
+ }
+
+ configuration->initializeException(new Ice::SocketException(__FILE__, __LINE__));
+ background->ice_getCachedConnection()->close(true);
+ IceUtil::ThreadControl::sleep(IceUtil::Time::milliSeconds(10));
+ configuration->initializeException(0);
+ try
+ {
+ background->ice_ping();
+ }
+ catch(const Ice::LocalException&)
+ {
+ }
+ try
+ {
+ background->ice_ping();
+ }
+ catch(const Ice::LocalException&)
+ {
+ test(false);
+ }
+
+ configuration->initializeSocketStatus(IceInternal::NeedWrite);
+ background->ice_getCachedConnection()->close(true);
+ background->ice_ping();
+ configuration->initializeSocketStatus(IceInternal::Finished);
+
+ ctl->initializeException(true);
+ background->ice_getCachedConnection()->close(true);
+ IceUtil::ThreadControl::sleep(IceUtil::Time::milliSeconds(10));
+ ctl->initializeException(false);
+ try
+ {
+ background->ice_ping();
+ }
+ catch(const Ice::LocalException&)
+ {
+ }
+ try
+ {
+ background->ice_ping();
+ }
+ catch(const Ice::LocalException&)
+ {
+ test(false);
+ }
+
+ try
+ {
+ ctl->initializeSocketStatus(IceInternal::NeedWrite);
+ background->ice_getCachedConnection()->close(true);
+ background->op();
+ ctl->initializeSocketStatus(IceInternal::Finished);
+ }
+ catch(const Ice::LocalException& ex)
+ {
+ cerr << ex << endl;
+ test(false);
+ }
+ }
+
+ thread1->destroy();
+ thread2->destroy();
+
+ thread1->getThreadControl().join();
+ thread2->getThreadControl().join();
+}
+
+void
+validationTests(const ConfigurationPtr& configuration,
+ const Test::BackgroundPrx& background,
+ const Test::BackgroundControllerPrx& ctl)
+{
+ try
+ {
+ background->op();
+ }
+ catch(const Ice::LocalException&)
+ {
+ test(false);
+ }
+ background->ice_getConnection()->close(false);
+
+ try
+ {
+ // Get the read() of connection validation to throw right away.
+ configuration->readException(new Ice::SocketException(__FILE__, __LINE__));
+ background->op();
+ test(false);
+ }
+ catch(const Ice::SocketException&)
+ {
+ configuration->readException(0);
+ }
+
+ OpExAMICallbackPtr cbEx = new OpExAMICallback();
+
+ configuration->readException(new Ice::SocketException(__FILE__, __LINE__));
+ background->op_async(cbEx);
+ test(cbEx->exception(true));
+ configuration->readException(0);
+
+ configuration->readException(new Ice::SocketException(__FILE__, __LINE__));
+ background->ice_oneway()->op_async(cbEx);
+ test(cbEx->exception(true));
+ configuration->readException(0);
+
+ if(background->ice_getCommunicator()->getProperties()->getProperty("Ice.Default.Protocol") != "test-ssl")
+ {
+ try
+ {
+ // Get the read() of the connection validation to return "would block"
+ configuration->readReady(false);
+ background->op();
+ configuration->readReady(true);
+ }
+ catch(const Ice::LocalException& ex)
+ {
+ cerr << ex << endl;
+ test(false);
+ }
+ background->ice_getConnection()->close(false);
+
+ try
+ {
+ // Get the read() of the connection validation to return "would block" and then throw.
+ configuration->readReady(false);
+ configuration->readException(new Ice::SocketException(__FILE__, __LINE__));
+ background->op();
+ test(false);
+ }
+ catch(const Ice::SocketException&)
+ {
+ configuration->readException(0);
+ configuration->readReady(true);
+ }
+
+ configuration->readReady(false);
+ configuration->readException(new Ice::SocketException(__FILE__, __LINE__));
+ background->op_async(cbEx);
+ test(cbEx->exception(true));
+ configuration->readException(0);
+ configuration->readReady(true);
+
+ configuration->readReady(false);
+ configuration->readException(new Ice::SocketException(__FILE__, __LINE__));
+ background->ice_oneway()->op_async(cbEx);
+ test(cbEx->exception(true));
+ configuration->readException(0);
+ configuration->readReady(true);
+ }
+
+ ctl->holdAdapter(); // Hold to block in connection validation
+ OpAMICallbackPtr cb = new OpAMICallback();
+ background->op_async(cb);
+ OpAMICallbackPtr cb2 = new OpAMICallback();
+ background->op_async(cb2);
+ test(!cb->response(false));
+ test(!cb2->response(false));
+ ctl->resumeAdapter();
+ test(cb->response(true));
+ test(cb2->response(true));
+
+ try
+ {
+ // Get the write() of connection validation to throw right away.
+ ctl->writeException(true);
+ background->op();
+ test(false);
+ }
+ catch(const Ice::ConnectionLostException&)
+ {
+ ctl->writeException(false);
+ }
+
+ try
+ {
+ // Get the write() of the connection validation to return "would block"
+ ctl->writeReady(false);
+ background->op();
+ ctl->writeReady(true);
+ }
+ catch(const Ice::LocalException& ex)
+ {
+ cerr << ex << endl;
+ test(false);
+ }
+ background->ice_getConnection()->close(false);
+
+ try
+ {
+ // Get the write() of the connection validation to return "would block" and then throw.
+ ctl->writeReady(false);
+ ctl->writeException(true);
+ background->op();
+ test(false);
+ }
+ catch(const Ice::ConnectionLostException&)
+ {
+ ctl->writeException(false);
+ ctl->writeReady(true);
+ }
+
+ Ice::ByteSeq seq;
+ seq.resize(512 * 1024);
+
+ BackgroundPrx backgroundBatchOneway = BackgroundPrx::uncheckedCast(background->ice_batchOneway());
+
+ //
+ // First send small requests to test without auto-flushing.
+ //
+ backgroundBatchOneway->ice_getConnection()->close(false);
+ try
+ {
+ backgroundBatchOneway->ice_ping();
+ test(false);
+ }
+ catch(const Ice::CloseConnectionException&)
+ {
+ }
+ ctl->holdAdapter();
+ backgroundBatchOneway->op();
+ backgroundBatchOneway->op();
+ backgroundBatchOneway->op();
+ backgroundBatchOneway->op();
+ ctl->resumeAdapter();
+ backgroundBatchOneway->ice_flushBatchRequests();
+
+ //
+ // Send bigger requests to test with auto-flushing.
+ //
+ backgroundBatchOneway->ice_getConnection()->close(false);
+ try
+ {
+ backgroundBatchOneway->ice_ping();
+ test(false);
+ }
+ catch(const Ice::CloseConnectionException&)
+ {
+ }
+ ctl->holdAdapter();
+ backgroundBatchOneway->opWithPayload(seq);
+ backgroundBatchOneway->opWithPayload(seq);
+ backgroundBatchOneway->opWithPayload(seq);
+ backgroundBatchOneway->opWithPayload(seq);
+ ctl->resumeAdapter();
+ backgroundBatchOneway->ice_flushBatchRequests();
+
+ //
+ // Then try the same thing with async flush.
+ //
+
+ backgroundBatchOneway->ice_getConnection()->close(false);
+ try
+ {
+ backgroundBatchOneway->ice_ping();
+ test(false);
+ }
+ catch(const Ice::CloseConnectionException&)
+ {
+ }
+ ctl->holdAdapter();
+ backgroundBatchOneway->op();
+ backgroundBatchOneway->op();
+ backgroundBatchOneway->op();
+ backgroundBatchOneway->op();
+ ctl->resumeAdapter();
+ backgroundBatchOneway->ice_flushBatchRequests_async(new FlushBatchRequestsCallback());
+ backgroundBatchOneway->ice_getConnection()->close(false);
+
+ backgroundBatchOneway->ice_getConnection()->close(false);
+ try
+ {
+ backgroundBatchOneway->ice_ping();
+ test(false);
+ }
+ catch(const Ice::CloseConnectionException&)
+ {
+ }
+ ctl->holdAdapter();
+ backgroundBatchOneway->opWithPayload(seq);
+ backgroundBatchOneway->opWithPayload(seq);
+ backgroundBatchOneway->opWithPayload(seq);
+ backgroundBatchOneway->opWithPayload(seq);
+ ctl->resumeAdapter();
+ FlushBatchRequestsCallbackPtr fcb = new FlushBatchRequestsCallback();
+ backgroundBatchOneway->ice_flushBatchRequests_async(fcb);
+ //
+ // We can't close the connection before ensuring all the batches have been sent since
+ // with auto-flushing the close connection message might be sent once the first call
+ // opWithPayload is sent and before the flushBatchRequests (this would therefore result
+ // in the flush to report a CloseConnectionException). Instead we flush a second time
+ // with the same callback to wait for the first flush to complete.
+ //
+ //backgroundBatchOneway->ice_getConnection()->close(false);
+ backgroundBatchOneway->ice_flushBatchRequests_async(fcb);
+ backgroundBatchOneway->ice_getConnection()->close(false);
+}
+
+void
+readWriteTests(const ConfigurationPtr& configuration,
+ const Test::BackgroundPrx& background,
+ const Test::BackgroundControllerPrx& ctl)
+{
+ try
+ {
+ background->op();
+ }
+ catch(const Ice::LocalException& ex)
+ {
+ cerr << ex << endl;
+ test(false);
+ }
+
+ try
+ {
+ background->ice_ping();
+ configuration->writeException(new Ice::SocketException(__FILE__, __LINE__));
+ background->op();
+ test(false);
+ }
+ catch(const Ice::SocketException&)
+ {
+ configuration->writeException(0);
+ }
+
+ OpExAMICallbackPtr cbEx = new OpExAMICallback();
+
+ background->ice_ping();
+ configuration->writeException(new Ice::SocketException(__FILE__, __LINE__));
+ background->op_async(cbEx);
+ test(cbEx->exception(true));
+ configuration->writeException(0);
+
+ background->ice_ping();
+ configuration->writeException(new Ice::SocketException(__FILE__, __LINE__));
+ background->ice_oneway()->op_async(cbEx);
+ test(cbEx->exception(true));
+ configuration->writeException(0);
+
+ try
+ {
+ background->ice_ping();
+ configuration->readException(new Ice::SocketException(__FILE__, __LINE__));
+ background->op();
+ test(false);
+ }
+ catch(const Ice::SocketException&)
+ {
+ configuration->readException(0);
+ }
+
+ background->ice_ping();
+ configuration->readException(new Ice::SocketException(__FILE__, __LINE__));
+ background->op_async(cbEx);
+ test(cbEx->exception(true));
+ configuration->readException(0);
+
+ try
+ {
+ background->ice_ping();
+ configuration->writeReady(false);
+ background->op();
+ configuration->writeReady(true);
+ }
+ catch(const Ice::LocalException&)
+ {
+ test(false);
+ }
+
+ try
+ {
+ background->ice_ping();
+ configuration->readReady(false);
+ background->op();
+ configuration->readReady(true);
+ }
+ catch(const Ice::LocalException&)
+ {
+ test(false);
+ }
+
+ try
+ {
+ background->ice_ping();
+ configuration->writeReady(false);
+ configuration->writeException(new Ice::SocketException(__FILE__, __LINE__));
+ background->op();
+ test(false);
+ }
+ catch(const Ice::SocketException&)
+ {
+ configuration->writeReady(true);
+ configuration->writeException(0);
+ }
+
+ background->ice_ping();
+ configuration->writeReady(false);
+ configuration->writeException(new Ice::SocketException(__FILE__, __LINE__));
+ background->op_async(cbEx);
+ test(cbEx->exception(true));
+ configuration->writeReady(true);
+ configuration->writeException(0);
+
+ background->ice_ping();
+ configuration->writeReady(false);
+ configuration->writeException(new Ice::SocketException(__FILE__, __LINE__));
+ background->ice_oneway()->op_async(cbEx);
+ test(cbEx->exception(true));
+ configuration->writeReady(true);
+ configuration->writeException(0);
+
+ try
+ {
+ background->ice_ping();
+ configuration->readReady(false);
+ configuration->readException(new Ice::SocketException(__FILE__, __LINE__));
+ background->op();
+ test(false);
+ }
+ catch(const Ice::SocketException&)
+ {
+ configuration->readException(0);
+ configuration->readReady(true);
+ }
+
+ background->ice_ping();
+ configuration->readReady(false);
+ configuration->readException(new Ice::SocketException(__FILE__, __LINE__));
+ background->op_async(cbEx);
+ test(cbEx->exception(true));
+ configuration->readReady(true);
+ configuration->readException(0);
+
+ background->ice_ping(); // Establish the connection
+
+ BackgroundPrx backgroundOneway = BackgroundPrx::uncheckedCast(background->ice_oneway());
+ test(backgroundOneway->ice_getConnection() == background->ice_getConnection());
+
+ ctl->holdAdapter(); // Hold to block in request send.
+
+ Ice::ByteSeq seq;
+ seq.resize(512 * 1024);
+ backgroundOneway->opWithPayload_async(new OpWithPayloadOnewayAMICallback(), seq);
+ OpAMICallbackPtr cb = new OpAMICallback();
+ background->op_async(cb);
+ OpAMICallbackPtr cb2 = new OpAMICallback();
+ background->op_async(cb2);
+ backgroundOneway->opWithPayload_async(new OpWithPayloadOnewayAMICallback(), seq);
+ backgroundOneway->opWithPayload_async(new OpWithPayloadOnewayAMICallback(), seq);
+ test(!cb->response(false));
+ test(!cb2->response(false));
+ ctl->resumeAdapter();
+ test(cb->response(true));
+ test(cb2->response(true));
+
+ try
+ {
+ background->ice_ping();
+ ctl->writeException(true);
+ background->op();
+ test(false);
+ }
+ catch(const Ice::ConnectionLostException&)
+ {
+ ctl->writeException(false);
+ }
+
+ try
+ {
+ background->ice_ping();
+ ctl->readException(true);
+ background->op();
+ test(false);
+ }
+ catch(const Ice::ConnectionLostException&)
+ {
+ ctl->readException(false);
+ }
+
+ try
+ {
+ background->ice_ping();
+ ctl->writeReady(false);
+ background->op();
+ ctl->writeReady(true);
+ }
+ catch(const Ice::LocalException&)
+ {
+ test(false);
+ }
+
+ try
+ {
+ background->ice_ping();
+ ctl->readReady(false);
+ background->op();
+ ctl->readReady(true);
+ }
+ catch(const Ice::LocalException&)
+ {
+ test(false);
+ }
+
+ try
+ {
+ background->ice_ping();
+ ctl->writeReady(false);
+ ctl->writeException(true);
+ background->op();
+ test(false);
+ }
+ catch(const Ice::ConnectionLostException&)
+ {
+ ctl->writeException(false);
+ ctl->writeReady(true);
+ }
+
+ try
+ {
+ background->ice_ping();
+ ctl->readReady(false);
+ ctl->readException(true);
+ background->op();
+ test(false);
+ }
+ catch(const Ice::ConnectionLostException&)
+ {
+ ctl->readException(false);
+ ctl->readReady(true);
+ }
+
+ OpThreadPtr thread1 = new OpThread(background);
+ OpThreadPtr thread2 = new OpThread(background);
+
+ for(int i = 0; i < 5; i++)
+ {
+ try
+ {
+ background->ice_ping();
+ }
+ catch(const Ice::LocalException&)
+ {
+ test(false);
+ }
+
+ IceUtil::ThreadControl::sleep(IceUtil::Time::milliSeconds(10));
+ configuration->writeException(new Ice::SocketException(__FILE__, __LINE__));
+ try
+ {
+ background->op();
+ }
+ catch(const Ice::LocalException&)
+ {
+ }
+ configuration->writeException(0);
+
+ IceUtil::ThreadControl::sleep(IceUtil::Time::milliSeconds(10));
+
+ background->ice_ping();
+ background->ice_getCachedConnection()->close(true);
+ IceUtil::ThreadControl::sleep(IceUtil::Time::milliSeconds(10));
+
+ background->ice_getCachedConnection()->close(true);
+ }
+
+ thread1->destroy();
+ thread2->destroy();
+
+ thread1->getThreadControl().join();
+ thread2->getThreadControl().join();
+}
diff --git a/cpp/test/Ice/background/Client.cpp b/cpp/test/Ice/background/Client.cpp
new file mode 100644
index 00000000000..93ec94c5770
--- /dev/null
+++ b/cpp/test/Ice/background/Client.cpp
@@ -0,0 +1,78 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2007 ZeroC, Inc. All rights reserved.
+//
+// This copy of Ice is licensed to you under the terms described in the
+// ICE_LICENSE file included in this distribution.
+//
+// **********************************************************************
+
+#include <Ice/Ice.h>
+#include <TestCommon.h>
+#include <Test.h>
+#include <Configuration.h>
+
+using namespace std;
+using namespace Test;
+
+int
+run(int argc, char* argv[], const Ice::CommunicatorPtr& communicator)
+{
+ BackgroundPrx allTests(const Ice::CommunicatorPtr&);
+ BackgroundPrx background = allTests(communicator);
+ background->shutdown();
+ return EXIT_SUCCESS;
+}
+
+int
+main(int argc, char* argv[])
+{
+ int status;
+ Ice::CommunicatorPtr communicator;
+
+ try
+ {
+ Ice::InitializationData initData;
+ initData.properties = Ice::createProperties(argc, argv);
+
+ //
+ // For this test, we want to disable retries.
+ //
+ initData.properties->setProperty("Ice.RetryIntervals", "-1");
+
+ //
+ // This test kills connections, so we don't want warnings.
+ //
+ initData.properties->setProperty("Ice.Warn.Connections", "0");
+
+ //
+ // Setup the test transport plugin.
+ //
+ initData.properties->setProperty("Ice.Plugin.Test", "TestTransport:createTestTransport");
+ string defaultProtocol = initData.properties->getPropertyWithDefault("Ice.Default.Protocol", "tcp");
+ initData.properties->setProperty("Ice.Default.Protocol", "test-" + defaultProtocol);
+
+ communicator = Ice::initialize(argc, argv, initData);
+ status = run(argc, argv, communicator);
+ }
+ catch(const Ice::Exception& ex)
+ {
+ cerr << ex << endl;
+ status = EXIT_FAILURE;
+ }
+
+ if(communicator)
+ {
+ try
+ {
+ communicator->destroy();
+ }
+ catch(const Ice::Exception& ex)
+ {
+ cerr << ex << endl;
+ status = EXIT_FAILURE;
+ }
+ }
+
+ return status;
+}
diff --git a/cpp/test/Ice/background/Configuration.cpp b/cpp/test/Ice/background/Configuration.cpp
new file mode 100644
index 00000000000..d2f7e82a1c1
--- /dev/null
+++ b/cpp/test/Ice/background/Configuration.cpp
@@ -0,0 +1,182 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2007 ZeroC, Inc. All rights reserved.
+//
+// This copy of Ice is licensed to you under the terms described in the
+// ICE_LICENSE file included in this distribution.
+//
+// **********************************************************************
+
+#include <Configuration.h>
+
+Configuration* Configuration::_instance = 0;
+
+Configuration::Configuration() :
+ _initializeSocketStatus(IceInternal::Finished),
+ _initializeResetCount(0),
+ _readReadyCount(0),
+ _writeReadyCount(0)
+{
+ assert(!_instance);
+ _instance = this;
+}
+
+Configuration::~Configuration()
+{
+ _instance = 0;
+}
+
+void
+Configuration::connectorsException(Ice::LocalException* ex)
+{
+ Lock sync(*this);
+ _connectorsException.reset(ex);
+}
+
+void
+Configuration::checkConnectorsException()
+{
+ Lock sync(*this);
+ if(_connectorsException.get())
+ {
+ _connectorsException->ice_throw();
+ }
+}
+
+void
+Configuration::connectException(Ice::LocalException* ex)
+{
+ Lock sync(*this);
+ _connectException.reset(ex);
+}
+
+void
+Configuration::checkConnectException()
+{
+ Lock sync(*this);
+ if(_connectException.get())
+ {
+ _connectException->ice_throw();
+ }
+}
+
+void
+Configuration::initializeSocketStatus(IceInternal::SocketStatus status)
+{
+ Lock sync(*this);
+ if(status == IceInternal::Finished)
+ {
+ _initializeResetCount = 0;
+ return;
+ }
+ _initializeResetCount = 10;
+ _initializeSocketStatus = status;
+}
+
+void
+Configuration::initializeException(Ice::LocalException* ex)
+{
+ Lock sync(*this);
+ _initializeException.reset(ex);
+}
+
+IceInternal::SocketStatus
+Configuration::initializeSocketStatus()
+{
+ Lock sync(*this);
+ if(_initializeResetCount == 0)
+ {
+ return IceInternal::Finished;
+ }
+ --_initializeResetCount;
+ return _initializeSocketStatus;
+}
+
+void
+Configuration::checkInitializeException()
+{
+ Lock sync(*this);
+ if(_initializeException.get())
+ {
+ _initializeException->ice_throw();
+ }
+}
+
+void
+Configuration::readReady(bool ready)
+{
+ Lock sync(*this);
+ _readReadyCount = ready ? 0 : 10;
+}
+
+void
+Configuration::readException(Ice::LocalException* ex)
+{
+ Lock sync(*this);
+ _readException.reset(ex);
+}
+
+bool
+Configuration::readReady()
+{
+ Lock sync(*this);
+ if(_readReadyCount == 0)
+ {
+ return true;
+ }
+ --_readReadyCount;
+ return false;
+}
+
+void
+Configuration::checkReadException()
+{
+ Lock sync(*this);
+ if(_readException.get())
+ {
+ _readException->ice_throw();
+ }
+}
+
+void
+Configuration::writeReady(bool ready)
+{
+ Lock sync(*this);
+ _writeReadyCount = ready ? 0 : 10;
+}
+
+void
+Configuration::writeException(Ice::LocalException* ex)
+{
+ Lock sync(*this);
+ _writeException.reset(ex);
+}
+
+bool
+Configuration::writeReady()
+{
+ Lock sync(*this);
+ if(_writeReadyCount == 0)
+ {
+ return true;
+ }
+ --_writeReadyCount;
+ return false;
+}
+
+void
+Configuration::checkWriteException()
+{
+ Lock sync(*this);
+ if(_writeException.get())
+ {
+ _writeException->ice_throw();
+ }
+}
+
+Configuration*
+Configuration::getInstance()
+{
+ return _instance;
+}
+
diff --git a/cpp/test/Ice/background/Configuration.h b/cpp/test/Ice/background/Configuration.h
new file mode 100644
index 00000000000..3277bd8d5f8
--- /dev/null
+++ b/cpp/test/Ice/background/Configuration.h
@@ -0,0 +1,67 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2007 ZeroC, Inc. All rights reserved.
+//
+// This copy of Ice is licensed to you under the terms described in the
+// ICE_LICENSE file included in this distribution.
+//
+// **********************************************************************
+
+#ifndef TEST_CONFIGURATION_H
+#define TEST_CONFIGURATION_H
+
+#include <IceUtil/Shared.h>
+#include <IceUtil/Handle.h>
+
+#include <Ice/LocalException.h>
+#include <Ice/Selector.h>
+
+class Configuration;
+typedef IceUtil::Handle<Configuration> ConfigurationPtr;
+
+class Configuration : public IceUtil::Shared, public IceUtil::Mutex
+{
+public:
+
+ Configuration();
+ virtual ~Configuration();
+
+ virtual void connectorsException(Ice::LocalException*);
+ virtual void checkConnectorsException();
+
+ virtual void connectException(Ice::LocalException*);
+ virtual void checkConnectException();
+
+ virtual void initializeSocketStatus(IceInternal::SocketStatus);
+ virtual void initializeException(Ice::LocalException*);
+ virtual IceInternal::SocketStatus initializeSocketStatus();
+ virtual void checkInitializeException();
+
+ virtual void readReady(bool);
+ virtual void readException(Ice::LocalException*);
+ virtual bool readReady();
+ virtual void checkReadException();
+
+ virtual void writeReady(bool);
+ virtual void writeException(Ice::LocalException*);
+ virtual bool writeReady();
+ virtual void checkWriteException();
+
+ static Configuration* getInstance();
+
+private:
+
+ std::auto_ptr<Ice::LocalException> _connectorsException;
+ std::auto_ptr<Ice::LocalException> _connectException;
+ IceInternal::SocketStatus _initializeSocketStatus;
+ int _initializeResetCount;
+ std::auto_ptr<Ice::LocalException> _initializeException;
+ int _readReadyCount;
+ std::auto_ptr<Ice::LocalException> _readException;
+ int _writeReadyCount;
+ std::auto_ptr<Ice::LocalException> _writeException;
+
+ static Configuration* _instance;
+};
+
+#endif
diff --git a/cpp/test/Ice/background/Connector.cpp b/cpp/test/Ice/background/Connector.cpp
new file mode 100644
index 00000000000..9e75d4672c3
--- /dev/null
+++ b/cpp/test/Ice/background/Connector.cpp
@@ -0,0 +1,69 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2007 ZeroC, Inc. All rights reserved.
+//
+// This copy of Ice is licensed to you under the terms described in the
+// ICE_LICENSE file included in this distribution.
+//
+// **********************************************************************
+
+#include <Connector.h>
+#include <Transceiver.h>
+#include <EndpointI.h>
+
+using namespace std;
+
+IceInternal::TransceiverPtr
+Connector::connect(int timeout)
+{
+ _configuration->checkConnectException();
+ return new Transceiver(_connector->connect(timeout));
+}
+
+Ice::Short
+Connector::type() const
+{
+ return (Ice::Short)(EndpointI::TYPE_BASE + _connector->type());
+}
+
+string
+Connector::toString() const
+{
+ return _connector->toString();
+}
+
+bool
+Connector::operator==(const IceInternal::Connector& r) const
+{
+ const Connector* p = dynamic_cast<const Connector*>(&r);
+ if(!p)
+ {
+ return false;
+ }
+
+ return *_connector == *p->_connector;
+}
+
+bool
+Connector::operator!=(const IceInternal::Connector& r) const
+{
+ return !operator==(r);
+}
+
+bool
+Connector::operator<(const IceInternal::Connector& r) const
+{
+ const Connector* p = dynamic_cast<const Connector*>(&r);
+ if(!p)
+ {
+ return type() < r.type();
+ }
+
+ return *_connector < *p->_connector;
+}
+
+Connector::Connector(const IceInternal::ConnectorPtr& connector) :
+ _connector(connector),
+ _configuration(Configuration::getInstance())
+{
+}
diff --git a/cpp/test/Ice/background/Connector.h b/cpp/test/Ice/background/Connector.h
new file mode 100644
index 00000000000..d8ffb10ea9a
--- /dev/null
+++ b/cpp/test/Ice/background/Connector.h
@@ -0,0 +1,38 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2007 ZeroC, Inc. All rights reserved.
+//
+// This copy of Ice is licensed to you under the terms described in the
+// ICE_LICENSE file included in this distribution.
+//
+// **********************************************************************
+
+#ifndef TEST_CONNECTOR_H
+#define TEST_CONNECTOR_H
+
+#include <Ice/Connector.h>
+#include <Configuration.h>
+
+class Connector : public IceInternal::Connector
+{
+public:
+
+ IceInternal::TransceiverPtr connect(int);
+
+ Ice::Short type() const;
+ std::string toString() const;
+
+ virtual bool operator==(const IceInternal::Connector&) const;
+ virtual bool operator!=(const IceInternal::Connector&) const;
+ virtual bool operator<(const IceInternal::Connector&) const;
+
+private:
+
+ Connector(const IceInternal::ConnectorPtr& connector);
+ friend class EndpointI;
+
+ const IceInternal::ConnectorPtr _connector;
+ const ConfigurationPtr _configuration;
+};
+
+#endif
diff --git a/cpp/test/Ice/background/EndpointFactory.cpp b/cpp/test/Ice/background/EndpointFactory.cpp
new file mode 100644
index 00000000000..70af767492a
--- /dev/null
+++ b/cpp/test/Ice/background/EndpointFactory.cpp
@@ -0,0 +1,53 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2007 ZeroC, Inc. All rights reserved.
+//
+// This copy of Ice is licensed to you under the terms described in the
+// ICE_LICENSE file included in this distribution.
+//
+// **********************************************************************
+
+#include <Ice/Instance.h>
+#include <Ice/EndpointFactoryManager.h>
+
+#include <EndpointFactory.h>
+#include <EndpointI.h>
+
+using namespace std;
+
+EndpointFactory::EndpointFactory(const IceInternal::EndpointFactoryPtr& factory) :
+ _factory(factory)
+{
+}
+
+Ice::Short
+EndpointFactory::type() const
+{
+ return (Ice::Short)(EndpointI::TYPE_BASE + _factory->type());
+}
+
+string
+EndpointFactory::protocol() const
+{
+ return "test-" + _factory->protocol();
+}
+
+IceInternal::EndpointIPtr
+EndpointFactory::create(const string& str, bool server) const
+{
+ return new EndpointI(_factory->create(str, server));
+}
+
+IceInternal::EndpointIPtr
+EndpointFactory::read(IceInternal::BasicStream* s) const
+{
+ short type;
+ s->read(type);
+ assert(type == _factory->type());
+ return new EndpointI(_factory->read(s));
+}
+
+void
+EndpointFactory::destroy()
+{
+}
diff --git a/cpp/test/Ice/background/EndpointFactory.h b/cpp/test/Ice/background/EndpointFactory.h
new file mode 100644
index 00000000000..b3a817b238c
--- /dev/null
+++ b/cpp/test/Ice/background/EndpointFactory.h
@@ -0,0 +1,35 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2007 ZeroC, Inc. All rights reserved.
+//
+// This copy of Ice is licensed to you under the terms described in the
+// ICE_LICENSE file included in this distribution.
+//
+// **********************************************************************
+
+#ifndef TEST_ENDPOINT_FACTORY_H
+#define TEST_ENDPOINT_FACTORY_H
+
+#include <Ice/EndpointFactory.h>
+
+class EndpointFactory : public IceInternal::EndpointFactory
+{
+public:
+
+ virtual ~EndpointFactory() { }
+
+ virtual ::Ice::Short type() const;
+ virtual ::std::string protocol() const;
+ virtual IceInternal::EndpointIPtr create(const std::string&, bool) const;
+ virtual IceInternal::EndpointIPtr read(IceInternal::BasicStream*) const;
+ virtual void destroy();
+
+protected:
+
+ EndpointFactory(const IceInternal::EndpointFactoryPtr&);
+ friend class TestPluginI;
+
+ IceInternal::EndpointFactoryPtr _factory;
+};
+
+#endif
diff --git a/cpp/test/Ice/background/EndpointI.cpp b/cpp/test/Ice/background/EndpointI.cpp
new file mode 100644
index 00000000000..ab83f97b08e
--- /dev/null
+++ b/cpp/test/Ice/background/EndpointI.cpp
@@ -0,0 +1,266 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2007 ZeroC, Inc. All rights reserved.
+//
+// This copy of Ice is licensed to you under the terms described in the
+// ICE_LICENSE file included in this distribution.
+//
+// **********************************************************************
+
+#include <EndpointI.h>
+#include <Transceiver.h>
+#include <Connector.h>
+#include <Acceptor.h>
+#include <Ice/BasicStream.h>
+
+using namespace std;
+
+Ice::Short EndpointI::TYPE_BASE = 100;
+
+EndpointI::EndpointI(const IceInternal::EndpointIPtr& endpoint) :
+ _endpoint(endpoint),
+ _configuration(Configuration::getInstance())
+{
+}
+
+void
+EndpointI::streamWrite(IceInternal::BasicStream* s) const
+{
+ s->write(type());
+ _endpoint->streamWrite(s);
+}
+
+Ice::Short
+EndpointI::type() const
+{
+ return (Ice::Short)(TYPE_BASE + _endpoint->type());
+}
+
+int
+EndpointI::timeout() const
+{
+ return _endpoint->timeout();
+}
+
+IceInternal::EndpointIPtr
+EndpointI::timeout(int timeout) const
+{
+ IceInternal::EndpointIPtr endpoint = _endpoint->timeout(timeout);
+ if(endpoint == _endpoint)
+ {
+ return const_cast<EndpointI*>(this);
+ }
+ else
+ {
+ return new EndpointI(endpoint);
+ }
+}
+
+IceInternal::EndpointIPtr
+EndpointI::connectionId(const string& connectionId) const
+{
+ IceInternal::EndpointIPtr endpoint = _endpoint->connectionId(connectionId);
+ if(endpoint == _endpoint)
+ {
+ return const_cast<EndpointI*>(this);
+ }
+ else
+ {
+ return new EndpointI(endpoint);
+ }
+}
+
+bool
+EndpointI::compress() const
+{
+ return _endpoint->compress();
+}
+
+IceInternal::EndpointIPtr
+EndpointI::compress(bool compress) const
+{
+ IceInternal::EndpointIPtr endpoint = _endpoint->compress(compress);
+ if(endpoint == _endpoint)
+ {
+ return const_cast<EndpointI*>(this);
+ }
+ else
+ {
+ return new EndpointI(endpoint);
+ }
+}
+
+bool
+EndpointI::datagram() const
+{
+ return _endpoint->datagram();
+}
+
+bool
+EndpointI::secure() const
+{
+ return _endpoint->secure();
+}
+
+bool
+EndpointI::unknown() const
+{
+ return _endpoint->unknown();
+}
+
+IceInternal::TransceiverPtr
+EndpointI::transceiver(IceInternal::EndpointIPtr& endpoint) const
+{
+ IceInternal::EndpointIPtr endpt = _endpoint;
+ IceInternal::TransceiverPtr transceiver = _endpoint->transceiver(endpt);
+ if(endpt == _endpoint)
+ {
+ endpoint = const_cast<EndpointI*>(this);
+ }
+ else
+ {
+ endpoint = new EndpointI(endpoint);
+ }
+
+ if(transceiver)
+ {
+ return new Transceiver(transceiver);
+ }
+ else
+ {
+ return 0;
+ }
+}
+
+vector<IceInternal::ConnectorPtr>
+EndpointI::connectors() const
+{
+ _configuration->checkConnectorsException();
+ vector<IceInternal::ConnectorPtr> c = _endpoint->connectors();
+ for(vector<IceInternal::ConnectorPtr>::iterator p = c.begin(); p != c.end(); ++p)
+ {
+ *p = new Connector(*p);
+ }
+ return c;
+}
+
+void
+EndpointI::connectors_async(const IceInternal::EndpointI_connectorsPtr& cb) const
+{
+ class Callback : public IceInternal::EndpointI_connectors
+ {
+ public:
+
+ Callback(const IceInternal::EndpointI_connectorsPtr& callback) : _callback(callback)
+ {
+ }
+
+ void
+ connectors(const vector<IceInternal::ConnectorPtr>& connectors)
+ {
+ vector<IceInternal::ConnectorPtr> c;
+ for(vector<IceInternal::ConnectorPtr>::const_iterator p = connectors.begin(); p != connectors.end(); ++p)
+ {
+ c.push_back(new Connector(*p));
+ }
+ _callback->connectors(c);
+ }
+
+ void
+ exception(const Ice::LocalException& ex)
+ {
+ _callback->exception(ex);
+ }
+
+ private:
+
+ IceInternal::EndpointI_connectorsPtr _callback;
+ };
+
+ try
+ {
+ _configuration->checkConnectorsException();
+ _endpoint->connectors_async(new Callback(cb));
+ }
+ catch(const Ice::LocalException& ex)
+ {
+ cb->exception(ex);
+ }
+}
+
+IceInternal::AcceptorPtr
+EndpointI::acceptor(IceInternal::EndpointIPtr& endpoint, const string& adapterName) const
+{
+ IceInternal::AcceptorPtr p = new Acceptor(_endpoint->acceptor(endpoint, adapterName));
+ endpoint = new EndpointI(endpoint);
+ return p;
+}
+
+vector<IceInternal::EndpointIPtr>
+EndpointI::expand() const
+{
+ vector<IceInternal::EndpointIPtr> e = _endpoint->expand();
+ for(vector<IceInternal::EndpointIPtr>::iterator p = e.begin(); p != e.end(); ++p)
+ {
+ *p = (*p == _endpoint) ? const_cast<EndpointI*>(this) : new EndpointI(*p);
+ }
+ return e;
+}
+
+bool
+EndpointI::equivalent(const IceInternal::EndpointIPtr& endpoint) const
+{
+ const EndpointI* testEndpointI = dynamic_cast<const EndpointI*>(endpoint.get());
+ if(!testEndpointI)
+ {
+ return false;
+ }
+ return testEndpointI->_endpoint->equivalent(_endpoint);
+}
+
+string
+EndpointI::toString() const
+{
+ return "test-" + _endpoint->toString();
+}
+
+bool
+EndpointI::operator==(const IceInternal::EndpointI& r) const
+{
+ const EndpointI* p = dynamic_cast<const EndpointI*>(&r);
+ if(!p)
+ {
+ return false;
+ }
+
+ if(this == p)
+ {
+ return true;
+ }
+
+
+ return *p->_endpoint == *_endpoint;
+}
+
+bool
+EndpointI::operator!=(const IceInternal::EndpointI& r) const
+{
+ return !operator==(r);
+}
+
+bool
+EndpointI::operator<(const IceInternal::EndpointI& r) const
+{
+ const EndpointI* p = dynamic_cast<const EndpointI*>(&r);
+ if(!p)
+ {
+ return type() < r.type();
+ }
+
+ if(this == p)
+ {
+ return false;
+ }
+
+ return *p->_endpoint < *_endpoint;
+}
diff --git a/cpp/test/Ice/background/EndpointI.h b/cpp/test/Ice/background/EndpointI.h
new file mode 100644
index 00000000000..71d41c3e095
--- /dev/null
+++ b/cpp/test/Ice/background/EndpointI.h
@@ -0,0 +1,63 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2007 ZeroC, Inc. All rights reserved.
+//
+// This copy of Ice is licensed to you under the terms described in the
+// ICE_LICENSE file included in this distribution.
+//
+// **********************************************************************
+
+#ifndef TEST_ENDPOINT_I_H
+#define TEST_ENDPOINT_I_H
+
+#include <Ice/EndpointI.h>
+#include <Configuration.h>
+
+class EndpointI : public IceInternal::EndpointI
+{
+public:
+
+ static Ice::Short TYPE_BASE;
+
+ virtual void streamWrite(IceInternal::BasicStream*) const;
+ virtual Ice::Short type() const;
+ virtual Ice::Int timeout() const;
+ virtual IceInternal::EndpointIPtr timeout(Ice::Int) const;
+ virtual IceInternal::EndpointIPtr connectionId(const ::std::string&) const;
+ virtual bool compress() const;
+ virtual IceInternal::EndpointIPtr compress(bool) const;
+ virtual bool datagram() const;
+ virtual bool secure() const;
+ virtual bool unknown() const;
+ virtual IceInternal::TransceiverPtr transceiver(IceInternal::EndpointIPtr&) const;
+ virtual std::vector<IceInternal::ConnectorPtr> connectors() const;
+ virtual void connectors_async(const IceInternal::EndpointI_connectorsPtr&) const;
+ virtual IceInternal::AcceptorPtr acceptor(IceInternal::EndpointIPtr&, const std::string&) const;
+ virtual std::vector<IceInternal::EndpointIPtr> expand() const;
+ virtual bool equivalent(const IceInternal::EndpointIPtr&) const;
+
+ virtual std::string toString() const;
+
+ virtual bool operator==(const IceInternal::EndpointI&) const;
+ virtual bool operator!=(const IceInternal::EndpointI&) const;
+ virtual bool operator<(const IceInternal::EndpointI&) const;
+
+private:
+
+ EndpointI(const IceInternal::EndpointIPtr&);
+ friend class EndpointFactory;
+
+#if defined(__SUNPRO_CC) || defined(__HP_aCC)
+ //
+ // COMPILERFIX: prevent the compiler from emitting a warning about
+ // hidding these operators.
+ //
+ using LocalObject::operator==;
+ using LocalObject::operator<;
+#endif
+
+ const IceInternal::EndpointIPtr _endpoint;
+ const ConfigurationPtr _configuration;
+};
+
+#endif
diff --git a/cpp/test/Ice/background/Makefile b/cpp/test/Ice/background/Makefile
new file mode 100644
index 00000000000..e8626b27943
--- /dev/null
+++ b/cpp/test/Ice/background/Makefile
@@ -0,0 +1,70 @@
+# **********************************************************************
+#
+# Copyright (c) 2003-2007 ZeroC, Inc. All rights reserved.
+#
+# This copy of Ice is licensed to you under the terms described in the
+# ICE_LICENSE file included in this distribution.
+#
+# **********************************************************************
+
+top_srcdir = ../../..
+
+CLIENT = client
+SERVER = server
+
+TSPFILENAME = $(call mklibfilename,TestTransport,$(VERSION))
+TSPSONAME = $(call mksoname,TestTransport,$(SOVERSION))
+TSPLIBNAME = $(call mklibname,TestTransport)
+
+TARGETS = $(CLIENT) $(SERVER) $(call mklibtargets,$(TSPFILENAME),$(TSPSONAME),$(TSPLIBNAME))
+
+COBJS = Configuration.o \
+ Test.o \
+ Client.o \
+ AllTests.o
+
+SOBJS = Configuration.o \
+ Test.o \
+ TestI.o \
+ Server.o
+
+TRANSPORT_OBJS = Configuration.o \
+ Connector.o \
+ Acceptor.o \
+ EndpointI.o \
+ Transceiver.o \
+ EndpointFactory.o \
+ PluginI.o
+
+SRCS = $(TRANSPORT_OBJS:.o=.cpp) \
+ $(COBJS:.o=.cpp) \
+ $(SOBJS:.o=.cpp)
+
+SLICE_SRCS = Test.ice
+
+include $(top_srcdir)/config/Make.rules
+
+CPPFLAGS := -I. -I../../include -I../../../src $(CPPFLAGS)
+LINKWITH := $(BZIP2_RPATH_LINK) -lIce -lIceUtil
+
+$(CLIENT): $(COBJS)
+ rm -f $@
+ $(CXX) $(LDFLAGS) -o $@ $(COBJS) $(LIBS)
+
+$(SERVER): $(SOBJS)
+ rm -f $@
+ $(CXX) $(LDFLAGS) -o $@ $(SOBJS) $(LIBS)
+
+$(TSPFILENAME): $(TRANSPORT_OBJS)
+ rm -f $@
+ $(call mkshlib,$@,$(TSPSONAME),$(OBJS) $(TRANSPORT_OBJS),$(LINKWITH))
+
+$(TSPSONAME): $(TSPFILENAME)
+ rm -f $@
+ ln -s $(TSPFILENAME) $@
+
+$(TSPLIBNAME): $(TSPSONAME)
+ rm -f $@
+ ln -s $(TSPSONAME) $@
+
+include .depend
diff --git a/cpp/test/Ice/background/Makefile.mak b/cpp/test/Ice/background/Makefile.mak
new file mode 100644
index 00000000000..53066a048dd
--- /dev/null
+++ b/cpp/test/Ice/background/Makefile.mak
@@ -0,0 +1,73 @@
+# **********************************************************************
+#
+# Copyright (c) 2003-2007 ZeroC, Inc. All rights reserved.
+#
+# This copy of Ice is licensed to you under the terms described in the
+# ICE_LICENSE file included in this distribution.
+#
+# **********************************************************************
+
+top_srcdir = ..\..\..
+
+CLIENT = client.exe
+SERVER = server.exe
+LIBNAME = testtransport$(LIBSUFFIX).lib
+DLLNAME = testtransport$(SOVERSION)$(LIBSUFFIX).dll
+
+TARGETS = $(CLIENT) $(SERVER) $(LIBNAME) $(DLLNAME)
+
+COBJS = Configuration.obj \
+ Test.obj \
+ Client.obj \
+ AllTests.obj
+
+SOBJS = Configuration.obj \
+ Test.obj \
+ TestI.obj \
+ Server.obj
+
+TRANSPORT_OBJS = Configuration.obj \
+ Connector.obj \
+ Acceptor.obj \
+ EndpointI.obj \
+ Transceiver.obj \
+ EndpointFactory.obj \
+ PluginI.obj
+
+SRCS = $(TRANSPORT_OBJS:.obj=.cpp) \
+ $(COBJS:.obj=.cpp) \
+ $(SOBJS:.obj=.cpp)
+
+!include $(top_srcdir)/config/Make.rules.mak
+
+CPPFLAGS = -I. -I../../include -I../../../src $(CPPFLAGS) -DWIN32_LEAN_AND_MEAN
+LINKWITH = $(LIBS)
+
+!if "$(CPP_COMPILER)" != "BCC2006" && "$(OPTIMIZE)" != "yes"
+TPDBFLAGS = /pdb:$(DLLNAME:.dll=.pdb)
+CPDBFLAGS = /pdb:$(CLIENT:.exe=.pdb)
+SPDBFLAGS = /pdb:$(SERVER:.exe=.pdb)
+!endif
+
+$(CLIENT): $(COBJS)
+ $(LINK) $(LD_EXEFLAGS) $(CPDBFLAGS) $(SETARGV) $(COBJS) $(PREOUT)$@ $(PRELIBS)$(LIBS)
+ @if exist $@.manifest echo ^ ^ ^ Embedding manifest using $(MT) && \
+ $(MT) -nologo -manifest $@.manifest -outputresource:$@;#1 && del /q $@.manifest
+
+$(SERVER): $(SOBJS)
+ $(LINK) $(LD_EXEFLAGS) $(SPDBFLAGS) $(SETARGV) $(SOBJS) $(PREOUT)$@ $(PRELIBS)$(LIBS)
+ @if exist $@.manifest echo ^ ^ ^ Embedding manifest using $(MT) && \
+ $(MT) -nologo -manifest $@.manifest -outputresource:$@;#1 && del /q $@.manifest
+
+$(LIBNAME) : $(DLLNAME)
+
+$(DLLNAME): $(OBJS) $(TRANSPORT_OBJS)
+ $(LINK) $(LD_DLLFLAGS) $(TPDBFLAGS) $(SETARGV) $(OBJS) $(TRANSPORT_OBJS) $(PREOUT)$(DLLNAME) $(PRELIBS)$(LINKWITH)
+ @if exist $@.manifest echo ^ ^ ^ Embedding manifest using $(MT) && \
+ $(MT) -nologo -manifest $@.manifest -outputresource:$@;#2 && del /q $@.manifest
+ @if exist $(DLLNAME:.dll=.exp) del /q $(DLLNAME:.dll=.exp)
+
+clean::
+ del /q Test.cpp Test.h
+
+!include .depend
diff --git a/cpp/test/Ice/background/PluginI.cpp b/cpp/test/Ice/background/PluginI.cpp
new file mode 100644
index 00000000000..a00c0208482
--- /dev/null
+++ b/cpp/test/Ice/background/PluginI.cpp
@@ -0,0 +1,86 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2007 ZeroC, Inc. All rights reserved.
+//
+// This copy of Ice is licensed to you under the terms described in the
+// ICE_LICENSE file included in this distribution.
+//
+// **********************************************************************
+
+#include <Ice/Initialize.h>
+#include <Ice/Instance.h>
+#include <Ice/ProtocolPluginFacade.h>
+#include <Ice/EndpointFactoryManager.h>
+
+#include <PluginI.h>
+#include <EndpointFactory.h>
+
+#ifndef TEST_TRANSPORT_API
+# define TEST_TRANSPORT_API ICE_DECLSPEC_EXPORT
+#endif
+
+using namespace std;
+
+class TestPluginI : public PluginI
+{
+public:
+
+ TestPluginI(const Ice::CommunicatorPtr&);
+
+ virtual void initialize();
+ virtual void destroy();
+
+ virtual ConfigurationPtr getConfiguration();
+
+private:
+
+ const Ice::CommunicatorPtr _communicator;
+ const ConfigurationPtr _configuration;
+};
+
+
+//
+// Plugin factory function.
+//
+extern "C"
+{
+
+TEST_TRANSPORT_API Ice::Plugin*
+createTestTransport(const Ice::CommunicatorPtr& communicator, const string& name, const Ice::StringSeq& args)
+{
+ return new TestPluginI(communicator);
+}
+
+}
+
+TestPluginI::TestPluginI(const Ice::CommunicatorPtr& communicator) :
+ _communicator(communicator),
+ _configuration(new Configuration())
+{
+}
+
+void
+TestPluginI::initialize()
+{
+ IceInternal::ProtocolPluginFacadePtr facade = IceInternal::getProtocolPluginFacade(_communicator);
+
+ for(Ice::Short s = 0; s < 100; ++s)
+ {
+ IceInternal::EndpointFactoryPtr factory = facade->getEndpointFactory(s);
+ if(factory)
+ {
+ facade->addEndpointFactory(new EndpointFactory(factory));
+ }
+ }
+}
+
+void
+TestPluginI::destroy()
+{
+}
+
+ConfigurationPtr
+TestPluginI::getConfiguration()
+{
+ return _configuration;
+}
diff --git a/cpp/test/Ice/background/PluginI.h b/cpp/test/Ice/background/PluginI.h
new file mode 100644
index 00000000000..fffc0f16d1e
--- /dev/null
+++ b/cpp/test/Ice/background/PluginI.h
@@ -0,0 +1,23 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2007 ZeroC, Inc. All rights reserved.
+//
+// This copy of Ice is licensed to you under the terms described in the
+// ICE_LICENSE file included in this distribution.
+//
+// **********************************************************************
+
+#ifndef TEST_PLUGIN_H
+#define TEST_PLUGIN_H
+
+#include <Ice/Plugin.h>
+#include <Configuration.h>
+
+class PluginI : public Ice::Plugin
+{
+public:
+
+ virtual ConfigurationPtr getConfiguration() = 0;
+};
+
+#endif
diff --git a/cpp/test/Ice/background/Server.cpp b/cpp/test/Ice/background/Server.cpp
new file mode 100644
index 00000000000..45358ed96c7
--- /dev/null
+++ b/cpp/test/Ice/background/Server.cpp
@@ -0,0 +1,171 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2007 ZeroC, Inc. All rights reserved.
+//
+// This copy of Ice is licensed to you under the terms described in the
+// ICE_LICENSE file included in this distribution.
+//
+// **********************************************************************
+
+#include <IceUtil/DisableWarnings.h>
+#include <Ice/Ice.h>
+#include <TestI.h>
+#include <Configuration.h>
+#include <PluginI.h>
+
+#include <Ice/Locator.h>
+#include <Ice/Router.h>
+
+using namespace std;
+
+class LocatorI : public Ice::Locator
+{
+public:
+
+ virtual void
+ findAdapterById_async(const Ice::AMD_Locator_findAdapterByIdPtr& response, const string& adapter,
+ const Ice::Current& current) const
+ {
+ _controller->checkCallPause(current);
+ Ice::CommunicatorPtr communicator = current.adapter->getCommunicator();
+ response->ice_response(current.adapter->createDirectProxy(communicator->stringToIdentity("dummy")));
+ }
+
+ virtual void
+ findObjectById_async(const Ice::AMD_Locator_findObjectByIdPtr& response, const Ice::Identity& id,
+ const Ice::Current& current) const
+ {
+ _controller->checkCallPause(current);
+ Ice::CommunicatorPtr communicator = current.adapter->getCommunicator();
+ response->ice_response(current.adapter->createDirectProxy(id));
+ }
+
+ virtual Ice::LocatorRegistryPrx
+ getRegistry(const Ice::Current&) const
+ {
+ return 0;
+ }
+
+ LocatorI(const BackgroundControllerIPtr& controller) : _controller(controller)
+ {
+ }
+
+private:
+
+ BackgroundControllerIPtr _controller;
+};
+
+class RouterI : public Ice::Router
+{
+public:
+
+ virtual Ice::ObjectPrx
+ getClientProxy(const Ice::Current& current) const
+ {
+ _controller->checkCallPause(current);
+ return 0;
+ }
+
+ virtual Ice::ObjectPrx
+ getServerProxy(const Ice::Current& current) const
+ {
+ _controller->checkCallPause(current);
+ return 0;
+ }
+
+ virtual void
+ addProxy(const Ice::ObjectPrx&, const Ice::Current&)
+ {
+ }
+
+ virtual Ice::ObjectProxySeq
+ addProxies(const Ice::ObjectProxySeq&, const Ice::Current&)
+ {
+ return Ice::ObjectProxySeq();
+ }
+
+ RouterI(const BackgroundControllerIPtr& controller)
+ {
+ _controller = controller;
+ }
+
+private:
+
+ BackgroundControllerIPtr _controller;
+};
+
+
+int
+run(int argc, char* argv[], const Ice::CommunicatorPtr& communicator)
+{
+ communicator->getProperties()->setProperty("TestAdapter.Endpoints", "default -p 12010 -t 10000");
+ communicator->getProperties()->setProperty("ControllerAdapter.Endpoints", "tcp -p 12011");
+ communicator->getProperties()->setProperty("ControllerAdapter.ThreadPool.Size", "1");
+
+ Ice::ObjectAdapterPtr adapter = communicator->createObjectAdapter("TestAdapter");
+ Ice::ObjectAdapterPtr adapter2 = communicator->createObjectAdapter("ControllerAdapter");
+
+ PluginI* plugin = dynamic_cast<PluginI*>(communicator->getPluginManager()->getPlugin("Test").get());
+ assert(plugin);
+ ConfigurationPtr configuration = plugin->getConfiguration();
+ BackgroundControllerIPtr backgroundController = new BackgroundControllerI(adapter, configuration);
+
+ adapter->add(new BackgroundI(backgroundController), communicator->stringToIdentity("background"));
+ adapter->add(new LocatorI(backgroundController), communicator->stringToIdentity("locator"));
+ adapter->add(new RouterI(backgroundController), communicator->stringToIdentity("router"));
+ adapter->activate();
+
+ adapter2->add(backgroundController, communicator->stringToIdentity("backgroundController"));
+ adapter2->activate();
+
+ communicator->waitForShutdown();
+ return EXIT_SUCCESS;
+}
+
+int
+main(int argc, char* argv[])
+{
+ int status;
+ Ice::CommunicatorPtr communicator;
+
+ try
+ {
+ Ice::InitializationData initData;
+ initData.properties = Ice::createProperties(argc, argv);
+
+ //
+ // This test kills connections, so we don't want warnings.
+ //
+ initData.properties->setProperty("Ice.Warn.Connections", "0");
+
+ //
+ // Setup the test transport plugin.
+ //
+ initData.properties->setProperty("Ice.Plugin.Test", "TestTransport:createTestTransport");
+ string defaultProtocol = initData.properties->getPropertyWithDefault("Ice.Default.Protocol", "tcp");
+ initData.properties->setProperty("Ice.Default.Protocol", "test-" + defaultProtocol);
+
+ communicator = Ice::initialize(argc, argv, initData);
+ status = run(argc, argv, communicator);
+ }
+ catch(const Ice::Exception& ex)
+ {
+ cerr << ex << endl;
+ status = EXIT_FAILURE;
+ }
+
+ if(communicator)
+ {
+ try
+ {
+ communicator->destroy();
+ }
+ catch(const Ice::Exception& ex)
+ {
+ cerr << ex << endl;
+ status = EXIT_FAILURE;
+ }
+ }
+
+ return status;
+}
diff --git a/cpp/test/Ice/background/Test.ice b/cpp/test/Ice/background/Test.ice
new file mode 100644
index 00000000000..f85b9ac0065
--- /dev/null
+++ b/cpp/test/Ice/background/Test.ice
@@ -0,0 +1,46 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2007 ZeroC, Inc. All rights reserved.
+//
+// This copy of Ice is licensed to you under the terms described in the
+// ICE_LICENSE file included in this distribution.
+//
+// **********************************************************************
+
+#ifndef TEST_ICE
+#define TEST_ICE
+
+#include <Ice/BuiltinSequences.ice>
+
+module Test
+{
+
+interface Background
+{
+ ["ami"] void op();
+ ["ami"] void opWithPayload(Ice::ByteSeq seq);
+
+ void shutdown();
+};
+
+interface BackgroundController
+{
+ void pauseCall(string call);
+ void resumeCall(string call);
+
+ void holdAdapter();
+ void resumeAdapter();
+
+ void initializeSocketStatus(int status);
+ void initializeException(bool enable);
+
+ void readReady(bool enable);
+ void readException(bool enable);
+
+ void writeReady(bool enable);
+ void writeException(bool enable);
+};
+
+};
+
+#endif
diff --git a/cpp/test/Ice/background/TestI.cpp b/cpp/test/Ice/background/TestI.cpp
new file mode 100644
index 00000000000..4883931db1b
--- /dev/null
+++ b/cpp/test/Ice/background/TestI.cpp
@@ -0,0 +1,117 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2007 ZeroC, Inc. All rights reserved.
+//
+// This copy of Ice is licensed to you under the terms described in the
+// ICE_LICENSE file included in this distribution.
+//
+// **********************************************************************
+
+#include <TestI.h>
+#include <Ice/Ice.h>
+
+using namespace std;
+using namespace Ice;
+
+void
+BackgroundI::op(const Ice::Current& current)
+{
+ _controller->checkCallPause(current);
+}
+
+void
+BackgroundI::opWithPayload(const Ice::ByteSeq&, const Ice::Current& current)
+{
+ _controller->checkCallPause(current);
+}
+
+void
+BackgroundI::shutdown(const Ice::Current& current)
+{
+ current.adapter->getCommunicator()->shutdown();
+}
+
+BackgroundI::BackgroundI(const BackgroundControllerIPtr& controller) :
+ _controller(controller)
+{
+}
+
+void
+BackgroundControllerI::pauseCall(const string& opName, const Ice::Current&)
+{
+ Lock sync(*this);
+ _pausedCalls.insert(opName);
+}
+
+void
+BackgroundControllerI::resumeCall(const string& opName, const Ice::Current&)
+{
+ Lock sync(*this);
+ _pausedCalls.erase(opName);
+ notifyAll();
+}
+
+void
+BackgroundControllerI::checkCallPause(const Ice::Current& current)
+{
+ Lock sync(*this);
+ while(_pausedCalls.find(current.operation) != _pausedCalls.end())
+ {
+ wait();
+ }
+}
+
+void
+BackgroundControllerI::holdAdapter(const Ice::Current&)
+{
+ _adapter->hold();
+}
+
+void
+BackgroundControllerI::resumeAdapter(const Ice::Current&)
+{
+ _adapter->activate();
+}
+
+void
+BackgroundControllerI::initializeSocketStatus(int status, const Ice::Current&)
+{
+ _configuration->initializeSocketStatus(static_cast<IceInternal::SocketStatus>(status));
+}
+
+void
+BackgroundControllerI::initializeException(bool enable, const Ice::Current&)
+{
+ _configuration->initializeException(enable ? new Ice::SocketException(__FILE__, __LINE__) : 0);
+}
+
+void
+BackgroundControllerI::readReady(bool enable, const Ice::Current&)
+{
+ _configuration->readReady(enable);
+}
+
+void
+BackgroundControllerI::readException(bool enable, const Ice::Current&)
+{
+ _configuration->readException(enable ? new Ice::SocketException(__FILE__, __LINE__) : 0);
+}
+
+void
+BackgroundControllerI::writeReady(bool enable, const Ice::Current&)
+{
+ _configuration->writeReady(enable);
+}
+
+void
+BackgroundControllerI::writeException(bool enable, const Ice::Current&)
+{
+ _configuration->writeException(enable ? new Ice::SocketException(__FILE__, __LINE__) : 0);
+}
+
+BackgroundControllerI::BackgroundControllerI(const Ice::ObjectAdapterPtr& adapter,
+ const ConfigurationPtr& configuration) :
+ _adapter(adapter),
+ _configuration(configuration)
+{
+}
diff --git a/cpp/test/Ice/background/TestI.h b/cpp/test/Ice/background/TestI.h
new file mode 100644
index 00000000000..2acedc0489c
--- /dev/null
+++ b/cpp/test/Ice/background/TestI.h
@@ -0,0 +1,66 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2007 ZeroC, Inc. All rights reserved.
+//
+// This copy of Ice is licensed to you under the terms described in the
+// ICE_LICENSE file included in this distribution.
+//
+// **********************************************************************
+
+#ifndef TEST_I_H
+#define TEST_I_H
+
+#include <Test.h>
+#include <Configuration.h>
+
+#include <set>
+
+class BackgroundControllerI;
+typedef IceUtil::Handle<BackgroundControllerI> BackgroundControllerIPtr;
+
+class BackgroundI : virtual public Test::Background
+{
+public:
+
+ virtual void op(const Ice::Current&);
+ virtual void opWithPayload(const Ice::ByteSeq&, const Ice::Current&);
+ virtual void shutdown(const Ice::Current&);
+
+ BackgroundI(const BackgroundControllerIPtr&);
+
+private:
+
+ BackgroundControllerIPtr _controller;
+};
+
+class BackgroundControllerI : public Test::BackgroundController, IceUtil::Monitor<IceUtil::Mutex>
+{
+public:
+
+
+ virtual void pauseCall(const std::string&, const Ice::Current&);
+ virtual void resumeCall(const std::string&, const Ice::Current&);
+ virtual void checkCallPause(const Ice::Current&);
+
+ virtual void holdAdapter(const Ice::Current&);
+ virtual void resumeAdapter(const Ice::Current&);
+
+ virtual void initializeSocketStatus(int, const Ice::Current&);
+ virtual void initializeException(bool, const Ice::Current&);
+
+ virtual void readReady(bool, const Ice::Current&);
+ virtual void readException(bool, const Ice::Current&);
+
+ virtual void writeReady(bool, const Ice::Current&);
+ virtual void writeException(bool, const Ice::Current&);
+
+ BackgroundControllerI(const Ice::ObjectAdapterPtr&, const ConfigurationPtr&);
+
+private:
+
+ Ice::ObjectAdapterPtr _adapter;
+ std::set<std::string> _pausedCalls;
+ ConfigurationPtr _configuration;
+};
+
+#endif
diff --git a/cpp/test/Ice/background/Transceiver.cpp b/cpp/test/Ice/background/Transceiver.cpp
new file mode 100644
index 00000000000..ddee56e5d23
--- /dev/null
+++ b/cpp/test/Ice/background/Transceiver.cpp
@@ -0,0 +1,143 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2007 ZeroC, Inc. All rights reserved.
+//
+// This copy of Ice is licensed to you under the terms described in the
+// ICE_LICENSE file included in this distribution.
+//
+// **********************************************************************
+
+#include <Transceiver.h>
+
+using namespace std;
+
+SOCKET
+Transceiver::fd()
+{
+ return _transceiver->fd();
+}
+
+IceInternal::SocketStatus
+Transceiver::initialize(int timeout)
+{
+ if(timeout == 0)
+ {
+ IceInternal::SocketStatus status = _configuration->initializeSocketStatus();
+ if(status == IceInternal::NeedConnect)
+ {
+ return status;
+ }
+ else if(status == IceInternal::NeedWrite)
+ {
+ if(!_initialized)
+ {
+ status = _transceiver->initialize(timeout);
+ if(status != IceInternal::Finished)
+ {
+ return status;
+ }
+ _initialized = true;
+ }
+ return IceInternal::NeedWrite;
+ }
+ else if(status == IceInternal::NeedRead)
+ {
+ return status;
+ }
+ }
+ _configuration->checkInitializeException();
+ if(!_initialized)
+ {
+ IceInternal::SocketStatus status = _transceiver->initialize(timeout);
+ if(status != IceInternal::Finished)
+ {
+ return status;
+ }
+ _initialized = true;
+ }
+ return IceInternal::Finished;
+}
+
+void
+Transceiver::close()
+{
+ _transceiver->close();
+}
+
+void
+Transceiver::shutdownWrite()
+{
+ _transceiver->shutdownWrite();
+}
+
+void
+Transceiver::shutdownReadWrite()
+{
+ _transceiver->shutdownReadWrite();
+}
+
+bool
+Transceiver::write(IceInternal::Buffer& buf, int timeout)
+{
+ if(!_initialized)
+ {
+ throw Ice::SocketException(__FILE__, __LINE__);
+ }
+
+ if(timeout == 0)
+ {
+ if(!_configuration->writeReady())
+ {
+ return false;
+ }
+ }
+ _configuration->checkWriteException();
+ return _transceiver->write(buf, timeout);
+}
+
+bool
+Transceiver::read(IceInternal::Buffer& buf, int timeout)
+{
+ if(!_initialized)
+ {
+ throw Ice::SocketException(__FILE__, __LINE__);
+ }
+
+ if(timeout == 0)
+ {
+ if(!_configuration->readReady())
+ {
+ return false;
+ }
+ }
+ _configuration->checkReadException();
+ return _transceiver->read(buf, timeout);
+}
+
+string
+Transceiver::type() const
+{
+ return "test-" + _transceiver->type();
+}
+
+string
+Transceiver::toString() const
+{
+ return _transceiver->toString();
+}
+
+void
+Transceiver::checkSendSize(const IceInternal::Buffer& buf, size_t messageSizeMax)
+{
+ _transceiver->checkSendSize(buf, messageSizeMax);
+}
+
+//
+// Only for use by Connector, Acceptor
+//
+Transceiver::Transceiver(const IceInternal::TransceiverPtr& transceiver) :
+ _transceiver(transceiver),
+ _configuration(Configuration::getInstance()),
+ _initialized(false)
+{
+}
diff --git a/cpp/test/Ice/background/Transceiver.h b/cpp/test/Ice/background/Transceiver.h
new file mode 100644
index 00000000000..1872f86bfc1
--- /dev/null
+++ b/cpp/test/Ice/background/Transceiver.h
@@ -0,0 +1,43 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2007 ZeroC, Inc. All rights reserved.
+//
+// This copy of Ice is licensed to you under the terms described in the
+// ICE_LICENSE file included in this distribution.
+//
+// **********************************************************************
+
+#ifndef TEST_TRANSCEIVER_H
+#define TEST_TRANSCEIVER_H
+
+#include <Ice/Transceiver.h>
+#include <Configuration.h>
+
+class Transceiver : public IceInternal::Transceiver
+{
+public:
+
+ virtual SOCKET fd();
+ virtual void close();
+ virtual void shutdownWrite();
+ virtual void shutdownReadWrite();
+ virtual bool write(IceInternal::Buffer&, int);
+ virtual bool read(IceInternal::Buffer&, int);
+ virtual std::string type() const;
+ virtual std::string toString() const;
+ virtual IceInternal::SocketStatus initialize(int);
+ virtual void checkSendSize(const IceInternal::Buffer&, size_t);
+
+private:
+
+ Transceiver(const IceInternal::TransceiverPtr&);
+ friend class Connector;
+ friend class Acceptor;
+ friend class EndpointI;
+
+ const IceInternal::TransceiverPtr _transceiver;
+ const ConfigurationPtr _configuration;
+ bool _initialized;
+};
+
+#endif
diff --git a/cpp/test/Ice/background/run.py b/cpp/test/Ice/background/run.py
new file mode 100755
index 00000000000..598f980ea26
--- /dev/null
+++ b/cpp/test/Ice/background/run.py
@@ -0,0 +1,29 @@
+#!/usr/bin/env python
+# **********************************************************************
+#
+# Copyright (c) 2003-2007 ZeroC, Inc. All rights reserved.
+#
+# This copy of Ice is licensed to you under the terms described in the
+# ICE_LICENSE file included in this distribution.
+#
+# **********************************************************************
+
+import os, sys
+
+for toplevel in [".", "..", "../..", "../../..", "../../../.."]:
+ toplevel = os.path.normpath(toplevel)
+ if os.path.exists(os.path.join(toplevel, "config", "TestUtil.py")):
+ break
+else:
+ raise "can't find toplevel directory!"
+
+sys.path.append(os.path.join(toplevel, "config"))
+import TestUtil
+
+name = os.path.join("Ice", "background")
+testdir = os.path.join(toplevel, "test", name)
+
+TestUtil.addLdPath(testdir)
+
+TestUtil.clientServerTest(name)
+sys.exit(0)
diff --git a/cpp/test/Ice/operations/AllTests.cpp b/cpp/test/Ice/operations/AllTests.cpp
index 799560a8d5d..1c89beb032e 100644
--- a/cpp/test/Ice/operations/AllTests.cpp
+++ b/cpp/test/Ice/operations/AllTests.cpp
@@ -29,6 +29,11 @@ allTests(const Ice::CommunicatorPtr& communicator, bool collocated)
derived->opDerived();
cout << "ok" << endl;
+ cout << "testing oneway operations... " << flush;
+ void oneways(const Ice::CommunicatorPtr&, const Test::MyClassPrx&);
+ oneways(communicator, cl);
+ cout << "ok" << endl;
+
if(!collocated)
{
cout << "testing twoway operations with AMI... " << flush;
@@ -37,6 +42,11 @@ allTests(const Ice::CommunicatorPtr& communicator, bool collocated)
twowaysAMI(communicator, derived);
cout << "ok" << endl;
+ cout << "testing oneway operations with AMI... " << flush;
+ void onewaysAMI(const Ice::CommunicatorPtr&, const Test::MyClassPrx&);
+ onewaysAMI(communicator, cl);
+ cout << "ok" << endl;
+
cout << "testing batch oneway operations... " << flush;
void batchOneways(const Test::MyClassPrx&);
batchOneways(cl);
diff --git a/cpp/test/Ice/operations/BatchOneways.cpp b/cpp/test/Ice/operations/BatchOneways.cpp
index f5242c3dee4..f315b0c065d 100644
--- a/cpp/test/Ice/operations/BatchOneways.cpp
+++ b/cpp/test/Ice/operations/BatchOneways.cpp
@@ -19,7 +19,6 @@ batchOneways(const Test::MyClassPrx& p)
const Test::ByteS bs1(10 * 1024);
const Test::ByteS bs2(99 * 1024);
const Test::ByteS bs3(100 * 1024);
-
try
{
p->opByteSOneway(bs1);
diff --git a/cpp/test/Ice/operations/Makefile b/cpp/test/Ice/operations/Makefile
index 9f6fcb227ba..7b435d3989a 100644
--- a/cpp/test/Ice/operations/Makefile
+++ b/cpp/test/Ice/operations/Makefile
@@ -20,7 +20,9 @@ COBJS = Test.o \
Client.o \
AllTests.o \
Twoways.o \
+ Oneways.o \
TwowaysAMI.o \
+ OnewaysAMI.o \
BatchOneways.o
SOBJS = Test.o \
@@ -36,7 +38,9 @@ COLOBJS = Test.o \
Collocated.o \
AllTests.o \
Twoways.o \
+ Oneways.o \
TwowaysAMI.o \
+ OnewaysAMI.o \
BatchOneways.o
SRCS = $(COBJS:.o=.cpp) \
diff --git a/cpp/test/Ice/operations/Makefile.mak b/cpp/test/Ice/operations/Makefile.mak
index f646d70ae33..ca773b8661a 100644
--- a/cpp/test/Ice/operations/Makefile.mak
+++ b/cpp/test/Ice/operations/Makefile.mak
@@ -20,7 +20,9 @@ COBJS = Test.obj \
Client.obj \
AllTests.obj \
Twoways.obj \
+ Oneways.obj \
TwowaysAMI.obj \
+ OnewaysAMI.obj \
BatchOneways.obj
SOBJS = Test.obj \
@@ -36,7 +38,9 @@ COLOBJS = Test.obj \
Collocated.obj \
AllTests.obj \
Twoways.obj \
+ Oneways.obj \
TwowaysAMI.obj \
+ OnewaysAMI.obj \
BatchOneways.obj
SRCS = $(COBJS:.obj=.cpp) \
diff --git a/cpp/test/Ice/operations/Oneways.cpp b/cpp/test/Ice/operations/Oneways.cpp
new file mode 100644
index 00000000000..fcf890b0e50
--- /dev/null
+++ b/cpp/test/Ice/operations/Oneways.cpp
@@ -0,0 +1,39 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2007 ZeroC, Inc. All rights reserved.
+//
+// This copy of Ice is licensed to you under the terms described in the
+// ICE_LICENSE file included in this distribution.
+//
+// **********************************************************************
+
+#include <Ice/Ice.h>
+#include <TestCommon.h>
+#include <Test.h>
+
+using namespace std;
+
+void
+oneways(const Ice::CommunicatorPtr& communicator, const Test::MyClassPrx& proxy)
+{
+ Test::MyClassPrx p = Test::MyClassPrx::uncheckedCast(proxy->ice_oneway());
+
+ {
+ p->opVoid();
+ }
+
+ {
+ Ice::Byte b;
+ Ice::Byte r;
+
+ try
+ {
+ r = p->opByte(Ice::Byte(0xff), Ice::Byte(0x0f), b);
+ test(false);
+ }
+ catch(const Ice::TwowayOnlyException&)
+ {
+ }
+ }
+
+}
diff --git a/cpp/test/Ice/operations/OnewaysAMI.cpp b/cpp/test/Ice/operations/OnewaysAMI.cpp
new file mode 100644
index 00000000000..20a6445b839
--- /dev/null
+++ b/cpp/test/Ice/operations/OnewaysAMI.cpp
@@ -0,0 +1,145 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2007 ZeroC, Inc. All rights reserved.
+//
+// This copy of Ice is licensed to you under the terms described in the
+// ICE_LICENSE file included in this distribution.
+//
+// **********************************************************************
+
+#include <Ice/Ice.h>
+#include <TestCommon.h>
+#include <Test.h>
+#include <limits>
+
+using namespace std;
+
+class CallbackBase : public IceUtil::Monitor<IceUtil::Mutex>
+{
+public:
+
+ CallbackBase() :
+ _called(false)
+ {
+ }
+
+ virtual ~CallbackBase()
+ {
+ }
+
+ bool check()
+ {
+ IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this);
+ while(!_called)
+ {
+ if(!timedWait(IceUtil::Time::seconds(5)))
+ {
+ return false;
+ }
+ }
+ _called = false;
+ return true;
+ }
+
+protected:
+
+ void called()
+ {
+ IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this);
+ assert(!_called);
+ _called = true;
+ notify();
+ }
+
+private:
+
+ bool _called;
+};
+
+class AMI_MyClass_onewayOpVoidI : public Test::AMI_MyClass_opVoid, public CallbackBase
+{
+public:
+
+ virtual void ice_response()
+ {
+ called();
+ }
+
+ virtual void ice_exception(const ::Ice::Exception&)
+ {
+ test(false);
+ }
+};
+
+typedef IceUtil::Handle<AMI_MyClass_onewayOpVoidI> AMI_MyClass_onewayOpVoidIPtr;
+
+class AMI_MyClass_onewayOpVoidExI : public Test::AMI_MyClass_opVoid, public CallbackBase
+{
+public:
+
+ virtual void ice_response()
+ {
+ test(false);
+ }
+
+ virtual void ice_exception(const ::Ice::Exception& ex)
+ {
+ test(dynamic_cast<const ::Ice::NoEndpointException*>(&ex));
+ called();
+ }
+};
+
+typedef IceUtil::Handle<AMI_MyClass_onewayOpVoidExI> AMI_MyClass_onewayOpVoidExIPtr;
+
+class AMI_MyClass_onewayOpByteExI : public Test::AMI_MyClass_opByte, public CallbackBase
+{
+public:
+
+ virtual void ice_response(::Ice::Byte r, ::Ice::Byte b)
+ {
+ test(false);
+ }
+
+ virtual void ice_exception(const ::Ice::Exception& ex)
+ {
+ test(dynamic_cast<const ::Ice::TwowayOnlyException*>(&ex));
+ called();
+ }
+};
+
+typedef IceUtil::Handle<AMI_MyClass_onewayOpByteExI> AMI_MyClass_onewayOpByteExIPtr;
+
+void
+onewaysAMI(const Ice::CommunicatorPtr& communicator, const Test::MyClassPrx& proxy)
+{
+ Test::MyClassPrx p = Test::MyClassPrx::uncheckedCast(proxy->ice_oneway());
+
+ {
+ AMI_MyClass_onewayOpVoidIPtr cb = new AMI_MyClass_onewayOpVoidI();
+ p->opVoid_async(cb);
+ // Let's check if we can reuse the same callback object for another call.
+ p->opVoid_async(cb);
+ }
+
+ {
+ // Check that a call to a void operation raises NoEndpointException
+ // in the ice_exception() callback instead of at the point of call.
+ Test::MyClassPrx indirect = Test::MyClassPrx::uncheckedCast(p->ice_adapterId("dummy"));
+ AMI_MyClass_onewayOpVoidExIPtr cb = new AMI_MyClass_onewayOpVoidExI();
+ try
+ {
+ indirect->opVoid_async(cb);
+ }
+ catch(const Ice::Exception&)
+ {
+ test(false);
+ }
+ test(cb->check());
+ }
+
+ {
+ AMI_MyClass_onewayOpByteExIPtr cb = new AMI_MyClass_onewayOpByteExI();
+ p->opByte_async(cb, 0, 0);
+ test(cb->check());
+ }
+}
diff --git a/cpp/test/Ice/operations/TestAMDI.cpp b/cpp/test/Ice/operations/TestAMDI.cpp
index 0227c30075f..f3baed1e676 100644
--- a/cpp/test/Ice/operations/TestAMDI.cpp
+++ b/cpp/test/Ice/operations/TestAMDI.cpp
@@ -37,10 +37,13 @@ private:
void
MyDerivedClassI::shutdown_async(const Test::AMD_MyClass_shutdownPtr& cb, const Ice::Current& current)
{
- if(_opVoidThread)
{
- _opVoidThread->getThreadControl().join();
- _opVoidThread = 0;
+ IceUtil::Mutex::Lock sync(_opVoidMutex);
+ if(_opVoidThread)
+ {
+ _opVoidThread->getThreadControl().join();
+ _opVoidThread = 0;
+ }
}
current.adapter->getCommunicator()->shutdown();
@@ -50,6 +53,7 @@ MyDerivedClassI::shutdown_async(const Test::AMD_MyClass_shutdownPtr& cb, const I
void
MyDerivedClassI::opVoid_async(const Test::AMD_MyClass_opVoidPtr& cb, const Ice::Current&)
{
+ IceUtil::Mutex::Lock sync(_opVoidMutex);
if(_opVoidThread)
{
_opVoidThread->getThreadControl().join();
diff --git a/cpp/test/Ice/operations/TestAMDI.h b/cpp/test/Ice/operations/TestAMDI.h
index 7931398b7e8..bad7823a570 100644
--- a/cpp/test/Ice/operations/TestAMDI.h
+++ b/cpp/test/Ice/operations/TestAMDI.h
@@ -135,6 +135,7 @@ public:
private:
IceUtil::ThreadPtr _opVoidThread;
+ IceUtil::Mutex _opVoidMutex;
};
#endif
diff --git a/cpp/test/Ice/operations/TwowaysAMI.cpp b/cpp/test/Ice/operations/TwowaysAMI.cpp
index 158f0c6df25..fb81868048f 100644
--- a/cpp/test/Ice/operations/TwowaysAMI.cpp
+++ b/cpp/test/Ice/operations/TwowaysAMI.cpp
@@ -42,7 +42,7 @@ public:
IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this);
while(!_called)
{
- if(!timedWait(IceUtil::Time::seconds(5)))
+ if(!timedWait(IceUtil::Time::seconds(50000)))
{
return false;
}
@@ -50,7 +50,7 @@ public:
_called = false;
return true;
}
-
+
protected:
void called()
@@ -94,7 +94,7 @@ public:
virtual void ice_exception(const ::Ice::Exception& ex)
{
- test(dynamic_cast<const ::Ice::TwowayOnlyException*>(&ex));
+ test(dynamic_cast<const ::Ice::NoEndpointException*>(&ex));
called();
}
};
@@ -131,7 +131,7 @@ public:
virtual void ice_exception(const ::Ice::Exception& ex)
{
- test(dynamic_cast<const ::Ice::TwowayOnlyException*>(&ex));
+ test(dynamic_cast<const ::Ice::NoEndpointException*>(&ex));
called();
}
};
@@ -875,12 +875,13 @@ void
twowaysAMI(const Ice::CommunicatorPtr& communicator, const Test::MyClassPrx& p)
{
{
- // Check that a call to a void operation raises TwowayOnlyException
+ // Check that a call to a void operation raises NoEndpointException
// in the ice_exception() callback instead of at the point of call.
- Test::MyClassPrx oneway = Test::MyClassPrx::uncheckedCast(p->ice_oneway());
+ Test::MyClassPrx indirect = Test::MyClassPrx::uncheckedCast(p->ice_adapterId("dummy"));
AMI_MyClass_opVoidExIPtr cb = new AMI_MyClass_opVoidExI;
- try {
- oneway->opVoid_async(cb);
+ try
+ {
+ indirect->opVoid_async(cb);
}
catch(const Ice::Exception&)
{
@@ -890,13 +891,13 @@ twowaysAMI(const Ice::CommunicatorPtr& communicator, const Test::MyClassPrx& p)
}
{
- // Check that a call to a twoway operation raises TwowayOnlyException
+ // Check that a call to a twoway operation raises NoEndpointException
// in the ice_exception() callback instead of at the point of call.
- Test::MyClassPrx oneway = Test::MyClassPrx::uncheckedCast(p->ice_oneway());
+ Test::MyClassPrx indirect = Test::MyClassPrx::uncheckedCast(p->ice_adapterId("dummy"));
AMI_MyClass_opByteExIPtr cb = new AMI_MyClass_opByteExI;
try
{
- oneway->opByte_async(cb, 0, 0);
+ indirect->opByte_async(cb, 0, 0);
}
catch(const Ice::Exception&)
{
@@ -1345,7 +1346,7 @@ twowaysAMI(const Ice::CommunicatorPtr& communicator, const Test::MyClassPrx& p)
Test::MyClassPrx p = Test::MyClassPrx::uncheckedCast(
- ic->stringToProxy("test:default -p 12010 -t 10000"));
+ ic->stringToProxy("test:default -p 12010"));
ic->getImplicitContext()->setContext(ctx);
diff --git a/cpp/test/Ice/timeout/AllTests.cpp b/cpp/test/Ice/timeout/AllTests.cpp
index 694604304f9..78ac425ad95 100644
--- a/cpp/test/Ice/timeout/AllTests.cpp
+++ b/cpp/test/Ice/timeout/AllTests.cpp
@@ -242,9 +242,6 @@ allTests(const Ice::CommunicatorPtr& communicator)
cout << "testing AMI read timeout... " << flush;
{
//
- // The resolution of AMI timeouts is limited by the connection monitor
- // thread. We set Ice.MonitorConnections=1 (one second) in main().
- //
// Expect TimeoutException.
//
TimeoutPrx to = TimeoutPrx::uncheckedCast(obj->ice_timeout(500));
@@ -267,9 +264,6 @@ allTests(const Ice::CommunicatorPtr& communicator)
cout << "testing AMI write timeout... " << flush;
{
//
- // The resolution of AMI timeouts is limited by the connection monitor
- // thread. We set Ice.MonitorConnections=1 (one second) in main().
- //
// Expect TimeoutException.
//
TimeoutPrx to = TimeoutPrx::uncheckedCast(obj->ice_timeout(500));
diff --git a/cpp/test/Ice/timeout/Client.cpp b/cpp/test/Ice/timeout/Client.cpp
index b3c9c744c72..9cdc8a39d76 100644
--- a/cpp/test/Ice/timeout/Client.cpp
+++ b/cpp/test/Ice/timeout/Client.cpp
@@ -44,11 +44,6 @@ main(int argc, char* argv[])
//
initData.properties->setProperty("Ice.Warn.Connections", "0");
- //
- // Check for AMI timeouts every second.
- //
- initData.properties->setProperty("Ice.MonitorConnections", "1");
-
communicator = Ice::initialize(argc, argv, initData);
status = run(argc, argv, communicator);
}
diff --git a/cpp/test/IceStorm/federation2/run.py b/cpp/test/IceStorm/federation2/run.py
index 737b106fbac..a960fbbc95f 100755
--- a/cpp/test/IceStorm/federation2/run.py
+++ b/cpp/test/IceStorm/federation2/run.py
@@ -298,6 +298,11 @@ sys.stdout.flush()
onewayStatus = doTest(0, iceStormReference)
print "ok"
+#
+# Give some time for the error to be reported
+#
+time.sleep(2)
+
if onewayStatus or expectorThread.matches(index) != 1:
TestUtil.killServers()
sys.exit(1)
diff --git a/cpp/test/IceUtil/timer/Client.cpp b/cpp/test/IceUtil/timer/Client.cpp
index 382a95175d1..d1e4a2ed474 100644
--- a/cpp/test/IceUtil/timer/Client.cpp
+++ b/cpp/test/IceUtil/timer/Client.cpp
@@ -28,7 +28,7 @@ public:
}
virtual void
- run()
+ runTimerTask()
{
Lock sync(*this);
++_count;
@@ -83,6 +83,13 @@ public:
}
}
+ void
+ clear()
+ {
+ _run = IceUtil::Time();
+ _count = 0;
+ }
+
private:
IceUtil::Time _run;
@@ -101,19 +108,20 @@ int main(int argc, char* argv[])
TestTaskPtr task = new TestTask();
timer->schedule(task, IceUtil::Time());
task->waitForRun();
+ task->clear();
while(true)
{
- TestTaskPtr task = new TestTask();
- timer->schedule(task, IceUtil::Time::milliSeconds(-10));
try
{
+ timer->schedule(task, IceUtil::Time::milliSeconds(-10));
timer->schedule(task, IceUtil::Time());
- test(task->hasRun());
}
catch(const IceUtil::IllegalArgumentException&)
{
break;
}
+ task->waitForRun();
+ task->clear();
}
}