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; | ||
| -  | ||