Project

General

Profile

Feature #13963 ยป 0001-file.c-release-GVL-around-lstat-2.patch

normalperson (Eric Wong), 10/01/2017 10:06 PM

View differences:

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;
-
    (1-1/1)