mirror of
https://github.com/neovim/neovim.git
synced 2025-10-16 06:46:07 +00:00
feat(lua): add proper support of luv threads
This commit is contained in:
@@ -40,8 +40,10 @@
|
||||
bool did_try_to_free = false; \
|
||||
uv_call_start: {} \
|
||||
uv_fs_t req; \
|
||||
fs_loop_lock(); \
|
||||
ret = func(&fs_loop, &req, __VA_ARGS__); \
|
||||
uv_fs_req_cleanup(&req); \
|
||||
fs_loop_unlock(); \
|
||||
if (ret == UV_ENOMEM && !did_try_to_free) { \
|
||||
try_to_free_memory(); \
|
||||
did_try_to_free = true; \
|
||||
@@ -52,12 +54,24 @@ uv_call_start: {} \
|
||||
// Many fs functions from libuv return that value on success.
|
||||
static const int kLibuvSuccess = 0;
|
||||
static uv_loop_t fs_loop;
|
||||
static uv_mutex_t fs_loop_mutex;
|
||||
|
||||
|
||||
// Initialize the fs module
|
||||
void fs_init(void)
|
||||
{
|
||||
uv_loop_init(&fs_loop);
|
||||
uv_mutex_init_recursive(&fs_loop_mutex);
|
||||
}
|
||||
|
||||
void fs_loop_lock(void)
|
||||
{
|
||||
uv_mutex_lock(&fs_loop_mutex);
|
||||
}
|
||||
|
||||
void fs_loop_unlock(void)
|
||||
{
|
||||
uv_mutex_unlock(&fs_loop_mutex);
|
||||
}
|
||||
|
||||
|
||||
@@ -98,9 +112,12 @@ bool os_isrealdir(const char *name)
|
||||
FUNC_ATTR_NONNULL_ALL
|
||||
{
|
||||
uv_fs_t request;
|
||||
fs_loop_lock();
|
||||
if (uv_fs_lstat(&fs_loop, &request, name, NULL) != kLibuvSuccess) {
|
||||
fs_loop_unlock();
|
||||
return false;
|
||||
}
|
||||
fs_loop_unlock();
|
||||
if (S_ISLNK(request.statbuf.st_mode)) {
|
||||
return false;
|
||||
} else {
|
||||
@@ -738,7 +755,9 @@ static int os_stat(const char *name, uv_stat_t *statbuf)
|
||||
return UV_EINVAL;
|
||||
}
|
||||
uv_fs_t request;
|
||||
fs_loop_lock();
|
||||
int result = uv_fs_stat(&fs_loop, &request, name, NULL);
|
||||
fs_loop_unlock();
|
||||
if (result == kLibuvSuccess) {
|
||||
*statbuf = request.statbuf;
|
||||
}
|
||||
@@ -935,9 +954,11 @@ int os_mkdtemp(const char *template, char *path)
|
||||
FUNC_ATTR_NONNULL_ALL
|
||||
{
|
||||
uv_fs_t request;
|
||||
fs_loop_lock();
|
||||
int result = uv_fs_mkdtemp(&fs_loop, &request, template, NULL);
|
||||
fs_loop_unlock();
|
||||
if (result == kLibuvSuccess) {
|
||||
STRNCPY(path, request.path, TEMP_FILE_PATH_MAXLEN);
|
||||
xstrlcpy(path, request.path, TEMP_FILE_PATH_MAXLEN);
|
||||
}
|
||||
uv_fs_req_cleanup(&request);
|
||||
return result;
|
||||
@@ -962,7 +983,9 @@ int os_rmdir(const char *path)
|
||||
bool os_scandir(Directory *dir, const char *path)
|
||||
FUNC_ATTR_NONNULL_ALL
|
||||
{
|
||||
fs_loop_lock();
|
||||
int r = uv_fs_scandir(&fs_loop, &dir->request, path, 0, NULL);
|
||||
fs_loop_unlock();
|
||||
if (r < 0) {
|
||||
os_closedir(dir);
|
||||
}
|
||||
@@ -1023,7 +1046,9 @@ bool os_fileinfo_link(const char *path, FileInfo *file_info)
|
||||
return false;
|
||||
}
|
||||
uv_fs_t request;
|
||||
fs_loop_lock();
|
||||
bool ok = uv_fs_lstat(&fs_loop, &request, path, NULL) == kLibuvSuccess;
|
||||
fs_loop_unlock();
|
||||
if (ok) {
|
||||
file_info->stat = request.statbuf;
|
||||
}
|
||||
@@ -1041,6 +1066,7 @@ bool os_fileinfo_fd(int file_descriptor, FileInfo *file_info)
|
||||
{
|
||||
uv_fs_t request;
|
||||
memset(file_info, 0, sizeof(*file_info));
|
||||
fs_loop_lock();
|
||||
bool ok = uv_fs_fstat(&fs_loop,
|
||||
&request,
|
||||
file_descriptor,
|
||||
@@ -1049,6 +1075,7 @@ bool os_fileinfo_fd(int file_descriptor, FileInfo *file_info)
|
||||
file_info->stat = request.statbuf;
|
||||
}
|
||||
uv_fs_req_cleanup(&request);
|
||||
fs_loop_unlock();
|
||||
return ok;
|
||||
}
|
||||
|
||||
@@ -1165,6 +1192,7 @@ char *os_realpath(const char *name, char *buf)
|
||||
FUNC_ATTR_NONNULL_ARG(1)
|
||||
{
|
||||
uv_fs_t request;
|
||||
fs_loop_lock();
|
||||
int result = uv_fs_realpath(&fs_loop, &request, name, NULL);
|
||||
if (result == kLibuvSuccess) {
|
||||
if (buf == NULL) {
|
||||
@@ -1173,6 +1201,7 @@ char *os_realpath(const char *name, char *buf)
|
||||
xstrlcpy(buf, request.ptr, MAXPATHL + 1);
|
||||
}
|
||||
uv_fs_req_cleanup(&request);
|
||||
fs_loop_unlock();
|
||||
return result == kLibuvSuccess ? buf : NULL;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user