mirror of
https://github.com/fish-shell/fish-shell.git
synced 2026-06-18 12:01:16 -03:00
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:
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user