]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/fdiodispatcher.cpp
got rid of wxSocketBase::m_error which could get out of sync with wxSocketImpl::m_err...
[wxWidgets.git] / src / common / fdiodispatcher.cpp
index 20fc9aca48e855d02ebf208c36bf9e4b22057b16..607519b365e4833cf35971cb52eb988134924ad1 100644 (file)
 #endif
 
 #ifndef WX_PRECOMP
+    #include "wx/module.h"
 #endif //WX_PRECOMP
 
 #include "wx/private/fdiodispatcher.h"
 
+#include "wx/private/selectdispatcher.h"
+#ifdef __UNIX__
+    #include "wx/unix/private/epolldispatcher.h"
+#endif
+
+wxFDIODispatcher *gs_dispatcher = NULL;
+
 // ============================================================================
 // implementation
 // ============================================================================
 
-wxFDIOHandler *wxFDIODispatcher::FindHandler(int fd) const
+// ----------------------------------------------------------------------------
+// wxFDIODispatcher
+// ----------------------------------------------------------------------------
+
+/* static */
+wxFDIODispatcher *wxFDIODispatcher::Get()
+{
+    if ( !gs_dispatcher )
+    {
+#if wxUSE_EPOLL_DISPATCHER
+        gs_dispatcher = wxEpollDispatcher::Create();
+        if ( !gs_dispatcher )
+#endif // wxUSE_EPOLL_DISPATCHER
+#if wxUSE_SELECT_DISPATCHER
+            gs_dispatcher = new wxSelectDispatcher();
+#endif // wxUSE_SELECT_DISPATCHER
+    }
+
+    wxASSERT_MSG( gs_dispatcher, "failed to create any IO dispatchers" );
+
+    return gs_dispatcher;
+}
+
+/* static */
+void wxFDIODispatcher::DispatchPending()
+{
+    if ( gs_dispatcher )
+        gs_dispatcher->Dispatch(0);
+}
+
+// ----------------------------------------------------------------------------
+// wxMappedFDIODispatcher
+// ----------------------------------------------------------------------------
+
+wxFDIOHandler *wxMappedFDIODispatcher::FindHandler(int fd) const
 {
     const wxFDIOHandlerMap::const_iterator it = m_handlers.find(fd);
 
@@ -40,11 +82,10 @@ wxFDIOHandler *wxFDIODispatcher::FindHandler(int fd) const
 }
 
 
-bool wxFDIODispatcher::RegisterFD(int fd, wxFDIOHandler *handler, int flags)
+bool
+wxMappedFDIODispatcher::RegisterFD(int fd, wxFDIOHandler *handler, int flags)
 {
-    wxUnusedVar(flags);
-
-    wxCHECK_MSG( handler, false, _T("handler can't be NULL") );
+    wxCHECK_MSG( handler, false, "handler can't be NULL" );
 
     // notice that it's not an error to register a handler for the same fd
     // twice as it can be done with different flags -- but it is an error to
@@ -53,9 +94,9 @@ bool wxFDIODispatcher::RegisterFD(int fd, wxFDIOHandler *handler, int flags)
     if ( i != m_handlers.end() )
     {
         wxASSERT_MSG( i->second.handler == handler,
-                        _T("registering different handler for the same fd?") );
+                        "registering different handler for the same fd?" );
         wxASSERT_MSG( i->second.flags != flags,
-                        _T("reregistering with the same flags?") );
+                        "reregistering with the same flags?" );
     }
 
     m_handlers[fd] = wxFDIOHandlerEntry(handler, flags);
@@ -63,35 +104,43 @@ bool wxFDIODispatcher::RegisterFD(int fd, wxFDIOHandler *handler, int flags)
     return true;
 }
 
-bool wxFDIODispatcher::ModifyFD(int fd, wxFDIOHandler *handler, int flags)
+bool
+wxMappedFDIODispatcher::ModifyFD(int fd, wxFDIOHandler *handler, int flags)
 {
-    wxUnusedVar(flags);
-
-    wxCHECK_MSG( handler, false, _T("handler can't be NULL") );
+    wxCHECK_MSG( handler, false, "handler can't be NULL" );
 
     wxFDIOHandlerMap::iterator i = m_handlers.find(fd);
     wxCHECK_MSG( i != m_handlers.end(), false,
-                    _T("modifying unregistered handler?") );
+                    "modifying unregistered handler?" );
 
     i->second = wxFDIOHandlerEntry(handler, flags);
 
     return true;
 }
 
-wxFDIOHandler *wxFDIODispatcher::UnregisterFD(int fd, int flags)
+bool wxMappedFDIODispatcher::UnregisterFD(int fd)
 {
     wxFDIOHandlerMap::iterator i = m_handlers.find(fd);
-    wxCHECK_MSG( i != m_handlers.end(), NULL,
-                    _T("unregistering unregistered handler?") );
+    if ( i == m_handlers.end() )
+      return false;
 
-    wxFDIOHandler * const handler = i->second.handler;
-    i->second.flags &= ~flags;
-    if ( !i->second.flags )
-    {
-        // this handler is not registered for anything any more, get rid of it
-        m_handlers.erase(i);
-    }
+    m_handlers.erase(i);
 
-    return handler;
+    return true;
 }
 
+// ----------------------------------------------------------------------------
+// wxSelectDispatcherModule
+// ----------------------------------------------------------------------------
+
+class wxFDIODispatcherModule : public wxModule
+{
+public:
+    virtual bool OnInit() { return true; }
+    virtual void OnExit() { wxDELETE(gs_dispatcher); }
+
+private:
+    DECLARE_DYNAMIC_CLASS(wxFDIODispatcherModule)
+};
+
+IMPLEMENT_DYNAMIC_CLASS(wxFDIODispatcherModule, wxModule)