Use new instead of malloc
Using new instead of malloc is required for proper initialization of C++ classes.
This commit is contained in:
@ -19,6 +19,7 @@
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdint.h>
|
||||
#include <new>
|
||||
|
||||
#include <maxscale/router.h>
|
||||
#include "rwsplit_internal.hh"
|
||||
@ -74,7 +75,6 @@ static uint64_t getCapabilities(MXS_ROUTER* instance);
|
||||
* not part of the API.
|
||||
*/
|
||||
|
||||
static void free_rwsplit_instance(ROUTER_INSTANCE *router);
|
||||
static bool rwsplit_process_router_options(ROUTER_INSTANCE *router,
|
||||
char **options);
|
||||
static void handle_error_reply_client(MXS_SESSION *ses, ROUTER_CLIENT_SES *rses,
|
||||
@ -231,12 +231,13 @@ static bool handle_max_slaves(ROUTER_INSTANCE *router, const char *str)
|
||||
*/
|
||||
static MXS_ROUTER *createInstance(SERVICE *service, char **options)
|
||||
{
|
||||
ROUTER_INSTANCE *router;
|
||||
ROUTER_INSTANCE* router = new (std::nothrow) ROUTER_INSTANCE;
|
||||
|
||||
if ((router = (ROUTER_INSTANCE*)MXS_CALLOC(1, sizeof(ROUTER_INSTANCE))) == NULL)
|
||||
if (router == NULL)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
router->service = service;
|
||||
|
||||
/*
|
||||
@ -270,7 +271,7 @@ static MXS_ROUTER *createInstance(SERVICE *service, char **options)
|
||||
if (!handle_max_slaves(router, config_get_string(params, "max_slave_connections")) ||
|
||||
(options && !rwsplit_process_router_options(router, options)))
|
||||
{
|
||||
free_rwsplit_instance(router);
|
||||
delete router;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@ -304,7 +305,7 @@ static MXS_ROUTER *createInstance(SERVICE *service, char **options)
|
||||
static MXS_ROUTER_SESSION *newSession(MXS_ROUTER *router_inst, MXS_SESSION *session)
|
||||
{
|
||||
ROUTER_INSTANCE* router = (ROUTER_INSTANCE*)router_inst;
|
||||
ROUTER_CLIENT_SES *client_rses = (ROUTER_CLIENT_SES *)MXS_CALLOC(1, sizeof(ROUTER_CLIENT_SES));
|
||||
ROUTER_CLIENT_SES* client_rses = new (std::nothrow) ROUTER_CLIENT_SES;
|
||||
|
||||
if (client_rses == NULL)
|
||||
{
|
||||
@ -315,6 +316,9 @@ static MXS_ROUTER_SESSION *newSession(MXS_ROUTER *router_inst, MXS_SESSION *sess
|
||||
client_rses->rses_chk_tail = CHK_NUM_ROUTER_SES;
|
||||
#endif
|
||||
|
||||
client_rses->rses_properties[RSES_PROP_TYPE_SESCMD] = NULL;
|
||||
client_rses->rses_properties[RSES_PROP_TYPE_TMPTABLES] = NULL;
|
||||
client_rses->rses_closed = false;
|
||||
client_rses->router = router;
|
||||
client_rses->client_dcb = session->client_dcb;
|
||||
client_rses->have_tmp_tables = false;
|
||||
@ -326,21 +330,12 @@ static MXS_ROUTER_SESSION *newSession(MXS_ROUTER *router_inst, MXS_SESSION *sess
|
||||
|
||||
int router_nservers = router->service->n_dbref;
|
||||
const int min_nservers = 1; /*< hard-coded for now */
|
||||
|
||||
if (!have_enough_servers(client_rses, min_nservers, router_nservers, router))
|
||||
{
|
||||
MXS_FREE(client_rses);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create backend reference objects for this session.
|
||||
*/
|
||||
backend_ref_t *backend_ref;
|
||||
|
||||
if (!create_backends(client_rses, &backend_ref, &router_nservers))
|
||||
if (!have_enough_servers(client_rses, min_nservers, router_nservers, router) ||
|
||||
!create_backends(client_rses, &backend_ref, &router_nservers))
|
||||
{
|
||||
MXS_FREE(client_rses);
|
||||
delete client_rses;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@ -361,8 +356,8 @@ static MXS_ROUTER_SESSION *newSession(MXS_ROUTER *router_inst, MXS_SESSION *sess
|
||||
* in the strict mode. If sessions without master are allowed, only
|
||||
* <min_nslaves> slaves must be found.
|
||||
*/
|
||||
MXS_FREE(client_rses->rses_backend_ref);
|
||||
MXS_FREE(client_rses);
|
||||
delete client_rses->rses_backend_ref;
|
||||
delete client_rses;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@ -489,9 +484,8 @@ static void freeSession(MXS_ROUTER *router_instance, MXS_ROUTER_SESSION *router_
|
||||
}
|
||||
}
|
||||
|
||||
MXS_FREE(router_cli_ses->rses_backend_ref);
|
||||
MXS_FREE(router_cli_ses);
|
||||
return;
|
||||
delete[] router_cli_ses->rses_backend_ref;
|
||||
delete router_cli_ses;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -988,11 +982,7 @@ static uint64_t getCapabilities(MXS_ROUTER* instance)
|
||||
*/
|
||||
void bref_clear_state(backend_ref_t *bref, bref_state_t state)
|
||||
{
|
||||
if (bref == NULL)
|
||||
{
|
||||
MXS_ERROR("[%s] Error: NULL parameter.", __FUNCTION__);
|
||||
return;
|
||||
}
|
||||
ss_dassert(bref);
|
||||
|
||||
if ((state & BREF_WAITING_RESULT) && (bref->bref_state & BREF_WAITING_RESULT))
|
||||
{
|
||||
@ -1037,11 +1027,7 @@ void bref_clear_state(backend_ref_t *bref, bref_state_t state)
|
||||
*/
|
||||
void bref_set_state(backend_ref_t *bref, bref_state_t state)
|
||||
{
|
||||
if (bref == NULL)
|
||||
{
|
||||
MXS_ERROR("[%s] Error: NULL parameter.", __FUNCTION__);
|
||||
return;
|
||||
}
|
||||
ss_dassert(bref);
|
||||
|
||||
if ((state & BREF_WAITING_RESULT) && (bref->bref_state & BREF_WAITING_RESULT) == 0)
|
||||
{
|
||||
@ -1070,6 +1056,32 @@ void bref_set_state(backend_ref_t *bref, bref_state_t state)
|
||||
bref->bref_state |= state;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Create a generic router session property structure.
|
||||
*
|
||||
* @param prop_type Property type
|
||||
*
|
||||
* @return property structure of requested type, or NULL if failed
|
||||
*/
|
||||
rses_property_t *rses_property_init(rses_property_type_t prop_type)
|
||||
{
|
||||
rses_property_t* prop = new (std::nothrow) rses_property_t;
|
||||
|
||||
if (prop == NULL)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
prop->rses_prop_type = prop_type;
|
||||
#if defined(SS_DEBUG)
|
||||
prop->rses_prop_chk_top = CHK_NUM_ROUTER_PROPERTY;
|
||||
prop->rses_prop_chk_tail = CHK_NUM_ROUTER_PROPERTY;
|
||||
#endif
|
||||
|
||||
CHK_RSES_PROP(prop);
|
||||
return prop;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Free resources belonging to a property
|
||||
*
|
||||
@ -1079,11 +1091,7 @@ void bref_set_state(backend_ref_t *bref, bref_state_t state)
|
||||
*/
|
||||
void rses_property_done(rses_property_t *prop)
|
||||
{
|
||||
if (prop == NULL)
|
||||
{
|
||||
MXS_ERROR("[%s] Error: NULL parameter.", __FUNCTION__);
|
||||
return;
|
||||
}
|
||||
ss_dassert(prop);
|
||||
CHK_RSES_PROP(prop);
|
||||
|
||||
switch (prop->rses_prop_type)
|
||||
@ -1103,7 +1111,7 @@ void rses_property_done(rses_property_t *prop)
|
||||
ss_dassert(false);
|
||||
break;
|
||||
}
|
||||
MXS_FREE(prop);
|
||||
delete prop;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1677,7 +1685,7 @@ static bool handle_error_new_connection(ROUTER_INSTANCE *inst,
|
||||
static bool have_enough_servers(ROUTER_CLIENT_SES *rses, const int min_nsrv,
|
||||
int router_nsrv, ROUTER_INSTANCE *router)
|
||||
{
|
||||
bool succp;
|
||||
bool succp = true;
|
||||
|
||||
/** With too few servers session is not created */
|
||||
if (router_nsrv < min_nsrv ||
|
||||
@ -1718,27 +1726,8 @@ static bool have_enough_servers(ROUTER_CLIENT_SES *rses, const int min_nsrv,
|
||||
}
|
||||
succp = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
succp = true;
|
||||
}
|
||||
return succp;
|
||||
}
|
||||
|
||||
/*
|
||||
* @brief Release resources when createInstance fails to complete
|
||||
*
|
||||
* Internal to createInstance
|
||||
*
|
||||
* @param router Router instance
|
||||
*
|
||||
*/
|
||||
static void free_rwsplit_instance(ROUTER_INSTANCE *router)
|
||||
{
|
||||
if (router)
|
||||
{
|
||||
MXS_FREE(router);
|
||||
}
|
||||
return succp;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1755,7 +1744,7 @@ static void free_rwsplit_instance(ROUTER_INSTANCE *router)
|
||||
*/
|
||||
static bool create_backends(ROUTER_CLIENT_SES *rses, backend_ref_t** dest, int* n_backend)
|
||||
{
|
||||
backend_ref_t *backend_ref = (backend_ref_t *)MXS_CALLOC(1, *n_backend * sizeof(backend_ref_t));
|
||||
backend_ref_t* backend_ref = new (std::nothrow) backend_ref_t[*n_backend];
|
||||
|
||||
if (backend_ref == NULL)
|
||||
{
|
||||
@ -1774,9 +1763,13 @@ static bool create_backends(ROUTER_CLIENT_SES *rses, backend_ref_t** dest, int*
|
||||
backend_ref[i].bref_sescmd_cur.scmd_cur_chk_top = CHK_NUM_SESCMD_CUR;
|
||||
backend_ref[i].bref_sescmd_cur.scmd_cur_chk_tail = CHK_NUM_SESCMD_CUR;
|
||||
#endif
|
||||
backend_ref[i].closed_at = 0;
|
||||
backend_ref[i].bref_state = 0;
|
||||
backend_ref[i].ref = sref;
|
||||
backend_ref[i].reply_state = REPLY_STATE_DONE;
|
||||
backend_ref[i].reply_cmd = 0;
|
||||
backend_ref[i].bref_dcb = NULL;
|
||||
backend_ref[i].bref_num_result_wait = 0;
|
||||
/** store pointers to sescmd list to both cursors */
|
||||
backend_ref[i].bref_sescmd_cur.scmd_cur_rses = rses;
|
||||
backend_ref[i].bref_sescmd_cur.scmd_cur_active = false;
|
||||
|
@ -1358,32 +1358,6 @@ handle_got_target(ROUTER_INSTANCE *inst, ROUTER_CLIENT_SES *rses,
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Create a generic router session property structure.
|
||||
*
|
||||
* @param prop_type Property type
|
||||
*
|
||||
* @return property structure of requested type, or NULL if failed
|
||||
*/
|
||||
rses_property_t *rses_property_init(rses_property_type_t prop_type)
|
||||
{
|
||||
rses_property_t *prop;
|
||||
|
||||
prop = (rses_property_t *)MXS_CALLOC(1, sizeof(rses_property_t));
|
||||
if (prop == NULL)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
prop->rses_prop_type = prop_type;
|
||||
#if defined(SS_DEBUG)
|
||||
prop->rses_prop_chk_top = CHK_NUM_ROUTER_PROPERTY;
|
||||
prop->rses_prop_chk_tail = CHK_NUM_ROUTER_PROPERTY;
|
||||
#endif
|
||||
|
||||
CHK_RSES_PROP(prop);
|
||||
return prop;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Add property to the router client session
|
||||
*
|
||||
|
@ -83,6 +83,8 @@ mysql_sescmd_t *mysql_sescmd_init(rses_property_t *rses_prop,
|
||||
sescmd->my_sescmd_buf = sescmd_buf;
|
||||
sescmd->my_sescmd_packet_type = packet_type;
|
||||
sescmd->position = atomic_add(&rses->pos_generator, 1);
|
||||
sescmd->my_sescmd_is_replied = false;
|
||||
sescmd->reply_cmd = 0;
|
||||
|
||||
return sescmd;
|
||||
}
|
||||
|
Reference in New Issue
Block a user