#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);
}
-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
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);
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)