diff options
author | Andreas Rumpf <rumpf_a@web.de> | 2015-09-24 16:04:42 +0200 |
---|---|---|
committer | Andreas Rumpf <rumpf_a@web.de> | 2015-09-24 16:04:42 +0200 |
commit | 308a0d0a553c8d44f321a1b6e4772c388bb79059 (patch) | |
tree | 0a1b53c6671d02350c48cd0b266a05bc95bbebe7 /lib | |
parent | 683e1e8faf206f0fdb9738278a00e9920fb488c5 (diff) | |
parent | 63c35a98f47807cc42a7cb3f8555e0568f090fe8 (diff) | |
download | Nim-308a0d0a553c8d44f321a1b6e4772c388bb79059.tar.gz |
Merge pull request #3316 from jlp765/memfilesWinClose
bug fix: close() only unmapViewOfFile when fHandle is valid.
Diffstat (limited to 'lib')
-rw-r--r-- | lib/pure/memfiles.nim | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/lib/pure/memfiles.nim b/lib/pure/memfiles.nim index 27b989597..b9c574944 100644 --- a/lib/pure/memfiles.nim +++ b/lib/pure/memfiles.nim @@ -32,8 +32,9 @@ type size*: int ## size of the memory mapped file when defined(windows): - fHandle: int - mapHandle: int + fHandle: Handle + mapHandle: Handle + wasOpened: bool ## only close if wasOpened else: handle: cint @@ -115,7 +116,8 @@ proc open*(filename: string, mode: FileMode = fmRead, template callCreateFile(winApiProc, filename: expr): expr = winApiProc( filename, - if readonly: GENERIC_READ else: GENERIC_ALL, + # GENERIC_ALL != (GENERIC_READ or GENERIC_WRITE) + if readonly: GENERIC_READ else: GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ, nil, if newFileSize != -1: CREATE_ALWAYS else: OPEN_EXISTING, @@ -172,6 +174,8 @@ proc open*(filename: string, mode: FileMode = fmRead, if mappedSize != -1: result.size = min(fileSize, mappedSize).int else: result.size = fileSize.int + result.wasOpened = true + else: template fail(errCode: OSErrorCode, msg: expr) = rollback() @@ -226,7 +230,7 @@ proc close*(f: var MemFile) = var lastErr: OSErrorCode when defined(windows): - if f.fHandle != INVALID_HANDLE_VALUE: + if f.fHandle != INVALID_HANDLE_VALUE and f.wasOpened: error = unmapViewOfFile(f.mem) == 0 lastErr = osLastError() error = (closeHandle(f.mapHandle) == 0) or error @@ -243,6 +247,7 @@ proc close*(f: var MemFile) = when defined(windows): f.fHandle = 0 f.mapHandle = 0 + f.wasOpened = false else: f.handle = 0 |