@@ -4,7 +4,6 @@ use anyhow::{Context, Result};
4
4
use ignore:: overrides:: OverrideBuilder ;
5
5
use ignore:: { WalkBuilder , WalkState } ;
6
6
use std:: path:: Path ;
7
- use std:: sync:: atomic:: { AtomicU64 , Ordering } ;
8
7
use std:: sync:: { Arc , Mutex } ;
9
8
10
9
/// Determines the disk usage of all files in the given directory.
@@ -40,7 +39,7 @@ fn du_inner(path: &Path, patterns: &[&str]) -> Result<u64> {
40
39
. git_ignore ( false )
41
40
. git_exclude ( false ) ;
42
41
let walker = builder. build_parallel ( ) ;
43
- let total = Arc :: new ( AtomicU64 :: new ( 0 ) ) ;
42
+ let total = Arc :: new ( Mutex :: new ( 0u64 ) ) ;
44
43
// A slot used to indicate there was an error while walking.
45
44
//
46
45
// It is possible that more than one error happens (such as in different
@@ -52,7 +51,8 @@ fn du_inner(path: &Path, patterns: &[&str]) -> Result<u64> {
52
51
Ok ( entry) => match entry. metadata ( ) {
53
52
Ok ( meta) => {
54
53
if meta. is_file ( ) {
55
- total. fetch_add ( meta. len ( ) , Ordering :: SeqCst ) ;
54
+ let mut lock = total. lock ( ) . unwrap ( ) ;
55
+ * lock += meta. len ( ) ;
56
56
}
57
57
}
58
58
Err ( e) => {
@@ -73,5 +73,6 @@ fn du_inner(path: &Path, patterns: &[&str]) -> Result<u64> {
73
73
return Err ( e) ;
74
74
}
75
75
76
- Ok ( total. load ( Ordering :: SeqCst ) )
76
+ let total = * total. lock ( ) . unwrap ( ) ;
77
+ Ok ( total)
77
78
}
0 commit comments