summaryrefslogtreecommitdiff
path: root/cpp/src
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/src')
-rw-r--r--cpp/src/Ice/ConnectionI.cpp47
-rw-r--r--cpp/src/Ice/ConnectionI.h1
-rw-r--r--cpp/src/Ice/Outgoing.cpp37
-rw-r--r--cpp/src/Ice/Reference.cpp16
-rw-r--r--cpp/src/Ice/Reference.h124
-rw-r--r--cpp/src/slice2cpp/Gen.cpp17
6 files changed, 159 insertions, 83 deletions
diff --git a/cpp/src/Ice/ConnectionI.cpp b/cpp/src/Ice/ConnectionI.cpp
index 002041cb492..1e7a4ecb88d 100644
--- a/cpp/src/Ice/ConnectionI.cpp
+++ b/cpp/src/Ice/ConnectionI.cpp
@@ -728,8 +728,8 @@ Ice::ConnectionI::prepareBatchRequest(BasicStream* os)
_batchStream.swap(*os);
//
- // _batchStream now belongs to the caller, until
- // finishBatchRequest() is called.
+ // The batch stream now belongs to the caller, until
+ // finishBatchRequest() or abortBatchRequest() is called.
//
}
@@ -738,16 +738,12 @@ Ice::ConnectionI::finishBatchRequest(BasicStream* os, bool compress)
{
IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this);
- if(_exception.get())
- {
- _exception->ice_throw();
- }
-
- assert(_state > StateNotValidated);
- assert(_state < StateClosing);
-
- _batchStream.swap(*os); // Get the batch stream back.
- ++_batchRequestNum; // Increment the number of requests in the batch.
+ //
+ // Get the batch stream back and increment the number of requests
+ // in the batch.
+ //
+ _batchStream.swap(*os);
+ ++_batchRequestNum;
//
// We compress the whole batch if there is at least one compressed
@@ -757,9 +753,33 @@ Ice::ConnectionI::finishBatchRequest(BasicStream* os, bool compress)
{
_batchRequestCompress = true;
}
+
+ //
+ // Notify about the batch stream not being in use anymore.
+ //
+ assert(_batchStreamInUse);
+ _batchStreamInUse = false;
+ notifyAll();
+}
+
+void
+Ice::ConnectionI::abortBatchRequest()
+{
+ IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this);
+
+ //
+ // Destroy and reset the batch stream and batch count. We cannot
+ // safe old requests in the batch stream, as they might be
+ // corrupted due to incomplete marshaling.
+ //
+ BasicStream dummy(_instance.get());
+ _batchStream.swap(dummy);
+ _batchRequestNum = 0;
+ _batchRequestCompress = false;
//
- // Give the Connection back.
+ // Notify about the batch stream not being in use
+ // anymore.
//
assert(_batchStreamInUse);
_batchStreamInUse = false;
@@ -895,7 +915,6 @@ Ice::ConnectionI::flushBatchRequests()
//
BasicStream dummy(_instance.get());
_batchStream.swap(dummy);
- assert(_batchStream.b.empty());
_batchRequestNum = 0;
_batchRequestCompress = false;
_batchStreamInUse = false;
diff --git a/cpp/src/Ice/ConnectionI.h b/cpp/src/Ice/ConnectionI.h
index 862d8024d2a..36722a2aa13 100644
--- a/cpp/src/Ice/ConnectionI.h
+++ b/cpp/src/Ice/ConnectionI.h
@@ -67,6 +67,7 @@ public:
void prepareBatchRequest(IceInternal::BasicStream*);
void finishBatchRequest(IceInternal::BasicStream*, bool);
+ void abortBatchRequest();
virtual void flushBatchRequests(); // From Connection.
void sendResponse(IceInternal::BasicStream*, Byte);
diff --git a/cpp/src/Ice/Outgoing.cpp b/cpp/src/Ice/Outgoing.cpp
index b73438a2717..f1aa80b6a05 100644
--- a/cpp/src/Ice/Outgoing.cpp
+++ b/cpp/src/Ice/Outgoing.cpp
@@ -110,6 +110,8 @@ IceInternal::Outgoing::Outgoing(ConnectionI* connection, Reference* ref, const s
bool
IceInternal::Outgoing::invoke()
{
+ assert(_state == StateUnsent);
+
_os.endWriteEncaps();
switch(_reference->getMode())
@@ -226,11 +228,12 @@ IceInternal::Outgoing::invoke()
//
// For oneway and datagram requests, the connection object
// never calls back on this object. Therefore we don't
- // need to lock the mutex, keep track of state, 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".
+ // 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;
}
@@ -243,6 +246,7 @@ IceInternal::Outgoing::invoke()
// regular oneways and datagrams (see comment above)
// apply.
//
+ _state = StateInProgress;
_connection->finishBatchRequest(&_os, _compress);
break;
}
@@ -252,6 +256,31 @@ IceInternal::Outgoing::invoke()
}
void
+IceInternal::Outgoing::abort(const LocalException& ex)
+{
+ assert(_state == StateUnsent);
+
+ //
+ // If we didn't finish a batch oneway or datagram request, we must
+ // notify the connection about that we give up ownership of the
+ // batch stream.
+ //
+ if(_reference->getMode() == Reference::ModeBatchOneway || _reference->getMode() == Reference::ModeBatchDatagram)
+ {
+ _connection->abortBatchRequest();
+
+ //
+ // If we abort a batch requests, we cannot retry, because not
+ // only the batch request that caused the problem will be
+ // aborted, but all other requests in the batch as well.
+ //
+ throw NonRepeatable(*_exception.get());
+ }
+
+ ex.ice_throw();
+}
+
+void
IceInternal::Outgoing::finished(BasicStream& is)
{
IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this);
diff --git a/cpp/src/Ice/Reference.cpp b/cpp/src/Ice/Reference.cpp
index 27045b5a9c0..db2d0600c2b 100644
--- a/cpp/src/Ice/Reference.cpp
+++ b/cpp/src/Ice/Reference.cpp
@@ -95,6 +95,7 @@ IceInternal::Reference::changeSecure(bool newSecure) const
ReferencePtr
IceInternal::Reference::changeCollocationOptimization(bool newCollocationOptimization) const
{
+ // TODO: See comments in header.
if(newCollocationOptimization == collocationOptimization)
{
return ReferencePtr(const_cast<Reference*>(this));
@@ -107,30 +108,40 @@ IceInternal::Reference::changeCollocationOptimization(bool newCollocationOptimiz
ReferencePtr
IceInternal::Reference::changeRouter(const RouterPrx&) const
{
+ // TODO: I suggest to make this pure virtual, and to move this
+ // implementation to FixedReference.
return ReferencePtr(const_cast<Reference*>(this));
}
ReferencePtr
IceInternal::Reference::changeLocator(const LocatorPrx&) const
{
+ // TODO: I suggest to make this pure virtual, and to move this
+ // implementation to FixedReference.
return ReferencePtr(const_cast<Reference*>(this));
}
ReferencePtr
IceInternal::Reference::changeDefault() const
{
+ // TODO: This operation should either be pure virtual, or it
+ // should change the default values and be used by the overrides.
return ReferencePtr(const_cast<Reference*>(this));
}
ReferencePtr
IceInternal::Reference::changeCompress(bool) const
{
+ // TODO: I suggest to make this pure virtual, and to move this
+ // implementation to FixedReference.
return ReferencePtr(const_cast<Reference*>(this));
}
ReferencePtr
IceInternal::Reference::changeTimeout(int) const
{
+ // TODO: I suggest to make it pure virtual, and to move this
+ // implementation to FixedReference.
return ReferencePtr(const_cast<Reference*>(this));
}
@@ -503,6 +514,7 @@ IceInternal::Reference::Reference(const InstancePtr& inst, const Ice::Identity&
IceInternal::Reference::Reference(const Reference& r)
{
+ // TODO: Use initializer list.
instance = r.instance;
mode = r.mode;
identity = r.identity;
@@ -528,6 +540,8 @@ IceInternal::FixedReference::FixedReference(const InstancePtr& inst, const Ice::
vector<EndpointPtr>
IceInternal::FixedReference::getEndpoints() const
{
+ // TODO: Remove implementation, it doesn't do anything. The
+ // overrides are all that is needed.
return vector<EndpointPtr>();
}
@@ -655,12 +669,14 @@ IceInternal::RoutableReference::changeDefault() const
ReferencePtr
IceInternal::RoutableReference::changeCompress(bool newCompress) const
{
+ // TODO: Remove this implementation, it doesn't add anything.
return RoutableReferencePtr(const_cast<RoutableReference*>(this));
}
ReferencePtr
IceInternal::RoutableReference::changeTimeout(int newTimeout) const
{
+ // TODO: Remove this implementation, it doesn't add anything.
return RoutableReferencePtr(const_cast<RoutableReference*>(this));
}
diff --git a/cpp/src/Ice/Reference.h b/cpp/src/Ice/Reference.h
index 91a99a8b5f8..01dbdab1ab3 100644
--- a/cpp/src/Ice/Reference.h
+++ b/cpp/src/Ice/Reference.h
@@ -28,7 +28,7 @@ namespace IceInternal
class BasicStream;
-class Reference : public ::IceUtil::Shared
+class Reference : public IceUtil::Shared
{
public:
@@ -43,14 +43,15 @@ public:
};
Mode getMode() const { return mode; }
- const ::Ice::Identity& getIdentity() const { return identity; }
- const ::Ice::Context& getContext() const { return context; }
- const ::std::string& getFacet() const { return facet; }
+ const Ice::Identity& getIdentity() const { return identity; }
+ const Ice::Context& getContext() const { return context; }
+ const std::string& getFacet() const { return facet; }
bool getSecure() const { return secure; }
bool getCollocationOptimization() const { return collocationOptimization; }
+ // TODO: Should be virtual, only for RoutableReference.
const InstancePtr& getInstance() const { return instance; }
- virtual ::std::vector<EndpointPtr> getEndpoints() const = 0;
+ virtual std::vector<EndpointPtr> getEndpoints() const = 0;
//
// The change* methods (here and in derived classes) create
@@ -58,14 +59,14 @@ public:
// corresponding value changed.
//
ReferencePtr changeMode(Mode) const;
- ReferencePtr changeIdentity(const ::Ice::Identity&) const;
- ReferencePtr changeContext(const ::Ice::Context&) const;
- ReferencePtr changeFacet(const ::std::string&) const;
+ ReferencePtr changeIdentity(const Ice::Identity&) const;
+ ReferencePtr changeContext(const Ice::Context&) const;
+ ReferencePtr changeFacet(const std::string&) const;
ReferencePtr changeSecure(bool) const;
- ReferencePtr changeCollocationOptimization(bool) const;
+ ReferencePtr changeCollocationOptimization(bool) const; // TODO: Should be virtual, only for RoutableReference.
- virtual ReferencePtr changeRouter(const ::Ice::RouterPrx&) const;
- virtual ReferencePtr changeLocator(const ::Ice::LocatorPrx&) const;
+ virtual ReferencePtr changeRouter(const Ice::RouterPrx&) const;
+ virtual ReferencePtr changeLocator(const Ice::LocatorPrx&) const;
virtual ReferencePtr changeDefault() const;
virtual ReferencePtr changeCompress(bool) const;
virtual ReferencePtr changeTimeout(int) const;
@@ -80,14 +81,16 @@ public:
//
// Convert the reference to its string form.
//
- virtual ::std::string toString() const = 0;
+ virtual std::string toString() const = 0;
//
// Get a suitable connection for this reference.
//
- virtual ::Ice::ConnectionIPtr getConnection(bool&) const = 0;
+ virtual Ice::ConnectionIPtr getConnection(bool&) const = 0;
- ::std::vector< ::Ice::ConnectionIPtr> filterConnections(const ::std::vector< ::Ice::ConnectionIPtr>&) const;
+ // TODO: Belongs into FixedReference. Or for consistency, you
+ // could make it a global function, like filterEndpoints.
+ std::vector<Ice::ConnectionIPtr> filterConnections(const std::vector<Ice::ConnectionIPtr>&) const;
virtual bool operator==(const Reference&) const = 0;
virtual bool operator!=(const Reference&) const = 0;
@@ -97,24 +100,24 @@ public:
protected:
- Reference(const InstancePtr&, const ::Ice::Identity&, const ::Ice::Context&, const ::std::string&,
+ Reference(const InstancePtr&, const Ice::Identity&, const Ice::Context&, const std::string&,
Mode, bool, bool);
Reference(const Reference&);
- virtual ~Reference() {}
+ virtual ~Reference() {} // TODO: Remove if no functionality.
private:
InstancePtr instance;
Mode mode;
- ::Ice::Identity identity;
- ::Ice::Context context;
- ::std::string facet;
+ Ice::Identity identity;
+ Ice::Context context;
+ std::string facet;
bool secure;
- bool collocationOptimization;
+ bool collocationOptimization; // TODO: Belongs into RoutableReference.
- ::IceUtil::Mutex hashMutex; // For lazy initialization of hash value.
- mutable ::Ice::Int hashValue;
+ IceUtil::Mutex hashMutex; // For lazy initialization of hash value.
+ mutable Ice::Int hashValue;
mutable bool hashInitialized;
};
@@ -122,16 +125,16 @@ class FixedReference : public Reference
{
public:
- FixedReference(const InstancePtr&, const ::Ice::Identity&, const ::Ice::Context&, const ::std::string&, Mode, bool,
- bool, const ::std::vector< ::Ice::ConnectionIPtr>&);
+ FixedReference(const InstancePtr&, const Ice::Identity&, const Ice::Context&, const std::string&, Mode, bool,
+ bool, const std::vector<Ice::ConnectionIPtr>&);
- const ::std::vector< ::Ice::ConnectionIPtr>& getFixedConnections() const { return fixedConnections; }
+ const std::vector<Ice::ConnectionIPtr>& getFixedConnections() const { return fixedConnections; }
- virtual ::std::vector<EndpointPtr> getEndpoints() const;
+ virtual std::vector<EndpointPtr> getEndpoints() const;
virtual void streamWrite(BasicStream*) const;
- virtual ::std::string toString() const;
- virtual ::Ice::ConnectionIPtr getConnection(bool&) const;
+ virtual std::string toString() const;
+ virtual Ice::ConnectionIPtr getConnection(bool&) const;
virtual bool operator==(const Reference&) const;
virtual bool operator!=(const Reference&) const;
@@ -142,11 +145,11 @@ public:
protected:
FixedReference(const FixedReference&);
- virtual ~FixedReference() {}
+ virtual ~FixedReference() {} // TODO: Remove if no functionality.
private:
- ::std::vector< ::Ice::ConnectionIPtr> fixedConnections;
+ std::vector<Ice::ConnectionIPtr> fixedConnections;
};
class RoutableReference : public Reference
@@ -154,16 +157,16 @@ class RoutableReference : public Reference
public:
const RouterInfoPtr& getRouterInfo() const { return routerInfo; }
- ::std::vector<EndpointPtr> getRoutedEndpoints() const;
+ std::vector<EndpointPtr> getRoutedEndpoints() const;
- virtual ReferencePtr changeRouter(const ::Ice::RouterPrx&) const;
+ virtual ReferencePtr changeRouter(const Ice::RouterPrx&) const;
virtual ReferencePtr changeDefault() const;
virtual ReferencePtr changeCompress(bool) const;
virtual ReferencePtr changeTimeout(int) const;
virtual void streamWrite(BasicStream*) const = 0;
- virtual ::std::string toString() const = 0;
- virtual ::Ice::ConnectionIPtr getConnection(bool&) const = 0;
+ virtual std::string toString() const = 0;
+ virtual Ice::ConnectionIPtr getConnection(bool&) const = 0;
virtual bool operator==(const Reference&) const = 0;
virtual bool operator!=(const Reference&) const = 0;
@@ -173,10 +176,10 @@ public:
protected:
- RoutableReference(const InstancePtr&, const ::Ice::Identity&, const ::Ice::Context&, const ::std::string&,
+ RoutableReference(const InstancePtr&, const Ice::Identity&, const Ice::Context&, const std::string&,
Mode, bool, const RouterInfoPtr&, bool);
RoutableReference(const RoutableReference&);
- virtual ~RoutableReference() {}
+ virtual ~RoutableReference() {} // TODO: Remove if no functionality.
private:
@@ -188,19 +191,19 @@ class DirectReference : public RoutableReference
{
public:
- DirectReference(const InstancePtr&, const ::Ice::Identity&, const ::Ice::Context&, const ::std::string&, Mode, bool,
- const ::std::vector<EndpointPtr>&, const RouterInfoPtr&, bool);
+ DirectReference(const InstancePtr&, const Ice::Identity&, const Ice::Context&, const std::string&, Mode, bool,
+ const std::vector<EndpointPtr>&, const RouterInfoPtr&, bool);
- virtual ::std::vector<EndpointPtr> getEndpoints() const;
+ virtual std::vector<EndpointPtr> getEndpoints() const;
- DirectReferencePtr changeEndpoints(const ::std::vector<EndpointPtr>&) const;
+ DirectReferencePtr changeEndpoints(const std::vector<EndpointPtr>&) const;
virtual ReferencePtr changeCompress(bool) const;
virtual ReferencePtr changeTimeout(int) const;
virtual void streamWrite(BasicStream*) const;
- virtual ::std::string toString() const;
- virtual ::Ice::ConnectionIPtr getConnection(bool&) const;
+ virtual std::string toString() const;
+ virtual Ice::ConnectionIPtr getConnection(bool&) const;
virtual bool operator==(const Reference&) const;
virtual bool operator!=(const Reference&) const;
@@ -211,34 +214,35 @@ public:
protected:
DirectReference(const DirectReference&);
- virtual ~DirectReference() {}
+ virtual ~DirectReference() {} // TODO: Remove if no functionality.
private:
- ::std::vector<EndpointPtr> endpoints;
+ std::vector<EndpointPtr> endpoints;
};
class IndirectReference : public RoutableReference
{
public:
- IndirectReference(const InstancePtr&, const ::Ice::Identity&, const ::Ice::Context&, const ::std::string&,
- Mode, bool, const ::std::string&, const RouterInfoPtr&, const LocatorInfoPtr&, bool);
+ IndirectReference(const InstancePtr&, const Ice::Identity&, const Ice::Context&, const std::string&,
+ Mode, bool, const std::string&, const RouterInfoPtr&, const LocatorInfoPtr&, bool);
- const ::std::string& getAdapterId() const { return adapterId; }
+ const std::string& getAdapterId() const { return adapterId; }
const LocatorInfoPtr& getLocatorInfo() const { return locatorInfo; }
- virtual ::std::vector<EndpointPtr> getEndpoints() const;
+ virtual std::vector<EndpointPtr> getEndpoints() const;
- IndirectReferencePtr changeAdapterId(const ::std::string&) const;
- virtual ReferencePtr changeLocator(const ::Ice::LocatorPrx&) const;
+ // TODO: Is the function below needed? (Since it's non-virtual, and not present in Reference.)
+ IndirectReferencePtr changeAdapterId(const std::string&) const;
+ virtual ReferencePtr changeLocator(const Ice::LocatorPrx&) const;
virtual ReferencePtr changeDefault() const;
virtual ReferencePtr changeCompress(bool) const;
virtual ReferencePtr changeTimeout(int) const;
virtual void streamWrite(BasicStream*) const;
- virtual ::std::string toString() const;
- virtual ::Ice::ConnectionIPtr getConnection(bool&) const;
+ virtual std::string toString() const;
+ virtual Ice::ConnectionIPtr getConnection(bool&) const;
virtual bool operator==(const Reference&) const;
virtual bool operator!=(const Reference&) const;
@@ -249,18 +253,18 @@ public:
protected:
IndirectReference(const IndirectReference&);
- virtual ~IndirectReference() {}
+ virtual ~IndirectReference() {} // TODO: Remove if no functionality.
private:
- ::std::string adapterId;
+ std::string adapterId;
LocatorInfoPtr locatorInfo; // Null if no locator is used.
};
-::std::vector<EndpointPtr> filterEndpoints(const ::std::vector<EndpointPtr>&, Reference::Mode, bool);
+std::vector<EndpointPtr> filterEndpoints(const std::vector<EndpointPtr>&, Reference::Mode, bool);
#if 0 // TODO: move this
-class Reference : public ::IceUtil::Shared
+class Reference : public IceUtil::Shared
{
public:
@@ -271,13 +275,13 @@ public:
//
// Filter endpoints or connections based on criteria from this reference.
//
- ::std::vector<Ice::ConnectionIPtr> filterConnections(const ::std::vector<Ice::ConnectionIPtr>&) const;
+ std::vector<Ice::ConnectionIPtr> filterConnections(const std::vector<Ice::ConnectionIPtr>&) const;
private:
- Reference(const InstancePtr&, const Ice::Identity&, const Ice::Context&, const ::std::string&, Mode, bool,
- const ::std::string&, const ::std::vector<EndpointPtr>&,
- const RouterInfoPtr&, const LocatorInfoPtr&, const ::std::vector<Ice::ConnectionIPtr>&, bool);
+ Reference(const InstancePtr&, const Ice::Identity&, const Ice::Context&, const std::string&, Mode, bool,
+ const std::string&, const std::vector<EndpointPtr>&,
+ const RouterInfoPtr&, const LocatorInfoPtr&, const std::vector<Ice::ConnectionIPtr>&, bool);
friend class ReferenceFactory;
};
#endif
diff --git a/cpp/src/slice2cpp/Gen.cpp b/cpp/src/slice2cpp/Gen.cpp
index 369e86b6c7d..221da646fc4 100644
--- a/cpp/src/slice2cpp/Gen.cpp
+++ b/cpp/src/slice2cpp/Gen.cpp
@@ -1768,12 +1768,19 @@ Slice::Gen::DelegateMVisitor::visitOperation(const OperationPtr& p)
<< "static_cast< ::Ice::OperationMode>(" << p->mode() << "), __context, __compress);";
if(!inParams.empty())
{
+ C << nl << "try";
+ C << sb;
C << nl << "::IceInternal::BasicStream* __os = __out.os();";
- }
- writeMarshalCode(C, inParams, 0);
- if(p->sendsClasses())
- {
- C << nl << "__os->writePendingObjects();";
+ writeMarshalCode(C, inParams, 0);
+ if(p->sendsClasses())
+ {
+ C << nl << "__os->writePendingObjects();";
+ }
+ C << eb;
+ C << nl << "catch(const ::Ice::LocalException& __ex)";
+ C << sb;
+ C << nl << "__out.abort(__ex);";
+ C << eb;
}
C << nl << "bool __ok = __out.invoke();";
C << nl << "try";