@@ -160,7 +160,7 @@ pub fn getcwd() -> IoResult<Path> {
160
160
}
161
161
162
162
#[ cfg( windows) ]
163
- pub mod windows {
163
+ pub mod windoze {
164
164
use libc:: types:: os:: arch:: extra:: DWORD ;
165
165
use libc;
166
166
use option:: Option ;
@@ -386,7 +386,7 @@ pub fn getenv_as_bytes(n: &str) -> Option<Vec<u8>> {
386
386
pub fn getenv ( n : & str ) -> Option < String > {
387
387
unsafe {
388
388
with_env_lock ( || {
389
- use os:: windows :: { fill_utf16_buf_and_decode} ;
389
+ use os:: windoze :: { fill_utf16_buf_and_decode} ;
390
390
let mut n: Vec < u16 > = n. utf16_units ( ) . collect ( ) ;
391
391
n. push ( 0 ) ;
392
392
fill_utf16_buf_and_decode ( |buf, sz| {
@@ -715,7 +715,7 @@ pub fn self_exe_name() -> Option<Path> {
715
715
#[ cfg( windows) ]
716
716
fn load_self ( ) -> Option < Vec < u8 > > {
717
717
unsafe {
718
- use os:: windows :: fill_utf16_buf_and_decode;
718
+ use os:: windoze :: fill_utf16_buf_and_decode;
719
719
fill_utf16_buf_and_decode ( |buf, sz| {
720
720
libc:: GetModuleFileNameW ( 0 u as libc:: DWORD , buf, sz)
721
721
} ) . map ( |s| s. into_string ( ) . into_bytes ( ) )
@@ -1215,7 +1215,11 @@ pub enum MapOption {
1215
1215
/// Create a map for a specific address range. Corresponds to `MAP_FIXED` on
1216
1216
/// POSIX.
1217
1217
MapAddr ( * const u8 ) ,
1218
+ /// Create a memory mapping for a file with a given HANDLE.
1219
+ #[ cfg( windows) ]
1220
+ MapFd ( libc:: HANDLE ) ,
1218
1221
/// Create a memory mapping for a file with a given fd.
1222
+ #[ cfg( not( windows) ) ]
1219
1223
MapFd ( c_int ) ,
1220
1224
/// When using `MapFd`, the start of the map is `uint` bytes from the start
1221
1225
/// of the file.
@@ -1413,7 +1417,7 @@ impl MemoryMap {
1413
1417
let mut readable = false ;
1414
1418
let mut writable = false ;
1415
1419
let mut executable = false ;
1416
- let mut fd : c_int = - 1 ;
1420
+ let mut handle : HANDLE = libc :: INVALID_HANDLE_VALUE ;
1417
1421
let mut offset: uint = 0 ;
1418
1422
let len = round_up ( min_len, page_size ( ) ) ;
1419
1423
@@ -1423,23 +1427,23 @@ impl MemoryMap {
1423
1427
MapWritable => { writable = true ; } ,
1424
1428
MapExecutable => { executable = true ; }
1425
1429
MapAddr ( addr_) => { lpAddress = addr_ as LPVOID ; } ,
1426
- MapFd ( fd_ ) => { fd = fd_ ; } ,
1430
+ MapFd ( handle_ ) => { handle = handle_ ; } ,
1427
1431
MapOffset ( offset_) => { offset = offset_; } ,
1428
1432
MapNonStandardFlags ( ..) => { }
1429
1433
}
1430
1434
}
1431
1435
1432
1436
let flProtect = match ( executable, readable, writable) {
1433
- ( false , false , false ) if fd == - 1 => libc:: PAGE_NOACCESS ,
1437
+ ( false , false , false ) if handle == libc :: INVALID_HANDLE_VALUE => libc:: PAGE_NOACCESS ,
1434
1438
( false , true , false ) => libc:: PAGE_READONLY ,
1435
1439
( false , true , true ) => libc:: PAGE_READWRITE ,
1436
- ( true , false , false ) if fd == - 1 => libc:: PAGE_EXECUTE ,
1440
+ ( true , false , false ) if handle == libc :: INVALID_HANDLE_VALUE => libc:: PAGE_EXECUTE ,
1437
1441
( true , true , false ) => libc:: PAGE_EXECUTE_READ ,
1438
1442
( true , true , true ) => libc:: PAGE_EXECUTE_READWRITE ,
1439
1443
_ => return Err ( ErrUnsupProt )
1440
1444
} ;
1441
1445
1442
- if fd == - 1 {
1446
+ if handle == libc :: INVALID_HANDLE_VALUE {
1443
1447
if offset != 0 {
1444
1448
return Err ( ErrUnsupOffset ) ;
1445
1449
}
@@ -1467,7 +1471,7 @@ impl MemoryMap {
1467
1471
// we should never get here.
1468
1472
} ;
1469
1473
unsafe {
1470
- let hFile = libc :: get_osfhandle ( fd ) as HANDLE ;
1474
+ let hFile = handle ;
1471
1475
let mapping = libc:: CreateFileMappingW ( hFile,
1472
1476
ptr:: null_mut ( ) ,
1473
1477
flProtect,
@@ -1991,55 +1995,47 @@ mod tests {
1991
1995
1992
1996
#[ test]
1993
1997
fn memory_map_file ( ) {
1994
- use result:: Result :: { Ok , Err } ;
1995
1998
use os:: * ;
1996
- use libc:: * ;
1997
- use io:: fs;
1998
-
1999
- #[ cfg( unix) ]
2000
- fn lseek_ ( fd : c_int , size : uint ) {
2001
- unsafe {
2002
- assert ! ( lseek( fd, size as off_t, SEEK_SET ) == size as off_t) ;
2003
- }
1999
+ use io:: fs:: { File , unlink} ;
2000
+ use io:: SeekStyle :: SeekSet ;
2001
+ use io:: FileMode :: Open ;
2002
+ use io:: FileAccess :: ReadWrite ;
2003
+ use libc:: HANDLE ;
2004
+
2005
+ #[ cfg( not( windows) ) ]
2006
+ fn get_fd ( file : & File ) -> c_int {
2007
+ use os:: unix:: AsRawFd ;
2008
+ file. as_raw_fd ( )
2004
2009
}
2010
+
2005
2011
#[ cfg( windows) ]
2006
- fn lseek_ ( fd : c_int , size : uint ) {
2007
- unsafe {
2008
- assert ! ( lseek( fd, size as c_long, SEEK_SET ) == size as c_long) ;
2009
- }
2012
+ fn get_fd ( file : & File ) -> HANDLE {
2013
+ use os:: windows:: AsRawHandle ;
2014
+ file. as_raw_handle ( )
2010
2015
}
2011
2016
2012
2017
let mut path = tmpdir ( ) ;
2013
2018
path. push ( "mmap_file.tmp" ) ;
2014
2019
let size = MemoryMap :: granularity ( ) * 2 ;
2020
+ let mut file = File :: open_mode ( & path, Open , ReadWrite ) . unwrap ( ) ;
2021
+ file. seek ( size as i64 , SeekSet ) ;
2022
+ file. write_u8 ( 0 ) ;
2015
2023
2016
- let fd = unsafe {
2017
- let fd = path. with_c_str ( |path| {
2018
- open ( path, O_CREAT | O_RDWR | O_TRUNC , S_IRUSR | S_IWUSR )
2019
- } ) ;
2020
- lseek_ ( fd, size) ;
2021
- "x" . with_c_str ( |x| assert ! ( write( fd, x as * const c_void, 1 ) == 1 ) ) ;
2022
- fd
2023
- } ;
2024
- let chunk = match MemoryMap :: new ( size / 2 , & [
2024
+ let chunk = MemoryMap :: new ( size / 2 , & [
2025
2025
MapReadable ,
2026
2026
MapWritable ,
2027
- MapFd ( fd ) ,
2027
+ MapFd ( get_fd ( & file ) ) ,
2028
2028
MapOffset ( size / 2 )
2029
- ] ) {
2030
- Ok ( chunk) => chunk,
2031
- Err ( msg) => panic ! ( "{}" , msg)
2032
- } ;
2029
+ ] ) . unwrap ( ) ;
2033
2030
assert ! ( chunk. len > 0 ) ;
2034
2031
2035
2032
unsafe {
2036
2033
* chunk. data = 0xbe ;
2037
2034
assert ! ( * chunk. data == 0xbe ) ;
2038
- close ( fd) ;
2039
2035
}
2040
2036
drop ( chunk) ;
2041
2037
2042
- fs :: unlink ( & path) . unwrap ( ) ;
2038
+ unlink ( & path) . unwrap ( ) ;
2043
2039
}
2044
2040
2045
2041
#[ test]
0 commit comments