diff --git a/src/ca/caChannel.cpp b/src/ca/caChannel.cpp index f578de8..4cfeea2 100644 --- a/src/ca/caChannel.cpp +++ b/src/ca/caChannel.cpp @@ -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() diff --git a/src/ca/caChannel.h b/src/ca/caChannel.h index 7111932..ebeb437 100644 --- a/src/ca/caChannel.h +++ b/src/ca/caChannel.h @@ -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 --------------- */ diff --git a/src/client/pvAccess.h b/src/client/pvAccess.h index 4347566..3b0b1bb 100644 --- a/src/client/pvAccess.h +++ b/src/client/pvAccess.h @@ -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 */ diff --git a/src/mb/pvAccessMB.h b/src/mb/pvAccessMB.h index 40f4463..9bc5a1a 100644 --- a/src/mb/pvAccessMB.h +++ b/src/mb/pvAccessMB.h @@ -6,8 +6,39 @@ # undef epicsExportSharedSymbols #endif +#ifdef WITH_MICROBENCH + #include +#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 diff --git a/src/pipelineService/pipelineServer.cpp b/src/pipelineService/pipelineServer.cpp index ca88a29..3e25649 100644 --- a/src/pipelineService/pipelineServer.cpp +++ b/src/pipelineService/pipelineServer.cpp @@ -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 { diff --git a/src/remoteClient/clientContextImpl.cpp b/src/remoteClient/clientContextImpl.cpp index bc3cf5b..fc6e92c 100644 --- a/src/remoteClient/clientContextImpl.cpp +++ b/src/remoteClient/clientContextImpl.cpp @@ -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 diff --git a/src/server/responseHandlers.cpp b/src/server/responseHandlers.cpp index 8773b5e..e706e40 100644 --- a/src/server/responseHandlers.cpp +++ b/src/server/responseHandlers.cpp @@ -1882,7 +1882,11 @@ void ServerMonitorHandler::handleResponse(osiSockAddr* responseFrom, { int32 nfree = payloadBuffer->getInt(); ServerMonitorRequesterImpl::shared_pointer request = static_pointer_cast(channel->getRequest(ioid)); - request->getChannelMonitor()->reportRemoteQueueStatus(nfree); + + Monitor::shared_pointer mp = request->getChannelMonitor(); + PipelineMonitor* pmp = dynamic_cast(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(mp.get()); + if (pmp) + pmp->reportRemoteQueueStatus(nfree); return; // note: not possible to ack and destroy }