--- pegasus/src/Pegasus/ProviderManager2/OOPProviderManagerRouter.cpp.obz5072 2006-05-31 12:18:40.000000000 -0400 +++ pegasus/src/Pegasus/ProviderManager2/OOPProviderManagerRouter.cpp 2006-05-31 13:09:56.000000000 -0400 @@ -97,18 +97,25 @@ { public: OutstandingRequestEntry( - String messageId_, + String originalMessageId_, CIMRequestMessage* requestMessage_, CIMResponseMessage*& responseMessage_, Semaphore* responseReady_) - : messageId(messageId_), + : originalMessageId(originalMessageId_), requestMessage(requestMessage_), responseMessage(responseMessage_), responseReady(responseReady_) { } - String messageId; + /** + A unique value is substituted as the request messageId attribute to + allow responses to be definitively correllated with requests. + The original messageId value is stored here to avoid a race condition + between the processing of a response chunk and the resetting of the + original messageId in the request message. + */ + String originalMessageId; CIMRequestMessage* requestMessage; CIMResponseMessage*& responseMessage; Semaphore* responseReady; @@ -931,7 +938,7 @@ i != 0; i++) { PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL2, - String("Completing messageId \"") + i.value()->messageId + + String("Completing messageId \"") + i.key() + "\" with a null response."); i.value()->responseMessage = response; i.value()->responseReady->signal(); @@ -1048,7 +1055,7 @@ // Semaphore waitSemaphore(0); OutstandingRequestEntry outstandingRequestEntry( - uniqueMessageId, request, response, &waitSemaphore); + originalMessageId, request, response, &waitSemaphore); // // Lock the Provider Agent Container while initializing the @@ -1343,7 +1350,7 @@ // Put the original message ID into the response response->messageId = - _outstandingRequestEntry->requestMessage->messageId; + _outstandingRequestEntry->originalMessageId; // Call the response chunk callback to process the chunk _responseChunkCallback(