]> git.saurik.com Git - wxWidgets.git/commitdiff
made Dispatch() return bool indicating whether we processed any events inside it...
authorVadim Zeitlin <vadim@wxwidgets.org>
Thu, 16 Oct 2008 12:31:30 +0000 (12:31 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Thu, 16 Oct 2008 12:31:30 +0000 (12:31 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@56355 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/private/fdiodispatcher.h
include/wx/private/selectdispatcher.h
src/common/selectdispatcher.cpp
src/unix/epolldispatcher.cpp

index 04128f858bc85c921897238f2105d390005de7c4..e7f367c1ffa42acc05d5231743abb203482bfa57 100644 (file)
@@ -67,8 +67,10 @@ public:
     // unregister descriptor previously registered with RegisterFD()
     virtual bool UnregisterFD(int fd) = 0;
 
-    // wait for an event for at most timeout milliseconds and process it
-    virtual void Dispatch(int timeout = TIMEOUT_INFINITE) = 0;
+    // wait for an event for at most timeout milliseconds and process it;
+    // 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() { }
 };
index 5eed47c55c081530803911b803b489ba05237d59..a704b8a83cbc90c419e3680ccef270319bf104ee 100644 (file)
@@ -91,14 +91,15 @@ public:
     virtual bool RegisterFD(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 void Dispatch(int timeout = TIMEOUT_INFINITE);
+    virtual bool Dispatch(int timeout = TIMEOUT_INFINITE);
 
 private:
     // common part of RegisterFD() and ModifyFD()
     bool DoUpdateFDAndHandler(int fd, wxFDIOHandler *handler, int flags);
 
-    // call the handlers for the fds present in the given sets
-    void ProcessSets(const wxSelectSets& sets);
+    // call the handlers for the fds present in the given sets, return true if
+    // we called any handlers
+    bool ProcessSets(const wxSelectSets& sets);
 
     // helper of ProcessSets(): call the handler if its fd is in the set
     void DoProcessFD(int fd, const fd_set& fds, wxFDIOHandler *handler,
index ffcf38717912bd16ad42dec7075fbaf77bb1a761..990b62c21c0fdf7eceae51b87574fe67f586a06a 100644 (file)
@@ -190,8 +190,9 @@ bool wxSelectDispatcher::UnregisterFD(int fd)
     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++ )
     {
         if ( !sets.HasFD(fd) )
@@ -204,11 +205,15 @@ void wxSelectDispatcher::ProcessSets(const wxSelectSets& sets)
             continue;
         }
 
+        gotEvent = true;
+
         sets.Handle(fd, *handler);
     }
+
+    return gotEvent;
 }
 
-void wxSelectDispatcher::Dispatch(int timeout)
+bool wxSelectDispatcher::Dispatch(int timeout)
 {
     struct timeval tv,
                   *ptv;
@@ -240,8 +245,12 @@ void wxSelectDispatcher::Dispatch(int timeout)
             break;
 
         default:
-            ProcessSets(sets);
+            if ( ProcessSets(sets) )
+                return true;
     }
+
+    // nothing happened
+    return false;
 }
 
 #endif // wxUSE_SELECT_DISPATCHER
index 7cc46b39b0b6a8d222c10e803d817a2055280d26..f509c7be2556af9f903fd0c6449720d7977f85db 100644 (file)
@@ -158,7 +158,7 @@ bool wxEpollDispatcher::UnregisterFD(int fd)
     return true;
 }
 
-void wxEpollDispatcher::Dispatch(int timeout)
+bool wxEpollDispatcher::Dispatch(int timeout)
 {
     epoll_event events[16];
 
@@ -176,10 +176,11 @@ void wxEpollDispatcher::Dispatch(int timeout)
         {
             wxLogSysError(_("Waiting for IO on epoll descriptor %d failed"),
                           m_epollDescriptor);
-            return;
+            return false;
         }
     }
 
+    bool gotEvents = false;
     for ( epoll_event *p = events; p < events + e_num; p++ )
     {
         wxFDIOHandler * const handler = (wxFDIOHandler *)(p->data.ptr);
@@ -199,7 +200,13 @@ void wxEpollDispatcher::Dispatch(int timeout)
             handler->OnWriteWaiting();
         else if ( p->events & EPOLLERR )
             handler->OnExceptionWaiting();
+        else
+            continue;
+
+        gotEvents = true;
     }
+
+    return gotEvents;
 }
 
 #endif // wxUSE_EPOLL_DISPATCHER