Feature #13963 ยป 0001-file.c-release-GVL-around-lstat-2.patch
| file.c | ||
|---|---|---|
|
return rb_stat_new(&st);
|
||
|
}
|
||
|
#ifdef HAVE_LSTAT
|
||
|
static void *
|
||
|
no_gvl_lstat(void *ptr)
|
||
|
{
|
||
|
no_gvl_stat_data *arg = ptr;
|
||
|
return (void *)(VALUE)lstat(arg->file.path, arg->st);
|
||
|
}
|
||
|
static int
|
||
|
lstat_without_gvl(const char *path, struct stat *st)
|
||
|
{
|
||
|
no_gvl_stat_data data;
|
||
|
data.file.path = path;
|
||
|
data.st = st;
|
||
|
return (int)(VALUE)rb_thread_call_without_gvl(no_gvl_lstat, &data,
|
||
|
RUBY_UBF_IO, NULL);
|
||
|
}
|
||
|
#endif /* HAVE_LSTAT */
|
||
|
/*
|
||
|
* call-seq:
|
||
|
* File.lstat(file_name) -> stat
|
||
| ... | ... | |
|
FilePathValue(fname);
|
||
|
fname = rb_str_encode_ospath(fname);
|
||
|
if (lstat(StringValueCStr(fname), &st) == -1) {
|
||
|
if (lstat_without_gvl(StringValueCStr(fname), &st) == -1) {
|
||
|
rb_sys_fail_path(fname);
|
||
|
}
|
||
|
return rb_stat_new(&st);
|
||
| ... | ... | |
|
GetOpenFile(obj, fptr);
|
||
|
if (NIL_P(fptr->pathv)) return Qnil;
|
||
|
path = rb_str_encode_ospath(fptr->pathv);
|
||
|
if (lstat(RSTRING_PTR(path), &st) == -1) {
|
||
|
if (lstat_without_gvl(RSTRING_PTR(path), &st) == -1) {
|
||
|
rb_sys_fail_path(fptr->pathv);
|
||
|
}
|
||
|
return rb_stat_new(&st);
|
||
| ... | ... | |
|
FilePathValue(fname);
|
||
|
fname = rb_str_encode_ospath(fname);
|
||
|
if (lstat(StringValueCStr(fname), &st) < 0) return Qfalse;
|
||
|
if (lstat_without_gvl(StringValueCStr(fname), &st) < 0) return Qfalse;
|
||
|
if (S_ISLNK(st.st_mode)) return Qtrue;
|
||
|
#endif
|
||
| ... | ... | |
|
FilePathValue(fname);
|
||
|
fname = rb_str_encode_ospath(fname);
|
||
|
if (lstat(StringValueCStr(fname), &st) == -1) {
|
||
|
if (lstat_without_gvl(StringValueCStr(fname), &st) == -1) {
|
||
|
rb_sys_fail_path(fname);
|
||
|
}
|
||
| ... | ... | |
|
struct stat st;
|
||
|
p = (char *)s;
|
||
|
len = strlen(p);
|
||
|
if (lstat(buf, &st) == 0 && S_ISLNK(st.st_mode)) {
|
||
|
if (lstat_without_gvl(buf, &st) == 0 && S_ISLNK(st.st_mode)) {
|
||
|
is_symlink = 1;
|
||
|
if (len > 4 && STRCASECMP(p + len - 4, ".lnk") != 0) {
|
||
|
lnk_added = 1;
|
||
| ... | ... | |
|
#ifdef __native_client__
|
||
|
ret = stat(RSTRING_PTR(testpath), &sbuf);
|
||
|
#else
|
||
|
ret = lstat(RSTRING_PTR(testpath), &sbuf);
|
||
|
ret = lstat_without_gvl(RSTRING_PTR(testpath), &sbuf);
|
||
|
#endif
|
||
|
if (ret == -1) {
|
||
|
int e = errno;
|
||
|
-
|
||