diff options
Diffstat (limited to 'cpp/src')
-rw-r--r-- | cpp/src/Ice/ConnectionI.cpp | 47 | ||||
-rw-r--r-- | cpp/src/Ice/ConnectionI.h | 1 | ||||
-rw-r--r-- | cpp/src/Ice/Outgoing.cpp | 37 | ||||
-rw-r--r-- | cpp/src/Ice/Reference.cpp | 16 | ||||
-rw-r--r-- | cpp/src/Ice/Reference.h | 124 | ||||
-rw-r--r-- | cpp/src/slice2cpp/Gen.cpp | 17 |
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"; |