MXS-2271 Use std::mutex instead of pthread_mutex

This commit is contained in:
Esa Korhonen
2019-01-17 14:58:57 +02:00
parent 3125d1babf
commit 40f58ddec8
2 changed files with 86 additions and 112 deletions

View File

@ -19,6 +19,7 @@
#include <maxscale/ccdefs.hh> #include <maxscale/ccdefs.hh>
#include <atomic> #include <atomic>
#include <mutex>
#include <openssl/sha.h> #include <openssl/sha.h>
#include <maxbase/semaphore.hh> #include <maxbase/semaphore.hh>
#include <maxbase/worker.hh> #include <maxbase/worker.hh>
@ -250,9 +251,9 @@ public:
MXS_MONITOR_API* api; /**< The monitor api */ MXS_MONITOR_API* api; /**< The monitor api */
MXS_MONITOR_INSTANCE* instance; /**< Instance returned from startMonitor */ MXS_MONITOR_INSTANCE* instance; /**< Instance returned from startMonitor */
MXS_MONITOR* next; /**< Next monitor in the linked list */ MXS_MONITOR* next; /**< Next monitor in the linked list */
mutable std::mutex lock;
bool active; /**< True if monitor is active */ bool active; /**< True if monitor is active */
pthread_mutex_t lock;
monitor_state_t state; /**< The state of the monitor. This should ONLY be written to by the monitor_state_t state; /**< The state of the monitor. This should ONLY be written to by the
* admin thread. */ * admin thread. */

View File

@ -68,6 +68,7 @@ enum stored_value_type
using std::string; using std::string;
using std::set; using std::set;
using Guard = std::lock_guard<std::mutex>;
const char CN_BACKEND_CONNECT_ATTEMPTS[] = "backend_connect_attempts"; const char CN_BACKEND_CONNECT_ATTEMPTS[] = "backend_connect_attempts";
const char CN_BACKEND_CONNECT_TIMEOUT[] = "backend_connect_timeout"; const char CN_BACKEND_CONNECT_TIMEOUT[] = "backend_connect_timeout";
@ -146,7 +147,6 @@ MXS_MONITOR* monitor_create(const char* name, const char* module, MXS_CONFIG_PAR
memset(mon->journal_hash, 0, sizeof(mon->journal_hash)); memset(mon->journal_hash, 0, sizeof(mon->journal_hash));
mon->disk_space_threshold = NULL; mon->disk_space_threshold = NULL;
mon->disk_space_check_interval = config_get_integer(params, CN_DISK_SPACE_CHECK_INTERVAL); mon->disk_space_check_interval = config_get_integer(params, CN_DISK_SPACE_CHECK_INTERVAL);
pthread_mutex_init(&mon->lock, NULL);
for (auto& s : mxs::strtok(config_get_string(params, CN_SERVERS), ",")) for (auto& s : mxs::strtok(config_get_string(params, CN_SERVERS), ","))
{ {
@ -259,7 +259,7 @@ void monitor_start(MXS_MONITOR* monitor, const MXS_CONFIG_PARAMETER* params)
{ {
if (monitor) if (monitor)
{ {
pthread_mutex_lock(&monitor->lock); Guard guard(monitor->lock);
// Only start the monitor if it's stopped. // Only start the monitor if it's stopped.
if (monitor->state == MONITOR_STATE_STOPPED) if (monitor->state == MONITOR_STATE_STOPPED)
@ -279,8 +279,6 @@ void monitor_start(MXS_MONITOR* monitor, const MXS_CONFIG_PARAMETER* params)
MXS_ERROR("Failed to start monitor '%s'.", monitor->name); MXS_ERROR("Failed to start monitor '%s'.", monitor->name);
} }
} }
pthread_mutex_unlock(&monitor->lock);
} }
} }
@ -312,7 +310,7 @@ void monitor_stop(MXS_MONITOR* monitor)
{ {
if (monitor) if (monitor)
{ {
pthread_mutex_lock(&monitor->lock); Guard guard(monitor->lock);
/** Only stop the monitor if it is running */ /** Only stop the monitor if it is running */
if (monitor->state == MONITOR_STATE_RUNNING) if (monitor->state == MONITOR_STATE_RUNNING)
@ -330,8 +328,6 @@ void monitor_stop(MXS_MONITOR* monitor)
db = db->next; db = db->next;
} }
} }
pthread_mutex_unlock(&monitor->lock);
} }
} }
@ -386,8 +382,8 @@ bool monitor_add_server(MXS_MONITOR* mon, SERVER* server)
monitor_stop(mon); monitor_stop(mon);
} }
pthread_mutex_lock(&mon->lock); {
Guard guard(mon->lock);
if (mon->monitored_servers == NULL) if (mon->monitored_servers == NULL)
{ {
mon->monitored_servers = db; mon->monitored_servers = db;
@ -401,7 +397,7 @@ bool monitor_add_server(MXS_MONITOR* mon, SERVER* server)
} }
ptr->next = db; ptr->next = db;
} }
pthread_mutex_unlock(&mon->lock); }
if (old_state == MONITOR_STATE_RUNNING) if (old_state == MONITOR_STATE_RUNNING)
{ {
@ -453,9 +449,9 @@ void monitor_remove_server(MXS_MONITOR* mon, SERVER* server)
monitor_stop(mon); monitor_stop(mon);
} }
pthread_mutex_lock(&mon->lock);
MXS_MONITORED_SERVER* ptr = mon->monitored_servers; MXS_MONITORED_SERVER* ptr = mon->monitored_servers;
{
Guard guard(mon->lock);
if (ptr && ptr->server == server) if (ptr && ptr->server == server)
{ {
@ -464,7 +460,6 @@ void monitor_remove_server(MXS_MONITOR* mon, SERVER* server)
else else
{ {
MXS_MONITORED_SERVER* prev = ptr; MXS_MONITORED_SERVER* prev = ptr;
while (ptr) while (ptr)
{ {
if (ptr->server == server) if (ptr->server == server)
@ -476,7 +471,7 @@ void monitor_remove_server(MXS_MONITOR* mon, SERVER* server)
ptr = ptr->next; ptr = ptr->next;
} }
} }
pthread_mutex_unlock(&mon->lock); }
if (ptr) if (ptr)
{ {
@ -833,8 +828,7 @@ bool check_monitor_permissions(MXS_MONITOR* monitor, const char* query)
*/ */
void monitor_add_parameters(MXS_MONITOR* monitor, MXS_CONFIG_PARAMETER* params) void monitor_add_parameters(MXS_MONITOR* monitor, MXS_CONFIG_PARAMETER* params)
{ {
pthread_mutex_lock(&monitor->lock); Guard guard(monitor->lock);
while (params) while (params)
{ {
MXS_CONFIG_PARAMETER* old = config_get_param(monitor->parameters, params->name); MXS_CONFIG_PARAMETER* old = config_get_param(monitor->parameters, params->name);
@ -853,8 +847,6 @@ void monitor_add_parameters(MXS_MONITOR* monitor, MXS_CONFIG_PARAMETER* params)
params = params->next; params = params->next;
} }
pthread_mutex_unlock(&monitor->lock);
} }
void monitor_set_parameter(MXS_MONITOR* monitor, const char* key, const char* value) void monitor_set_parameter(MXS_MONITOR* monitor, const char* key, const char* value)
@ -870,8 +862,7 @@ bool monitor_remove_parameter(MXS_MONITOR* monitor, const char* key)
{ {
MXS_CONFIG_PARAMETER* prev = NULL; MXS_CONFIG_PARAMETER* prev = NULL;
bool rval = false; bool rval = false;
Guard guard(monitor->lock);
pthread_mutex_lock(&monitor->lock);
for (MXS_CONFIG_PARAMETER* p = monitor->parameters; p; p = p->next) for (MXS_CONFIG_PARAMETER* p = monitor->parameters; p; p = p->next)
{ {
@ -895,15 +886,12 @@ bool monitor_remove_parameter(MXS_MONITOR* monitor, const char* key)
prev = p; prev = p;
} }
pthread_mutex_unlock(&monitor->lock);
return rval; return rval;
} }
void mon_alter_parameter(MXS_MONITOR* monitor, const char* key, const char* value) void mon_alter_parameter(MXS_MONITOR* monitor, const char* key, const char* value)
{ {
pthread_mutex_lock(&monitor->lock); Guard guard(monitor->lock);
for (MXS_CONFIG_PARAMETER* p = monitor->parameters; p; p = p->next) for (MXS_CONFIG_PARAMETER* p = monitor->parameters; p; p = p->next)
{ {
if (strcmp(p->name, key) == 0) if (strcmp(p->name, key) == 0)
@ -913,8 +901,6 @@ void mon_alter_parameter(MXS_MONITOR* monitor, const char* key, const char* valu
break; break;
} }
} }
pthread_mutex_unlock(&monitor->lock);
} }
void monitor_stash_current_status(MXS_MONITORED_SERVER* ptr) void monitor_stash_current_status(MXS_MONITORED_SERVER* ptr)
@ -1536,8 +1522,7 @@ MXS_MONITOR* monitor_server_in_use(const SERVER* server)
for (MXS_MONITOR* mon = allMonitors; mon && !rval; mon = mon->next) for (MXS_MONITOR* mon = allMonitors; mon && !rval; mon = mon->next)
{ {
pthread_mutex_lock(&mon->lock); Guard guard(mon->lock);
if (mon->active) if (mon->active)
{ {
for (MXS_MONITORED_SERVER* db = mon->monitored_servers; db && !rval; db = db->next) for (MXS_MONITORED_SERVER* db = mon->monitored_servers; db && !rval; db = db->next)
@ -1548,8 +1533,6 @@ MXS_MONITOR* monitor_server_in_use(const SERVER* server)
} }
} }
} }
pthread_mutex_unlock(&mon->lock);
} }
return rval; return rval;
@ -1569,8 +1552,8 @@ static bool create_monitor_config(const MXS_MONITOR* monitor, const char* filena
return false; return false;
} }
pthread_mutex_lock((pthread_mutex_t*)&monitor->lock); {
Guard guard(monitor->lock);
dprintf(file, "[%s]\n", monitor->name); dprintf(file, "[%s]\n", monitor->name);
dprintf(file, "%s=monitor\n", CN_TYPE); dprintf(file, "%s=monitor\n", CN_TYPE);
@ -1596,9 +1579,9 @@ static bool create_monitor_config(const MXS_MONITOR* monitor, const char* filena
{CN_TYPE, CN_SERVERS}, {CN_TYPE, CN_SERVERS},
config_monitor_params, config_monitor_params,
mod->parameters); mod->parameters);
pthread_mutex_unlock((pthread_mutex_t*)&monitor->lock); }
close(file);
close(file);
return true; return true;
} }
@ -1775,14 +1758,14 @@ json_t* monitor_parameters_to_json(const MXS_MONITOR* monitor)
json_t* monitor_json_data(const MXS_MONITOR* monitor, const char* host) json_t* monitor_json_data(const MXS_MONITOR* monitor, const char* host)
{ {
json_t* rval = json_object(); json_t* rval = json_object();
json_t* attr = json_object();
json_t* rel = json_object();
pthread_mutex_lock((pthread_mutex_t*)&monitor->lock); {
Guard guard(monitor->lock);
json_object_set_new(rval, CN_ID, json_string(monitor->name)); json_object_set_new(rval, CN_ID, json_string(monitor->name));
json_object_set_new(rval, CN_TYPE, json_string(CN_MONITORS)); json_object_set_new(rval, CN_TYPE, json_string(CN_MONITORS));
json_t* attr = json_object();
json_object_set_new(attr, CN_MODULE, json_string(monitor->module_name)); json_object_set_new(attr, CN_MODULE, json_string(monitor->module_name));
json_object_set_new(attr, CN_STATE, json_string(monitor_state_to_string(monitor->state))); json_object_set_new(attr, CN_STATE, json_string(monitor_state_to_string(monitor->state)));
json_object_set_new(attr, CN_TICKS, json_integer(monitor->ticks)); json_object_set_new(attr, CN_TICKS, json_integer(monitor->ticks));
@ -1801,27 +1784,20 @@ json_t* monitor_json_data(const MXS_MONITOR* monitor, const char* host)
} }
} }
json_t* rel = json_object();
if (monitor->monitored_servers) if (monitor->monitored_servers)
{ {
json_t* mon_rel = mxs_json_relationship(host, MXS_JSON_API_SERVERS); json_t* mon_rel = mxs_json_relationship(host, MXS_JSON_API_SERVERS);
for (MXS_MONITORED_SERVER* db = monitor->monitored_servers; db; db = db->next) for (MXS_MONITORED_SERVER* db = monitor->monitored_servers; db; db = db->next)
{ {
mxs_json_add_relation(mon_rel, db->server->name(), CN_SERVERS); mxs_json_add_relation(mon_rel, db->server->name(), CN_SERVERS);
} }
json_object_set_new(rel, CN_SERVERS, mon_rel); json_object_set_new(rel, CN_SERVERS, mon_rel);
} }
}
pthread_mutex_unlock((pthread_mutex_t*)&monitor->lock);
json_object_set_new(rval, CN_RELATIONSHIPS, rel); json_object_set_new(rval, CN_RELATIONSHIPS, rel);
json_object_set_new(rval, CN_ATTRIBUTES, attr); json_object_set_new(rval, CN_ATTRIBUTES, attr);
json_object_set_new(rval, CN_LINKS, mxs_json_self_link(host, CN_MONITORS, monitor->name)); json_object_set_new(rval, CN_LINKS, mxs_json_self_link(host, CN_MONITORS, monitor->name));
return rval; return rval;
} }
@ -1863,8 +1839,7 @@ json_t* monitor_relations_to_server(const SERVER* server, const char* host)
for (MXS_MONITOR* mon = allMonitors; mon; mon = mon->next) for (MXS_MONITOR* mon = allMonitors; mon; mon = mon->next)
{ {
pthread_mutex_lock(&mon->lock); Guard guard(mon->lock);
if (mon->active) if (mon->active)
{ {
for (MXS_MONITORED_SERVER* db = mon->monitored_servers; db; db = db->next) for (MXS_MONITORED_SERVER* db = mon->monitored_servers; db; db = db->next)
@ -1876,8 +1851,6 @@ json_t* monitor_relations_to_server(const SERVER* server, const char* host)
} }
} }
} }
pthread_mutex_unlock(&mon->lock);
} }
guard.unlock(); guard.unlock();