diff --git a/pvAccessApp/client/pvAccess.h b/pvAccessApp/client/pvAccess.h index 6884f95..d42d38c 100644 --- a/pvAccessApp/client/pvAccess.h +++ b/pvAccessApp/client/pvAccess.h @@ -85,25 +85,25 @@ namespace epics { namespace pvAccess { * @param channelArray The channelArray interface or null if the request failed. * @param pvArray The PVArray that holds the data. */ - virtual void channelArrayConnect(epics::pvData::Status *status,ChannelArray *channelArray,epics::pvData::PVArray *pvArray) = 0; + virtual void channelArrayConnect(const epics::pvData::Status &status,ChannelArray *channelArray,epics::pvData::PVArray *pvArray) = 0; /** * The request is done. This is always called with no locks held. * @param status Completion status. */ - virtual void putArrayDone(epics::pvData::Status *status) = 0; + virtual void putArrayDone(const epics::pvData::Status &status) = 0; /** * The request is done. This is always called with no locks held. * @param status Completion status. */ - virtual void getArrayDone(epics::pvData::Status *status) = 0; + virtual void getArrayDone(const epics::pvData::Status &status) = 0; /** * The request is done. This is always called with no locks held. * @param status Completion status. */ - virtual void setLengthDone(epics::pvData::Status *status) = 0; + virtual void setLengthDone(const epics::pvData::Status &status) = 0; }; @@ -127,7 +127,7 @@ namespace epics { namespace pvAccess { /** * @param status Completion status. */ - virtual void channelFindResult(epics::pvData::Status *status,ChannelFind *channelFind,bool wasFound) = 0; + virtual void channelFindResult(const epics::pvData::Status &status,ChannelFind *channelFind,bool wasFound) = 0; }; @@ -164,14 +164,14 @@ namespace epics { namespace pvAccess { * @param pvStructure The PVStructure that holds the data. * @param bitSet The bitSet for that shows what data has changed. */ - virtual void channelGetConnect(epics::pvData::Status *status,ChannelGet *channelGet, + virtual void channelGetConnect(const epics::pvData::Status &status,ChannelGet *channelGet, epics::pvData::PVStructure *pvStructure,epics::pvData::BitSet *bitSet) = 0; /** * The request is done. This is always called with no locks held. * @param status Completion status. */ - virtual void getDone(epics::pvData::Status *status) = 0; + virtual void getDone(const epics::pvData::Status &status) = 0; }; @@ -207,13 +207,13 @@ namespace epics { namespace pvAccess { * @param channelProcess The channelProcess interface or null if the client could not become * the record processor. */ - virtual void channelProcessConnect(epics::pvData::Status *status,ChannelProcess *channelProcess) = 0; + virtual void channelProcessConnect(const epics::pvData::Status &status,ChannelProcess *channelProcess) = 0; /** * The process request is done. This is always called with no locks held. * @param status Completion status. */ - virtual void processDone(epics::pvData::Status *status) = 0; + virtual void processDone(const epics::pvData::Status &status) = 0; }; @@ -255,20 +255,20 @@ namespace epics { namespace pvAccess { * @param pvStructure The PVStructure that holds the data. * @param bitSet The bitSet for that shows what data has changed. */ - virtual void channelPutConnect(epics::pvData::Status *status,ChannelPut *channelPut, + virtual void channelPutConnect(const epics::pvData::Status &status,ChannelPut *channelPut, epics::pvData::PVStructure *pvStructure,epics::pvData::BitSet *bitSet) = 0; /** * The request is done. This is always called with no locks held. * @param status Completion status. */ - virtual void putDone(epics::pvData::Status *status) = 0; + virtual void putDone(const epics::pvData::Status &status) = 0; /** * The get request is done. This is always called with no locks held. * @param status Completion status. */ - virtual void getDone(epics::pvData::Status *status) = 0; + virtual void getDone(const epics::pvData::Status &status) = 0; }; @@ -317,25 +317,25 @@ namespace epics { namespace pvAccess { * @param pvPutStructure The PVStructure that holds the putData. * @param pvGetStructure The PVStructure that holds the getData. */ - virtual void channelPutGetConnect(epics::pvData::Status *status,ChannelPutGet *channelPutGet, + virtual void channelPutGetConnect(const epics::pvData::Status &status,ChannelPutGet *channelPutGet, epics::pvData::PVStructure *pvPutStructure,epics::pvData::PVStructure *pvGetStructure) = 0; /** * The putGet request is done. This is always called with no locks held. * @param status Completion status. */ - virtual void putGetDone(epics::pvData::Status *status) = 0; + virtual void putGetDone(const epics::pvData::Status &status) = 0; /** * The getPut request is done. This is always called with no locks held. * @param status Completion status. */ - virtual void getPutDone(epics::pvData::Status *status) = 0; + virtual void getPutDone(const epics::pvData::Status &status) = 0; /** * The getGet request is done. This is always called with no locks held. * @param status Completion status. */ - virtual void getGetDone(epics::pvData::Status *status) = 0; + virtual void getGetDone(const epics::pvData::Status &status) = 0; }; @@ -371,7 +371,7 @@ namespace epics { namespace pvAccess { * @param pvArgument The argument structure for an RPC request. * @param bitSet The bitSet for argument changes. */ - virtual void channelRPCConnect(epics::pvData::Status *status,ChannelRPC *channelRPC, + virtual void channelRPCConnect(const epics::pvData::Status &status,ChannelRPC *channelRPC, epics::pvData::PVStructure *pvArgument,epics::pvData::BitSet *bitSet) = 0; /** @@ -379,7 +379,7 @@ namespace epics { namespace pvAccess { * @param status Completion status. * @param pvResponse The response data for the RPC request. */ - virtual void requestDone(epics::pvData::Status *status,epics::pvData::PVStructure *pvResponse) = 0; + virtual void requestDone(const epics::pvData::Status &status,epics::pvData::PVStructure *pvResponse) = 0; }; @@ -396,7 +396,7 @@ namespace epics { namespace pvAccess { * @param status Completion status. * @param field The Structure for the request. */ - virtual void getDone(epics::pvData::Status *status,epics::pvData::FieldConstPtr field) = 0; + virtual void getDone(const epics::pvData::Status &status,epics::pvData::FieldConstPtr field) = 0; }; @@ -588,7 +588,7 @@ namespace epics { namespace pvAccess { * @param status Completion status. * @param channel The channel. */ - virtual void channelCreated(epics::pvData::Status* status, Channel *channel) = 0; + virtual void channelCreated(const epics::pvData::Status &status, Channel *channel) = 0; /** * A channel connection state change has occurred. diff --git a/pvAccessApp/remote/remote.h b/pvAccessApp/remote/remote.h index cd131c5..856c353 100644 --- a/pvAccessApp/remote/remote.h +++ b/pvAccessApp/remote/remote.h @@ -537,7 +537,7 @@ namespace epics { * Report status to clients (e.g. disconnected). * @param status to report. */ - virtual void reportStatus(epics::pvData::Status* status) = 0; + virtual void reportStatus(const epics::pvData::Status& status) = 0; /** * Get request requester. diff --git a/pvAccessApp/remoteClient/clientContextImpl.cpp b/pvAccessApp/remoteClient/clientContextImpl.cpp index 1148dd0..e0a872d 100644 --- a/pvAccessApp/remoteClient/clientContextImpl.cpp +++ b/pvAccessApp/remoteClient/clientContextImpl.cpp @@ -33,8 +33,8 @@ using namespace epics::pvData; namespace epics { namespace pvAccess { - Status* ChannelImpl::channelDestroyed = getStatusCreate()->createStatus(STATUSTYPE_WARNING, "channel destroyed"); - Status* ChannelImpl::channelDisconnected = getStatusCreate()->createStatus(STATUSTYPE_WARNING, "channel disconnected"); + Status ChannelImpl::channelDestroyed = Status(Status::STATUSTYPE_WARNING, "channel destroyed"); + Status ChannelImpl::channelDisconnected = Status(Status::STATUSTYPE_WARNING, "channel disconnected"); // TODO consider std::unordered_map @@ -86,23 +86,23 @@ namespace epics { int m_refCount; + Status m_status; + virtual ~BaseRequestImpl() {}; public: - static StatusCreate* statusCreate; static PVDataCreate* pvDataCreate; - static Status* okStatus; - static Status* destroyedStatus; - static Status* channelNotConnected; - static Status* otherRequestPendingStatus; - static Status* pvRequestNull; + static Status destroyedStatus; + static Status channelNotConnected; + static Status otherRequestPendingStatus; + static Status pvRequestNull; BaseRequestImpl(ChannelImpl* channel, Requester* requester) : m_channel(channel), m_context(channel->getContext()), m_requester(requester), m_destroyed(false), m_remotelyDestroy(false), - m_pendingRequest(NULL_REQUEST), m_refCount(1) + m_pendingRequest(NULL_REQUEST), m_refCount(1), m_status() { // register response request m_ioid = m_context->registerResponseRequest(this); @@ -138,20 +138,20 @@ namespace epics { return m_ioid; } - virtual bool initResponse(Transport* transport, int8 version, ByteBuffer* payloadBuffer, int8 qos, Status* status) = 0; - virtual bool destroyResponse(Transport* transport, int8 version, ByteBuffer* payloadBuffer, int8 qos, Status* status) = 0; - virtual bool normalResponse(Transport* transport, int8 version, ByteBuffer* payloadBuffer, int8 qos, Status* status) = 0; + virtual bool initResponse(Transport* transport, int8 version, ByteBuffer* payloadBuffer, int8 qos, const Status& status) = 0; + virtual bool destroyResponse(Transport* transport, int8 version, ByteBuffer* payloadBuffer, int8 qos, const Status& status) = 0; + virtual bool normalResponse(Transport* transport, int8 version, ByteBuffer* payloadBuffer, int8 qos, const Status& status) = 0; virtual void response(Transport* transport, int8 version, ByteBuffer* payloadBuffer) { transport->ensureData(1); int8 qos = payloadBuffer->getByte(); - Status* status = statusCreate->deserializeStatus(payloadBuffer, transport); + transport->getIntrospectionRegistry()->deserializeStatus(m_status, payloadBuffer, transport); try { if (qos & QOS_INIT) { - if (status->isSuccess()) + if (m_status.isSuccess()) { // once created set destroy flag m_mutex.lock(); @@ -159,7 +159,7 @@ namespace epics { m_mutex.unlock(); } - initResponse(transport, version, payloadBuffer, qos, status); + initResponse(transport, version, payloadBuffer, qos, m_status); } else if (qos & QOS_DESTROY) { @@ -167,24 +167,18 @@ namespace epics { m_remotelyDestroy = false; m_mutex.unlock(); - if (!destroyResponse(transport, version, payloadBuffer, qos, status)) + if (!destroyResponse(transport, version, payloadBuffer, qos, m_status)) cancel(); } else { - normalResponse(transport, version, payloadBuffer, qos, status); + normalResponse(transport, version, payloadBuffer, qos, m_status); } } catch (std::exception &e) { errlogSevPrintf(errlogMajor, "Unhandled exception caught from client code at %s:%d: %s", __FILE__, __LINE__, e.what()); - // TODO - if (status != okStatus) - delete status; } catch (...) { errlogSevPrintf(errlogMajor, "Unhandled exception caught from client code at %s:%d.", __FILE__, __LINE__); - // TODO - if (status != okStatus) - delete status; } } @@ -226,11 +220,11 @@ namespace epics { // TODO notify? } - void reportStatus(Status* status) { + void reportStatus(const Status& status) { // destroy, since channel (parent) was destroyed - if (status == ChannelImpl::channelDestroyed) + if (&status == &ChannelImpl::channelDestroyed) destroy(); - else if (status == ChannelImpl::channelDisconnected) + else if (&status == &ChannelImpl::channelDisconnected) stopRequest(); // TODO notify? } @@ -280,14 +274,12 @@ namespace epics { - StatusCreate* BaseRequestImpl::statusCreate = getStatusCreate(); PVDataCreate* BaseRequestImpl::pvDataCreate = getPVDataCreate(); - Status* BaseRequestImpl::okStatus = getStatusCreate()->getStatusOK();; - Status* BaseRequestImpl::destroyedStatus = getStatusCreate()->createStatus(STATUSTYPE_ERROR, "request destroyed"); - Status* BaseRequestImpl::channelNotConnected = getStatusCreate()->createStatus(STATUSTYPE_ERROR, "channel not connected"); - Status* BaseRequestImpl::otherRequestPendingStatus = getStatusCreate()->createStatus(STATUSTYPE_ERROR, "other request pending"); - Status* BaseRequestImpl::pvRequestNull = getStatusCreate()->createStatus(STATUSTYPE_ERROR, "pvRequest == 0"); + Status BaseRequestImpl::destroyedStatus = Status(Status::STATUSTYPE_ERROR, "request destroyed"); + Status BaseRequestImpl::channelNotConnected = Status(Status::STATUSTYPE_ERROR, "channel not connected"); + Status BaseRequestImpl::otherRequestPendingStatus = Status(Status::STATUSTYPE_ERROR, "other request pending"); + Status BaseRequestImpl::pvRequestNull = Status(Status::STATUSTYPE_ERROR, "pvRequest == 0"); @@ -352,17 +344,17 @@ namespace epics { stopRequest(); } - virtual bool destroyResponse(Transport* transport, int8 version, ByteBuffer* payloadBuffer, int8 qos, Status* status) { + virtual bool destroyResponse(Transport* transport, int8 version, ByteBuffer* payloadBuffer, int8 qos, const Status& status) { EXCEPTION_GUARD(m_callback->processDone(status)); return true; } - virtual bool initResponse(Transport* transport, int8 version, ByteBuffer* payloadBuffer, int8 qos, Status* status) { + virtual bool initResponse(Transport* transport, int8 version, ByteBuffer* payloadBuffer, int8 qos, const Status& status) { EXCEPTION_GUARD(m_callback->channelProcessConnect(status, this)); return true; } - virtual bool normalResponse(Transport* transport, int8 version, ByteBuffer* payloadBuffer, int8 qos, Status* status) { + virtual bool normalResponse(Transport* transport, int8 version, ByteBuffer* payloadBuffer, int8 qos, const Status& status) { EXCEPTION_GUARD(m_callback->processDone(status)); return true; } @@ -386,6 +378,7 @@ namespace epics { try { m_channel->checkAndGetTransport()->enqueueSendRequest(this); } catch (std::runtime_error &rte) { + stopRequest(); EXCEPTION_GUARD(m_callback->processDone(channelNotConnected)); } } @@ -477,15 +470,15 @@ namespace epics { stopRequest(); } - virtual bool destroyResponse(Transport* transport, int8 version, ByteBuffer* payloadBuffer, int8 qos, Status* status) { + virtual bool destroyResponse(Transport* transport, int8 version, ByteBuffer* payloadBuffer, int8 qos, const Status& status) { // data available if (qos & QOS_GET) return normalResponse(transport, version, payloadBuffer, qos, status); return true; } - virtual bool initResponse(Transport* transport, int8 version, ByteBuffer* payloadBuffer, int8 qos, Status* status) { - if (!status->isSuccess()) + virtual bool initResponse(Transport* transport, int8 version, ByteBuffer* payloadBuffer, int8 qos, const Status& status) { + if (!status.isSuccess()) { EXCEPTION_GUARD(m_channelGetRequester->channelGetConnect(status, this, 0, 0)); return true; @@ -500,8 +493,8 @@ namespace epics { return true; } - virtual bool normalResponse(Transport* transport, int8 version, ByteBuffer* payloadBuffer, int8 qos, Status* status) { - if (!status->isSuccess()) + virtual bool normalResponse(Transport* transport, int8 version, ByteBuffer* payloadBuffer, int8 qos, const Status& status) { + if (!status.isSuccess()) { EXCEPTION_GUARD(m_channelGetRequester->getDone(status)); return true; @@ -533,6 +526,7 @@ namespace epics { try { m_channel->checkAndGetTransport()->enqueueSendRequest(this); } catch (std::runtime_error &rte) { + stopRequest(); EXCEPTION_GUARD(m_channelGetRequester->getDone(channelNotConnected)); } } @@ -635,13 +629,13 @@ namespace epics { stopRequest(); } - virtual bool destroyResponse(Transport* transport, int8 version, ByteBuffer* payloadBuffer, int8 qos, Status* status) { + virtual bool destroyResponse(Transport* transport, int8 version, ByteBuffer* payloadBuffer, int8 qos, const Status& status) { EXCEPTION_GUARD(m_channelPutRequester->putDone(status)); return true; } - virtual bool initResponse(Transport* transport, int8 version, ByteBuffer* payloadBuffer, int8 qos, Status* status) { - if (!status->isSuccess()) + virtual bool initResponse(Transport* transport, int8 version, ByteBuffer* payloadBuffer, int8 qos, const Status& status) { + if (!status.isSuccess()) { EXCEPTION_GUARD(m_channelPutRequester->channelPutConnect(status, this, 0, 0)); return true; @@ -656,10 +650,10 @@ namespace epics { return true; } - virtual bool normalResponse(Transport* transport, int8 version, ByteBuffer* payloadBuffer, int8 qos, Status* status) { + virtual bool normalResponse(Transport* transport, int8 version, ByteBuffer* payloadBuffer, int8 qos, const Status& status) { if (qos & QOS_GET) { - if (!status->isSuccess()) + if (!status.isSuccess()) { EXCEPTION_GUARD(m_channelPutRequester->getDone(status)); return true; @@ -694,6 +688,7 @@ namespace epics { try { m_channel->checkAndGetTransport()->enqueueSendRequest(this); } catch (std::runtime_error &rte) { + stopRequest(); EXCEPTION_GUARD(m_channelPutRequester->getDone(channelNotConnected)); } } @@ -714,6 +709,7 @@ namespace epics { try { m_channel->checkAndGetTransport()->enqueueSendRequest(this); } catch (std::runtime_error &rte) { + stopRequest(); EXCEPTION_GUARD(m_channelPutRequester->putDone(channelNotConnected)); } } @@ -814,14 +810,14 @@ namespace epics { stopRequest(); } - virtual bool destroyResponse(Transport* transport, int8 version, ByteBuffer* payloadBuffer, int8 qos, Status* status) { + virtual bool destroyResponse(Transport* transport, int8 version, ByteBuffer* payloadBuffer, int8 qos, const Status& status) { // data available // TODO we need a flag here... return normalResponse(transport, version, payloadBuffer, qos, status); } - virtual bool initResponse(Transport* transport, int8 version, ByteBuffer* payloadBuffer, int8 qos, Status* status) { - if (!status->isSuccess()) + virtual bool initResponse(Transport* transport, int8 version, ByteBuffer* payloadBuffer, int8 qos, const Status& status) { + if (!status.isSuccess()) { EXCEPTION_GUARD(m_channelPutGetRequester->channelPutGetConnect(status, this, 0, 0)); return true; @@ -837,10 +833,10 @@ namespace epics { } - virtual bool normalResponse(Transport* transport, int8 version, ByteBuffer* payloadBuffer, int8 qos, Status* status) { + virtual bool normalResponse(Transport* transport, int8 version, ByteBuffer* payloadBuffer, int8 qos, const Status& status) { if (qos & QOS_GET) { - if (!status->isSuccess()) + if (!status.isSuccess()) { EXCEPTION_GUARD(m_channelPutGetRequester->getGetDone(status)); return true; @@ -854,7 +850,7 @@ namespace epics { } else if (qos & QOS_GET_PUT) { - if (!status->isSuccess()) + if (!status.isSuccess()) { EXCEPTION_GUARD(m_channelPutGetRequester->getPutDone(status)); return true; @@ -868,7 +864,7 @@ namespace epics { } else { - if (!status->isSuccess()) + if (!status.isSuccess()) { EXCEPTION_GUARD(m_channelPutGetRequester->putGetDone(status)); return true; @@ -897,6 +893,7 @@ namespace epics { try { m_channel->checkAndGetTransport()->enqueueSendRequest(this); } catch (std::runtime_error &rte) { + stopRequest(); EXCEPTION_GUARD(m_channelPutGetRequester->putGetDone(channelNotConnected)); } } @@ -915,6 +912,7 @@ namespace epics { try { m_channel->checkAndGetTransport()->enqueueSendRequest(this); } catch (std::runtime_error &rte) { + stopRequest(); EXCEPTION_GUARD(m_channelPutGetRequester->getGetDone(channelNotConnected)); } } @@ -933,6 +931,7 @@ namespace epics { try { m_channel->checkAndGetTransport()->enqueueSendRequest(this); } catch (std::runtime_error &rte) { + stopRequest(); EXCEPTION_GUARD(m_channelPutGetRequester->getPutDone(channelNotConnected)); } } @@ -1032,14 +1031,14 @@ namespace epics { stopRequest(); } - virtual bool destroyResponse(Transport* transport, int8 version, ByteBuffer* payloadBuffer, int8 qos, Status* status) { + virtual bool destroyResponse(Transport* transport, int8 version, ByteBuffer* payloadBuffer, int8 qos, const Status& status) { // data available // TODO we need a flag here... return normalResponse(transport, version, payloadBuffer, qos, status); } - virtual bool initResponse(Transport* transport, int8 version, ByteBuffer* payloadBuffer, int8 qos, Status* status) { - if (!status->isSuccess()) + virtual bool initResponse(Transport* transport, int8 version, ByteBuffer* payloadBuffer, int8 qos, const Status& status) { + if (!status.isSuccess()) { EXCEPTION_GUARD(m_channelRPCRequester->channelRPCConnect(status, this, 0, 0)); return true; @@ -1054,8 +1053,8 @@ namespace epics { return true; } - virtual bool normalResponse(Transport* transport, int8 version, ByteBuffer* payloadBuffer, int8 qos, Status* status) { - if (!status->isSuccess()) + virtual bool normalResponse(Transport* transport, int8 version, ByteBuffer* payloadBuffer, int8 qos, const Status& status) { + if (!status.isSuccess()) { EXCEPTION_GUARD(m_channelRPCRequester->requestDone(status, 0)); return true; @@ -1084,6 +1083,7 @@ namespace epics { try { m_channel->checkAndGetTransport()->enqueueSendRequest(this); } catch (std::runtime_error &rte) { + stopRequest(); EXCEPTION_GUARD(m_channelRPCRequester->requestDone(channelNotConnected, 0)); } } @@ -1194,15 +1194,15 @@ namespace epics { stopRequest(); } - virtual bool destroyResponse(Transport* transport, int8 version, ByteBuffer* payloadBuffer, int8 qos, Status* status) { + virtual bool destroyResponse(Transport* transport, int8 version, ByteBuffer* payloadBuffer, int8 qos, const Status& status) { // data available (get with destroy) if (qos & QOS_GET) return normalResponse(transport, version, payloadBuffer, qos, status); return true; } - virtual bool initResponse(Transport* transport, int8 version, ByteBuffer* payloadBuffer, int8 qos, Status* status) { - if (!status->isSuccess()) + virtual bool initResponse(Transport* transport, int8 version, ByteBuffer* payloadBuffer, int8 qos, const Status& status) { + if (!status.isSuccess()) { EXCEPTION_GUARD(m_channelArrayRequester->channelArrayConnect(status, this, 0)); return true; @@ -1217,10 +1217,10 @@ namespace epics { return true; } - virtual bool normalResponse(Transport* transport, int8 version, ByteBuffer* payloadBuffer, int8 qos, Status* status) { + virtual bool normalResponse(Transport* transport, int8 version, ByteBuffer* payloadBuffer, int8 qos, const Status& status) { if (qos & QOS_GET) { - if (!status->isSuccess()) + if (!status.isSuccess()) { m_channelArrayRequester->getArrayDone(status); return true; @@ -1262,6 +1262,7 @@ namespace epics { m_count = count; m_channel->checkAndGetTransport()->enqueueSendRequest(this); } catch (std::runtime_error &rte) { + stopRequest(); EXCEPTION_GUARD(m_channelArrayRequester->getArrayDone(channelNotConnected)); } } @@ -1284,6 +1285,7 @@ namespace epics { m_count = count; m_channel->checkAndGetTransport()->enqueueSendRequest(this); } catch (std::runtime_error &rte) { + stopRequest(); EXCEPTION_GUARD(m_channelArrayRequester->putArrayDone(channelNotConnected)); } } @@ -1306,6 +1308,7 @@ namespace epics { m_capacity = capacity; m_channel->checkAndGetTransport()->enqueueSendRequest(this); } catch (std::runtime_error &rte) { + stopRequest(); EXCEPTION_GUARD(m_channelArrayRequester->setLengthDone(channelNotConnected)); } } @@ -1401,9 +1404,9 @@ namespace epics { cancel(); } - void reportStatus(Status* status) { + void reportStatus(const Status& status) { // destroy, since channel (parent) was destroyed - if (status == ChannelImpl::channelDestroyed) + if (&status == &ChannelImpl::channelDestroyed) destroy(); // TODO notify? } @@ -1442,11 +1445,10 @@ namespace epics { } virtual void response(Transport* transport, int8 version, ByteBuffer* payloadBuffer) { - // TODO? - // try - // { - Status* status = BaseRequestImpl::statusCreate->deserializeStatus(payloadBuffer, transport); - if (status->isSuccess()) + + Status status; + transport->getIntrospectionRegistry()->deserializeStatus(status, payloadBuffer, transport); + if (status.isSuccess()) { // deserialize Field... const Field* field = transport->getIntrospectionRegistry()->deserialize(payloadBuffer, transport); @@ -1458,16 +1460,6 @@ namespace epics { EXCEPTION_GUARD(m_callback->getDone(status, 0)); } - // TODO - if (status != BaseRequestImpl::okStatus) - delete status; - // } // TODO guard callback - // finally - // { - // always cancel request - // cancel(); - // } - cancel(); } @@ -1531,12 +1523,12 @@ namespace epics { m_gotMonitor = false; } - Status* start() { - return 0; + Status start() { + return Status::OK; } - Status* stop() { - return 0; + Status stop() { + return Status::OK; } void destroy() { @@ -1620,14 +1612,14 @@ namespace epics { m_gotMonitor = false; } - Status* start() { + Status start() { Lock guard(&m_mutex); m_gotMonitor = false; - return 0; + return Status::OK; } - Status* stop() { - return 0; + Status stop() { + return Status::OK; } void destroy() { @@ -1757,16 +1749,18 @@ namespace epics { m_gotMonitor = false; } - Status* start() { + Status start() { Lock guard(&m_mutex); + if (!m_monitorElementChangeBitSet) + return Status(Status::STATUSTYPE_ERROR, "Monitor not connected."); m_gotMonitor = false; m_monitorElementChangeBitSet->clear(); m_monitorElementOverrunBitSet->clear(); - return 0; + return Status::OK; } - Status* stop() { - return 0; + Status stop() { + return Status::OK; } void destroy() { @@ -1847,9 +1841,8 @@ namespace epics { if ((buffer >> queueSize).fail()) { - Status* failedToConvert = getStatusCreate()->createStatus(STATUSTYPE_ERROR, "queueSize type is not a valid integer"); + Status failedToConvert(Status::STATUSTYPE_ERROR, "queueSize type is not a valid integer"); EXCEPTION_GUARD(m_monitorRequester->monitorConnect(failedToConvert, 0, 0)); - delete failedToConvert; return; } } @@ -1896,14 +1889,14 @@ namespace epics { stopRequest(); } - virtual bool destroyResponse(Transport* transport, int8 version, ByteBuffer* payloadBuffer, int8 qos, Status* status) { + virtual bool destroyResponse(Transport* transport, int8 version, ByteBuffer* payloadBuffer, int8 qos, const Status& status) { // data available // TODO if (qos & QOS_GET) return normalResponse(transport, version, payloadBuffer, qos, status); } - virtual bool initResponse(Transport* transport, int8 version, ByteBuffer* payloadBuffer, int8 qos, Status* status) { - if (!status->isSuccess()) + virtual bool initResponse(Transport* transport, int8 version, ByteBuffer* payloadBuffer, int8 qos, const Status& status) { + if (!status.isSuccess()) { EXCEPTION_GUARD(m_monitorRequester->monitorConnect(status, this, 0)); return true; @@ -1917,12 +1910,12 @@ namespace epics { structure->decReferenceCount(); if (m_started) - delete start(); + start(); return true; } - virtual bool normalResponse(Transport* transport, int8 version, ByteBuffer* payloadBuffer, int8 qos, Status* status) { + virtual bool normalResponse(Transport* transport, int8 version, ByteBuffer* payloadBuffer, int8 qos, const Status& status) { if (qos & QOS_GET) { // TODO not supported by IF yet... @@ -1941,86 +1934,76 @@ namespace epics { // override, since we optimize status virtual void response(Transport* transport, int8 version, ByteBuffer* payloadBuffer) { - // TODO? - // try - // { + transport->ensureData(1); int8 qos = payloadBuffer->getByte(); if (qos & QOS_INIT) { - Status* status = statusCreate->deserializeStatus(payloadBuffer, transport); + Status status; + transport->getIntrospectionRegistry()->deserializeStatus(status, payloadBuffer, transport); initResponse(transport, version, payloadBuffer, qos, status); - // TODO - if (status != okStatus) - delete status; } else if (qos & QOS_DESTROY) { - Status* status = statusCreate->deserializeStatus(payloadBuffer, transport); + Status status; + transport->getIntrospectionRegistry()->deserializeStatus(status, payloadBuffer, transport); m_remotelyDestroy = true; if (!destroyResponse(transport, version, payloadBuffer, qos, status)) cancel(); - // TODO - if (status != okStatus) - delete status; } else { - normalResponse(transport, version, payloadBuffer, qos, okStatus); + normalResponse(transport, version, payloadBuffer, qos, Status::OK); } } - virtual Status* start() + virtual Status start() { Lock guard(&m_mutex); if (m_destroyed) - return getStatusCreate()->createStatus(STATUSTYPE_ERROR, "Monitor destroyed.");; - + return BaseRequestImpl::destroyedStatus; + m_monitorStrategy->start(); // start == process + get if (!startRequest(QOS_PROCESS | QOS_GET)) - { - return getStatusCreate()->createStatus(STATUSTYPE_ERROR, "Other request pending."); - } + return BaseRequestImpl::otherRequestPendingStatus; try { m_channel->checkAndGetTransport()->enqueueSendRequest(this); m_started = true; - // client needs to delete status, so passing shared OK instance is not right thing to do - return getStatusCreate()->createStatus(STATUSTYPE_OK, "Monitor started."); + return Status::OK; } catch (std::runtime_error &rte) { - return getStatusCreate()->createStatus(STATUSTYPE_ERROR, "channel not connected."); + stopRequest(); + return BaseRequestImpl::channelNotConnected; } } - virtual Status* stop() + virtual Status stop() { Lock guard(&m_mutex); if (m_destroyed) - return getStatusCreate()->createStatus(STATUSTYPE_ERROR, "Monitor destroyed.");; + return BaseRequestImpl::destroyedStatus; m_monitorStrategy->stop(); // stop == process + no get if (!startRequest(QOS_PROCESS)) - { - return getStatusCreate()->createStatus(STATUSTYPE_ERROR, "Other request pending."); - } + return BaseRequestImpl::otherRequestPendingStatus; try { m_channel->checkAndGetTransport()->enqueueSendRequest(this); m_started = false; - // client needs to delete status, so passing shared OK instance is not right thing to do - return getStatusCreate()->createStatus(STATUSTYPE_OK, "Monitor stopped."); + return Status::OK; } catch (std::runtime_error &rte) { - return getStatusCreate()->createStatus(STATUSTYPE_ERROR, "channel not connected."); + stopRequest(); + return BaseRequestImpl::channelNotConnected; } } @@ -2349,14 +2332,15 @@ namespace epics { transport->ensureData(8); pvAccessID cid = payloadBuffer->getInt(); pvAccessID sid = payloadBuffer->getInt(); - // TODO... do not destroy OK - Status* status = transport->getIntrospectionRegistry()->deserializeStatus(payloadBuffer, transport); + + Status status; + transport->getIntrospectionRegistry()->deserializeStatus(status, payloadBuffer, transport); ChannelImpl* channel = static_cast(_context->getChannel(cid)); if (channel) { // failed check - if (!status->isSuccess()) { + if (!status.isSuccess()) { channel->createChannelFailed(); return; } @@ -2365,11 +2349,6 @@ namespace epics { channel->connectionCompleted(sid); } - - // TODO not nice - if (status != BaseRequestImpl::okStatus) - delete status; - } }; @@ -3141,8 +3120,7 @@ namespace epics { */ void disconnectPendingIO(bool destroy) { - // TODO destroy????!! - Status* status = destroy ? channelDestroyed : channelDisconnected; + Status* status = destroy ? &channelDestroyed : &channelDisconnected; Lock guard(&m_responseRequestsMutex); @@ -3159,7 +3137,7 @@ namespace epics { for (int i = 0; i< count; i++) { - EXCEPTION_GUARD(rrs[i]->reportStatus(status)); + EXCEPTION_GUARD(rrs[i]->reportStatus(*status)); } } @@ -3345,8 +3323,8 @@ namespace epics { if (!channelFindRequester) throw std::runtime_error("0 requester"); - std::auto_ptr errorStatus(getStatusCreate()->createStatus(STATUSTYPE_ERROR, "not implemented", 0)); - channelFindRequester->channelFindResult(errorStatus.get(), 0, false); + Status errorStatus(Status::STATUSTYPE_ERROR, "not implemented", 0); + channelFindRequester->channelFindResult(errorStatus, 0, false); return 0; } @@ -3367,7 +3345,7 @@ namespace epics { // TODO support addressList Channel* channel = m_context->createChannelInternal(channelName, channelRequester, priority, 0); if (channel) - channelRequester->channelCreated(getStatusCreate()->getStatusOK(), channel); + channelRequester->channelCreated(Status::OK, channel); return channel; // NOTE it's up to internal code to respond w/ error to requester and return 0 in case of errors diff --git a/pvAccessApp/remoteClient/clientContextImpl.h b/pvAccessApp/remoteClient/clientContextImpl.h index 07004f2..b62be12 100644 --- a/pvAccessApp/remoteClient/clientContextImpl.h +++ b/pvAccessApp/remoteClient/clientContextImpl.h @@ -37,8 +37,8 @@ namespace epics { virtual Transport* checkAndGetTransport() = 0; virtual Transport* getTransport() = 0; - static Status* channelDestroyed; - static Status* channelDisconnected; + static Status channelDestroyed; + static Status channelDisconnected; }; diff --git a/pvAccessApp/server/responseHandlers.cpp b/pvAccessApp/server/responseHandlers.cpp index da7b811..ce2bf46 100644 --- a/pvAccessApp/server/responseHandlers.cpp +++ b/pvAccessApp/server/responseHandlers.cpp @@ -234,7 +234,7 @@ namespace epics { return this; } - void ChannelFindRequesterImpl::channelFindResult(epics::pvData::Status* status, ChannelFind* channelFind, boolean wasFound) + void ChannelFindRequesterImpl::channelFindResult(const epics::pvData::Status& status, ChannelFind* channelFind, boolean wasFound) { // TODO status Lock guard(_mutex); @@ -318,13 +318,13 @@ namespace epics { _transport(transport), _channelName(channelName), _cid(cid), - _status(NULL), + _status(), _channel(NULL) { } - void ChannelRequesterImpl::channelCreated(Status* const status, Channel* const channel) + void ChannelRequesterImpl::channelCreated(const Status& status, Channel* const channel) { Lock guard(_mutex); _status = status; diff --git a/pvAccessApp/server/responseHandlers.h b/pvAccessApp/server/responseHandlers.h index 2058367..ab5d97e 100644 --- a/pvAccessApp/server/responseHandlers.h +++ b/pvAccessApp/server/responseHandlers.h @@ -181,7 +181,7 @@ namespace epics { ChannelFindRequesterImpl(ServerContextImpl* context, ChannelFindRequesterImplObjectPool* objectPool); void clear(); ChannelFindRequesterImpl* set(int32 searchSequenceId, int32 cid, osiSockAddr* sendTo, boolean responseRequired); - void channelFindResult(epics::pvData::Status* status, ChannelFind* channelFind, boolean wasFound); + void channelFindResult(const epics::pvData::Status& status, ChannelFind* channelFind, boolean wasFound); void lock(); void unlock(); void acquire(); @@ -237,7 +237,7 @@ namespace epics { { public: ChannelRequesterImpl(Transport* transport, const String channelName, const int32 cid); - void channelCreated(Status* const status, Channel* const channel); + void channelCreated(const Status& status, Channel* const channel); void channelStateChange(Channel* const c, const Channel::ConnectionState isConnected); String getRequesterName(); void message(const String message, const epics::pvData::MessageType messageType); @@ -249,7 +249,7 @@ namespace epics { Transport* _transport; const String _channelName; const int32 _cid; - Status* _status; + Status _status; Channel* _channel; epics::pvData::Mutex _mutex; void createChannelFailedResponse(ByteBuffer* buffer, TransportSendControl* control, Status* const status); diff --git a/pvAccessApp/utils/inetAddressUtil.cpp b/pvAccessApp/utils/inetAddressUtil.cpp index 17f43b2..578ac6f 100644 --- a/pvAccessApp/utils/inetAddressUtil.cpp +++ b/pvAccessApp/utils/inetAddressUtil.cpp @@ -73,9 +73,7 @@ namespace epics { v->push_back(pNewNode); } - /* port of osiSockDiscoverBroadcastAddresses() in - * epics/base/src/libCom/osi/os/default/osdNetIntf.c - */ + // TODO use osiSockDiscoverBroadcastAddresses() from epics/base/src/libCom/osi/os/default/osdNetIntf.c InetAddrVector* getBroadcastAddresses(SOCKET sock, in_port_t defaultPort) { static const unsigned nelem = 100; diff --git a/pvAccessApp/utils/introspectionRegistry.cpp b/pvAccessApp/utils/introspectionRegistry.cpp index c94a1f2..01d159e 100644 --- a/pvAccessApp/utils/introspectionRegistry.cpp +++ b/pvAccessApp/utils/introspectionRegistry.cpp @@ -10,14 +10,12 @@ const int8 IntrospectionRegistry::NULL_TYPE_CODE = (int8)-1; const int8 IntrospectionRegistry::ONLY_ID_TYPE_CODE = (int8)-2; const int8 IntrospectionRegistry::FULL_WITH_ID_TYPE_CODE = (int8)-3; PVDataCreate* IntrospectionRegistry::_pvDataCreate = 0; -StatusCreate* IntrospectionRegistry::_statusCreate = 0; FieldCreate* IntrospectionRegistry::_fieldCreate = 0; IntrospectionRegistry::IntrospectionRegistry(bool serverSide) : _mutex(Mutex()) { // TODO not optimal _pvDataCreate = getPVDataCreate(); - _statusCreate = getStatusCreate(); _fieldCreate = getFieldCreate(); _direction = serverSide ? 1 : -1; @@ -359,14 +357,14 @@ PVStructurePtr IntrospectionRegistry::deserializeStructureAndCreatePVStructure(B return retVal; } -void IntrospectionRegistry::serializeStatus(ByteBuffer* buffer, SerializableControl* control, Status* status) +void IntrospectionRegistry::serializeStatus(ByteBuffer* buffer, SerializableControl* control, const Status& status) { - status->serialize(buffer, control); + status.serialize(buffer, control); } -Status* IntrospectionRegistry::deserializeStatus(ByteBuffer* buffer, DeserializableControl* control) +void IntrospectionRegistry::deserializeStatus(Status &status, ByteBuffer* buffer, DeserializableControl* control) { - return _statusCreate->deserializeStatus(buffer, control); + status.deserialize(buffer, control); } diff --git a/pvAccessApp/utils/introspectionRegistry.h b/pvAccessApp/utils/introspectionRegistry.h index 25dc442..afb8235 100644 --- a/pvAccessApp/utils/introspectionRegistry.h +++ b/pvAccessApp/utils/introspectionRegistry.h @@ -208,7 +208,7 @@ typedef std::map registryMap_t; * @param control serialization control. * @param status status to serialize. */ - void serializeStatus(ByteBuffer* buffer, SerializableControl* control, Status* status); + void serializeStatus(ByteBuffer* buffer, SerializableControl* control, const Status &status); /** * Deserialize status. @@ -216,7 +216,7 @@ typedef std::map registryMap_t; * @param buffer data buffer. * @param control serialization control. */ - Status* deserializeStatus(ByteBuffer* buffer, DeserializableControl* control); + void deserializeStatus(Status &status, ByteBuffer* buffer, DeserializableControl* control); private: registryMap_t _registry; @@ -231,11 +231,6 @@ typedef std::map registryMap_t; */ static PVDataCreate* _pvDataCreate; - /** - * Status factory. - */ - static StatusCreate* _statusCreate; - /** * Field factory. */ diff --git a/testApp/client/Makefile b/testApp/client/Makefile index 2eee695..81a73d6 100644 --- a/testApp/client/Makefile +++ b/testApp/client/Makefile @@ -10,9 +10,9 @@ PROD_HOST += testCreateRequest testCreateRequest_SRCS += testCreateRequest.cpp testCreateRequest_LIBS += pvData pvAccess Com -PROD_HOST += testMockClient -testMockClient_SRCS = testMockClient.cpp MockClientImpl.cpp -testMockClient_LIBS = pvData pvAccess Com +#PROD_HOST += testMockClient +#testMockClient_SRCS = testMockClient.cpp MockClientImpl.cpp +#testMockClient_LIBS = pvData pvAccess Com include $(TOP)/configure/RULES #---------------------------------------- diff --git a/testApp/remote/testRemoteClientImpl.cpp b/testApp/remote/testRemoteClientImpl.cpp index 357e314..af6740a 100644 --- a/testApp/remote/testRemoteClientImpl.cpp +++ b/testApp/remote/testRemoteClientImpl.cpp @@ -16,10 +16,10 @@ using namespace epics::pvAccess; class ChannelFindRequesterImpl : public ChannelFindRequester { - virtual void channelFindResult(epics::pvData::Status *status,ChannelFind *channelFind,bool wasFound) + virtual void channelFindResult(const epics::pvData::Status& status,ChannelFind *channelFind,bool wasFound) { std::cout << "[ChannelFindRequesterImpl] channelFindResult(" - << status->toString() << ", ..., " << wasFound << ")" << std::endl; + << status.toString() << ", ..., " << wasFound << ")" << std::endl; } }; @@ -35,9 +35,9 @@ class ChannelRequesterImpl : public ChannelRequester std::cout << "[" << getRequesterName() << "] message(" << message << ", " << messageTypeName[messageType] << ")" << std::endl; } - virtual void channelCreated(epics::pvData::Status* status, Channel *channel) + virtual void channelCreated(const epics::pvData::Status& status, Channel *channel) { - std::cout << "channelCreated(" << status->toString() << ", " + std::cout << "channelCreated(" << status.toString() << ", " << (channel ? channel->getChannelName() : "(0)") << ")" << std::endl; } @@ -59,9 +59,9 @@ class GetFieldRequesterImpl : public GetFieldRequester std::cout << "[" << getRequesterName() << "] message(" << message << ", " << messageTypeName[messageType] << ")" << std::endl; } - virtual void getDone(epics::pvData::Status *status,epics::pvData::FieldConstPtr field) + virtual void getDone(const epics::pvData::Status& status,epics::pvData::FieldConstPtr field) { - std::cout << "getDone(" << status->toString() << ", "; + std::cout << "getDone(" << status.toString() << ", "; if (field) { String str; @@ -95,10 +95,10 @@ class ChannelGetRequesterImpl : public ChannelGetRequester std::cout << "[" << getRequesterName() << "] message(" << message << ", " << messageTypeName[messageType] << ")" << std::endl; } - virtual void channelGetConnect(epics::pvData::Status *status,ChannelGet *channelGet, + virtual void channelGetConnect(const epics::pvData::Status& status,ChannelGet *channelGet, epics::pvData::PVStructure *pvStructure,epics::pvData::BitSet *bitSet) { - std::cout << "channelGetConnect(" << status->toString() << ")" << std::endl; + std::cout << "channelGetConnect(" << status.toString() << ")" << std::endl; if (pvStructure) { String st; @@ -113,9 +113,9 @@ class ChannelGetRequesterImpl : public ChannelGetRequester m_mutex.unlock(); } - virtual void getDone(epics::pvData::Status *status) + virtual void getDone(const epics::pvData::Status& status) { - std::cout << "getDone(" << status->toString() << ")" << std::endl; + std::cout << "getDone(" << status.toString() << ")" << std::endl; Lock guard(&m_mutex); if (m_pvStructure) { @@ -143,10 +143,10 @@ class ChannelPutRequesterImpl : public ChannelPutRequester std::cout << "[" << getRequesterName() << "] message(" << message << ", " << messageTypeName[messageType] << ")" << std::endl; } - virtual void channelPutConnect(epics::pvData::Status *status,ChannelPut *channelPut, + virtual void channelPutConnect(const epics::pvData::Status& status,ChannelPut *channelPut, epics::pvData::PVStructure *pvStructure,epics::pvData::BitSet *bitSet) { - std::cout << "channelPutConnect(" << status->toString() << ")" << std::endl; + std::cout << "channelPutConnect(" << status.toString() << ")" << std::endl; // TODO sync m_channelPut = channelPut; @@ -154,9 +154,9 @@ class ChannelPutRequesterImpl : public ChannelPutRequester m_bitSet = bitSet; } - virtual void getDone(epics::pvData::Status *status) + virtual void getDone(const epics::pvData::Status& status) { - std::cout << "getDone(" << status->toString() << ")" << std::endl; + std::cout << "getDone(" << status.toString() << ")" << std::endl; if (m_pvStructure) { String str; @@ -166,9 +166,9 @@ class ChannelPutRequesterImpl : public ChannelPutRequester } } - virtual void putDone(epics::pvData::Status *status) + virtual void putDone(const epics::pvData::Status& status) { - std::cout << "putDone(" << status->toString() << ")" << std::endl; + std::cout << "putDone(" << status.toString() << ")" << std::endl; if (m_pvStructure) { String str; @@ -196,10 +196,10 @@ class ChannelPutGetRequesterImpl : public ChannelPutGetRequester std::cout << "[" << getRequesterName() << "] message(" << message << ", " << messageTypeName[messageType] << ")" << std::endl; } - virtual void channelPutGetConnect(epics::pvData::Status *status,ChannelPutGet *channelPutGet, + virtual void channelPutGetConnect(const epics::pvData::Status& status,ChannelPutGet *channelPutGet, epics::pvData::PVStructure *putData,epics::pvData::PVStructure *getData) { - std::cout << "channelGetPutConnect(" << status->toString() << ")" << std::endl; + std::cout << "channelGetPutConnect(" << status.toString() << ")" << std::endl; // TODO sync m_channelPutGet = channelPutGet; m_putData = putData; @@ -221,9 +221,9 @@ class ChannelPutGetRequesterImpl : public ChannelPutGetRequester } } - virtual void getGetDone(epics::pvData::Status *status) + virtual void getGetDone(const epics::pvData::Status& status) { - std::cout << "getGetDone(" << status->toString() << ")" << std::endl; + std::cout << "getGetDone(" << status.toString() << ")" << std::endl; if (m_getData) { String str; @@ -233,9 +233,9 @@ class ChannelPutGetRequesterImpl : public ChannelPutGetRequester } } - virtual void getPutDone(epics::pvData::Status *status) + virtual void getPutDone(const epics::pvData::Status& status) { - std::cout << "getPutDone(" << status->toString() << ")" << std::endl; + std::cout << "getPutDone(" << status.toString() << ")" << std::endl; if (m_putData) { String str; @@ -245,9 +245,9 @@ class ChannelPutGetRequesterImpl : public ChannelPutGetRequester } } - virtual void putGetDone(epics::pvData::Status *status) + virtual void putGetDone(const epics::pvData::Status& status) { - std::cout << "putGetDone(" << status->toString() << ")" << std::endl; + std::cout << "putGetDone(" << status.toString() << ")" << std::endl; if (m_putData) { String str; @@ -276,10 +276,10 @@ class ChannelRPCRequesterImpl : public ChannelRPCRequester std::cout << "[" << getRequesterName() << "] message(" << message << ", " << messageTypeName[messageType] << ")" << std::endl; } - virtual void channelRPCConnect(epics::pvData::Status *status,ChannelRPC *channelRPC, + virtual void channelRPCConnect(const epics::pvData::Status& status,ChannelRPC *channelRPC, epics::pvData::PVStructure *pvStructure,epics::pvData::BitSet *bitSet) { - std::cout << "channelRPCConnect(" << status->toString() << ")" << std::endl; + std::cout << "channelRPCConnect(" << status.toString() << ")" << std::endl; if (pvStructure) { String st; @@ -293,9 +293,9 @@ class ChannelRPCRequesterImpl : public ChannelRPCRequester m_bitSet = bitSet; } - virtual void requestDone(epics::pvData::Status *status,epics::pvData::PVStructure *pvResponse) + virtual void requestDone(const epics::pvData::Status& status,epics::pvData::PVStructure *pvResponse) { - std::cout << "requestDone(" << status->toString() << ")" << std::endl; + std::cout << "requestDone(" << status.toString() << ")" << std::endl; if (pvResponse) { String str; @@ -321,10 +321,10 @@ class ChannelArrayRequesterImpl : public ChannelArrayRequester std::cout << "[" << getRequesterName() << "] message(" << message << ", " << messageTypeName[messageType] << ")" << std::endl; } - virtual void channelArrayConnect(epics::pvData::Status *status,ChannelArray *channelArray, + virtual void channelArrayConnect(const epics::pvData::Status& status,ChannelArray *channelArray, epics::pvData::PVArray *pvArray) { - std::cout << "channelArrayConnect(" << status->toString() << ")" << std::endl; + std::cout << "channelArrayConnect(" << status.toString() << ")" << std::endl; if (pvArray) { String st; @@ -337,9 +337,9 @@ class ChannelArrayRequesterImpl : public ChannelArrayRequester m_pvArray = pvArray; } - virtual void getArrayDone(epics::pvData::Status *status) + virtual void getArrayDone(const epics::pvData::Status& status) { - std::cout << "getArrayDone(" << status->toString() << ")" << std::endl; + std::cout << "getArrayDone(" << status.toString() << ")" << std::endl; if (m_pvArray) { String str; @@ -349,14 +349,14 @@ class ChannelArrayRequesterImpl : public ChannelArrayRequester } } - virtual void putArrayDone(epics::pvData::Status *status) + virtual void putArrayDone(const epics::pvData::Status& status) { - std::cout << "putArrayDone(" << status->toString() << ")" << std::endl; + std::cout << "putArrayDone(" << status.toString() << ")" << std::endl; } - virtual void setLengthDone(epics::pvData::Status *status) + virtual void setLengthDone(const epics::pvData::Status& status) { - std::cout << "setLengthDone(" << status->toString() << ")" << std::endl; + std::cout << "setLengthDone(" << status.toString() << ")" << std::endl; } }; @@ -372,9 +372,9 @@ class MonitorRequesterImpl : public MonitorRequester std::cout << "[" << getRequesterName() << "] message(" << message << ", " << messageTypeName[messageType] << ")" << std::endl; } - virtual void monitorConnect(Status* status, Monitor* monitor, Structure* structure) + virtual void monitorConnect(const epics::pvData::Status& status, Monitor* monitor, Structure* structure) { - std::cout << "monitorConnect(" << status->toString() << ")" << std::endl; + std::cout << "monitorConnect(" << status.toString() << ")" << std::endl; if (structure) { String str; @@ -421,17 +421,17 @@ class ChannelProcessRequesterImpl : public ChannelProcessRequester std::cout << "[" << getRequesterName() << "] message(" << message << ", " << messageTypeName[messageType] << ")" << std::endl; } - virtual void channelProcessConnect(epics::pvData::Status *status,ChannelProcess *channelProcess) + virtual void channelProcessConnect(const epics::pvData::Status& status,ChannelProcess *channelProcess) { - std::cout << "channelProcessConnect(" << status->toString() << ")" << std::endl; + std::cout << "channelProcessConnect(" << status.toString() << ")" << std::endl; // TODO sync m_channelProcess = channelProcess; } - virtual void processDone(epics::pvData::Status *status) + virtual void processDone(const epics::pvData::Status& status) { - std::cout << "processDone(" << status->toString() << ")" << std::endl; + std::cout << "processDone(" << status.toString() << ")" << std::endl; } }; @@ -549,15 +549,13 @@ int main(int argc,char *argv[]) epicsThreadSleep( 1.0 ); - Status* status = monitor->start(); - std::cout << "monitor->start() = " << status->toString() << std::endl; - delete status; + Status status = monitor->start(); + std::cout << "monitor->start() = " << status.toString() << std::endl; epicsThreadSleep( 3.0 ); status = monitor->stop(); - std::cout << "monitor->stop() = " << status->toString() << std::endl; - delete status; + std::cout << "monitor->stop() = " << status.toString() << std::endl; monitor->destroy(); diff --git a/testApp/utils/introspectionRegistryTest.cpp b/testApp/utils/introspectionRegistryTest.cpp index 5b46ca7..0c9d7bc 100644 --- a/testApp/utils/introspectionRegistryTest.cpp +++ b/testApp/utils/introspectionRegistryTest.cpp @@ -58,7 +58,6 @@ static DeserializableControl* control; static ByteBuffer* buffer; static PVDataCreate* pvDataCreate; -static StatusCreate* statusCreate; static FieldCreate* fieldCreate; static StandardField *standardField; @@ -396,20 +395,20 @@ void testSerializeStatus() { buffer->clear(); registry->reset(); - Status* statusIn = statusCreate->getStatusOK(); + Status statusIn(Status::STATUSTYPE_WARNING, "msg", "dumpy"); registry->serializeStatus(buffer,flusher,statusIn); buffer->flip(); - Status* statusOut= registry->deserializeStatus(buffer,control); - assert(statusIn->getType() == statusOut->getType()); - delete statusOut; - //TODO why are in and out on the same address? + Status statusOut; + registry->deserializeStatus(statusOut, buffer,control); + assert(statusIn.getType() == statusOut.getType()); + assert(statusIn.getMessage() == statusOut.getMessage()); + assert(statusIn.getStackDump() == statusOut.getStackDump()); } int main(int argc, char *argv[]) { pvDataCreate = getPVDataCreate(); - statusCreate = getStatusCreate(); fieldCreate = getFieldCreate(); standardField = getStandardField();