@@ -4,7 +4,6 @@ use anyhow::{Context, Result};
44use ignore:: overrides:: OverrideBuilder ;
55use ignore:: { WalkBuilder , WalkState } ;
66use std:: path:: Path ;
7- use std:: sync:: atomic:: { AtomicU64 , Ordering } ;
87use std:: sync:: { Arc , Mutex } ;
98
109/// Determines the disk usage of all files in the given directory.
@@ -40,7 +39,7 @@ fn du_inner(path: &Path, patterns: &[&str]) -> Result<u64> {
4039 . git_ignore ( false )
4140 . git_exclude ( false ) ;
4241 let walker = builder. build_parallel ( ) ;
43- let total = Arc :: new ( AtomicU64 :: new ( 0 ) ) ;
42+ let total = Arc :: new ( Mutex :: new ( 0u64 ) ) ;
4443 // A slot used to indicate there was an error while walking.
4544 //
4645 // 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> {
5251 Ok ( entry) => match entry. metadata ( ) {
5352 Ok ( meta) => {
5453 if meta. is_file ( ) {
55- total. fetch_add ( meta. len ( ) , Ordering :: SeqCst ) ;
54+ let mut lock = total. lock ( ) . unwrap ( ) ;
55+ * lock += meta. len ( ) ;
5656 }
5757 }
5858 Err ( e) => {
@@ -73,5 +73,6 @@ fn du_inner(path: &Path, patterns: &[&str]) -> Result<u64> {
7373 return Err ( e) ;
7474 }
7575
76- Ok ( total. load ( Ordering :: SeqCst ) )
76+ let total = * total. lock ( ) . unwrap ( ) ;
77+ Ok ( total)
7778}
0 commit comments