aboutsummaryrefslogtreecommitdiffstats
path: root/dir.c
Commit message (Collapse)AuthorAgeFilesLines
* fix "initialize miss".ko12018-09-261-0/+1
| | | | | | | | * dir.c (glob_helper): initialize `args.pathtype`. missed at r64810. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@64849 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* dir.c: fix glob with recursive and braceshirosaki2018-09-251-17/+5
| | | | | | | | Fixed bug that glob with recursive and braces (**/{a,b}) pattern fails. [Feature #13167] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@64836 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* dir.c: fix memory leak of glob with bracesshirosaki2018-09-251-5/+25
| | | | | | | join_path uses malloc. So free is required. [Feature #13167] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@64835 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* dir.c: performance fix with bracesshirosaki2018-09-221-30/+138
| | | | | | | | | | | Braces were expended before ruby_glob0(). This caused to call replace_real_basename() for same plain patterns repeatedly. Move blace expansion into glob_helper() in ruby_glob0() to reduce replace_real_basename() call. This fix changes the order of glob results. [Feature #13167] [Fix GH-1864] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@64810 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* Suppress more -Wparentheses warningsnobu2018-09-211-1/+1
| | | | | | [Fix GH-1958] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@64808 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* dir.c: fix glob with base when no DT_UNKNOWNnobu2018-07-261-16/+25
| | | | | | | | | | * dir.c (do_stat, do_lstat, do_opendir): need the length of the base path for fstatat() when fd is valid. * dir.c (glob_helper): fix for platforms where DT_UNKNOWN is not available, e.g. Solaris. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@64067 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* Revert "dir.c: fix glob with base when no DT_UNKNOWN"naruse2018-07-241-7/+7
| | | | | | | This reverts commit r63982. It breaks build on Solaris 11. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@64038 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* dir.c: fix glob with base when no DT_UNKNOWNnobu2018-07-171-7/+7
| | | | | | | | | | * dir.c (do_stat, do_lstat): need the length of the base path for fstatat() when fd is valid. * dir.c (glob_helper): fix for platforms where DT_UNKNOWN is not available, e.g. Solaris. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@63982 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* dir.c: fix directory globnobu2018-07-091-3/+4
| | | | | | | | | * dir.c (glob_helper): fix directory glob which resulted in lacking the first byte. adjust the length of basename to be appended as well as removing the heading path, not the length of the joined path. [ruby-dev:50588] [Bug #14899] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@63909 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* dir.c: define O_CLOEXEC for older systemsnormal2018-06-221-0/+4
| | | | | | | | | | SuSE 10 has openat(), but not O_CLOEXEC Reported-by: wangpeiwen [ruby-core:87591] [Bug #14864] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@63720 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* dir.c: warning for NULnobu2018-04-191-0/+5
| | | | | | | * dir.c (rb_push_glob): warn NUL-separated glob patterns. [Feature #14643] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@63190 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* [DOC] `*` in glob matches `\n` too [ci skip]kazu2018-04-081-1/+1
| | | | | | | | | | ``` File.fnmatch("a*b", "a\nb") # => true /\Aa.*b\z/x.match?("a\nb") # => false /\Aa.*b\z/mx.match?("a\nb") # => true ``` git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@63115 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* dir.c: Dir.glob examplenobu2018-03-301-0/+1
| | | | | | | * dir.c (dir_s_glob): [DOC] added an example of Dir.glob using pattern list. [ci skip] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@63041 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* dir.c: do not assume NUL terminatornobu2018-03-291-10/+13
| | | | | | | * dir.c (rb_push_glob): do not assume string is NUL terminated always, shared substring may not in the future. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@63034 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* dir.c: check NUL bytesnobu2018-03-281-14/+12
| | | | | | | | | | * dir.c (GlobPathValue): should be used in rb_push_glob only. other methods should use FilePathValue. https://hackerone.com/reports/302338 * dir.c (rb_push_glob): expand GlobPathValue git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@62989 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* [DOC] missing docs at toplevelnobu2018-02-231-0/+31
| | | | git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@62544 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* dir.c: Dir#each_childnobu2018-01-241-0/+9
| | | | | | | * dir.c (dir_each_child_m): new instance methods Dir#each_child and Dir#children. [Feature #13969] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@62022 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* use predefined IDskazu2018-01-221-1/+2
| | | | git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@62008 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* dir_closed marked as NORETURNshyouhei2018-01-181-0/+2
| | | | git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@61914 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* dir.c: pass flags to openat(2) correctlynormal2018-01-101-2/+2
| | | | | | | | | | | Flags are 3rd argument of openat(2) while the 4th argument (mode_t) is unnecessary for our uses. This bug exists since Ruby 2.5 from r58860 and was discoverd by strace. * dir.c (nogvl_opendir_at): use openat correctly [Feature #13056] [Feature #14346] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@61754 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* internal.h: remove dependecy on ruby/encoding.hnobu2018-01-091-1/+2
| | | | git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@61713 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* support 128bit ino on Windows (if available)usa2017-12-101-2/+2
| | | | | | | | | | | | | | | * win32/win32.c, include/ruby/win32.h (stati128, rb_{,u,l,ul}stati128): rename from stati64ns, change the type of st_ino to 64bit and added st_inohigh. * dir.c, file.c (stat, lstat): follow above changes. * file.c (rb_stat_ino): support 128bit ino. * win32/win32.c (rb_{,u,l,ul}stati128): ditto. [Feature #13731] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@61096 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* Dir#chdir keeps GVL if passed blocknormal2017-12-091-6/+8
| | | | | | | | | | | | | | | | | | On further examination, Dir.chdir with a block from multiple threads is thread-unsafe given our use of the chdir_blocking and chdir_thread global variables. This bug was only introduced in r60583 so not part of any stable release. Dir.chdir without a block can still make senses in a MT context as only one thread could be cwd-sensitive and other threads do not care which directory they're in. * dir.c (dir_chdir): keep GVL here (dir_s_chdir): release GVL if no block given git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@61091 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* support nanosec file timestamp on newer Windowsusa2017-12-041-2/+2
| | | | | | | | | | | | | Support nanosec file timestamp on Windows 8 or later. Original patches are written by kubo (Kubo Takehiro). Windows 7 and earlier also supports nanosec file timestamp, but it's too accurate than system time. so, this feature is disabled on such versions. [Feature #13726] this change also includes [Misc #13702] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@61013 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* util.h: remove my_getcwdnobu2017-11-261-1/+1
| | | | git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@60908 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* Use `const void*` instead of `const char*`kazu2017-11-211-1/+1
| | | | | | | Use cast from `char*` to `void*` instead of union in opendir_without_gvl, because convert from `void*` to `char*` without union in nogvl_opendir. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@60875 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* Cannot call rb_thread_call_with{out,}_gvl before running VMusa2017-11-181-5/+17
| | | | | | | | | * dir.c (opendir_without_gvl, with_gvl_gc_for_fd, opendir_at): check the VM is already initialized before calling rb_thread_call_with{out,}_gvl(). [Bug #14115] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@60837 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* dir.c: openat calls release GVL, toonormal2017-11-181-42/+77
| | | | | | | | | | | | | | | openat(2) also performs a path lookup, so it is also subject to pathological slowdowns like opendir(3) and open(2) syscalls. * dir.c (struct opendir_at_arg): new struct for callback (with_gvl_gc_for_fd): new callback for rb_thread_call_with_gvl (gc_for_fd_with_gvl): moved up (nogvl_opendir_at): extracted from do_opendir (opendir_at): new wrapper to release GVL for opendir_at (do_opendir): use new wrappers to release GVL (nogvl_dir_empty_p): adjust for gc_for_fd_with_gvl git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@60831 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* dir: release GVL on opendirnormal2017-11-181-5/+23
| | | | | | | | | | | | | opendir(3) is subject to the same pathological slowdowns on slow or unreliable filesystems as open(2), so release the GVL to avoid stalling the entire VM like we do with IO#open * dir.c (nogvl_opendir): new function (opendir_without_gvl): new function (dir_initialize): s/opendir/&_without_gvl/ (do_opendir): ditto git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@60830 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* dir.c: revert r60772, r60770, and r60769normal2017-11-151-30/+11
| | | | | | | | | | | | | | | | | Using readdir(3) without any locking causes thread-safety problems if directory streams get shared between threads. On ancient platforms, readdir(3) may have thread-safety problems even on different directory streams. Using readdir_r(3) is not viable, either, as it's deprecated due to name overflow problems. So for now, rely on GVL as in previous Rubies and perhaps consider per-"struct dir_data" mutexes for modern platforms which allow concurrent calls to readdir(3) on different directory streams. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@60774 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* Cannot call rb_thread_call_without_gvl before running VMusa2017-11-151-5/+4
| | | | | | | | | * dir.c (readdir_without_gvl): check the VM is already initialized before calling rb_thread_call_without_gvl(). [Bug #14108] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@60772 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* nogvl readdir make SEGV on Windowsusa2017-11-151-0/+4
| | | | | | | * dir.c (readdir_without_gvl): workaround for Windows. [Bug #14108] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@60770 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* dir.c: release GVL around remaining readdir callsnormal2017-11-141-11/+27
| | | | | | | | | | | | | | | | | | | | | Release GVL around all remaining readdir calls from the Dir class to prevent pathological stalls on slow filesystems in multi-threaded applications. opendir, rewinddir, closedir calls are not affected yet, but will be changed in future commits. In the future, further work may be done consolidate multiple GVL releasing calls to reduce overhead, similar to how changes to Dir.empty? were made in r60111 * dir.c (nogvl_readdir): new function (readdir_without_gvl): ditto (dir_read): s/READDIR/readdir_without_gvl/ (dir_each_entry): ditto (glob_helper): ditto git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@60769 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* dir.c: cast to suppress a warningnobu2017-11-011-1/+1
| | | | git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@60597 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* dir: Dir.mkdir and Dir.rmdir release GVLnormal2017-11-011-5/+34
| | | | | | | | | | | | | | This avoids blocking the entire VM when operating on slow or unreliable filesystems. Instead, only the thread performing the mkdir or rmdir operation is blocked and other threads are free to proceed. * dir.c (nogvl_mkdir): new function (nogvl_rmdir): ditto (dir_s_mkdir): release GVL (dir_s_rmdir): ditto git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@60595 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* use mode_t where applicable (instead of int)normal2017-10-311-2/+2
| | | | | | | | | | | | | | | | mode_t is the correct type for these syscalls and it can be easier-to-understand. It may also help portability to future platforms and improve type checking. * dir.c (dir_s_mkdir): use mode_t for mkdir(2) * file.c (chmod_internal): use mode_t for chmod(2) (rb_file_s_chmod): s/int/mode_t/ (lchmod_internal): ditto, deref pointer as in chmod_internal (rb_file_s_lchmod): pass pointer as in rb_file_s_chmod (rb_file_s_rename): use mode_t for umask(2) git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@60592 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* dir: Dir.chdir releases GVLnormal2017-10-301-1/+13
| | | | | | | | | | | | 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
* Revert "Dir.glob with FNM_EXTGLOB is optimized [Feature #13873]"naruse2017-10-271-82/+10
| | | | | | | | This reverts commit r60341,r60342,r60344,r60345. Breaking compabitility of the order of result breaks many tests. To avoid such effort to fix tests, the order should be kept. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@60478 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* Drop to support NaCl platform.hsbt2017-10-231-4/+0
| | | | | | | | | | | Because NaCl and PNaCl are already sunset status. see https://bugs.chromium.org/p/chromium/issues/detail?id=239656#c160 configure.ac: Patch for this file was provided by @nobu. [Feature #14041][ruby-core:83497][fix GH-1726] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@60374 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* dir.c: adjust indent [ci skip]nobu2017-10-221-44/+45
| | | | git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@60345 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* Dir.glob with FNM_EXTGLOB is optimized [Feature #13873]naruse2017-10-221-10/+81
| | | | | | The order of resulted array is changed in some cases. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@60341 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* Revert "ignore server side error"naruse2017-10-211-76/+8
| | | | | | This reverts commit r60314. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@60315 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* ignore server side errornaruse2017-10-211-8/+76
| | | | git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@60314 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* Revert "Dir.glob with FNM_EXTGLOB is optimized [Feature #13873]"naruse2017-10-211-76/+8
| | | | | | This reverts commit r60253 because it causes on error on Linux. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@60255 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* Dir.glob with FNM_EXTGLOB is optimized [Feature #13873]naruse2017-10-211-8/+76
| | | | | | The order of resulted array is changed in some cases. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@60253 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* Get rid of shadowing local variablesnobu2017-10-181-2/+2
| | | | git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@60204 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* Dir.empty? releases GVLnormal2017-10-041-24/+48
| | | | | | | | | | | | | | | | | | | | | | | | | | This converts all slow syscalls in the Dir.empty? implementation to release GVL. We avoid unnecessarily GVL release and reacquire for each slow call (opendir, readdir, closedir) and instead only release and acquire the GVL once in the common case. Benchmark results show a small degradation in single-threaded performance: Execution time (sec) name trunk built dir_empty_p 0.689 0.758 Speedup ratio: compare with the result of `trunk' (greater is better) name built dir_empty_p 0.909 * dir.c (rb_gc_for_fd_with_gvl): new function (nogvl_dir_empty_p): ditto (dir_s_empty_p): use new functions to release GVL * benchmark/bm_dir_empty_p.rb: new benchmark [ruby-core:83071] [Feature #13958] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@60111 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* dir.c: fix up r59527nobu2017-08-081-1/+2
| | | | | | | | * dir.c (glob_helper): fix up r59527, dot files other than current directory should not be included unless FNM_DOTMATCH is given. [ruby-core:82266] [Bug #13785] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@59529 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* dir.c: fix up r59481 for old kernelsnobu2017-08-081-6/+10
| | | | | | | | * dir.c (glob_helper): fix up r59481 for old kernels, which provide d_type member but just always set DT_UNKNOWN for any entries. [ruby-core:82266] [Bug #13785] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@59527 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* dir.c: reduce syscallsnobu2017-08-031-6/+4
| | | | | | | | * dir.c (glob_helper): utilize d_type even if no recursive pattern, to reduce stat/lstat syscalls in subsequent glob_helper. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@59481 b2dd03c8-39d4-4d8f-98ff-823fe69b080e