From 8414ce6e8051b6536db9e4c0f11cb0bf8d2a44b4 Mon Sep 17 00:00:00 2001 From: Johan Wikman Date: Fri, 8 Sep 2017 10:04:37 +0300 Subject: [PATCH] MXS-1392 Re-introduce zombie queue - Extend Worker interface so that zombies can be registered - Call deletion function at the end of event loop --- server/core/maxscale/worker.hh | 20 +++++++++++++++++--- server/core/worker.cc | 15 +++++++++++++++ 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/server/core/maxscale/worker.hh b/server/core/maxscale/worker.hh index 0297fc3b4..35c960ee3 100644 --- a/server/core/maxscale/worker.hh +++ b/server/core/maxscale/worker.hh @@ -14,6 +14,7 @@ #include #include +#include #include #include #include @@ -67,10 +68,11 @@ class Worker : public MXS_WORKER Worker& operator = (const Worker&); public: - typedef WORKER_STATISTICS STATISTICS; - typedef WorkerTask Task; - typedef WorkerDisposableTask DisposableTask; + typedef WORKER_STATISTICS STATISTICS; + typedef WorkerTask Task; + typedef WorkerDisposableTask DisposableTask; typedef Registry SessionsById; + typedef std::vector Zombies; enum state_t { @@ -226,6 +228,15 @@ public: */ static bool remove_shared_fd(int fd); + /** + * Register zombie for later deletion. + * + * @param pZombie DCB that will be deleted at end of event loop. + * + * @note The DCB must be owned by this worker. + */ + void register_zombie(DCB* pZombie); + /** * Main function of worker. * @@ -483,6 +494,8 @@ private: static Worker* create(int id, int epoll_listener_fd); + void delete_zombies(); + bool post_disposable(DisposableTask* pTask, enum execute_mode_t mode = EXECUTE_AUTO); void handle_message(MessageQueue& queue, const MessageQueue::Message& msg); // override @@ -509,6 +522,7 @@ private: * worker and not e.g. listener sessions. For now, * it's up to the protocol to decide whether a new * session is added to the map. */ + Zombies m_zombies; /*< DCBs to be deleted. */ }; } diff --git a/server/core/worker.cc b/server/core/worker.cc index ff36e0391..cad2ca5c1 100644 --- a/server/core/worker.cc +++ b/server/core/worker.cc @@ -836,6 +836,19 @@ json_t* mxs_worker_list_to_json(const char* host) return task.resource(); } +void Worker::register_zombie(DCB* pDcb) +{ + ss_dassert(pDcb->poll.thread.id == m_id); + + m_zombies.push_back(pDcb); +} + +void Worker::delete_zombies() +{ + // TODO: for_each(m_zombies.begin(), m_zombies.end(), dcb_free_all_memory); + m_zombies.resize(0); +} + void Worker::run() { this_thread.current_worker_id = m_id; @@ -1227,6 +1240,8 @@ void Worker::poll_waitevents() m_state = ZPROCESSING; + delete_zombies(); + m_state = IDLE; } /*< while(1) */