Don't raise OSError from memFileInput()
This commit is contained in:
parent
5df69fc696
commit
87309f3120
1 changed files with 20 additions and 17 deletions
|
|
@ -166,7 +166,7 @@ let memFileInputVTable = InputStreamVTable(
|
||||||
)
|
)
|
||||||
|
|
||||||
proc memFileInput*(filename: string, mappedSize = -1, offset = 0): InputStreamHandle
|
proc memFileInput*(filename: string, mappedSize = -1, offset = 0): InputStreamHandle
|
||||||
{.raises: [IOError, OSError].} =
|
{.raises: [IOError].} =
|
||||||
## Creates an input stream for reading the contents of a memory-mapped file.
|
## Creates an input stream for reading the contents of a memory-mapped file.
|
||||||
##
|
##
|
||||||
## Using this API will provide better performance than `fileInput`,
|
## Using this API will provide better performance than `fileInput`,
|
||||||
|
|
@ -187,24 +187,27 @@ proc memFileInput*(filename: string, mappedSize = -1, offset = 0): InputStreamHa
|
||||||
# Nim's memfiles module will fail to map an empty file,
|
# Nim's memfiles module will fail to map an empty file,
|
||||||
# but we don't consider this a problem. The stream will
|
# but we don't consider this a problem. The stream will
|
||||||
# be in non-readable state from the start.
|
# be in non-readable state from the start.
|
||||||
let fileSize = getFileSize(filename)
|
try:
|
||||||
if fileSize == 0:
|
let fileSize = getFileSize(filename)
|
||||||
return makeHandle InputStream()
|
if fileSize == 0:
|
||||||
|
return makeHandle InputStream()
|
||||||
|
|
||||||
let
|
let
|
||||||
memFile = memfiles.open(filename,
|
memFile = memfiles.open(filename,
|
||||||
mode = fmRead,
|
mode = fmRead,
|
||||||
mappedSize = mappedSize,
|
mappedSize = mappedSize,
|
||||||
offset = offset)
|
offset = offset)
|
||||||
head = cast[ptr byte](memFile.mem)
|
head = cast[ptr byte](memFile.mem)
|
||||||
mappedSize = memFile.size
|
mappedSize = memFile.size
|
||||||
|
|
||||||
makeHandle MemFileInputStream(
|
makeHandle MemFileInputStream(
|
||||||
vtable: vtableAddr memFileInputVTable,
|
vtable: vtableAddr memFileInputVTable,
|
||||||
span: PageSpan(
|
span: PageSpan(
|
||||||
startAddr: head,
|
startAddr: head,
|
||||||
endAddr: offset(head, mappedSize)),
|
endAddr: offset(head, mappedSize)),
|
||||||
file: memFile)
|
file: memFile)
|
||||||
|
except OSError as err:
|
||||||
|
raise newException(IOError, err.msg, err)
|
||||||
|
|
||||||
func getNewSpan(s: InputStream) =
|
func getNewSpan(s: InputStream) =
|
||||||
let buffers = s.buffers
|
let buffers = s.buffers
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue