55
66use crate :: error:: FileError ;
77use crate :: file_util:: * ;
8- use fd_lock:: { FdLock , FdLockGuard } ;
8+ use fd_lock:: { RwLock , RwLockWriteGuard } ;
99use std:: os:: windows:: fs:: OpenOptionsExt ;
1010use std:: path:: PathBuf ;
1111use std:: { borrow:: Cow , io:: ErrorKind } ;
@@ -18,13 +18,13 @@ use winapi::um::{
1818 winnt:: { FILE_ATTRIBUTE_HIDDEN , FILE_ATTRIBUTE_TEMPORARY } ,
1919} ;
2020
21- /// Wrapper for fd_lock::FdLock . Used to lock files/directories to prevent concurrent access
21+ /// Wrapper for fd_lock::RwLock . Used to lock files/directories to prevent concurrent access
2222/// from multiple instances of tmc-langs.
2323pub struct FileLock {
2424 path : PathBuf ,
2525 // this is re-set in every lock command if the target is a file
2626 // ideally it would be set to none when the guard is dropped, but doing so is probably not worth the trouble
27- lock : Option < FdLock < File > > ,
27+ lock : Option < RwLock < File > > ,
2828}
2929
3030impl FileLock {
@@ -42,12 +42,12 @@ impl FileLock {
4242 if self . path . is_file ( ) {
4343 // for files, just use the path
4444 let file = open_file ( & self . path ) ?;
45- let lock = FdLock :: new ( file) ;
45+ let lock = RwLock :: new ( file) ;
4646 self . lock = Some ( lock) ;
4747 let lock = self . lock . as_mut ( ) . expect ( "set to Some before this call" ) ;
48- let guard = lock. lock ( ) . expect ( "cannot fail on Windows" ) ;
48+ let guard = lock. write ( ) . expect ( "cannot fail on Windows" ) ;
4949 Ok ( FileLockGuard {
50- _guard : LockInner :: FdLockGuard ( guard) ,
50+ _guard : LockInner :: RwLockWriteGuard ( guard) ,
5151 path : Cow :: Borrowed ( & self . path ) ,
5252 } )
5353 } else if self . path . is_dir ( ) {
@@ -123,7 +123,7 @@ pub struct FileLockGuard<'a> {
123123
124124enum LockInner < ' a > {
125125 LockFile ( File ) ,
126- FdLockGuard ( FdLockGuard < ' a , File > ) ,
126+ RwLockWriteGuard ( RwLockWriteGuard < ' a , File > ) ,
127127}
128128
129129impl Drop for FileLockGuard < ' _ > {
@@ -155,7 +155,7 @@ mod test {
155155 let mutex = Arc :: new ( Mutex :: new ( vec ! [ ] ) ) ;
156156
157157 // take file lock and then mutex
158- let guard = lock. lock ( ) . unwrap ( ) ;
158+ let guard = lock. write ( ) . unwrap ( ) ;
159159 let mut mguard = mutex. try_lock ( ) . unwrap ( ) ;
160160
161161 let handle = {
@@ -165,7 +165,7 @@ mod test {
165165 std:: thread:: spawn ( move || {
166166 // if the file lock doesn't block, the mutex lock will panic and the test will fail
167167 let mut lock = FileLock :: new ( temp_path) . unwrap ( ) ;
168- let _guard = lock. lock ( ) . unwrap ( ) ;
168+ let _guard = lock. write ( ) . unwrap ( ) ;
169169 mutex. try_lock ( ) . unwrap ( ) . push ( 1 ) ;
170170 } )
171171 } ;
@@ -191,7 +191,7 @@ mod test {
191191 let mutex = Arc :: new ( Mutex :: new ( vec ! [ ] ) ) ;
192192
193193 // take file lock and mutex
194- let guard = lock. lock ( ) . unwrap ( ) ;
194+ let guard = lock. write ( ) . unwrap ( ) ;
195195 let mut mguard = mutex. try_lock ( ) . unwrap ( ) ;
196196
197197 let handle = {
@@ -201,7 +201,7 @@ mod test {
201201 std:: thread:: spawn ( move || {
202202 // if the file lock doesn't block, the mutex lock will panic and the test will fail
203203 let mut lock = FileLock :: new ( temp_path) . unwrap ( ) ;
204- let _guard = lock. lock ( ) . unwrap ( ) ;
204+ let _guard = lock. write ( ) . unwrap ( ) ;
205205 mutex. try_lock ( ) . unwrap ( ) . push ( 1 ) ;
206206 } )
207207 } ;
@@ -225,7 +225,7 @@ mod test {
225225 let mut lock = FileLock :: new ( temp. path ( ) . to_path_buf ( ) ) . unwrap ( ) ;
226226 let lock_path = temp. path ( ) . join ( ".tmc.lock" ) ;
227227 assert ! ( !lock_path. exists( ) ) ;
228- let guard = lock. lock ( ) . unwrap ( ) ;
228+ let guard = lock. write ( ) . unwrap ( ) ;
229229 assert ! ( lock_path. exists( ) ) ;
230230 drop ( guard) ;
231231 assert ! ( !lock_path. exists( ) ) ;
0 commit comments