made Dispatch() return bool indicating whether we processed any events inside it or if the timeout expired

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@56355 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2008-10-16 12:31:30 +00:00
parent c139dda12a
commit 5a557d1ea0
4 changed files with 29 additions and 10 deletions

View File

@@ -67,8 +67,10 @@ public:
// unregister descriptor previously registered with RegisterFD() // unregister descriptor previously registered with RegisterFD()
virtual bool UnregisterFD(int fd) = 0; virtual bool UnregisterFD(int fd) = 0;
// wait for an event for at most timeout milliseconds and process it // wait for an event for at most timeout milliseconds and process it;
virtual void Dispatch(int timeout = TIMEOUT_INFINITE) = 0; // return true if we processed any events or false if timeout expired
// without anything happening
virtual bool Dispatch(int timeout = TIMEOUT_INFINITE) = 0;
virtual ~wxFDIODispatcher() { } virtual ~wxFDIODispatcher() { }
}; };

View File

@@ -91,14 +91,15 @@ public:
virtual bool RegisterFD(int fd, wxFDIOHandler *handler, int flags = wxFDIO_ALL); virtual bool RegisterFD(int fd, wxFDIOHandler *handler, int flags = wxFDIO_ALL);
virtual bool ModifyFD(int fd, wxFDIOHandler *handler, int flags = wxFDIO_ALL); virtual bool ModifyFD(int fd, wxFDIOHandler *handler, int flags = wxFDIO_ALL);
virtual bool UnregisterFD(int fd); virtual bool UnregisterFD(int fd);
virtual void Dispatch(int timeout = TIMEOUT_INFINITE); virtual bool Dispatch(int timeout = TIMEOUT_INFINITE);
private: private:
// common part of RegisterFD() and ModifyFD() // common part of RegisterFD() and ModifyFD()
bool DoUpdateFDAndHandler(int fd, wxFDIOHandler *handler, int flags); bool DoUpdateFDAndHandler(int fd, wxFDIOHandler *handler, int flags);
// call the handlers for the fds present in the given sets // call the handlers for the fds present in the given sets, return true if
void ProcessSets(const wxSelectSets& sets); // we called any handlers
bool ProcessSets(const wxSelectSets& sets);
// helper of ProcessSets(): call the handler if its fd is in the set // helper of ProcessSets(): call the handler if its fd is in the set
void DoProcessFD(int fd, const fd_set& fds, wxFDIOHandler *handler, void DoProcessFD(int fd, const fd_set& fds, wxFDIOHandler *handler,

View File

@@ -190,8 +190,9 @@ bool wxSelectDispatcher::UnregisterFD(int fd)
return true; return true;
} }
void wxSelectDispatcher::ProcessSets(const wxSelectSets& sets) bool wxSelectDispatcher::ProcessSets(const wxSelectSets& sets)
{ {
bool gotEvent = false;
for ( int fd = 0; fd <= m_maxFD; fd++ ) for ( int fd = 0; fd <= m_maxFD; fd++ )
{ {
if ( !sets.HasFD(fd) ) if ( !sets.HasFD(fd) )
@@ -204,11 +205,15 @@ void wxSelectDispatcher::ProcessSets(const wxSelectSets& sets)
continue; continue;
} }
gotEvent = true;
sets.Handle(fd, *handler); sets.Handle(fd, *handler);
} }
return gotEvent;
} }
void wxSelectDispatcher::Dispatch(int timeout) bool wxSelectDispatcher::Dispatch(int timeout)
{ {
struct timeval tv, struct timeval tv,
*ptv; *ptv;
@@ -240,8 +245,12 @@ void wxSelectDispatcher::Dispatch(int timeout)
break; break;
default: default:
ProcessSets(sets); if ( ProcessSets(sets) )
return true;
} }
// nothing happened
return false;
} }
#endif // wxUSE_SELECT_DISPATCHER #endif // wxUSE_SELECT_DISPATCHER

View File

@@ -158,7 +158,7 @@ bool wxEpollDispatcher::UnregisterFD(int fd)
return true; return true;
} }
void wxEpollDispatcher::Dispatch(int timeout) bool wxEpollDispatcher::Dispatch(int timeout)
{ {
epoll_event events[16]; epoll_event events[16];
@@ -176,10 +176,11 @@ void wxEpollDispatcher::Dispatch(int timeout)
{ {
wxLogSysError(_("Waiting for IO on epoll descriptor %d failed"), wxLogSysError(_("Waiting for IO on epoll descriptor %d failed"),
m_epollDescriptor); m_epollDescriptor);
return; return false;
} }
} }
bool gotEvents = false;
for ( epoll_event *p = events; p < events + e_num; p++ ) for ( epoll_event *p = events; p < events + e_num; p++ )
{ {
wxFDIOHandler * const handler = (wxFDIOHandler *)(p->data.ptr); wxFDIOHandler * const handler = (wxFDIOHandler *)(p->data.ptr);
@@ -199,7 +200,13 @@ void wxEpollDispatcher::Dispatch(int timeout)
handler->OnWriteWaiting(); handler->OnWriteWaiting();
else if ( p->events & EPOLLERR ) else if ( p->events & EPOLLERR )
handler->OnExceptionWaiting(); handler->OnExceptionWaiting();
else
continue;
gotEvents = true;
} }
return gotEvents;
} }
#endif // wxUSE_EPOLL_DISPATCHER #endif // wxUSE_EPOLL_DISPATCHER