PEGASUS_NAMESPACE_BEGIN
-////////////////////////////////////////////////////////////////////////////////
-//
-// Local routines:
-//
-////////////////////////////////////////////////////////////////////////////////
-
-static inline int select_wrapper(
- int nfds,
- fd_set* rd_fd_set,
- fd_set* wr_fd_set,
- fd_set* ex_fd_set,
- const struct timeval* tv)
-{
- return select(FD_SETSIZE, rd_fd_set, wr_fd_set, ex_fd_set, tv);
-}
-
////////////////////////////////////////////////////////////////////////////////
//
// Routines for starting and stoping socket interface.
extern Uint32 _socketInterfaceInitCount;
-static void _SocketInterfaceInc()
+static void _OpenSocketInterface()
{
if (_socketInterfaceInitCount == 0)
{
_socketInterfaceInitCount++;
}
-static void _SocketInterfaceDec()
+static void _CloseSocketInterface()
{
_socketInterfaceInitCount--;
Monitor::Monitor()
{
- _SocketInterfaceInc();
+ _OpenSocketInterface();
_rep = new MonitorRep;
FD_ZERO(&_rep->rd_fd_set);
FD_ZERO(&_rep->active_ex_fd_set);
}
-MonitorHandler::~MonitorHandler()
-{
- _SocketInterfaceDec();
-}
-
Monitor::~Monitor()
{
- delete _rep;
+ _CloseSocketInterface();
}
-Boolean Monitor::select(Uint32 milliseconds)
+Boolean Monitor::run(Uint32 milliseconds)
{
// Windows select() has a strange little bug. It returns immediately if
// there are no descriptors in the set even if the timeout is non-zero.
const Uint32 USEC = (milliseconds % 1000) * 1000;
struct timeval tv = { SEC, USEC };
- count = select_wrapper(
+ count = select(
FD_SETSIZE,
&_rep->active_rd_fd_set,
&_rep->active_wr_fd_set,
Uint32 events = 0;
if (FD_ISSET(socket, &_rep->active_rd_fd_set))
- events |= READ;
+ events |= SocketMessage::READ;
if (FD_ISSET(socket, &_rep->active_wr_fd_set))
- events |= WRITE;
+ events |= SocketMessage::WRITE;
if (FD_ISSET(socket, &_rep->active_ex_fd_set))
- events |= EXCEPTION;
+ events |= SocketMessage::EXCEPTION;
if (events)
{
if (!queue)
unsolicitSocketMessages(_entries[i].queueId);
- if (events & WRITE)
+ if (events & SocketMessage::WRITE)
{
FD_CLR(socket, &_rep->active_wr_fd_set);
}
- if (events & EXCEPTION)
+ if (events & SocketMessage::EXCEPTION)
{
FD_CLR(socket, &_rep->active_ex_fd_set);
}
- if (events & READ)
+ if (events & SocketMessage::READ)
{
FD_CLR(socket, &_rep->active_rd_fd_set);
}
Boolean Monitor::solicitSocketMessages(
Sint32 socket,
Uint32 events,
- Uint32 queueId);
+ Uint32 queueId)
{
// See whether a handler is already registered for this one:
Uint32 pos = _findEntry(socket);
- if (pos != PEGUSUS_NOT_FOUND)
+ if (pos != PEGASUS_NOT_FOUND)
return false;
// Set the events:
- if (events & READ)
+ if (events & SocketMessage::READ)
FD_SET(socket, &_rep->rd_fd_set);
- if (events & WRITE)
+ if (events & SocketMessage::WRITE)
FD_SET(socket, &_rep->wr_fd_set);
- if (events & EXCEPTION)
+ if (events & SocketMessage::EXCEPTION)
FD_SET(socket, &_rep->ex_fd_set);
// Add the entry to the list:
return true;
}
-Boolean Monitor::unolicitSocketMessages(Sint32 socket)
+Boolean Monitor::unsolicitSocketMessages(Sint32 socket)
{
// Look for the given entry and remove it:
#include <Pegasus/Common/Config.h>
#include <Pegasus/Common/Array.h>
#include <Pegasus/Common/String.h>
+#include <Pegasus/Common/Message.h>
PEGASUS_NAMESPACE_BEGIN
struct MonitorRep;
/** This message occurs when there is activity on a socket. */
-class SocketMessage
+class SocketMessage : public Message
{
public:
+ enum Events { READ = 1, WRITE = 2, EXCEPTION = 4 };
+
SocketMessage(Events events_, Uint32 socket_) :
Message(SOCKET_MESSAGE),
events(events_), socket(socket_)
{
}
- enum Events { READ = 1, WRITE = 2, EXCEPTION = 4 };
-
Uint32 events;
Uint32 socket;
whichever occurs first.
@param timeoutMsec the number of milliseconds to wait for an event.
-
@return true if an event occured.
*/
Boolean run(Uint32 timeoutMsec);
be one solicitor per socket.
@param socket the socket to monitor for activity.
-
@param events socket events to monitor (see the SocketMessage::Events
enumeration for details).
-
@param queueId of queue on which to post socket messages.
-
@return false if messages have already been solicited on this socket.
*/
Boolean solicitSocketMessages(
Uint32 queueId);
/** Unsolicit messages on the given socket.
+
@param socket on which to unsolicit messages.
@return false if no such solicitation has been made on the given socket.
*/
- Boolean unolicitSocketMessages(Sint32 socket);
+ Boolean unsolicitSocketMessages(Sint32 socket);
private:
Uint32 _findEntry(Sint32 socket) const;
- Array<MonitorEntry> _entries;
+ Array<_MonitorEntry> _entries;
MonitorRep* _rep;
};
-PEGASUS_MEMORY_FUNCTIONS(MonitorEntry)
-
PEGASUS_NAMESPACE_END
#endif /* Pegasus_Monitor_h */