tog-pegasus/pegasus-2.5.1-obz5180.patch

68 lines
2.5 KiB
Diff

--- pegasus/src/Pegasus/Server/CIMOperationRequestDispatcher.cpp.obz5180 2006-07-07 18:19:11.000000000 -0400
+++ pegasus/src/Pegasus/Server/CIMOperationRequestDispatcher.cpp 2006-07-07 19:03:51.000000000 -0400
@@ -421,7 +421,18 @@
CIMResponseMessage *&response)
{
static const char func[] = "CIMOperationRequestDispatcher::_enqueueResponse";
- AutoMutex autoMut(_mut);
+ // Obtain the _enqueueResponseMutex mutex for this chunked request.
+ // This mutex is used to serialize chunked responses from all incoming
+ // provider threads. It is imperative that the sequencing done by the
+ // resequenceResponse() method and the writing of the chunked response
+ // to the connection socket (done as a synchronous enqueue at the end
+ // of this method) are atomic to ensure that the chunk that is marked
+ // as isComplete for the overall response is indeed the last chunk
+ // returned to the client. See PEP 140 for details.
+ // This mutex was moved into the OperationAggregate class as part of
+ // bug 4629 because we only need to serialize on a per-request basis.
+ // This prevents serializing independent requests on separate connections.
+ AutoMutex autoMut(poA->_enqueueResponseMutex);
Boolean isComplete = false;
try
@@ -550,13 +561,6 @@
CIMException(CIM_ERR_FAILED, String(failMsg));
}
- if (isComplete == true)
- {
- // also deletes the copied request attached to it
- delete poA;
- poA = 0;
- }
-
// after sending, the response has been deleted externally
response = 0;
@@ -1785,6 +1789,12 @@
// the ENTIRE response to the request.
isComplete = service->_enqueueResponse(poA, response);
+ if (isComplete)
+ {
+ // also deletes the copied request attached to it
+ delete poA;
+ poA = 0;
+ }
PEG_METHOD_EXIT();
}
--- pegasus/src/Pegasus/Server/CIMOperationRequestDispatcher.h.obz5180 2006-02-10 14:13:47.000000000 -0500
+++ pegasus/src/Pegasus/Server/CIMOperationRequestDispatcher.h 2006-07-07 19:00:43.000000000 -0400
@@ -159,6 +159,7 @@
*/
class PEGASUS_SERVER_LINKAGE OperationAggregate
{
+ friend class CIMOperationRequestDispatcher;
public:
/* Operation Aggregate constructor. Builds an aggregate
object.
@@ -227,6 +228,7 @@
Array<CIMResponseMessage*> _responseList;
Mutex _appendResponseMutex;
+ Mutex _enqueueResponseMutex;
CIMRequestMessage* _request;
Uint32 _totalIssued;
Uint32 _magicNumber;