From 1adebdc7676e44c91daeee24745a63c2019e2ec3 Mon Sep 17 00:00:00 2001 From: def Date: Tue, 24 Feb 2015 16:37:54 +0100 Subject: 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. --- lib/pure/os.nim | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) (limited to 'lib/pure/os.nim') diff --git a/lib/pure/os.nim b/lib/pure/os.nim index ceeba182f..23e01a7d4 100644 --- a/lib/pure/os.nim +++ b/lib/pure/os.nim @@ -1299,10 +1299,14 @@ iterator walkDir*(dir: string): tuple[kind: PathComponent, path: string] {. if y != "." and y != "..": var s: TStat y = dir / y - if lstat(y, s) < 0'i32: break var k = pcFile - if S_ISDIR(s.st_mode): k = pcDir - if S_ISLNK(s.st_mode): k = succ(k) + when defined(linux) or defined(macosx): + 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) discard closedir(d) -- cgit 1.4.1-2-gfad0 From 34d87c105cdb667b40df6c7c3c953d0c9cd6180a Mon Sep 17 00:00:00 2001 From: def Date: Tue, 24 Feb 2015 23:31:31 +0100 Subject: Fall back to lstat() calls on unsupported filesystems --- lib/pure/os.nim | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) (limited to 'lib/pure/os.nim') diff --git a/lib/pure/os.nim b/lib/pure/os.nim index 23e01a7d4..f668e756d 100644 --- a/lib/pure/os.nim +++ b/lib/pure/os.nim @@ -1300,13 +1300,17 @@ iterator walkDir*(dir: string): tuple[kind: PathComponent, path: string] {. var s: TStat y = dir / y var k = pcFile + when defined(linux) or defined(macosx): - 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) + if x.d_type != DT_UNKNOWN: + if x.d_type == DT_DIR: k = pcDir + if x.d_type == DT_LNK: k = succ(k) + yield (k, y) + continue + + 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) discard closedir(d) -- cgit 1.4.1-2-gfad0 From 5e8eaa5f9755a6c8ed73ae0e49d399ac2dd3217c Mon Sep 17 00:00:00 2001 From: def Date: Tue, 24 Feb 2015 23:39:08 +0100 Subject: Use faster walkDir on BSDs --- lib/pure/os.nim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib/pure/os.nim') diff --git a/lib/pure/os.nim b/lib/pure/os.nim index f668e756d..bf581667b 100644 --- a/lib/pure/os.nim +++ b/lib/pure/os.nim @@ -1301,7 +1301,7 @@ iterator walkDir*(dir: string): tuple[kind: PathComponent, path: string] {. y = dir / y var k = pcFile - when defined(linux) or defined(macosx): + when defined(linux) or defined(macosx) or defined(bsd): if x.d_type != DT_UNKNOWN: if x.d_type == DT_DIR: k = pcDir if x.d_type == DT_LNK: k = succ(k) -- cgit 1.4.1-2-gfad0