aboutsummaryrefslogtreecommitdiffstats
path: root/file.c
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2015-06-14 08:20:43 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2015-06-14 08:20:43 +0000
commit62fd58480c95af5a58b68d002e52a4ac15788f97 (patch)
tree3bab297ddd904851cdf0f3c9b3b53f3c94eacf49 /file.c
parent071f564fe547eaafe672ba0baa7036540919fc0d (diff)
downloadruby-62fd58480c95af5a58b68d002e52a4ac15788f97.tar.gz
file.c: open without gvl
* file.c (rb_file_load_ok): try opening file without gvl not to lock entire process. [Bug #11060] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@50887 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'file.c')
-rw-r--r--file.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/file.c b/file.c
index a9444029d2..026ed031a1 100644
--- a/file.c
+++ b/file.c
@@ -26,6 +26,7 @@
#include "internal.h"
#include "ruby/io.h"
#include "ruby/util.h"
+#include "ruby/thread.h"
#include "dln.h"
#ifdef HAVE_UNISTD_H
@@ -5621,11 +5622,19 @@ rb_path_check(const char *path)
}
#ifndef _WIN32
+static void *
+loadopen_func(void *arg)
+{
+ return (void *)(VALUE)rb_cloexec_open((const char *)arg, O_RDONLY, 0);
+}
+
int
rb_file_load_ok(const char *path)
{
int ret = 1;
- int fd = rb_cloexec_open(path, O_RDONLY, 0);
+ int fd;
+
+ fd = (int)(VALUE)rb_thread_call_without_gvl(loadopen_func, (void *)path, RUBY_UBF_IO, 0);
if (fd == -1) return 0;
rb_update_max_fd(fd);
#if !defined DOSISH