Remove custom lock types in favor of native C++11 mutexes

No longer using RAII wrappers around pthread_mutex_t and pthread_cond_t
in favor of the C++11 std::mutex, std::recursive_mutex, and
std::condition_variable data types.
This commit is contained in:
Mahmoud Al-Qudsi
2017-08-18 14:26:35 -05:00
parent b1ac07a178
commit e76c1fd139
18 changed files with 74 additions and 250 deletions

View File

@@ -35,7 +35,7 @@ static function_map_t loaded_functions;
static std::set<wcstring> function_tombstones;
/// Lock for functions.
static pthread_mutex_t functions_lock;
static std::recursive_mutex functions_lock;
static bool function_remove_ignore_autoload(const wcstring &name, bool tombstone = true);
@@ -55,7 +55,7 @@ static bool is_autoload = false;
/// loaded.
static int load(const wcstring &name) {
ASSERT_IS_MAIN_THREAD();
scoped_lock locker(functions_lock);
scoped_rlock locker(functions_lock);
bool was_autoload = is_autoload;
int res;
@@ -106,17 +106,6 @@ static void autoload_names(std::set<wcstring> &names, int get_hidden) {
}
}
void function_init() {
// PCA: This recursive lock was introduced early in my work. I would like to make this a
// non-recursive lock but I haven't fully investigated all the call paths (for autoloading
// functions, etc.).
pthread_mutexattr_t a;
DIE_ON_FAILURE(pthread_mutexattr_init(&a));
DIE_ON_FAILURE(pthread_mutexattr_settype(&a, PTHREAD_MUTEX_RECURSIVE));
DIE_ON_FAILURE(pthread_mutex_init(&functions_lock, &a));
DIE_ON_FAILURE(pthread_mutexattr_destroy(&a));
}
static std::map<wcstring, env_var_t> snapshot_vars(const wcstring_list_t &vars) {
std::map<wcstring, env_var_t> result;
for (wcstring_list_t::const_iterator it = vars.begin(), end = vars.end(); it != end; ++it) {
@@ -153,7 +142,7 @@ void function_add(const function_data_t &data, const parser_t &parser, int defin
CHECK(!data.name.empty(), ); //!OCLINT(multiple unary operator)
CHECK(data.definition, );
scoped_lock locker(functions_lock);
scoped_rlock locker(functions_lock);
// Remove the old function.
function_remove(data.name);
@@ -174,28 +163,28 @@ void function_add(const function_data_t &data, const parser_t &parser, int defin
int function_exists(const wcstring &cmd) {
if (parser_keywords_is_reserved(cmd)) return 0;
scoped_lock locker(functions_lock);
scoped_rlock locker(functions_lock);
load(cmd);
return loaded_functions.find(cmd) != loaded_functions.end();
}
void function_load(const wcstring &cmd) {
if (!parser_keywords_is_reserved(cmd)) {
scoped_lock locker(functions_lock);
scoped_rlock locker(functions_lock);
load(cmd);
}
}
int function_exists_no_autoload(const wcstring &cmd, const env_vars_snapshot_t &vars) {
if (parser_keywords_is_reserved(cmd)) return 0;
scoped_lock locker(functions_lock);
scoped_rlock locker(functions_lock);
return loaded_functions.find(cmd) != loaded_functions.end() ||
function_autoloader.can_load(cmd, vars);
}
static bool function_remove_ignore_autoload(const wcstring &name, bool tombstone) {
// Note: the lock may be held at this point, but is recursive.
scoped_lock locker(functions_lock);
scoped_rlock locker(functions_lock);
function_map_t::iterator iter = loaded_functions.find(name);
@@ -229,7 +218,7 @@ static const function_info_t *function_get(const wcstring &name) {
}
bool function_get_definition(const wcstring &name, wcstring *out_definition) {
scoped_lock locker(functions_lock);
scoped_rlock locker(functions_lock);
const function_info_t *func = function_get(name);
if (func && out_definition) {
out_definition->assign(func->definition);
@@ -238,26 +227,26 @@ bool function_get_definition(const wcstring &name, wcstring *out_definition) {
}
wcstring_list_t function_get_named_arguments(const wcstring &name) {
scoped_lock locker(functions_lock);
scoped_rlock locker(functions_lock);
const function_info_t *func = function_get(name);
return func ? func->named_arguments : wcstring_list_t();
}
std::map<wcstring, env_var_t> function_get_inherit_vars(const wcstring &name) {
scoped_lock locker(functions_lock);
scoped_rlock locker(functions_lock);
const function_info_t *func = function_get(name);
return func ? func->inherit_vars : std::map<wcstring, env_var_t>();
}
bool function_get_shadow_scope(const wcstring &name) {
scoped_lock locker(functions_lock);
scoped_rlock locker(functions_lock);
const function_info_t *func = function_get(name);
return func ? func->shadow_scope : false;
}
bool function_get_desc(const wcstring &name, wcstring *out_desc) {
// Empty length string goes to NULL.
scoped_lock locker(functions_lock);
scoped_rlock locker(functions_lock);
const function_info_t *func = function_get(name);
if (out_desc && func && !func->description.empty()) {
out_desc->assign(_(func->description.c_str()));
@@ -269,7 +258,7 @@ bool function_get_desc(const wcstring &name, wcstring *out_desc) {
void function_set_desc(const wcstring &name, const wcstring &desc) {
load(name);
scoped_lock locker(functions_lock);
scoped_rlock locker(functions_lock);
function_map_t::iterator iter = loaded_functions.find(name);
if (iter != loaded_functions.end()) {
iter->second.description = desc;
@@ -278,7 +267,7 @@ void function_set_desc(const wcstring &name, const wcstring &desc) {
bool function_copy(const wcstring &name, const wcstring &new_name) {
bool result = false;
scoped_lock locker(functions_lock);
scoped_rlock locker(functions_lock);
function_map_t::const_iterator iter = loaded_functions.find(name);
if (iter != loaded_functions.end()) {
// This new instance of the function shouldn't be tied to the definition file of the
@@ -293,7 +282,7 @@ bool function_copy(const wcstring &name, const wcstring &new_name) {
wcstring_list_t function_get_names(int get_hidden) {
std::set<wcstring> names;
scoped_lock locker(functions_lock);
scoped_rlock locker(functions_lock);
autoload_names(names, get_hidden);
function_map_t::const_iterator iter;
@@ -310,19 +299,19 @@ wcstring_list_t function_get_names(int get_hidden) {
}
const wchar_t *function_get_definition_file(const wcstring &name) {
scoped_lock locker(functions_lock);
scoped_rlock locker(functions_lock);
const function_info_t *func = function_get(name);
return func ? func->definition_file : NULL;
}
bool function_is_autoloaded(const wcstring &name) {
scoped_lock locker(functions_lock);
scoped_rlock locker(functions_lock);
const function_info_t *func = function_get(name);
return func->is_autoload;
}
int function_get_definition_offset(const wcstring &name) {
scoped_lock locker(functions_lock);
scoped_rlock locker(functions_lock);
const function_info_t *func = function_get(name);
return func ? func->definition_offset : -1;
}