summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorusa <usa@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2015-07-03 08:51:59 +0000
committerusa <usa@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2015-07-03 08:51:59 +0000
commitdffe87c72014a4732282126acc87c898fddb0d81 (patch)
tree7be2eb3415f43af35d8c6b27eac291c458fa6eba
parentee1519777bbd4f57463e23b267653f8f37d7afaa (diff)
merge revision(s) 50887,50896,50902: [Backport #11060]
* 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/branches/ruby_2_1@51118 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog5
-rw-r--r--common.mk5
-rw-r--r--file.c11
-rw-r--r--test/ruby/test_require.rb13
-rw-r--r--version.h8
-rw-r--r--win32/file.c14
6 files changed, 46 insertions, 10 deletions
diff --git a/ChangeLog b/ChangeLog
index fca0c652c1..5b634e4c55 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Fri Jul 3 17:44:27 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * file.c (rb_file_load_ok): try opening file without gvl not to
+ lock entire process. [Bug #11060]
+
Tue Jun 30 11:56:24 2015 Eric Wong <e@80x24.org>
* numeric.c (bit_coerce): use original value for error message
diff --git a/common.mk b/common.mk
index 6508c4c023..d2a4edd2a7 100644
--- a/common.mk
+++ b/common.mk
@@ -678,7 +678,7 @@ load.$(OBJEXT): {$(VPATH)}load.c {$(VPATH)}eval_intern.h \
{$(VPATH)}dln.h {$(VPATH)}internal.h $(PROBES_H_INCLUDES) {$(VPATH)}vm_opts.h
file.$(OBJEXT): {$(VPATH)}file.c $(RUBY_H_INCLUDES) {$(VPATH)}io.h \
$(ENCODING_H_INCLUDES) {$(VPATH)}util.h {$(VPATH)}dln.h \
- {$(VPATH)}internal.h
+ {$(VPATH)}internal.h {$(VPATH)}thread.h
gc.$(OBJEXT): {$(VPATH)}gc.c $(RUBY_H_INCLUDES) {$(VPATH)}re.h \
{$(VPATH)}regex.h $(ENCODING_H_INCLUDES) $(VM_CORE_H_INCLUDES) \
{$(VPATH)}gc.h {$(VPATH)}io.h {$(VPATH)}eval_intern.h {$(VPATH)}util.h \
@@ -835,7 +835,8 @@ utf_8.$(OBJEXT): {$(VPATH)}utf_8.c {$(VPATH)}regenc.h {$(VPATH)}config.h \
win32/win32.$(OBJEXT): {$(VPATH)}win32/win32.c {$(VPATH)}dln.h {$(VPATH)}dln_find.c \
{$(VPATH)}internal.h $(RUBY_H_INCLUDES) $(PLATFORM_D)
-win32/file.$(OBJEXT): {$(VPATH)}win32/file.c $(RUBY_H_INCLUDES) $(PLATFORM_D)
+win32/file.$(OBJEXT): {$(VPATH)}win32/file.c {$(VPATH)}thread.h \
+ $(RUBY_H_INCLUDES) $(PLATFORM_D)
$(NEWLINE_C): $(srcdir)/enc/trans/newline.trans $(srcdir)/tool/transcode-tblgen.rb
$(Q) $(BASERUBY) "$(srcdir)/tool/transcode-tblgen.rb" -vo $@ $(srcdir)/enc/trans/newline.trans
diff --git a/file.c b/file.c
index e9e2dd1340..dc8f9021d4 100644
--- a/file.c
+++ b/file.c
@@ -26,6 +26,7 @@
#include "ruby/ruby.h"
#include "ruby/io.h"
#include "ruby/util.h"
+#include "ruby/thread.h"
#include "dln.h"
#include "internal.h"
@@ -5384,6 +5385,12 @@ 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);
+}
+
#ifdef __native_client__
__attribute__((noinline))
#endif
@@ -5391,7 +5398,9 @@ 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
diff --git a/test/ruby/test_require.rb b/test/ruby/test_require.rb
index 2bdad8f981..44bcfc6343 100644
--- a/test/ruby/test_require.rb
+++ b/test/ruby/test_require.rb
@@ -687,4 +687,17 @@ class TestRequire < Test::Unit::TestCase
INPUT
}
end
+
+ def test_loading_fifo_threading
+ Tempfile.create(%w'fifo .rb') {|f|
+ f.close
+ File.unlink(f.path)
+ File.mkfifo(f.path)
+ assert_separately(["-", f.path], <<-END, timeout: 3)
+ th = Thread.current
+ Thread.start {begin sleep(0.001) end until th.stop?; th.raise(IOError)}
+ assert_raise(IOError) {load(ARGV[0])}
+ END
+ }
+ end unless /mswin|mingw/ =~ RUBY_PLATFORM
end
diff --git a/version.h b/version.h
index 1374e308c3..6749f7cd5e 100644
--- a/version.h
+++ b/version.h
@@ -1,10 +1,10 @@
#define RUBY_VERSION "2.1.7"
-#define RUBY_RELEASE_DATE "2015-06-30"
-#define RUBY_PATCHLEVEL 369
+#define RUBY_RELEASE_DATE "2015-07-03"
+#define RUBY_PATCHLEVEL 370
#define RUBY_RELEASE_YEAR 2015
-#define RUBY_RELEASE_MONTH 6
-#define RUBY_RELEASE_DAY 30
+#define RUBY_RELEASE_MONTH 7
+#define RUBY_RELEASE_DAY 3
#include "ruby/version.h"
diff --git a/win32/file.c b/win32/file.c
index d0e0864b3f..de66e8cb95 100644
--- a/win32/file.c
+++ b/win32/file.c
@@ -1,5 +1,6 @@
#include "ruby/ruby.h"
#include "ruby/encoding.h"
+#include "ruby/thread.h"
#include "internal.h"
#include <winbase.h>
#include <wchar.h>
@@ -670,6 +671,14 @@ rb_file_expand_path_internal(VALUE fname, VALUE dname, int abs_mode, int long_na
return result;
}
+static void *
+loadopen_func(void *wpath)
+{
+ return (void *)CreateFileW(wpath, GENERIC_READ,
+ FILE_SHARE_READ | FILE_SHARE_WRITE,
+ NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
+}
+
int
rb_file_load_ok(const char *path)
{
@@ -686,9 +695,8 @@ rb_file_load_ok(const char *path)
ret = 0;
}
else {
- HANDLE h = CreateFileW(wpath, GENERIC_READ,
- FILE_SHARE_READ | FILE_SHARE_WRITE,
- NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
+ HANDLE h = (HANDLE)rb_thread_call_without_gvl(loadopen_func, (void *)wpath,
+ RUBY_UBF_IO, 0);
if (h != INVALID_HANDLE_VALUE) {
CloseHandle(h);
}