From 43763781d7147ee4fd43869fd2a03db6b4d1a121 Mon Sep 17 00:00:00 2001 From: Gasper Jansa Date: Tue, 1 Mar 2011 18:30:37 +0100 Subject: [PATCH] bug fixes --- .../server/referencedTransportSender.cpp | 8 ++++++ .../server/referencedTransportSender.h | 2 ++ pvAccessApp/server/responseHandlers.cpp | 26 +++++++++++-------- pvAccessApp/server/serverChannelImpl.cpp | 7 +++-- testApp/remote/testServer.cpp | 21 +++++++++++---- 5 files changed, 46 insertions(+), 18 deletions(-) diff --git a/pvAccessApp/server/referencedTransportSender.cpp b/pvAccessApp/server/referencedTransportSender.cpp index c9781a7..cc240c4 100644 --- a/pvAccessApp/server/referencedTransportSender.cpp +++ b/pvAccessApp/server/referencedTransportSender.cpp @@ -8,6 +8,14 @@ using namespace epics::pvData; namespace epics { namespace pvAccess { +ReferencedTransportSender::ReferencedTransportSender() : + _refCount(1) +{} + +ReferencedTransportSender::~ReferencedTransportSender() +{ +} + void ReferencedTransportSender::release() { _refMutex.lock(); diff --git a/pvAccessApp/server/referencedTransportSender.h b/pvAccessApp/server/referencedTransportSender.h index fdd27f5..5d764b0 100644 --- a/pvAccessApp/server/referencedTransportSender.h +++ b/pvAccessApp/server/referencedTransportSender.h @@ -13,6 +13,8 @@ namespace pvAccess { class ReferencedTransportSender : public TransportSender { public: + ReferencedTransportSender(); + virtual ~ReferencedTransportSender(); void release(); void acquire(); private: diff --git a/pvAccessApp/server/responseHandlers.cpp b/pvAccessApp/server/responseHandlers.cpp index f61c37d..08954ed 100644 --- a/pvAccessApp/server/responseHandlers.cpp +++ b/pvAccessApp/server/responseHandlers.cpp @@ -527,6 +527,7 @@ void ServerGetHandler::handleResponse(osiSockAddr* responseFrom, if (init) { // pvRequest + //TODO who is responsible to delete this pvRequest?? PVStructurePtr pvRequest = transport->getIntrospectionRegistry()->deserializePVRequest(payloadBuffer, transport); // create... @@ -558,7 +559,7 @@ ServerChannelGetRequesterImpl::ServerChannelGetRequesterImpl(ServerContextImpl* BaseChannelRequester(context, channel, ioid, transport) { startRequest(QOS_INIT); - channel->registerRequest(ioid, this); + channel->registerRequest(ioid, static_cast(this)); _channelGet = channel->getChannel()->createChannelGet(this, pvRequest); // TODO what if last call fails... registration is still present } @@ -594,6 +595,7 @@ void ServerChannelGetRequesterImpl::getDone(const Status& status) void ServerChannelGetRequesterImpl::destroy() { { + Lock guard(_mutex); _channel->unregisterRequest(_ioid); if (_channelGet != NULL) { @@ -727,7 +729,7 @@ ServerChannelPutRequesterImpl::ServerChannelPutRequesterImpl(ServerContextImpl* BaseChannelRequester(context, channel, ioid, transport) { startRequest(QOS_INIT); - channel->registerRequest(ioid, this); + channel->registerRequest(ioid, static_cast(this)); _channelPut = channel->getChannel()->createChannelPut(this, pvRequest); // TODO what if last call fails... registration is still present } @@ -919,7 +921,7 @@ ServerChannelPutGetRequesterImpl::ServerChannelPutGetRequesterImpl(ServerContext BaseChannelRequester(context, channel, ioid, transport) { startRequest(QOS_INIT); - channel->registerRequest(ioid, this); + channel->registerRequest(ioid, static_cast(this)); _channelPutGet = channel->getChannel()->createChannelPutGet(this, pvRequest); // TODO what if last call fails... registration is still present } @@ -1127,7 +1129,7 @@ ServerMonitorRequesterImpl::ServerMonitorRequesterImpl(ServerContextImpl* contex BaseChannelRequester(context, channel, ioid, transport) { startRequest(QOS_INIT); - channel->registerRequest(ioid, this); + channel->registerRequest(ioid, static_cast(this)); _channelMonitor = channel->getChannel()->createMonitor(this, pvRequest); // TODO what if last call fails... registration is still present } @@ -1184,11 +1186,13 @@ void ServerMonitorRequesterImpl::unlock() void ServerMonitorRequesterImpl::destroy() { - Lock guard(_mutex); - _channel->unregisterRequest(_ioid); - if (_channelMonitor != NULL) { - _channelMonitor->destroy(); + Lock guard(_mutex); + _channel->unregisterRequest(_ioid); + if (_channelMonitor != NULL) + { + _channelMonitor->destroy(); + } } release(); } @@ -1330,7 +1334,7 @@ ServerChannelArrayRequesterImpl::ServerChannelArrayRequesterImpl(ServerContextIm { startRequest(QOS_INIT); - channel->registerRequest(ioid, this); + channel->registerRequest(ioid, static_cast(this)); _channelArray = channel->getChannel()->createChannelArray(this, pvRequest); // TODO what if last call fails... registration is still present } @@ -1548,7 +1552,7 @@ ServerChannelProcessRequesterImpl::ServerChannelProcessRequesterImpl(ServerConte _refCount(1) { startRequest(QOS_INIT); - channel->registerRequest(ioid, this); + channel->registerRequest(ioid, static_cast(this)); _channelProcess = channel->getChannel()->createChannelProcess(this, pvRequest); // TODO what if last call fails... registration is still present } @@ -1767,7 +1771,7 @@ ServerChannelRPCRequesterImpl::ServerChannelRPCRequesterImpl(ServerContextImpl* BaseChannelRequester(context, channel, ioid, transport) { startRequest(QOS_INIT); - channel->registerRequest(ioid, this); + channel->registerRequest(ioid, static_cast(this)); _channelRPC = channel->getChannel()->createChannelRPC(this, pvRequest); } diff --git a/pvAccessApp/server/serverChannelImpl.cpp b/pvAccessApp/server/serverChannelImpl.cpp index 30a350f..940ac8a 100644 --- a/pvAccessApp/server/serverChannelImpl.cpp +++ b/pvAccessApp/server/serverChannelImpl.cpp @@ -11,7 +11,8 @@ ServerChannelImpl::ServerChannelImpl(Channel* channel, pvAccessID cid, pvAccessID sid, epics::pvData::PVField* securityToken): _channel(channel), _cid(cid), - _sid(cid) + _sid(cid), + _destroyed(false) { if (channel == NULL) { @@ -105,10 +106,12 @@ void ServerChannelImpl::destroyAllRequests() if (_requests.size() == 0) return; - for(_iter = _requests.begin(); _iter != _requests.end(); _iter++) + while(_requests.size() != 0) { + _iter = _requests.begin(); _iter->second->destroy(); } + _requests.clear(); } diff --git a/testApp/remote/testServer.cpp b/testApp/remote/testServer.cpp index 4d2df11..7b9ec5e 100644 --- a/testApp/remote/testServer.cpp +++ b/testApp/remote/testServer.cpp @@ -460,7 +460,16 @@ class MockChannel : public Channel { virtual void getField(GetFieldRequester *requester,epics::pvData::String subField) { - PVFieldPtr pvField = m_pvStructure->getSubField(subField); + PVFieldPtr pvField; + if(subField == "") + { + pvField = m_pvStructure; + } + else + { + pvField = m_pvStructure->getSubField(subField); + } + if(pvField == NULL) { string errMsg = "field '" + subField + "' not found"; @@ -468,7 +477,7 @@ class MockChannel : public Channel { requester->getDone(errorStatus,NULL); return; } - requester->getDone(Status::OK,m_pvStructure->getSubField(subField)->getField()); + requester->getDone(Status::OK,pvField->getField()); } virtual ChannelProcess* createChannelProcess( @@ -584,6 +593,8 @@ class MockServerChannelProvider : public ChannelProvider { MockServerChannelProvider() : m_mockChannelFind(new MockChannelFind(this)) { } + ~MockServerChannelProvider() {}; + virtual epics::pvData::String getProviderName() { return "local"; @@ -630,9 +641,8 @@ class MockServerChannelProvider : public ChannelProvider { return 0; } } - private: - ~MockServerChannelProvider() {}; + MockChannelFind* m_mockChannelFind; @@ -872,11 +882,12 @@ void testServer() ctx.printInfo(); - ctx.run(0); + ctx.run(25); ctx.destroy(); unregisterChannelProvider(static_cast(channelProvider)); + delete channelProvider; } int main(int argc, char *argv[])