MXS-2196: Move listener operations into listener sources

The operations that are done on a listener are now done in the correct
source file.
This commit is contained in:
Markus Mäkelä
2018-11-29 11:22:22 +02:00
parent 6c281d55e2
commit 5926ac2c3c
2 changed files with 50 additions and 47 deletions

View File

@ -41,6 +41,7 @@
#include <maxscale/alloc.h> #include <maxscale/alloc.h>
#include <maxscale/users.h> #include <maxscale/users.h>
#include <maxscale/service.hh> #include <maxscale/service.hh>
#include <maxscale/poll.h>
static RSA* rsa_512 = NULL; static RSA* rsa_512 = NULL;
static RSA* rsa_1024 = NULL; static RSA* rsa_1024 = NULL;
@ -81,17 +82,6 @@ SERV_LISTENER::~SERV_LISTENER()
SSL_LISTENER_free(ssl); SSL_LISTENER_free(ssl);
} }
/**
* Create a new listener structure
*
* @param protocol The name of the protocol module
* @param address The address to listen with
* @param port The port to listen on
* @param authenticator Name of the authenticator to be used
* @param options Authenticator options
* @param ssl SSL configuration
* @return New listener object or NULL if unable to allocate
*/
SERV_LISTENER* listener_alloc(SERVICE* service, SERV_LISTENER* listener_alloc(SERVICE* service,
const char* name, const char* name,
const char* protocol, const char* protocol,
@ -124,16 +114,52 @@ SERV_LISTENER* listener_alloc(SERVICE* service,
auth_options, auth_instance, ssl); auth_options, auth_instance, ssl);
} }
/**
* @brief Free a listener
*
* @param listener Listener to free
*/
void listener_free(SERV_LISTENER* listener) void listener_free(SERV_LISTENER* listener)
{ {
delete listener; delete listener;
} }
void listener_destroy(SERV_LISTENER* listener)
{
listener_set_active(listener, false);
listener_stop(listener);
// 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(listener->listener->fd);
listener->listener->fd = -1;
}
bool listener_stop(SERV_LISTENER* listener)
{
bool rval = false;
mxb_assert(listener->listener);
if (listener->listener->session->state == SESSION_STATE_LISTENER
&& poll_remove_dcb(listener->listener) == 0)
{
listener->listener->session->state = SESSION_STATE_LISTENER_STOPPED;
rval = true;
}
return rval;
}
bool listener_start(SERV_LISTENER* listener)
{
bool rval = true;
mxb_assert(listener->listener);
if (listener->listener->session->state == SESSION_STATE_LISTENER_STOPPED
&& poll_add_dcb(listener->listener) == 0)
{
listener->listener->session->state = SESSION_STATE_LISTENER;
rval = true;
}
return rval;
}
/** /**
* Set the maximum SSL/TLS version the listener will support * Set the maximum SSL/TLS version the listener will support
* @param ssl_listener Listener data to configure * @param ssl_listener Listener data to configure

View File

@ -596,9 +596,8 @@ bool serviceStopListener(SERVICE* svc, const char* name)
{ {
if (listener_is_active(listener) && listener->name == name) if (listener_is_active(listener) && listener->name == name)
{ {
if (poll_remove_dcb(listener->listener) == 0) if (listener_stop(listener))
{ {
listener->listener->session->state = SESSION_STATE_LISTENER_STOPPED;
rval = true; rval = true;
} }
break; break;
@ -619,10 +618,8 @@ bool serviceStartListener(SERVICE* svc, const char* name)
{ {
if (listener_is_active(listener) && listener->name == name) if (listener_is_active(listener) && listener->name == name)
{ {
if (listener->listener && listener->listener->session->state == SESSION_STATE_LISTENER_STOPPED if (listener_start(listener))
&& poll_add_dcb(listener->listener) == 0)
{ {
listener->listener->session->state = SESSION_STATE_LISTENER;
rval = true; rval = true;
} }
break; break;
@ -672,16 +669,11 @@ bool serviceStop(SERVICE* service)
for (SERV_LISTENER* listener = listener_iterator_init(service, &iter); for (SERV_LISTENER* listener = listener_iterator_init(service, &iter);
listener; listener = listener_iterator_next(&iter)) listener; listener = listener_iterator_next(&iter))
{ {
if (listener_is_active(listener) if (listener_is_active(listener) && listener_stop(listener))
&& listener->listener && listener->listener->session->state == SESSION_STATE_LISTENER)
{ {
if (poll_remove_dcb(listener->listener) == 0)
{
listener->listener->session->state = SESSION_STATE_LISTENER_STOPPED;
listeners++; listeners++;
} }
} }
}
service->state = SERVICE_STATE_STOPPED; service->state = SERVICE_STATE_STOPPED;
} }
@ -708,16 +700,11 @@ bool serviceStart(SERVICE* service)
for (SERV_LISTENER* listener = listener_iterator_init(service, &iter); for (SERV_LISTENER* listener = listener_iterator_init(service, &iter);
listener; listener = listener_iterator_next(&iter)) listener; listener = listener_iterator_next(&iter))
{ {
if (listener_is_active(listener) if (listener_is_active(listener) && listener_start(listener))
&& listener->listener && listener->listener->session->state == SESSION_STATE_LISTENER_STOPPED)
{ {
if (poll_add_dcb(listener->listener) == 0)
{
listener->listener->session->state = SESSION_STATE_LISTENER;
listeners++; listeners++;
} }
} }
}
service->state = SERVICE_STATE_STARTED; service->state = SERVICE_STATE_STARTED;
} }
@ -754,18 +741,8 @@ bool service_remove_listener(Service* service, const char* target)
{ {
if (listener_is_active(listener) && listener->name == target) if (listener_is_active(listener) && listener->name == target)
{ {
listener_set_active(listener, false); listener_destroy(listener);
if (poll_remove_dcb(listener->listener) == 0)
{
listener->listener->session->state = SESSION_STATE_LISTENER_STOPPED;
rval = true; rval = true;
// 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(listener->listener->fd);
listener->listener->fd = -1;
}
break; break;
} }
} }