summaryrefslogtreecommitdiff
path: root/cpp/src
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/src')
-rw-r--r--cpp/src/Ice/ConnectionFactory.cpp22
-rw-r--r--cpp/src/Ice/ConnectionFactory.h4
-rw-r--r--cpp/src/Ice/ObjectAdapterI.cpp3
3 files changed, 18 insertions, 11 deletions
diff --git a/cpp/src/Ice/ConnectionFactory.cpp b/cpp/src/Ice/ConnectionFactory.cpp
index ce807c91269..c84ff797b7f 100644
--- a/cpp/src/Ice/ConnectionFactory.cpp
+++ b/cpp/src/Ice/ConnectionFactory.cpp
@@ -1415,16 +1415,25 @@ IceInternal::IncomingConnectionFactory::connectionStartFailed(const Ice::Connect
}
}
+//
+// COMPILERFIX: The ConnectionFactory setup is broken out into a separate initialize
+// function because when it was part of the constructor C++Builder 2007 apps would
+// crash if an execption was thrown from any calls within the constructor.
+//
IceInternal::IncomingConnectionFactory::IncomingConnectionFactory(const InstancePtr& instance,
const EndpointIPtr& endpoint,
- const ObjectAdapterPtr& adapter,
- const string& adapterName) :
+ const ObjectAdapterPtr& adapter) :
EventHandler(instance),
_endpoint(endpoint),
_adapter(adapter),
_warn(_instance->initializationData().properties->getPropertyAsInt("Ice.Warn.Connections") > 0),
_state(StateHolding)
{
+}
+
+void
+IceInternal::IncomingConnectionFactory::initialize(const string& adapterName)
+{
if(_instance->defaultsAndOverrides()->overrideTimeout)
{
const_cast<EndpointIPtr&>(_endpoint) =
@@ -1472,12 +1481,11 @@ IceInternal::IncomingConnectionFactory::IncomingConnectionFactory(const Instance
_acceptor->listen();
_fd = _acceptor->fd();
- __setNoDelete(true);
try
{
adapterImpl->getThreadPool()->incFdsInUse();
}
- catch(const IceUtil::Exception& ex)
+ catch(const IceUtil::Exception&)
{
try
{
@@ -1488,16 +1496,14 @@ IceInternal::IncomingConnectionFactory::IncomingConnectionFactory(const Instance
// Here we ignore any exceptions in close().
}
- __setNoDelete(false);
- ex.ice_throw();
+ throw;
}
- __setNoDelete(false);
}
}
IceInternal::IncomingConnectionFactory::~IncomingConnectionFactory()
{
- assert(_state == StateClosed);
+ //assert(_state == StateClosed);
assert(!_acceptor);
assert(_connections.empty());
}
diff --git a/cpp/src/Ice/ConnectionFactory.h b/cpp/src/Ice/ConnectionFactory.h
index 674c8058cca..6c947339b64 100644
--- a/cpp/src/Ice/ConnectionFactory.h
+++ b/cpp/src/Ice/ConnectionFactory.h
@@ -171,8 +171,8 @@ public:
private:
- IncomingConnectionFactory(const InstancePtr&, const EndpointIPtr&, const Ice::ObjectAdapterPtr&,
- const std::string&);
+ IncomingConnectionFactory(const InstancePtr&, const EndpointIPtr&, const Ice::ObjectAdapterPtr&);
+ void initialize(const std::string&);
virtual ~IncomingConnectionFactory();
friend class Ice::ObjectAdapterI;
diff --git a/cpp/src/Ice/ObjectAdapterI.cpp b/cpp/src/Ice/ObjectAdapterI.cpp
index 9fb20494dcb..033e80d762d 100644
--- a/cpp/src/Ice/ObjectAdapterI.cpp
+++ b/cpp/src/Ice/ObjectAdapterI.cpp
@@ -873,7 +873,8 @@ Ice::ObjectAdapterI::ObjectAdapterI(const InstancePtr& instance, const Communica
for(vector<EndpointIPtr>::iterator p = endpoints.begin(); p != endpoints.end(); ++p)
{
- IncomingConnectionFactoryPtr factory = new IncomingConnectionFactory(instance, *p, this, _name);
+ IncomingConnectionFactoryPtr factory = new IncomingConnectionFactory(instance, *p, this);
+ factory->initialize(_name);
_incomingConnectionFactories.push_back(factory);
}