From aee60322c9ca90a8b51602145359a567c64eed9d Mon Sep 17 00:00:00 2001 From: Jeff Hill Date: Fri, 7 May 1999 23:07:11 +0000 Subject: [PATCH] throw warning exception with get/put callback failure detail --- src/cas/generic/casStrmClient.cc | 62 +++++++++++++++++++++++++++++--- 1 file changed, 57 insertions(+), 5 deletions(-) diff --git a/src/cas/generic/casStrmClient.cc b/src/cas/generic/casStrmClient.cc index 2d1059fe5..c852a2a37 100644 --- a/src/cas/generic/casStrmClient.cc +++ b/src/cas/generic/casStrmClient.cc @@ -29,6 +29,9 @@ * * History * $Log$ + * Revision 1.28 1999/04/30 15:46:54 jhill + * deal with situation where bounds on managed DD must be modified + * * Revision 1.27 1998/12/19 00:04:52 jhill * renamed createPV() to pvAttach() * @@ -458,14 +461,36 @@ caStatus casStrmClient::readNotifyResponse (casChannelI *pChan, caStatus ecaStatus; if (completionStatus!=S_cas_success) { - errMessage(completionStatus, - "<= get callback failure detail not passed to client"); ecaStatus = ECA_GETFAIL; } else { ecaStatus = ECA_NORMAL; } - return this->readNotifyResponseECA_XXX(pChan, msg, pDesc, ecaStatus); + ecaStatus = this->readNotifyResponseECA_XXX(pChan, msg, pDesc, ecaStatus); + if (ecaStatus) { + return ecaStatus; + } + + // + // send independent warning exception to the client so that they + // will see the error string associated with this error code + // since the error string cant be sent with the get call back + // response (hopefully this is useful information) + // + // order is very important here because it determines that the get + // call back response is always sent, and that this warning exception + // message will be sent at most one time (in rare instances it will + // not be sent, but at least it will not be sent multiple times). + // The message is logged to the console in the rare situations when + // we are unable to send. + // + if (completionStatus!=S_cas_success) { + ecaStatus = this->sendErrWithEpicsStatus (&msg, completionStatus, ECA_NOCONVERT); + if (ecaStatus) { + errMessage (completionStatus, "<= get callback failure detail not passed to client"); + } + } + return S_cas_success; } // @@ -832,11 +857,34 @@ caStatus casStrmClient::writeNotifyResponse( ecaStatus = ECA_NORMAL; } else { - errMessage (completionStatus, "<= put callback failure detail not passed to client"); ecaStatus = ECA_PUTFAIL; } - return this->casStrmClient::writeNotifyResponseECA_XXX(msg, ecaStatus); + ecaStatus = this->casStrmClient::writeNotifyResponseECA_XXX(msg, ecaStatus); + if (ecaStatus) { + return ecaStatus; + } + + // + // send independent warning exception to the client so that they + // will see the error string associated with this error code + // since the error string cant be sent with the put call back + // response (hopefully this is useful information) + // + // order is very important here because it determines that the put + // call back response is always sent, and that this warning exception + // message will be sent at most one time. In rare instances it will + // not be sent, but at least it will not be sent multiple times. + // The message is logged to the console in the rare situations when + // we are unable to send. + // + if (completionStatus!=S_cas_success) { + ecaStatus = this->sendErrWithEpicsStatus (&msg, completionStatus, ECA_NOCONVERT); + if (ecaStatus) { + errMessage (completionStatus, "<= put callback failure detail not passed to client"); + } + } + return S_cas_success; } /* @@ -1811,6 +1859,10 @@ caStatus casStrmClient::writeArrayData() return S_cas_noMemory; } + // + // ok to use the default gddDestructor here because + // an array of characters was allocated above + // pDestructor = new gddDestructor; if (!pDestructor) { delete [] pData;