Skip to content

Commit dffe87c

Browse files
committed
merge revision(s) 50887,50896,50902: [Backport ruby#11060]
* file.c (rb_file_load_ok): try opening file without gvl not to lock entire process. [Bug ruby#11060] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_1@51118 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
1 parent ee15197 commit dffe87c

File tree

6 files changed

+46
-10
lines changed

6 files changed

+46
-10
lines changed

ChangeLog

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
Fri Jul 3 17:44:27 2015 Nobuyoshi Nakada <[email protected]>
2+
3+
* file.c (rb_file_load_ok): try opening file without gvl not to
4+
lock entire process. [Bug #11060]
5+
16
Tue Jun 30 11:56:24 2015 Eric Wong <[email protected]>
27

38
* numeric.c (bit_coerce): use original value for error message

common.mk

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -678,7 +678,7 @@ load.$(OBJEXT): {$(VPATH)}load.c {$(VPATH)}eval_intern.h \
678678
{$(VPATH)}dln.h {$(VPATH)}internal.h $(PROBES_H_INCLUDES) {$(VPATH)}vm_opts.h
679679
file.$(OBJEXT): {$(VPATH)}file.c $(RUBY_H_INCLUDES) {$(VPATH)}io.h \
680680
$(ENCODING_H_INCLUDES) {$(VPATH)}util.h {$(VPATH)}dln.h \
681-
{$(VPATH)}internal.h
681+
{$(VPATH)}internal.h {$(VPATH)}thread.h
682682
gc.$(OBJEXT): {$(VPATH)}gc.c $(RUBY_H_INCLUDES) {$(VPATH)}re.h \
683683
{$(VPATH)}regex.h $(ENCODING_H_INCLUDES) $(VM_CORE_H_INCLUDES) \
684684
{$(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 \
835835

836836
win32/win32.$(OBJEXT): {$(VPATH)}win32/win32.c {$(VPATH)}dln.h {$(VPATH)}dln_find.c \
837837
{$(VPATH)}internal.h $(RUBY_H_INCLUDES) $(PLATFORM_D)
838-
win32/file.$(OBJEXT): {$(VPATH)}win32/file.c $(RUBY_H_INCLUDES) $(PLATFORM_D)
838+
win32/file.$(OBJEXT): {$(VPATH)}win32/file.c {$(VPATH)}thread.h \
839+
$(RUBY_H_INCLUDES) $(PLATFORM_D)
839840

840841
$(NEWLINE_C): $(srcdir)/enc/trans/newline.trans $(srcdir)/tool/transcode-tblgen.rb
841842
$(Q) $(BASERUBY) "$(srcdir)/tool/transcode-tblgen.rb" -vo $@ $(srcdir)/enc/trans/newline.trans

file.c

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
#include "ruby/ruby.h"
2727
#include "ruby/io.h"
2828
#include "ruby/util.h"
29+
#include "ruby/thread.h"
2930
#include "dln.h"
3031
#include "internal.h"
3132

@@ -5384,14 +5385,22 @@ rb_path_check(const char *path)
53845385
}
53855386

53865387
#ifndef _WIN32
5388+
static void *
5389+
loadopen_func(void *arg)
5390+
{
5391+
return (void *)(VALUE)rb_cloexec_open((const char *)arg, O_RDONLY, 0);
5392+
}
5393+
53875394
#ifdef __native_client__
53885395
__attribute__((noinline))
53895396
#endif
53905397
int
53915398
rb_file_load_ok(const char *path)
53925399
{
53935400
int ret = 1;
5394-
int fd = rb_cloexec_open(path, O_RDONLY, 0);
5401+
int fd;
5402+
5403+
fd = (int)(VALUE)rb_thread_call_without_gvl(loadopen_func, (void *)path, RUBY_UBF_IO, 0);
53955404
if (fd == -1) return 0;
53965405
rb_update_max_fd(fd);
53975406
#if !defined DOSISH

test/ruby/test_require.rb

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -687,4 +687,17 @@ def test_require_with_loaded_features_pop
687687
INPUT
688688
}
689689
end
690+
691+
def test_loading_fifo_threading
692+
Tempfile.create(%w'fifo .rb') {|f|
693+
f.close
694+
File.unlink(f.path)
695+
File.mkfifo(f.path)
696+
assert_separately(["-", f.path], <<-END, timeout: 3)
697+
th = Thread.current
698+
Thread.start {begin sleep(0.001) end until th.stop?; th.raise(IOError)}
699+
assert_raise(IOError) {load(ARGV[0])}
700+
END
701+
}
702+
end unless /mswin|mingw/ =~ RUBY_PLATFORM
690703
end

version.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
#define RUBY_VERSION "2.1.7"
2-
#define RUBY_RELEASE_DATE "2015-06-30"
3-
#define RUBY_PATCHLEVEL 369
2+
#define RUBY_RELEASE_DATE "2015-07-03"
3+
#define RUBY_PATCHLEVEL 370
44

55
#define RUBY_RELEASE_YEAR 2015
6-
#define RUBY_RELEASE_MONTH 6
7-
#define RUBY_RELEASE_DAY 30
6+
#define RUBY_RELEASE_MONTH 7
7+
#define RUBY_RELEASE_DAY 3
88

99
#include "ruby/version.h"
1010

win32/file.c

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#include "ruby/ruby.h"
22
#include "ruby/encoding.h"
3+
#include "ruby/thread.h"
34
#include "internal.h"
45
#include <winbase.h>
56
#include <wchar.h>
@@ -670,6 +671,14 @@ rb_file_expand_path_internal(VALUE fname, VALUE dname, int abs_mode, int long_na
670671
return result;
671672
}
672673

674+
static void *
675+
loadopen_func(void *wpath)
676+
{
677+
return (void *)CreateFileW(wpath, GENERIC_READ,
678+
FILE_SHARE_READ | FILE_SHARE_WRITE,
679+
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
680+
}
681+
673682
int
674683
rb_file_load_ok(const char *path)
675684
{
@@ -686,9 +695,8 @@ rb_file_load_ok(const char *path)
686695
ret = 0;
687696
}
688697
else {
689-
HANDLE h = CreateFileW(wpath, GENERIC_READ,
690-
FILE_SHARE_READ | FILE_SHARE_WRITE,
691-
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
698+
HANDLE h = (HANDLE)rb_thread_call_without_gvl(loadopen_func, (void *)wpath,
699+
RUBY_UBF_IO, 0);
692700
if (h != INVALID_HANDLE_VALUE) {
693701
CloseHandle(h);
694702
}

0 commit comments

Comments
 (0)