An object which monitors file descriptors for events and performs callbacks when interesting events happen. More...
#include <XmlRpcDispatch.h>
Classes | |
| struct | MonitoredSource |
Public Types | |
| enum | EventType { ReadableEvent = 1, WritableEvent = 2, Exception = 4 } |
Values indicating the type of events a source is interested in. More... | |
Public Member Functions | |
| XmlRpcDispatch () | |
| Constructor. | |
| ~XmlRpcDispatch () | |
| void | addSource (XmlRpcSource *source, unsigned eventMask) |
| Monitor this source for the event types specified by the event mask and call its event handler when any of the events occur. | |
| void | removeSource (XmlRpcSource *source) |
| Stop monitoring this source. | |
| void | setSourceEvents (XmlRpcSource *source, unsigned eventMask) |
| Modify the types of events to watch for on this source. | |
| void | work (double msTime) |
| Watch current set of sources and process events for the specified duration (in ms, -1 implies wait forever, or until exit is called). | |
| void | exit () |
| Exit from work routine. | |
| void | clear () |
| Clear all sources from the monitored sources list. Sources are closed. | |
Protected Types | |
| typedef std::list < MonitoredSource > | SourceList |
Protected Member Functions | |
| bool | waitForAndProcessEvents (double timeout) |
| Wait for I/O on any source, timeout, or interrupt signal. | |
| double | getTime () |
Protected Attributes | |
| SourceList | _sources |
| double | _endTime |
| bool | _doClear |
| bool | _inWork |
An object which monitors file descriptors for events and performs callbacks when interesting events happen.
Definition at line 28 of file XmlRpcDispatch.h.
typedef std::list< MonitoredSource > XmlRpc::XmlRpcDispatch::SourceList [protected] |
Definition at line 85 of file XmlRpcDispatch.h.
Values indicating the type of events a source is interested in.
| ReadableEvent |
data available to read |
| WritableEvent |
connected/data can be written without blocking |
| Exception |
uh oh |
Definition at line 35 of file XmlRpcDispatch.h.
{
ReadableEvent = 1,
WritableEvent = 2,
Exception = 4
};
| XmlRpcDispatch::XmlRpcDispatch | ( | ) |
Constructor.
Definition at line 35 of file XmlRpcDispatch.cc.
| XmlRpcDispatch::~XmlRpcDispatch | ( | ) |
Definition at line 43 of file XmlRpcDispatch.cc.
{
}
| void XmlRpcDispatch::addSource | ( | XmlRpcSource * | source, | |
| unsigned | eventMask | |||
| ) |
Monitor this source for the event types specified by the event mask and call its event handler when any of the events occur.
| source | The source to monitor | |
| eventMask | Which event types to watch for. |
Definition at line 50 of file XmlRpcDispatch.cc.
Referenced by XmlRpc::XmlRpcServer::bindAndListen(), XmlRpc::XmlRpcServer::dispatchConnection(), and XmlRpc::XmlRpcClient::setupConnection().
{
_sources.push_back(MonitoredSource(source, mask));
}
| void XmlRpcDispatch::clear | ( | ) |
Clear all sources from the monitored sources list. Sources are closed.
Definition at line 149 of file XmlRpcDispatch.cc.
Referenced by XmlRpc::XmlRpcServer::shutdown().
{
if (_inWork)
_doClear = true; // Finish reporting current events before clearing
else
{
SourceList closeList = _sources;
_sources.clear();
for (SourceList::iterator it=closeList.begin(); it!=closeList.end(); ++it)
it->getSource()->close();
}
}
| void XmlRpcDispatch::exit | ( | ) |
Exit from work routine.
Definition at line 141 of file XmlRpcDispatch.cc.
Referenced by XmlRpc::XmlRpcClient::close(), and XmlRpc::XmlRpcServer::exit().
{
_endTime = 0.0; // Return from work asap
}
| double XmlRpcDispatch::getTime | ( | ) | [protected] |
Definition at line 165 of file XmlRpcDispatch.cc.
Referenced by work().
{
#ifdef USE_FTIME
struct timeb tbuff;
ftime(&tbuff);
return ((double) tbuff.time + ((double)tbuff.millitm / 1000.0) +
((double) tbuff.timezone * 60));
#else
struct timeval tv;
struct timezone tz;
gettimeofday(&tv, &tz);
return (tv.tv_sec + tv.tv_usec / 1000000.0);
#endif /* USE_FTIME */
}
| void XmlRpcDispatch::removeSource | ( | XmlRpcSource * | source | ) |
Stop monitoring this source.
| source | The source to stop monitoring The source socket is not closed. |
Definition at line 57 of file XmlRpcDispatch.cc.
Referenced by XmlRpc::XmlRpcClient::close(), XmlRpc::XmlRpcServer::removeConnection(), and XmlRpc::XmlRpcClient::setupConnection().
| void XmlRpcDispatch::setSourceEvents | ( | XmlRpcSource * | source, | |
| unsigned | eventMask | |||
| ) |
Modify the types of events to watch for on this source.
Definition at line 70 of file XmlRpcDispatch.cc.
| bool XmlRpcDispatch::waitForAndProcessEvents | ( | double | timeout | ) | [protected] |
Wait for I/O on any source, timeout, or interrupt signal.
Definition at line 185 of file XmlRpcDispatch.cc.
Referenced by work().
{
#if defined(_WINDOWS) && 0
int nHandles = 0;
SourceList::iterator it;
for (it=_sources.begin(); it!=_sources.end(); ++it) {
int fd = it->getSource()->getfd();
int mask = 0;
if (it->getMask() & ReadableEvent) mask = (FD_READ | PACKET_FD_CLOSE | FD_ACCEPT);
if (it->getMask() & WritableEvent) mask |= (FD_WRITE | PACKET_FD_CLOSE);
#else // Posix
// Construct the sets of descriptors we are interested in
fd_set inFd, outFd, excFd;
FD_ZERO(&inFd);
FD_ZERO(&outFd);
FD_ZERO(&excFd);
int maxFd = -1;
SourceList::iterator it;
for (it=_sources.begin(); it!=_sources.end(); ++it) {
int fd = it->getSource()->getfd();
if (it->getMask() & ReadableEvent) FD_SET(fd, &inFd);
if (it->getMask() & WritableEvent) FD_SET(fd, &outFd);
if (it->getMask() & Exception) FD_SET(fd, &excFd);
if (it->getMask() && fd > maxFd) maxFd = fd;
}
// Check for events
int nEvents;
if (_endTime < 0.0)
nEvents = select(maxFd+1, &inFd, &outFd, &excFd, NULL);
else
{
struct timeval tv;
tv.tv_sec = (int)floor(timeout);
tv.tv_usec = ((int)floor(1000000.0 * (timeout-floor(timeout)))) % 1000000;
nEvents = select(maxFd+1, &inFd, &outFd, &excFd, &tv);
}
if (nEvents < 0 && errno != EINTR)
{
XmlRpcUtil::error("Error in XmlRpcDispatch::work: error in select (%d).", nEvents);
return false;
}
// Process events
for (it=_sources.begin(); it != _sources.end(); )
{
SourceList::iterator thisIt = it++;
XmlRpcSource* src = thisIt->getSource();
int fd = src->getfd();
if (fd <= maxFd) {
// handleEvent is called once per event type signalled
unsigned newMask = 0;
int nset = 0;
if (FD_ISSET(fd, &inFd))
{
newMask |= src->handleEvent(ReadableEvent);
++nset;
}
if (FD_ISSET(fd, &outFd))
{
newMask |= src->handleEvent(WritableEvent);
++nset;
}
if (FD_ISSET(fd, &excFd))
{
newMask |= src->handleEvent(Exception);
++nset;
}
// Some event occurred
if (nset)
{
if (newMask)
thisIt->getMask() = newMask;
else // Stop monitoring this one
{
_sources.erase(thisIt);
if ( ! src->getKeepOpen())
src->close();
}
}
}
}
#endif
return true;
}
| void XmlRpcDispatch::work | ( | double | msTime | ) |
Watch current set of sources and process events for the specified duration (in ms, -1 implies wait forever, or until exit is called).
Definition at line 84 of file XmlRpcDispatch.cc.
Referenced by XmlRpc::XmlRpcClient::execute(), and XmlRpc::XmlRpcServer::work().
{
// Compute end time
double timeNow = getTime();
_endTime = (timeout < 0.0) ? -1.0 : (timeNow + timeout);
_doClear = false;
_inWork = true;
// Only work while there is something to monitor
while (_sources.size() > 0) {
// Wait for and dispatch events
if ( ! waitForAndProcessEvents(timeout))
{
_inWork = false;
return;
}
// Check whether to clear all sources
if (_doClear)
{
SourceList closeList = _sources;
_sources.clear();
for (SourceList::iterator it=closeList.begin(); it!=closeList.end(); ++it) {
XmlRpcSource *src = it->getSource();
src->close();
}
_doClear = false;
}
// Check whether end time has passed or exit has been called
if (_endTime == 0.0) // Exit
break;
else if (_endTime > 0.0) // Check for timeout
{
double t = getTime();
if (t > _endTime)
break;
// Decrement timeout by elapsed time
timeout -= (t - timeNow);
if (timeout < 0.0)
timeout = 0.0; // Shouldn't happen but its fp math...
timeNow = t;
}
}
_inWork = false;
}
bool XmlRpc::XmlRpcDispatch::_doClear [protected] |
Definition at line 93 of file XmlRpcDispatch.h.
Referenced by clear(), work(), and XmlRpcDispatch().
double XmlRpc::XmlRpcDispatch::_endTime [protected] |
Definition at line 91 of file XmlRpcDispatch.h.
Referenced by exit(), waitForAndProcessEvents(), work(), and XmlRpcDispatch().
bool XmlRpc::XmlRpcDispatch::_inWork [protected] |
Definition at line 94 of file XmlRpcDispatch.h.
Referenced by clear(), work(), and XmlRpcDispatch().
SourceList XmlRpc::XmlRpcDispatch::_sources [protected] |
Definition at line 88 of file XmlRpcDispatch.h.
Referenced by addSource(), clear(), removeSource(), setSourceEvents(), waitForAndProcessEvents(), and work().
1.7.1