mirror of
https://github.com/neovim/neovim.git
synced 2025-09-27 21:48:35 +00:00
feat(lua): add proper support of luv threads
This commit is contained in:
@@ -24,6 +24,23 @@
|
||||
static bool runtime_search_path_valid = false;
|
||||
static int *runtime_search_path_ref = NULL;
|
||||
static RuntimeSearchPath runtime_search_path;
|
||||
static RuntimeSearchPath runtime_search_path_thread;
|
||||
static uv_mutex_t runtime_search_path_mutex;
|
||||
|
||||
void runtime_search_path_init(void)
|
||||
{
|
||||
uv_mutex_init(&runtime_search_path_mutex);
|
||||
}
|
||||
|
||||
void runtime_search_path_lock(void)
|
||||
{
|
||||
uv_mutex_lock(&runtime_search_path_mutex);
|
||||
}
|
||||
|
||||
void runtime_search_path_unlock(void)
|
||||
{
|
||||
uv_mutex_unlock(&runtime_search_path_mutex);
|
||||
}
|
||||
|
||||
/// ":runtime [what] {name}"
|
||||
void ex_runtime(exarg_T *eap)
|
||||
@@ -172,6 +189,17 @@ RuntimeSearchPath runtime_search_path_get_cached(int *ref)
|
||||
return runtime_search_path;
|
||||
}
|
||||
|
||||
RuntimeSearchPath copy_runtime_search_path(const RuntimeSearchPath src)
|
||||
{
|
||||
RuntimeSearchPath dst = KV_INITIAL_VALUE;
|
||||
for (size_t j = 0; j < kv_size(src); j++) {
|
||||
SearchPathItem src_item = kv_A(src, j);
|
||||
kv_push(dst, ((SearchPathItem){ xstrdup(src_item.path), src_item.after, src_item.has_lua }));
|
||||
}
|
||||
|
||||
return dst;
|
||||
}
|
||||
|
||||
void runtime_search_path_unref(RuntimeSearchPath path, int *ref)
|
||||
FUNC_ATTR_NONNULL_ALL
|
||||
{
|
||||
@@ -302,15 +330,33 @@ ArrayOf(String) runtime_get_named(bool lua, Array pat, bool all)
|
||||
{
|
||||
int ref;
|
||||
RuntimeSearchPath path = runtime_search_path_get_cached(&ref);
|
||||
ArrayOf(String) rv = ARRAY_DICT_INIT;
|
||||
static char buf[MAXPATHL];
|
||||
|
||||
ArrayOf(String) rv = runtime_get_named_common(lua, pat, all, path);
|
||||
|
||||
runtime_search_path_unref(path, &ref);
|
||||
return rv;
|
||||
}
|
||||
|
||||
ArrayOf(String) runtime_get_named_thread(bool lua, Array pat, bool all)
|
||||
{
|
||||
runtime_search_path_lock();
|
||||
ArrayOf(String) rv = runtime_get_named_common(lua, pat, all, runtime_search_path_thread);
|
||||
runtime_search_path_unlock();
|
||||
return rv;
|
||||
}
|
||||
|
||||
ArrayOf(String) runtime_get_named_common(bool lua, Array pat, bool all,
|
||||
RuntimeSearchPath path)
|
||||
{
|
||||
ArrayOf(String) rv = ARRAY_DICT_INIT;
|
||||
size_t buf_len = MAXPATHL;
|
||||
char *buf = xmalloc(MAXPATHL);
|
||||
for (size_t i = 0; i < kv_size(path); i++) {
|
||||
SearchPathItem *item = &kv_A(path, i);
|
||||
if (lua) {
|
||||
if (item->has_lua == kNone) {
|
||||
size_t size = (size_t)snprintf(buf, sizeof buf, "%s/lua/", item->path);
|
||||
item->has_lua = (size < sizeof buf && os_isdir((char_u *)buf)) ? kTrue : kFalse;
|
||||
size_t size = (size_t)snprintf(buf, buf_len, "%s/lua/", item->path);
|
||||
item->has_lua = (size < buf_len && os_isdir((char_u *)buf));
|
||||
}
|
||||
if (item->has_lua == kFalse) {
|
||||
continue;
|
||||
@@ -320,9 +366,9 @@ ArrayOf(String) runtime_get_named(bool lua, Array pat, bool all)
|
||||
for (size_t j = 0; j < pat.size; j++) {
|
||||
Object pat_item = pat.items[j];
|
||||
if (pat_item.type == kObjectTypeString) {
|
||||
size_t size = (size_t)snprintf(buf, sizeof buf, "%s/%s",
|
||||
size_t size = (size_t)snprintf(buf, buf_len, "%s/%s",
|
||||
item->path, pat_item.data.string.data);
|
||||
if (size < sizeof buf) {
|
||||
if (size < buf_len) {
|
||||
if (os_file_is_readable(buf)) {
|
||||
ADD(rv, STRING_OBJ(cstr_to_string(buf)));
|
||||
if (!all) {
|
||||
@@ -333,9 +379,8 @@ ArrayOf(String) runtime_get_named(bool lua, Array pat, bool all)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
done:
|
||||
runtime_search_path_unref(path, &ref);
|
||||
xfree(buf);
|
||||
return rv;
|
||||
}
|
||||
|
||||
@@ -569,6 +614,10 @@ void runtime_search_path_validate(void)
|
||||
runtime_search_path = runtime_search_path_build();
|
||||
runtime_search_path_valid = true;
|
||||
runtime_search_path_ref = NULL; // initially unowned
|
||||
runtime_search_path_lock();
|
||||
runtime_search_path_free(runtime_search_path_thread);
|
||||
runtime_search_path_thread = copy_runtime_search_path(runtime_search_path);
|
||||
runtime_search_path_unlock();
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user