@@ -62,7 +62,7 @@ cfg_if! {
6262 pub use std:: cell:: RefMut as WriteGuard ;
6363 pub use std:: cell:: RefMut as LockGuard ;
6464
65- pub use std:: cell:: RefCell as RwLock ;
65+ use std:: cell:: RefCell as InnerRwLock ;
6666 use std:: cell:: RefCell as InnerLock ;
6767
6868 use std:: cell:: Cell ;
@@ -159,13 +159,12 @@ cfg_if! {
159159
160160 pub use parking_lot:: MutexGuard as LockGuard ;
161161
162- use parking_lot;
163-
164162 pub use std:: sync:: Arc as Lrc ;
165163
166164 pub use self :: Lock as MTLock ;
167165
168166 use parking_lot:: Mutex as InnerLock ;
167+ use parking_lot:: RwLock as InnerRwLock ;
169168
170169 pub type MetadataRef = OwningRef <Box <Erased + Send + Sync >, [ u8 ] >;
171170
@@ -222,42 +221,6 @@ cfg_if! {
222221 self . 0 . lock( ) . take( )
223222 }
224223 }
225-
226- #[ derive( Debug ) ]
227- pub struct RwLock <T >( parking_lot:: RwLock <T >) ;
228-
229- impl <T > RwLock <T > {
230- #[ inline( always) ]
231- pub fn new( inner: T ) -> Self {
232- RwLock ( parking_lot:: RwLock :: new( inner) )
233- }
234-
235- #[ inline( always) ]
236- pub fn borrow( & self ) -> ReadGuard <T > {
237- if ERROR_CHECKING {
238- self . 0 . try_read( ) . expect( "lock was already held" )
239- } else {
240- self . 0 . read( )
241- }
242- }
243-
244- #[ inline( always) ]
245- pub fn borrow_mut( & self ) -> WriteGuard <T > {
246- if ERROR_CHECKING {
247- self . 0 . try_write( ) . expect( "lock was already held" )
248- } else {
249- self . 0 . write( )
250- }
251- }
252- }
253-
254- // FIXME: Probably a bad idea
255- impl <T : Clone > Clone for RwLock <T > {
256- #[ inline]
257- fn clone( & self ) -> Self {
258- RwLock :: new( self . borrow( ) . clone( ) )
259- }
260- }
261224 }
262225}
263226
@@ -384,6 +347,11 @@ impl<T> Lock<T> {
384347 self . 0 . borrow_mut ( )
385348 }
386349
350+ #[ inline( always) ]
351+ pub fn with_lock < F : FnOnce ( & mut T ) -> R , R > ( & self , f : F ) -> R {
352+ f ( & mut * self . lock ( ) )
353+ }
354+
387355 #[ inline( always) ]
388356 pub fn borrow ( & self ) -> LockGuard < T > {
389357 self . lock ( )
@@ -402,3 +370,83 @@ impl<T: Clone> Clone for Lock<T> {
402370 Lock :: new ( self . borrow ( ) . clone ( ) )
403371 }
404372}
373+
374+ #[ derive( Debug ) ]
375+ pub struct RwLock < T > ( InnerRwLock < T > ) ;
376+
377+ impl < T > RwLock < T > {
378+ #[ inline( always) ]
379+ pub fn new ( inner : T ) -> Self {
380+ RwLock ( InnerRwLock :: new ( inner) )
381+ }
382+
383+ #[ inline( always) ]
384+ pub fn into_inner ( self ) -> T {
385+ self . 0 . into_inner ( )
386+ }
387+
388+ #[ inline( always) ]
389+ pub fn get_mut ( & mut self ) -> & mut T {
390+ self . 0 . get_mut ( )
391+ }
392+
393+ #[ cfg( not( parallel_queries) ) ]
394+ #[ inline( always) ]
395+ pub fn read ( & self ) -> ReadGuard < T > {
396+ self . 0 . borrow ( )
397+ }
398+
399+ #[ cfg( parallel_queries) ]
400+ #[ inline( always) ]
401+ pub fn read ( & self ) -> ReadGuard < T > {
402+ if ERROR_CHECKING {
403+ self . 0 . try_read ( ) . expect ( "lock was already held" )
404+ } else {
405+ self . 0 . read ( )
406+ }
407+ }
408+
409+ #[ inline( always) ]
410+ pub fn with_read_lock < F : FnOnce ( & T ) -> R , R > ( & self , f : F ) -> R {
411+ f ( & * self . read ( ) )
412+ }
413+
414+ #[ cfg( not( parallel_queries) ) ]
415+ #[ inline( always) ]
416+ pub fn write ( & self ) -> WriteGuard < T > {
417+ self . 0 . borrow_mut ( )
418+ }
419+
420+ #[ cfg( parallel_queries) ]
421+ #[ inline( always) ]
422+ pub fn write ( & self ) -> WriteGuard < T > {
423+ if ERROR_CHECKING {
424+ self . 0 . try_write ( ) . expect ( "lock was already held" )
425+ } else {
426+ self . 0 . write ( )
427+ }
428+ }
429+
430+ #[ inline( always) ]
431+ pub fn with_write_lock < F : FnOnce ( & mut T ) -> R , R > ( & self , f : F ) -> R {
432+ f ( & mut * self . write ( ) )
433+ }
434+
435+ #[ inline( always) ]
436+ pub fn borrow ( & self ) -> ReadGuard < T > {
437+ self . read ( )
438+ }
439+
440+ #[ inline( always) ]
441+ pub fn borrow_mut ( & self ) -> WriteGuard < T > {
442+ self . write ( )
443+ }
444+ }
445+
446+ // FIXME: Probably a bad idea
447+ impl < T : Clone > Clone for RwLock < T > {
448+ #[ inline]
449+ fn clone ( & self ) -> Self {
450+ RwLock :: new ( self . borrow ( ) . clone ( ) )
451+ }
452+ }
0 commit comments