bug fixes
This commit is contained in:
@@ -8,6 +8,14 @@ using namespace epics::pvData;
|
||||
|
||||
namespace epics { namespace pvAccess {
|
||||
|
||||
ReferencedTransportSender::ReferencedTransportSender() :
|
||||
_refCount(1)
|
||||
{}
|
||||
|
||||
ReferencedTransportSender::~ReferencedTransportSender()
|
||||
{
|
||||
}
|
||||
|
||||
void ReferencedTransportSender::release()
|
||||
{
|
||||
_refMutex.lock();
|
||||
|
||||
@@ -13,6 +13,8 @@ namespace pvAccess {
|
||||
class ReferencedTransportSender : public TransportSender
|
||||
{
|
||||
public:
|
||||
ReferencedTransportSender();
|
||||
virtual ~ReferencedTransportSender();
|
||||
void release();
|
||||
void acquire();
|
||||
private:
|
||||
|
||||
@@ -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<Destroyable*>(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<Destroyable*>(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<Destroyable*>(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<Destroyable*>(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<Destroyable*>(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<Destroyable*>(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<Destroyable*>(this));
|
||||
_channelRPC = channel->getChannel()->createChannelRPC(this, pvRequest);
|
||||
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
@@ -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*>(channelProvider));
|
||||
delete channelProvider;
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
|
||||
Reference in New Issue
Block a user