PipelineMonitor instead of epics::pvData::Monitor

This commit is contained in:
Matej Sekoranja
2015-10-15 20:59:15 +02:00
parent b381d84e64
commit 5884d5b778
7 changed files with 58 additions and 20 deletions

View File

@@ -1444,12 +1444,6 @@ void CAChannelMonitor::release(epics::pvData::MonitorElementPtr const & /*monito
// noop
}
void CAChannelMonitor::reportRemoteQueueStatus(int32 /*freeElements*/)
{
// noop
}
/* --------------- epics::pvData::ChannelRequest --------------- */
void CAChannelMonitor::cancel()

View File

@@ -264,7 +264,6 @@ public:
virtual epics::pvData::Status stop();
virtual epics::pvData::MonitorElementPtr poll();
virtual void release(epics::pvData::MonitorElementPtr const & monitorElement);
virtual void reportRemoteQueueStatus(epics::pvData::int32 freeElements);
/* --------------- epics::pvData::ChannelRequest --------------- */

View File

@@ -941,6 +941,23 @@ namespace pvAccess {
epicsShareExtern void unregisterChannelProviderFactory(ChannelProviderFactory::shared_pointer const & channelProviderFactory);
/**
* @brief Pipeline (streaming) support API (optional).
* This is used by pvAccess to implement pipeline (streaming) monitors.
*/
class epicsShareClass PipelineMonitor : public virtual epics::pvData::Monitor {
public:
POINTER_DEFINITIONS(PipelineMonitor);
virtual ~PipelineMonitor(){}
/**
* Report remote queue status.
* @param freeElements number of free elements.
*/
virtual void reportRemoteQueueStatus(epics::pvData::int32 freeElements) = 0;
};
}}
#endif /* PVACCESS_H */

View File

@@ -6,8 +6,39 @@
# undef epicsExportSharedSymbols
#endif
#ifdef WITH_MICROBENCH
#include <pv/mb.h>
#else
#define MB_DECLARE(NAME, SIZE)
#define MB_DECLARE_EXTERN(NAME)
#define MB_POINT_ID(NAME, STAGE, STAGE_DESC, ID)
#define MB_INC_AUTO_ID(NAME)
#define MB_POINT(NAME, STAGE, STAGE_DESC)
#define MB_POINT_CONDITIONAL(NAME, STAGE, STAGE_DESC, COND)
#define MB_NORMALIZE(NAME)
#define MB_STATS(NAME, STREAM)
#define MB_STATS_OPT(NAME, STAGE_ONLY, SKIP_FIRST_N_SAMPLES, STREAM)
#define MB_CSV_EXPORT(NAME, STREAM)
#define MB_CSV_EXPORT_OPT(NAME, STAGE_ONLY, SKIP_FIRST_N_SAMPLES, STREAM)
#define MB_CSV_IMPORT(NAME, STREAM)
#define MB_PRINT(NAME, STREAM)
#define MB_PRINT_OPT(NAME, STAGE_ONLY, SKIP_FIRST_N_SAMPLES, STREAM)
#define MB_INIT
#endif
#ifdef pvAccessMBEpicsExportSharedSymbols
# define epicsExportSharedSymbols
# undef pvAccessMBEpicsExportSharedSymbols

View File

@@ -19,7 +19,7 @@ using namespace std;
namespace epics { namespace pvAccess {
class ChannelPipelineMonitorImpl :
public Monitor,
public PipelineMonitor,
public PipelineControl,
public std::tr1::enable_shared_from_this<ChannelPipelineMonitorImpl>
{

View File

@@ -2406,11 +2406,6 @@ namespace epics {
}
}
virtual void reportRemoteQueueStatus(int32 /*freeElements*/)
{
// noop for the client
}
virtual void send(ByteBuffer* buffer, TransportSendControl* control) {
control->startMessage((int8)CMD_MONITOR, 9);
buffer->putInt(m_channel->getServerChannelID());
@@ -2782,11 +2777,6 @@ namespace epics {
m_monitorStrategy->release(monitorElement);
}
virtual void reportRemoteQueueStatus(int32 freeElements)
{
m_monitorStrategy->reportRemoteQueueStatus(freeElements);
}
virtual void lock()
{
// noop

View File

@@ -1882,7 +1882,11 @@ void ServerMonitorHandler::handleResponse(osiSockAddr* responseFrom,
{
int32 nfree = payloadBuffer->getInt();
ServerMonitorRequesterImpl::shared_pointer request = static_pointer_cast<ServerMonitorRequesterImpl>(channel->getRequest(ioid));
request->getChannelMonitor()->reportRemoteQueueStatus(nfree);
Monitor::shared_pointer mp = request->getChannelMonitor();
PipelineMonitor* pmp = dynamic_cast<PipelineMonitor*>(mp.get());
if (pmp)
pmp->reportRemoteQueueStatus(nfree);
}
}
@@ -1903,7 +1907,10 @@ void ServerMonitorHandler::handleResponse(osiSockAddr* responseFrom,
if (ack)
{
int32 nfree = payloadBuffer->getInt();
request->getChannelMonitor()->reportRemoteQueueStatus(nfree);
Monitor::shared_pointer mp = request->getChannelMonitor();
PipelineMonitor* pmp = dynamic_cast<PipelineMonitor*>(mp.get());
if (pmp)
pmp->reportRemoteQueueStatus(nfree);
return;
// note: not possible to ack and destroy
}