From 0b0e71ba2b3ff71d616adaf20470ac9658d30bd6 Mon Sep 17 00:00:00 2001 From: normal Date: Mon, 30 Oct 2017 23:47:27 +0000 Subject: dir: Dir.chdir releases GVL chdir(2) is subject to all the pathological slowdowns and caveats as open(2) on slow or unreliable filesystems, so ensure other threads can proceed while this is happening. * dir.c (nogvl_chdir): new function * dir.c (dir_chdir): release GVL git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@60583 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- dir.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) (limited to 'dir.c') diff --git a/dir.c b/dir.c index 2c0ff03c53..f8bdf1dfb5 100644 --- a/dir.c +++ b/dir.c @@ -967,10 +967,22 @@ dir_close(VALUE dir) return Qnil; } +static void * +nogvl_chdir(void *ptr) +{ + const char *path = ptr; + + return (void *)(VALUE)chdir(path); +} + static void dir_chdir(VALUE path) { - if (chdir(RSTRING_PTR(path)) < 0) + int r; + char *p = RSTRING_PTR(path); + + r = (int)(VALUE)rb_thread_call_without_gvl(nogvl_chdir, p, RUBY_UBF_IO, 0); + if (r < 0) rb_sys_fail_path(path); } -- cgit v1.2.3