diff options
author | normal <normal@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2017-10-30 23:47:27 +0000 |
---|---|---|
committer | normal <normal@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2017-10-30 23:47:27 +0000 |
commit | 0b0e71ba2b3ff71d616adaf20470ac9658d30bd6 (patch) | |
tree | 44f4723756a15cded7aa1ab6fc14f8a6ddbe11ff /dir.c | |
parent | fecb9f8d8879830c9e7d9a06c20c4cf924812542 (diff) | |
download | ruby-0b0e71ba2b3ff71d616adaf20470ac9658d30bd6.tar.gz |
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
Diffstat (limited to 'dir.c')
-rw-r--r-- | dir.c | 14 |
1 files changed, 13 insertions, 1 deletions
@@ -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); } |