summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDamien George <damien@micropython.org>2024-12-18 11:30:33 +1100
committerDamien George <damien@micropython.org>2024-12-23 13:04:54 +1100
commit5e9dd4b6a2ba58bc61ffc0d0a34a03c0382fcc72 (patch)
tree6ea543475da9574bbc432e25e89c8188af256e39
parentf870e8d2d406e809b4494e6d029fee0269b1ea05 (diff)
extmod/vfs_reader: Add support for opening a memory-mappable file.
If the file can be memory mapped (because it responds to the buffer protocol) then return a memory-reader that directly references the ROM data of the file. Signed-off-by: Damien George <damien@micropython.org>
-rw-r--r--extmod/vfs_reader.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/extmod/vfs_reader.c b/extmod/vfs_reader.c
index 80d0fa634..de5c4e03d 100644
--- a/extmod/vfs_reader.c
+++ b/extmod/vfs_reader.c
@@ -85,6 +85,17 @@ void mp_reader_new_file(mp_reader_t *reader, qstr filename) {
const mp_stream_p_t *stream_p = mp_get_stream(file);
int errcode = 0;
+
+ #if MICROPY_VFS_ROM
+ // Check if the stream can be memory mapped.
+ mp_buffer_info_t bufinfo;
+ if (mp_get_buffer(file, &bufinfo, MP_BUFFER_READ)) {
+ mp_reader_new_mem(reader, bufinfo.buf, bufinfo.len, MP_READER_IS_ROM);
+ return;
+ }
+ #endif
+
+ // Determine how big the input buffer should be, if the stream requests a certain size or not.
mp_uint_t bufsize = stream_p->ioctl(file, MP_STREAM_GET_BUFFER_SIZE, 0, &errcode);
if (bufsize == MP_STREAM_ERROR || bufsize == 0) {
// bufsize == 0 is included here to support mpremote v1.21 and older where mount file ioctl
@@ -94,6 +105,7 @@ void mp_reader_new_file(mp_reader_t *reader, qstr filename) {
bufsize = MIN(MICROPY_READER_VFS_MAX_BUFFER_SIZE, MAX(MICROPY_READER_VFS_MIN_BUFFER_SIZE, bufsize));
}
+ // Create the reader.
mp_reader_vfs_t *rf = m_new_obj_var(mp_reader_vfs_t, buf, byte, bufsize);
rf->file = file;
rf->bufsize = bufsize;