Speed up walkDir significantly

We only know that this works on Linux and Mac OS X, so other systems use
the POSIX conforming version still. This removed the lstat call, which
is especially expensive on NFS filesystems for me.
This commit is contained in:
def 2015-02-24 16:37:54 +01:00
commit 1adebdc767
2 changed files with 20 additions and 3 deletions

View file

@ -70,6 +70,16 @@ const
STDIN_FILENO* = 0 ## File number of stdin; STDIN_FILENO* = 0 ## File number of stdin;
STDOUT_FILENO* = 1 ## File number of stdout; STDOUT_FILENO* = 1 ## File number of stdout;
DT_UNKNOWN* = 0
DT_FIFO* = 1
DT_CHR* = 2
DT_DIR* = 4
DT_BLK* = 6
DT_REG* = 8
DT_LNK* = 10
DT_SOCK* = 12
DT_WHT* = 14
type type
TDIR* {.importc: "DIR", header: "<dirent.h>", TDIR* {.importc: "DIR", header: "<dirent.h>",
incompleteStruct.} = object incompleteStruct.} = object
@ -84,6 +94,9 @@ type
Tdirent* {.importc: "struct dirent", Tdirent* {.importc: "struct dirent",
header: "<dirent.h>", final, pure.} = object ## dirent_t struct header: "<dirent.h>", final, pure.} = object ## dirent_t struct
d_ino*: Tino ## File serial number. d_ino*: Tino ## File serial number.
d_off*: TOff
d_reclen*: cshort
d_type*: int8
d_name*: array [0..255, char] ## Name of entry. d_name*: array [0..255, char] ## Name of entry.
Tflock* {.importc: "struct flock", final, pure, Tflock* {.importc: "struct flock", final, pure,

View file

@ -1299,10 +1299,14 @@ iterator walkDir*(dir: string): tuple[kind: PathComponent, path: string] {.
if y != "." and y != "..": if y != "." and y != "..":
var s: TStat var s: TStat
y = dir / y y = dir / y
if lstat(y, s) < 0'i32: break
var k = pcFile var k = pcFile
if S_ISDIR(s.st_mode): k = pcDir when defined(linux) or defined(macosx):
if S_ISLNK(s.st_mode): k = succ(k) if x.d_type == DT_DIR: k = pcDir
if x.d_type == DT_LNK: k = succ(k)
else:
if lstat(y, s) < 0'i32: break
if S_ISDIR(s.st_mode): k = pcDir
if S_ISLNK(s.st_mode): k = succ(k)
yield (k, y) yield (k, y)
discard closedir(d) discard closedir(d)