diff --git a/include/maxscale/listener.hh b/include/maxscale/listener.hh index 40aa9162e..2538b1f10 100644 --- a/include/maxscale/listener.hh +++ b/include/maxscale/listener.hh @@ -63,6 +63,16 @@ public: const std::string& auth_options, SSL_LISTENER* ssl); + /** + * Destroy a listener + * + * This removes the listener from the global list of active listeners. Once destroyed, the port used + * by a listener is open for immediate reuse. + * + * @param listener Listener to destroy + */ + static void destroy(const SListener& listener); + /** * Start listening on the configured port * @@ -84,14 +94,6 @@ public: */ bool start(); - /** - * Closes a listener - * - * This closes the network socket the listener listens on to allow immediate reuse of it. The listener - * instance can remain if there are open sessions for it. - */ - void close(); - /** * Listener name */ @@ -132,18 +134,6 @@ public: */ const char* state() const; - /** - * Whether the listener is active - */ - bool is_active() const; - - /** - * Deactivate the listener - * - * TODO: Remove and deactivate via removal from global listener list - */ - void deactivate(); - /** * The SSL_LISTENER object */ @@ -221,15 +211,6 @@ private: */ bool listener_serialize(const SListener& listener); -/** - * @brief Free a listener - * - * The listener must be destroyed before it can be freed. - * - * @param listener Listener to free - */ -void listener_free(const SListener& listener); - /** * Find a listener * diff --git a/server/core/listener.cc b/server/core/listener.cc index 80c7c3185..22de48b9e 100644 --- a/server/core/listener.cc +++ b/server/core/listener.cc @@ -57,7 +57,6 @@ Listener::Listener(SERVICE* service, const std::string& name, const std::string& , m_listener(nullptr) , m_users(nullptr) , m_service(service) - , m_active(1) { } @@ -116,21 +115,17 @@ SListener Listener::create(SERVICE* service, return listener; } -void listener_free(const SListener& listener) +void Listener::destroy(const SListener& listener) { - std::lock_guard guard(listener_lock); - all_listeners.remove(listener); -} - -void Listener::close() -{ - deactivate(); - stop(); + listener->stop(); // TODO: This is not pretty but it works, revise when listeners are refactored. This is // thread-safe as the listener is freed on the same thread that closes the socket. - ::close(m_listener->fd); - m_listener->fd = -1; + ::close(listener->m_listener->fd); + listener->m_listener->fd = -1; + + std::lock_guard guard(listener_lock); + all_listeners.remove(listener); } bool Listener::stop() @@ -170,7 +165,7 @@ SListener listener_find(const std::string& name) for (const auto& a : all_listeners) { - if (a->is_active() && a->name() == name) + if (a->name() == name) { rval = a; break; @@ -187,7 +182,7 @@ std::vector listener_find_by_service(const SERVICE* service) for (const auto& a : all_listeners) { - if (a->is_active() && a->service() == service) + if (a->service() == service) { rval.push_back(a); } @@ -616,16 +611,6 @@ json_t* Listener::to_json() const return rval; } -void Listener::deactivate() -{ - m_active = false; -} - -bool Listener::is_active() const -{ - return m_active; -} - const char* Listener::name() const { return m_name.c_str(); diff --git a/server/core/service.cc b/server/core/service.cc index 9ace6d86a..2bb215c22 100644 --- a/server/core/service.cc +++ b/server/core/service.cc @@ -236,12 +236,6 @@ Service::~Service() { mxs_rworker_delete_data(m_wkey); - for (const auto& tmp : listener_find_by_service(this)) - { - mxb_assert(!tmp->is_active() || maxscale_teardown_in_progress()); - listener_free(listener_find(tmp->name())); - } - if (router && router_instance && router->destroyInstance) { router->destroyInstance(router_instance); @@ -538,7 +532,7 @@ bool service_remove_listener(Service* service, const char* target) if (listener && listener->service() == service) { - listener->close(); + Listener::destroy(listener); rval = true; }