diff --git a/src/epoll.cpp b/src/epoll.cpp index 1b726885..ab792164 100644 --- a/src/epoll.cpp +++ b/src/epoll.cpp @@ -92,7 +92,9 @@ void zmq::epoll_t::rm_fd (handle_t handle_) int rc = epoll_ctl (epoll_fd, EPOLL_CTL_DEL, pe->fd, &pe->ev); errno_assert (rc != -1); pe->fd = retired_fd; + retired_sync.lock (); retired.push_back (pe); + retired_sync.unlock (); // Decrease the load metric of the thread. adjust_load (-1); @@ -180,10 +182,12 @@ void zmq::epoll_t::loop () } // Destroy retired event sources. + retired_sync.lock (); for (retired_t::iterator it = retired.begin (); it != retired.end (); ++it) { LIBZMQ_DELETE(*it); } retired.clear (); + retired_sync.unlock (); } } diff --git a/src/epoll.hpp b/src/epoll.hpp index 567a4bf3..6c2f9219 100644 --- a/src/epoll.hpp +++ b/src/epoll.hpp @@ -41,6 +41,7 @@ #include "fd.hpp" #include "thread.hpp" #include "poller_base.hpp" +#include "mutex.h" namespace zmq { @@ -102,6 +103,9 @@ namespace zmq // Handle of the physical thread doing the I/O work. thread_t worker; + // Synchronisation of the retired event source + mutex_t retired_sync; + epoll_t (const epoll_t&); const epoll_t &operator = (const epoll_t&); };