From: Vadim Zeitlin Date: Sat, 2 Jun 2007 13:51:05 +0000 (+0000) Subject: factor out the fd<->handlers map from wxFDIODispatcher into a separate wxMappedFDIODi... X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/ad8d42f83cdf7a4f26969957e94ed166a1a5710e?ds=inline factor out the fd<->handlers map from wxFDIODispatcher into a separate wxMappedFDIODispatcher class (patch 1729395) git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@46274 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/include/wx/private/fdiodispatcher.h b/include/wx/private/fdiodispatcher.h index 26b5164a59..0f71d94fd6 100644 --- a/include/wx/private/fdiodispatcher.h +++ b/include/wx/private/fdiodispatcher.h @@ -39,6 +39,31 @@ enum wxFDIODispatcherEntryFlags wxFDIO_ALL = wxFDIO_INPUT | wxFDIO_OUTPUT | wxFDIO_EXCEPTION }; +// base class for wxSelectDispatcher and wxEpollDispatcher +class WXDLLIMPEXP_BASE wxFDIODispatcher +{ +public: + enum { TIMEOUT_INFINITE = -1 }; + + // register handler for the given descriptor with the dispatcher, return + // true on success or false on error + virtual bool RegisterFD(int fd, wxFDIOHandler *handler, int flags) = 0; + + // modify descriptor flags or handler, return true on success + virtual bool ModifyFD(int fd, wxFDIOHandler *handler, int flags) = 0; + + // unregister descriptor previously registered with RegisterFD(), the + // caller is responsible for deleting the returned handler pointer if + // necessary + virtual bool UnregisterFD(int fd, int flags) = 0; + + // loops waiting for an event to happen on any of the descriptors + virtual void RunLoop(int timeout) = 0; + + virtual ~wxFDIODispatcher() { } +}; + +//entry for wxFDIOHandlerMap struct wxFDIOHandlerEntry { wxFDIOHandlerEntry() @@ -64,34 +89,28 @@ WX_DECLARE_HASH_MAP( wxFDIOHandlerMap ); -// base class for wxSelectDispatcher and wxEpollDispatcher +// FDIODispatcher that holds map fd <-> FDIOHandler, this should be used if +// this map isn't maintained elsewhere already as it is usually needed anyhow // -// notice that all pure virtual functions for FD management have implementation +// notice that all functions for FD management have implementation // in the base class and should be called from the derived classes -class WXDLLIMPEXP_BASE wxFDIODispatcher -{ +class WXDLLIMPEXP_BASE wxMappedFDIODispatcher : public wxFDIODispatcher { public: - enum { TIMEOUT_INFINITE = -1 }; - // find the handler for the given fd, return NULL if none wxFDIOHandler *FindHandler(int fd) const; - // register handler for the given descriptor with the dispatcher, return // true on success or false on error - virtual bool RegisterFD(int fd, wxFDIOHandler *handler, int flags) = 0; + virtual bool RegisterFD(int fd, wxFDIOHandler *handler, int flags); // modify descriptor flags or handler, return true on success - virtual bool ModifyFD(int fd, wxFDIOHandler *handler, int flags) = 0; + virtual bool ModifyFD(int fd, wxFDIOHandler *handler, int flags); // unregister descriptor previously registered with RegisterFD(), the // caller is responsible for deleting the returned handler pointer if // necessary - virtual wxFDIOHandler *UnregisterFD(int fd, int flags) = 0; + virtual bool UnregisterFD(int fd, int flags); - // loops waiting for an event to happen on any of the descriptors - virtual void RunLoop(int timeout) = 0; - - virtual ~wxFDIODispatcher() { } + virtual ~wxMappedFDIODispatcher() { } protected: // the fd -> handler map containing all the registered handlers diff --git a/include/wx/private/selectdispatcher.h b/include/wx/private/selectdispatcher.h index 2633b4de48..b444c23d8c 100644 --- a/include/wx/private/selectdispatcher.h +++ b/include/wx/private/selectdispatcher.h @@ -71,7 +71,7 @@ private: static Callback ms_handlers[Max]; }; -class WXDLLIMPEXP_BASE wxSelectDispatcher : public wxFDIODispatcher +class WXDLLIMPEXP_BASE wxSelectDispatcher : public wxMappedFDIODispatcher { public: // returns the unique instance of this class, the pointer shouldn't be @@ -86,7 +86,7 @@ public: // implement pure virtual methods of the base class virtual bool RegisterFD(int fd, wxFDIOHandler *handler, int flags = wxFDIO_ALL); virtual bool ModifyFD(int fd, wxFDIOHandler *handler, int flags = wxFDIO_ALL); - virtual wxFDIOHandler *UnregisterFD(int fd, int flags = wxFDIO_ALL); + virtual bool UnregisterFD(int fd, int flags = wxFDIO_ALL); virtual void RunLoop(int timeout = TIMEOUT_INFINITE); protected: diff --git a/include/wx/unix/private/epolldispatcher.h b/include/wx/unix/private/epolldispatcher.h index 0b4079463e..ef67a1520b 100644 --- a/include/wx/unix/private/epolldispatcher.h +++ b/include/wx/unix/private/epolldispatcher.h @@ -29,7 +29,7 @@ public: // implement base class pure virtual methods virtual bool RegisterFD(int fd, wxFDIOHandler* handler, int flags = wxFDIO_ALL); virtual bool ModifyFD(int fd, wxFDIOHandler* handler, int flags = wxFDIO_ALL); - virtual wxFDIOHandler *UnregisterFD(int fd, int flags = wxFDIO_ALL); + virtual bool UnregisterFD(int fd, int flags = wxFDIO_ALL); virtual void RunLoop(int timeout = TIMEOUT_INFINITE); private: diff --git a/src/common/fdiodispatcher.cpp b/src/common/fdiodispatcher.cpp index 20fc9aca48..f2e54e3036 100644 --- a/src/common/fdiodispatcher.cpp +++ b/src/common/fdiodispatcher.cpp @@ -32,7 +32,7 @@ // implementation // ============================================================================ -wxFDIOHandler *wxFDIODispatcher::FindHandler(int fd) const +wxFDIOHandler *wxMappedFDIODispatcher::FindHandler(int fd) const { const wxFDIOHandlerMap::const_iterator it = m_handlers.find(fd); @@ -40,7 +40,7 @@ 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); @@ -63,7 +63,7 @@ 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); @@ -78,13 +78,12 @@ bool wxFDIODispatcher::ModifyFD(int fd, wxFDIOHandler *handler, int flags) return true; } -wxFDIOHandler *wxFDIODispatcher::UnregisterFD(int fd, int flags) +bool wxMappedFDIODispatcher::UnregisterFD(int fd, int flags) { 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 ) { @@ -92,6 +91,6 @@ wxFDIOHandler *wxFDIODispatcher::UnregisterFD(int fd, int flags) m_handlers.erase(i); } - return handler; + return true; } diff --git a/src/common/selectdispatcher.cpp b/src/common/selectdispatcher.cpp index ccb19b54f6..2a96b33453 100644 --- a/src/common/selectdispatcher.cpp +++ b/src/common/selectdispatcher.cpp @@ -160,7 +160,7 @@ wxSelectDispatcher::wxSelectDispatcher() bool wxSelectDispatcher::RegisterFD(int fd, wxFDIOHandler *handler, int flags) { - if ( !wxFDIODispatcher::RegisterFD(fd, handler, flags) ) + if ( !wxMappedFDIODispatcher::RegisterFD(fd, handler, flags) ) return false; if ( !m_sets.SetFD(fd, flags) ) @@ -174,7 +174,7 @@ bool wxSelectDispatcher::RegisterFD(int fd, wxFDIOHandler *handler, int flags) bool wxSelectDispatcher::ModifyFD(int fd, wxFDIOHandler *handler, int flags) { - if ( !wxFDIODispatcher::ModifyFD(fd, handler, flags) ) + if ( !wxMappedFDIODispatcher::ModifyFD(fd, handler, flags) ) return false; wxASSERT_MSG( fd <= m_maxFD, _T("logic error: registered fd > m_maxFD?") ); @@ -182,10 +182,8 @@ bool wxSelectDispatcher::ModifyFD(int fd, wxFDIOHandler *handler, int flags) return m_sets.SetFD(fd, flags); } -wxFDIOHandler *wxSelectDispatcher::UnregisterFD(int fd, int flags) +bool wxSelectDispatcher::UnregisterFD(int fd, int flags) { - wxFDIOHandler * const handler = wxFDIODispatcher::UnregisterFD(fd, flags); - m_sets.ClearFD(fd, flags); // remove the handler if we don't need it any more @@ -205,7 +203,7 @@ wxFDIOHandler *wxSelectDispatcher::UnregisterFD(int fd, int flags) } } - return handler; + return true; } void wxSelectDispatcher::ProcessSets(const wxSelectSets& sets) diff --git a/src/unix/epolldispatcher.cpp b/src/unix/epolldispatcher.cpp index 294f89f1cb..533d15b45a 100644 --- a/src/unix/epolldispatcher.cpp +++ b/src/unix/epolldispatcher.cpp @@ -86,9 +86,6 @@ wxEpollDispatcher::wxEpollDispatcher() bool wxEpollDispatcher::RegisterFD(int fd, wxFDIOHandler* handler, int flags) { - if ( !wxFDIODispatcher::RegisterFD(fd, handler, flags) ) - return false; - epoll_event ev; ev.events = GetEpollMask(flags, fd); ev.data.ptr = handler; @@ -107,9 +104,6 @@ bool wxEpollDispatcher::RegisterFD(int fd, wxFDIOHandler* handler, int flags) bool wxEpollDispatcher::ModifyFD(int fd, wxFDIOHandler* handler, int flags) { - if ( !wxFDIODispatcher::ModifyFD(fd, handler, flags) ) - return false; - epoll_event ev; ev.events = GetEpollMask(flags, fd); ev.data.ptr = handler; @@ -126,12 +120,8 @@ bool wxEpollDispatcher::ModifyFD(int fd, wxFDIOHandler* handler, int flags) return true; } -wxFDIOHandler *wxEpollDispatcher::UnregisterFD(int fd, int flags) +bool wxEpollDispatcher::UnregisterFD(int fd, int flags) { - wxFDIOHandler * const handler = wxFDIODispatcher::UnregisterFD(fd, flags); - if ( !handler ) - return NULL; - epoll_event ev; ev.events = 0; ev.data.ptr = NULL; @@ -142,7 +132,7 @@ wxFDIOHandler *wxEpollDispatcher::UnregisterFD(int fd, int flags) fd, m_epollDescriptor); } - return handler; + return true; } void wxEpollDispatcher::RunLoop(int timeout)