@@ -3,12 +3,19 @@ use std::io;
3
3
use std:: ops:: { Deref , DerefMut } ;
4
4
use std:: path:: Path ;
5
5
6
+ use crate :: flock:: Lock ;
7
+
6
8
/// A trivial wrapper for [`memmap2::Mmap`] (or `Vec<u8>` on WASM).
7
9
#[ cfg( not( any( miri, target_arch = "wasm32" ) ) ) ]
8
- pub struct Mmap ( memmap2:: Mmap ) ;
10
+ pub struct Mmap {
11
+ map : memmap2:: Mmap ,
12
+ _lock : Option < Lock > ,
13
+ }
9
14
10
15
#[ cfg( any( miri, target_arch = "wasm32" ) ) ]
11
- pub struct Mmap ( Vec < u8 > ) ;
16
+ pub struct Mmap {
17
+ map : Vec < u8 > ,
18
+ }
12
19
13
20
#[ cfg( not( any( miri, target_arch = "wasm32" ) ) ) ]
14
21
impl Mmap {
@@ -19,15 +26,19 @@ impl Mmap {
19
26
/// However in practice most callers do not ensure this, so uses of this function are likely unsound.
20
27
#[ inline]
21
28
pub unsafe fn map ( path : impl AsRef < Path > ) -> io:: Result < Self > {
29
+ let path = path. as_ref ( ) ;
22
30
let file = File :: open ( path) ?;
31
+ let _lock = Some ( Lock :: new ( path, true , false , false ) ?) ;
23
32
// By default, memmap2 creates shared mappings, implying that we could see updates to the
24
33
// file through the mapping. That would violate our precondition; so by requesting a
25
34
// map_copy_read_only we do not lose anything.
26
35
// This mapping mode also improves our support for filesystems such as cacheless virtiofs.
27
36
// For more details see https://github.com/rust-lang/rust/issues/122262
28
37
//
29
38
// SAFETY: The caller must ensure that this is safe.
30
- unsafe { Ok ( Self ( memmap2:: MmapOptions :: new ( ) . map_copy_read_only ( & file) ?) ) }
39
+
40
+ let map = unsafe { memmap2:: MmapOptions :: new ( ) . map_copy_read_only ( & file) ? } ;
41
+ Ok ( Self { _lock, map } )
31
42
}
32
43
}
33
44
@@ -44,13 +55,13 @@ impl Deref for Mmap {
44
55
45
56
#[ inline]
46
57
fn deref ( & self ) -> & [ u8 ] {
47
- & self . 0
58
+ & self . map
48
59
}
49
60
}
50
61
51
62
impl AsRef < [ u8 ] > for Mmap {
52
63
fn as_ref ( & self ) -> & [ u8 ] {
53
- & self . 0
64
+ & self . map
54
65
}
55
66
}
56
67
@@ -75,8 +86,8 @@ impl MmapMut {
75
86
76
87
#[ inline]
77
88
pub fn make_read_only ( self ) -> std:: io:: Result < Mmap > {
78
- let mmap = self . 0 . make_read_only ( ) ?;
79
- Ok ( Mmap ( mmap ) )
89
+ let map = self . 0 . make_read_only ( ) ?;
90
+ Ok ( Mmap { map , _lock : None } )
80
91
}
81
92
}
82
93
@@ -95,7 +106,7 @@ impl MmapMut {
95
106
96
107
#[ inline]
97
108
pub fn make_read_only ( self ) -> std:: io:: Result < Mmap > {
98
- Ok ( Mmap ( self . 0 ) )
109
+ Ok ( Mmap { map : self . 0 } )
99
110
}
100
111
}
101
112
0 commit comments