bug fixes

This commit is contained in:
Gasper Jansa
2011-03-01 18:30:37 +01:00
parent 4d1e9b18bf
commit 43763781d7
5 changed files with 46 additions and 18 deletions

View File

@@ -8,6 +8,14 @@ using namespace epics::pvData;
namespace epics { namespace pvAccess {
ReferencedTransportSender::ReferencedTransportSender() :
_refCount(1)
{}
ReferencedTransportSender::~ReferencedTransportSender()
{
}
void ReferencedTransportSender::release()
{
_refMutex.lock();

View File

@@ -13,6 +13,8 @@ namespace pvAccess {
class ReferencedTransportSender : public TransportSender
{
public:
ReferencedTransportSender();
virtual ~ReferencedTransportSender();
void release();
void acquire();
private:

View File

@@ -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);
}

View File

@@ -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();
}

View File

@@ -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[])