@@ -159,7 +159,7 @@ pub fn getcwd() -> IoResult<Path> {
159
159
}
160
160
161
161
#[ cfg( windows) ]
162
- pub mod windows {
162
+ pub mod windoze {
163
163
use libc:: types:: os:: arch:: extra:: DWORD ;
164
164
use libc;
165
165
use option:: Option ;
@@ -385,7 +385,7 @@ pub fn getenv_as_bytes(n: &str) -> Option<Vec<u8>> {
385
385
pub fn getenv ( n : & str ) -> Option < String > {
386
386
unsafe {
387
387
with_env_lock ( || {
388
- use os:: windows :: { fill_utf16_buf_and_decode} ;
388
+ use os:: windoze :: { fill_utf16_buf_and_decode} ;
389
389
let mut n: Vec < u16 > = n. utf16_units ( ) . collect ( ) ;
390
390
n. push ( 0 ) ;
391
391
fill_utf16_buf_and_decode ( |buf, sz| {
@@ -712,7 +712,7 @@ pub fn self_exe_name() -> Option<Path> {
712
712
#[ cfg( windows) ]
713
713
fn load_self ( ) -> Option < Vec < u8 > > {
714
714
unsafe {
715
- use os:: windows :: fill_utf16_buf_and_decode;
715
+ use os:: windoze :: fill_utf16_buf_and_decode;
716
716
fill_utf16_buf_and_decode ( |buf, sz| {
717
717
libc:: GetModuleFileNameW ( 0 u as libc:: DWORD , buf, sz)
718
718
} ) . map ( |s| s. into_string ( ) . into_bytes ( ) )
@@ -1207,7 +1207,11 @@ pub enum MapOption {
1207
1207
/// Create a map for a specific address range. Corresponds to `MAP_FIXED` on
1208
1208
/// POSIX.
1209
1209
MapAddr ( * const u8 ) ,
1210
+ /// Create a memory mapping for a file with a given HANDLE.
1211
+ #[ cfg( windows) ]
1212
+ MapFd ( libc:: HANDLE ) ,
1210
1213
/// Create a memory mapping for a file with a given fd.
1214
+ #[ cfg( not( windows) ) ]
1211
1215
MapFd ( c_int ) ,
1212
1216
/// When using `MapFd`, the start of the map is `uint` bytes from the start
1213
1217
/// of the file.
@@ -1401,7 +1405,7 @@ impl MemoryMap {
1401
1405
let mut readable = false ;
1402
1406
let mut writable = false ;
1403
1407
let mut executable = false ;
1404
- let mut fd : c_int = - 1 ;
1408
+ let mut handle : HANDLE = libc :: INVALID_HANDLE_VALUE ;
1405
1409
let mut offset: uint = 0 ;
1406
1410
let len = round_up ( min_len, page_size ( ) ) ;
1407
1411
@@ -1411,23 +1415,23 @@ impl MemoryMap {
1411
1415
MapWritable => { writable = true ; } ,
1412
1416
MapExecutable => { executable = true ; }
1413
1417
MapAddr ( addr_) => { lpAddress = addr_ as LPVOID ; } ,
1414
- MapFd ( fd_ ) => { fd = fd_ ; } ,
1418
+ MapFd ( handle_ ) => { handle = handle_ ; } ,
1415
1419
MapOffset ( offset_) => { offset = offset_; } ,
1416
1420
MapNonStandardFlags ( ..) => { }
1417
1421
}
1418
1422
}
1419
1423
1420
1424
let flProtect = match ( executable, readable, writable) {
1421
- ( false , false , false ) if fd == - 1 => libc:: PAGE_NOACCESS ,
1425
+ ( false , false , false ) if handle == libc :: INVALID_HANDLE_VALUE => libc:: PAGE_NOACCESS ,
1422
1426
( false , true , false ) => libc:: PAGE_READONLY ,
1423
1427
( false , true , true ) => libc:: PAGE_READWRITE ,
1424
- ( true , false , false ) if fd == - 1 => libc:: PAGE_EXECUTE ,
1428
+ ( true , false , false ) if handle == libc :: INVALID_HANDLE_VALUE => libc:: PAGE_EXECUTE ,
1425
1429
( true , true , false ) => libc:: PAGE_EXECUTE_READ ,
1426
1430
( true , true , true ) => libc:: PAGE_EXECUTE_READWRITE ,
1427
1431
_ => return Err ( ErrUnsupProt )
1428
1432
} ;
1429
1433
1430
- if fd == - 1 {
1434
+ if handle == libc :: INVALID_HANDLE_VALUE {
1431
1435
if offset != 0 {
1432
1436
return Err ( ErrUnsupOffset ) ;
1433
1437
}
@@ -1455,7 +1459,7 @@ impl MemoryMap {
1455
1459
// we should never get here.
1456
1460
} ;
1457
1461
unsafe {
1458
- let hFile = libc :: get_osfhandle ( fd ) as HANDLE ;
1462
+ let hFile = handle ;
1459
1463
let mapping = libc:: CreateFileMappingW ( hFile,
1460
1464
ptr:: null_mut ( ) ,
1461
1465
flProtect,
@@ -1979,55 +1983,47 @@ mod tests {
1979
1983
1980
1984
#[ test]
1981
1985
fn memory_map_file ( ) {
1982
- use result:: Result :: { Ok , Err } ;
1983
1986
use os:: * ;
1984
- use libc:: * ;
1985
- use io:: fs;
1986
-
1987
- #[ cfg( unix) ]
1988
- fn lseek_ ( fd : c_int , size : uint ) {
1989
- unsafe {
1990
- assert ! ( lseek( fd, size as off_t, SEEK_SET ) == size as off_t) ;
1991
- }
1987
+ use io:: fs:: { File , unlink} ;
1988
+ use io:: SeekStyle :: SeekSet ;
1989
+ use io:: FileMode :: Open ;
1990
+ use io:: FileAccess :: ReadWrite ;
1991
+ use libc:: HANDLE ;
1992
+
1993
+ #[ cfg( not( windows) ) ]
1994
+ fn get_fd ( file : & File ) -> c_int {
1995
+ use os:: unix:: AsRawFd ;
1996
+ file. as_raw_fd ( )
1992
1997
}
1998
+
1993
1999
#[ cfg( windows) ]
1994
- fn lseek_ ( fd : c_int , size : uint ) {
1995
- unsafe {
1996
- assert ! ( lseek( fd, size as c_long, SEEK_SET ) == size as c_long) ;
1997
- }
2000
+ fn get_fd ( file : & File ) -> HANDLE {
2001
+ use os:: windows:: AsRawHandle ;
2002
+ file. as_raw_handle ( )
1998
2003
}
1999
2004
2000
2005
let mut path = tmpdir ( ) ;
2001
2006
path. push ( "mmap_file.tmp" ) ;
2002
2007
let size = MemoryMap :: granularity ( ) * 2 ;
2008
+ let mut file = File :: open_mode ( & path, Open , ReadWrite ) . unwrap ( ) ;
2009
+ file. seek ( size as i64 , SeekSet ) ;
2010
+ file. write_u8 ( 0 ) ;
2003
2011
2004
- let fd = unsafe {
2005
- let fd = path. with_c_str ( |path| {
2006
- open ( path, O_CREAT | O_RDWR | O_TRUNC , S_IRUSR | S_IWUSR )
2007
- } ) ;
2008
- lseek_ ( fd, size) ;
2009
- "x" . with_c_str ( |x| assert ! ( write( fd, x as * const c_void, 1 ) == 1 ) ) ;
2010
- fd
2011
- } ;
2012
- let chunk = match MemoryMap :: new ( size / 2 , & [
2012
+ let chunk = MemoryMap :: new ( size / 2 , & [
2013
2013
MapReadable ,
2014
2014
MapWritable ,
2015
- MapFd ( fd ) ,
2015
+ MapFd ( get_fd ( & file ) ) ,
2016
2016
MapOffset ( size / 2 )
2017
- ] ) {
2018
- Ok ( chunk) => chunk,
2019
- Err ( msg) => panic ! ( "{}" , msg)
2020
- } ;
2017
+ ] ) . unwrap ( ) ;
2021
2018
assert ! ( chunk. len > 0 ) ;
2022
2019
2023
2020
unsafe {
2024
2021
* chunk. data = 0xbe ;
2025
2022
assert ! ( * chunk. data == 0xbe ) ;
2026
- close ( fd) ;
2027
2023
}
2028
2024
drop ( chunk) ;
2029
2025
2030
- fs :: unlink ( & path) . unwrap ( ) ;
2026
+ unlink ( & path) . unwrap ( ) ;
2031
2027
}
2032
2028
2033
2029
#[ test]
0 commit comments