This is Unofficial EPICS BASE Doxygen Site
epics::pvAccess::ServerMonitorRequesterImpl Class Reference

#include "responseHandlers.h"

+ Inheritance diagram for epics::pvAccess::ServerMonitorRequesterImpl:
+ Collaboration diagram for epics::pvAccess::ServerMonitorRequesterImpl:

Public Types

typedef std::tr1::shared_ptr< ServerMonitorRequesterImplshared_pointer
 
typedef std::tr1::shared_ptr< const ServerMonitorRequesterImplconst_shared_pointer
 
- Public Types inherited from epics::pvAccess::MonitorRequester
typedef Monitor operation_type
 

Public Member Functions

virtual ~ServerMonitorRequesterImpl ()
 
virtual void monitorConnect (const epics::pvData::Status &status, Monitor::shared_pointer const &monitor, epics::pvData::StructureConstPtr const &structure) OVERRIDE FINAL
 
virtual void unlisten (Monitor::shared_pointer const &monitor) OVERRIDE FINAL
 
virtual void monitorEvent (Monitor::shared_pointer const &monitor) OVERRIDE FINAL
 
virtual void destroy () OVERRIDE FINAL
 
Monitor::shared_pointer getChannelMonitor ()
 
virtual std::tr1::shared_ptr< ChannelRequestgetOperation () OVERRIDE FINAL
 The Operation associated with this Requester, except for GetField and Monitor (which are special snowflakes...) More...
 
virtual void send (epics::pvData::ByteBuffer *buffer, TransportSendControl *control) OVERRIDE FINAL
 
void ack (size_t cnt)
 
- Public Member Functions inherited from epics::pvAccess::BaseChannelRequester
 POINTER_DEFINITIONS (BaseChannelRequester)
 
 BaseChannelRequester (ServerContextImpl::shared_pointer const &context, std::tr1::shared_ptr< ServerChannel > const &channel, const pvAccessID ioid, Transport::shared_pointer const &transport)
 
virtual ~BaseChannelRequester ()
 
bool startRequest (epics::pvData::int32 qos)
 
void stopRequest ()
 
epics::pvData::int32 getPendingRequest ()
 
virtual std::string getRequesterName () OVERRIDE FINAL
 
virtual void message (std::string const &message, epics::pvData::MessageType messageType) OVERRIDE FINAL
 
virtual void stats (Stats &s) const OVERRIDE FINAL
 Query current counter values. More...
 
- Public Member Functions inherited from epics::pvAccess::TransportSender
 POINTER_DEFINITIONS (TransportSender)
 
 TransportSender ()
 
virtual ~TransportSender ()
 
- Public Member Functions inherited from epics::pvAccess::Lockable
 POINTER_DEFINITIONS (Lockable)
 
virtual ~Lockable ()
 
virtual void lock ()
 
virtual void unlock ()
 
- Public Member Functions inherited from epics::pvAccess::fair_queue< T >::entry
 entry ()
 
 ~entry ()
 
- Public Member Functions inherited from epics::pvAccess::NetStats
virtual ~NetStats ()
 
- Public Member Functions inherited from epics::pvAccess::Destroyable
 POINTER_DEFINITIONS (Destroyable)
 
- Public Member Functions inherited from epics::pvAccess::MonitorRequester
 POINTER_DEFINITIONS (MonitorRequester)
 
virtual ~MonitorRequester ()
 
virtual void monitorConnect (epics::pvData::Status const &status, MonitorPtr const &monitor, epics::pvData::StructureConstPtr const &structure)=0
 
virtual void monitorEvent (MonitorPtr const &monitor)=0
 
virtual void unlisten (MonitorPtr const &monitor)=0
 
- Public Member Functions inherited from epics::pvAccess::ChannelBaseRequester
 POINTER_DEFINITIONS (ChannelBaseRequester)
 
 ChannelBaseRequester ()
 
virtual ~ChannelBaseRequester ()
 
virtual void channelDisconnect (bool destroy)
 

Static Public Member Functions

static shared_pointer create (ServerContextImpl::shared_pointer const &context, std::tr1::shared_ptr< ServerChannel > const &channel, const pvAccessID ioid, Transport::shared_pointer const &transport, epics::pvData::PVStructure::shared_pointer const &pvRequest)
 
- Static Public Member Functions inherited from epics::pvAccess::BaseChannelRequester
static void message (Transport::shared_pointer const &transport, const pvAccessID ioid, const std::string message, const epics::pvData::MessageType messageType)
 
static void sendFailureMessage (const epics::pvData::int8 command, Transport::shared_pointer const &transport, const pvAccessID ioid, const epics::pvData::int8 qos, const epics::pvData::Status status)
 

Protected Member Functions

 ServerMonitorRequesterImpl (ServerContextImpl::shared_pointer const &context, std::tr1::shared_ptr< ServerChannel > const &channel, const pvAccessID ioid, Transport::shared_pointer const &transport)
 
void activate (epics::pvData::PVStructure::shared_pointer const &pvRequest)
 
- Protected Member Functions inherited from epics::pvAccess::Destroyable
virtual ~Destroyable ()
 

Additional Inherited Members

- Public Attributes inherited from epics::pvAccess::TransportSender
size_t bytesTX
 
size_t bytesRX
 
- Static Public Attributes inherited from epics::pvAccess::BaseChannelRequester
static const epics::pvData::Status okStatus = Status()
 
static const epics::pvData::Status badCIDStatus
 
static const epics::pvData::Status badIOIDStatus
 
static const epics::pvData::Status noReadACLStatus
 
static const epics::pvData::Status noWriteACLStatus
 
static const epics::pvData::Status noProcessACLStatus
 
static const epics::pvData::Status otherRequestPendingStatus
 
static const epics::pvData::Status notAChannelRequestStatus
 
- Static Public Attributes inherited from epics::pvAccess::ChannelBaseRequester
static size_t num_instances
 
- Protected Attributes inherited from epics::pvAccess::BaseChannelRequester
const pvAccessID _ioid
 
const Transport::shared_pointer _transport
 
const std::tr1::shared_ptr< ServerChannel_channel
 
epics::pvData::Mutex _mutex
 

Detailed Description

Definition at line 469 of file responseHandlers.h.

Member Typedef Documentation

Constructor & Destructor Documentation

epics::pvAccess::ServerMonitorRequesterImpl::ServerMonitorRequesterImpl ( ServerContextImpl::shared_pointer const &  context,
std::tr1::shared_ptr< ServerChannel > const &  channel,
const pvAccessID  ioid,
Transport::shared_pointer const &  transport 
)
protected

Definition at line 1861 of file responseHandlers.cpp.

1865  :BaseChannelRequester(context, channel, ioid, transport)
1866  ,_window_open(0u)
1867  ,_unlisten(false)
1868  ,_pipeline(false)
1869 {}
BaseChannelRequester(ServerContextImpl::shared_pointer const &context, std::tr1::shared_ptr< ServerChannel > const &channel, const pvAccessID ioid, Transport::shared_pointer const &transport)
virtual epics::pvAccess::ServerMonitorRequesterImpl::~ServerMonitorRequesterImpl ( )
inlinevirtual

Definition at line 486 of file responseHandlers.h.

486 {}

Member Function Documentation

void epics::pvAccess::ServerMonitorRequesterImpl::ack ( size_t  cnt)

Definition at line 2075 of file responseHandlers.cpp.

2076 {
2077  typedef std::vector<MonitorElementPtr> acking_t;
2078  acking_t acking;
2079  Monitor::shared_pointer mon;
2080  {
2081  Lock guard(_mutex);
2082 
2083  // cnt will be larger if this is the initial window update,
2084  // or if the window is being enlarged.
2085  size_t nack = std::min(cnt, _window_closed.size());
2086 
2087  _window_open += cnt;
2088 
2089  window_t::iterator it, end(_window_closed.begin());
2090  std::advance(end, nack);
2091 
2092  acking.resize(nack);
2093 
2094  size_t i;
2095  for(i=0, it=_window_closed.begin(); i<nack; i++, ++it)
2096  {
2097  acking[i].swap(*it);
2098  }
2099 
2100  _window_closed.erase(_window_closed.begin(), end);
2101 
2102  mon = _channelMonitor;
2103  }
2104 
2105  for(acking_t::iterator it(acking.begin()), end(acking.end()); it!=end; ++it) {
2106  mon->release(*it);
2107  }
2108 
2109  mon->reportRemoteQueueStatus(cnt);
2110 }
int i
Definition: scan.c:967
#define min(x, y)
Definition: flexdef.h:78
A lock for multithreading.
Definition: lock.h:36
void epics::pvAccess::ServerMonitorRequesterImpl::activate ( epics::pvData::PVStructure::shared_pointer const &  pvRequest)
protected

Definition at line 1880 of file responseHandlers.cpp.

1881 {
1882  epics::pvData::PVScalar::const_shared_pointer O(pvRequest->getSubField<epics::pvData::PVScalar>("record._options.pipeline"));
1883  if(O) {
1884  try{
1885  _pipeline = O->getAs<epics::pvData::boolean>();
1886  }catch(std::exception& e){
1887  std::ostringstream strm;
1888  strm<<"Ignoring invalid pipeline= : "<<e.what();
1889  message(strm.str(), epics::pvData::errorMessage);
1890  }
1891  }
1893  shared_pointer thisPointer(shared_from_this());
1894  _channel->registerRequest(_ioid, thisPointer);
1895  INIT_EXCEPTION_GUARD(CMD_MONITOR, _channelMonitor, _channel->getChannel()->createMonitor(thisPointer, pvRequest));
1896 }
PVScalar is the base class for each scalar field.
Definition: pvData.h:272
const std::tr1::shared_ptr< ServerChannel > _channel
#define INIT_EXCEPTION_GUARD(cmd, var, code)
bool startRequest(epics::pvData::int32 qos)
virtual void message(std::string const &message, epics::pvData::MessageType messageType) OVERRIDE FINAL
std::tr1::shared_ptr< ServerMonitorRequesterImpl > shared_pointer
detail::pick_type< int8_t, signed char, detail::pick_type< uint8_t, char, unsigned char >::type >::type boolean
Definition: pvType.h:71
ServerMonitorRequesterImpl::shared_pointer epics::pvAccess::ServerMonitorRequesterImpl::create ( ServerContextImpl::shared_pointer const &  context,
std::tr1::shared_ptr< ServerChannel > const &  channel,
const pvAccessID  ioid,
Transport::shared_pointer const &  transport,
epics::pvData::PVStructure::shared_pointer const &  pvRequest 
)
static

Definition at line 1871 of file responseHandlers.cpp.

1874 {
1875  std::tr1::shared_ptr<ServerMonitorRequesterImpl> tp(new ServerMonitorRequesterImpl(context, channel, ioid, transport));
1876  tp->activate(pvRequest);
1877  return tp;
1878 }
ServerMonitorRequesterImpl(ServerContextImpl::shared_pointer const &context, std::tr1::shared_ptr< ServerChannel > const &channel, const pvAccessID ioid, Transport::shared_pointer const &transport)
void epics::pvAccess::ServerMonitorRequesterImpl::destroy ( )
virtual

Destroy this instance.

Implements epics::pvAccess::Destroyable.

Definition at line 1932 of file responseHandlers.cpp.

1933 {
1934  // keep a reference to ourselves as the owner
1935  // could release its reference and we don't want to be
1936  // destroyed prematurely
1937  shared_pointer self(shared_from_this());
1938 
1939  // hold a reference to channelMonitor so that _channelMonitor.reset()
1940  // does not call ~Monitor (external code) while we are holding a lock
1941  Monitor::shared_pointer monitor;
1942  window_t window;
1943  {
1944  Lock guard(_mutex);
1945  _channel->unregisterRequest(_ioid);
1946 
1947  window.swap(_window_closed);
1948 
1949  monitor.swap(_channelMonitor);
1950  }
1951  window.clear();
1952  if(monitor) {
1953  monitor->destroy();
1954  }
1955 }
const std::tr1::shared_ptr< ServerChannel > _channel
A lock for multithreading.
Definition: lock.h:36
std::tr1::shared_ptr< ServerMonitorRequesterImpl > shared_pointer
Monitor::shared_pointer epics::pvAccess::ServerMonitorRequesterImpl::getChannelMonitor ( )

Definition at line 1957 of file responseHandlers.cpp.

1958 {
1959  Lock guard(_mutex);
1960  return _channelMonitor;
1961 }
A lock for multithreading.
Definition: lock.h:36
virtual std::tr1::shared_ptr<ChannelRequest> epics::pvAccess::ServerMonitorRequesterImpl::getOperation ( )
inlinevirtual

The Operation associated with this Requester, except for GetField and Monitor (which are special snowflakes...)

Implements epics::pvAccess::BaseChannelRequester.

Definition at line 496 of file responseHandlers.h.

496 { return std::tr1::shared_ptr<ChannelRequest>(); }
void epics::pvAccess::ServerMonitorRequesterImpl::monitorConnect ( const epics::pvData::Status status,
Monitor::shared_pointer const &  monitor,
epics::pvData::StructureConstPtr const &  structure 
)
virtual

Definition at line 1898 of file responseHandlers.cpp.

1899 {
1900  {
1901  Lock guard(_mutex);
1902  _status = status;
1903  _channelMonitor = monitor;
1904  _structure = structure;
1905  }
1906  TransportSender::shared_pointer thisSender = shared_from_this();
1907  _transport->enqueueSendRequest(thisSender);
1908 
1909  // self-destruction
1910  if (!status.isSuccess())
1911  {
1912  destroy();
1913  }
1914 }
pvd::Status status
A lock for multithreading.
Definition: lock.h:36
const Transport::shared_pointer _transport
bool isSuccess() const
Definition: status.h:103
void epics::pvAccess::ServerMonitorRequesterImpl::monitorEvent ( Monitor::shared_pointer const &  monitor)
virtual

Definition at line 1926 of file responseHandlers.cpp.

1927 {
1928  TransportSender::shared_pointer thisSender = shared_from_this();
1929  _transport->enqueueSendRequest(thisSender);
1930 }
const Transport::shared_pointer _transport
void epics::pvAccess::ServerMonitorRequesterImpl::send ( epics::pvData::ByteBuffer buffer,
TransportSendControl control 
)
virtual

Called by transport. By this call transport gives callee ownership over the buffer. Calls on TransportSendControl instance must be made from calling thread. Moreover, ownership is valid only for the time of call of this method. NOTE: these limitations allow efficient implementation.

Implements epics::pvAccess::TransportSender.

Definition at line 1963 of file responseHandlers.cpp.

1964 {
1965  const int32 request = getPendingRequest();
1966 
1967  if ((QOS_INIT & request) != 0)
1968  {
1969  control->startMessage((int32)CMD_MONITOR, sizeof(int32)/sizeof(int8) + 1);
1970  buffer->putInt(_ioid);
1971  buffer->putByte((int8)request);
1972 
1973  {
1974  Lock guard(_mutex);
1975  _status.serialize(buffer, control);
1976  }
1977 
1978  if (_status.isSuccess())
1979  {
1980  // valid due to _mutex lock above
1981  control->cachedSerialize(_structure, buffer);
1982  }
1983  stopRequest();
1985  }
1986  else
1987  {
1988  Monitor::shared_pointer monitor(getChannelMonitor());
1989  if (!monitor)
1990  return;
1991 
1992  // TODO asCheck ?
1993 
1994  bool busy = false;
1995  if(_pipeline) {
1996  Lock guard(_mutex);
1997  busy = _window_open==0;
1998  }
1999 
2000  MonitorElement::Ref element;
2001  if(!busy) {
2002  MonitorElement::Ref E(monitor);
2003  E.swap(element);
2004  }
2005  if (element)
2006  {
2007  control->startMessage((int8)CMD_MONITOR, sizeof(int32)/sizeof(int8) + 1);
2008  buffer->putInt(_ioid);
2009  buffer->putByte((int8)request);
2010 
2011  // changedBitSet and data, if not notify only (i.e. queueSize == -1)
2012  const BitSet::shared_pointer& changedBitSet = element->changedBitSet;
2013  if (changedBitSet)
2014  {
2015  changedBitSet->serialize(buffer, control);
2016  element->pvStructurePtr->serialize(buffer, control, changedBitSet.get());
2017 
2018  // overrunBitset
2019  element->overrunBitSet->serialize(buffer, control);
2020  }
2021 
2022  {
2023  Lock guard(_mutex);
2024  if(!_pipeline) {
2025  } else if(_window_open==0) {
2026  // This really shouldn't happen as the above ensures that _window_open *was* non-zero,
2027  // and only we (the sender) will decrement.
2028  message("Monitor Logic Error: send outside of window", epics::pvData::warningMessage);
2029  LOG(logLevelError, "Monitor Logic Error: send outside of window %zu", _window_closed.size());
2030 
2031  } else {
2032  _window_closed.push_back(element.letGo());
2033  _window_open--;
2034  }
2035  }
2036 
2037  element.reset(); // calls Monitor::release() if not swap()'d
2038 
2039  // TODO if we try to proces several monitors at once, then fairness suffers
2040  // TODO compbine several monitors into one message (reduces payload)
2041  TransportSender::shared_pointer thisSender = shared_from_this();
2042  _transport->enqueueSendRequest(thisSender);
2043  }
2044  else
2045  {
2046  bool unlisten;
2047  window_t window;
2048  {
2049  Lock guard(_mutex);
2050  unlisten = _unlisten;
2051  _unlisten = false;
2052  if(unlisten) {
2053  window.swap(_window_closed);
2054  _window_open = 0u;
2055  }
2056  }
2057 
2058  for(window_t::iterator it(window.begin()), end(window.end()); it!=end; ++it) {
2059  monitor->release(*it);
2060  }
2061  window.clear();
2062 
2063  if (unlisten)
2064  {
2065  control->startMessage((int8)CMD_MONITOR, sizeof(int32)/sizeof(int8) + 1);
2066  buffer->putInt(_ioid);
2067  buffer->putByte((int8)QOS_DESTROY);
2068  Status::Ok.serialize(buffer, control);
2069  }
2070  }
2071 
2072  }
2073 }
int8_t int8
Definition: pvType.h:75
std::string request
static Status Ok
Definition: status.h:47
EPICS_ALWAYS_INLINE void putInt(int32 value)
Definition: byteBuffer.h:537
bool startRequest(epics::pvData::int32 qos)
A lock for multithreading.
Definition: lock.h:36
const Transport::shared_pointer _transport
const epics::pvData::PVStructurePtr pvStructurePtr
Definition: monitor.h:58
#define LOG(level, format,...)
Definition: logger.h:48
void serialize(ByteBuffer *buffer, SerializableControl *flusher) const
Definition: status.cpp:45
virtual void unlisten(Monitor::shared_pointer const &monitor) OVERRIDE FINAL
bool isSuccess() const
Definition: status.h:103
EPICS_ALWAYS_INLINE void putByte(int8 value)
Definition: byteBuffer.h:525
const epics::pvData::BitSet::shared_pointer overrunBitSet
Definition: monitor.h:60
virtual void cachedSerialize(std::tr1::shared_ptr< const Field > const &field, ByteBuffer *buffer)=0
const epics::pvData::BitSet::shared_pointer changedBitSet
Definition: monitor.h:59
virtual void message(std::string const &message, epics::pvData::MessageType messageType) OVERRIDE FINAL
virtual void startMessage(epics::pvData::int8 command, std::size_t ensureCapacity, epics::pvData::int32 payloadSize=0)=0
int32_t int32
Definition: pvType.h:83
void epics::pvAccess::ServerMonitorRequesterImpl::unlisten ( Monitor::shared_pointer const &  monitor)
virtual

Definition at line 1916 of file responseHandlers.cpp.

1917 {
1918  {
1919  Lock guard(_mutex);
1920  _unlisten = true;
1921  }
1922  TransportSender::shared_pointer thisSender = shared_from_this();
1923  _transport->enqueueSendRequest(thisSender);
1924 }
A lock for multithreading.
Definition: lock.h:36
const Transport::shared_pointer _transport

The documentation for this class was generated from the following files: