10000 extmod/vfs_reader: Add file ioctl to set read buffer size. · micropython/micropython@eef2ace · GitHub
[go: up one dir, main page]

Skip to content

Commit eef2ace

Browse files
author
Andrew Leech
committed
extmod/vfs_reader: Add file ioctl to set read buffer size.
Can be used to speed up importing a file from a vfs based filesystem. Signed-off-by: Andrew Leech <andrew.leech@planetinnovation.com.au>
1 parent a614c1d commit eef2ace

File tree

3 files changed

+40
-7
lines changed

3 files changed

+40
-7
lines changed

extmod/vfs_reader.c

Lines changed: 35 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -34,21 +34,39 @@
3434

3535
#if MICROPY_READER_VFS
3636

37+
3738
typedef struct _mp_reader_vfs_t {
3839
mp_obj_t file;
3940
uint16_t len;
4041
uint16_t pos;
41-
byte buf[24];
42+
uint8_t bufsize;
43+
byte buf[];
4244
} mp_reader_vfs_t;
4345

4446
STATIC mp_uint_t mp_reader_vfs_readbyte(void *data) {
4547
mp_reader_vfs_t *reader = (mp_reader_vfs_t *)data;
48+
if (!reader->bufsize) {
49+
// If buffering is disabled read byte from stream directly
50+
byte c;
51+
int errcode = 0;
52+
mp_uint_t len = mp_stream_rw(reader->file, &c, 1,
53+
&errcode, MP_STREAM_RW_READ | MP_STREAM_RW_ONCE);
54+
if (errcode != 0) {
55+
// TODO handle errors properly
56+
return MP_READER_EOF;
57+
}
58+
if (len == 0) {
59+
return MP_READER_EOF;
60+
}
61+
return c;
62+
}
63+
4664
if (reader->pos >= reader->len) {
47-
if (reader->len < sizeof(reader->buf)) {
65+
if (reader->len < reader->bufsize) {
4866
return MP_READER_EOF;
4967
} else {
5068
int errcode;
51-
reader->len = mp_stream_rw(reader->file, reader->buf, sizeof(reader->buf),
69+
reader->len = mp_stream_rw(reader->file, reader->buf, reader->bufsize,
5270
&errcode, MP_STREAM_RW_READ | MP_STREAM_RW_ONCE);
5371
if (errcode != 0) {
5472
// TODO handle errors properly
@@ -70,14 +88,24 @@ STATIC void mp_reader_vfs_close(void *data) {
7088
}
7189

7290
void mp_reader_new_file(mp_reader_t *reader, qstr filename) {
73-
mp_reader_vfs_t *rf = m_new_obj(mp_reader_vfs_t);
7491
mp_obj_t args[2] = {
7592
MP_OBJ_NEW_QSTR(filename),
7693
MP_OBJ_NEW_QSTR(MP_QSTR_rb),
7794
};
78-
rf->file = mp_vfs_open(MP_ARRAY_SIZE(args), &args[0], (mp_map_t *)&mp_const_empty_map);
79-
int errcode;
80-
rf->len = mp_stream_rw(rf->file, rf->buf, sizeof(rf->buf), &errcode, MP_STREAM_RW_READ | MP_STREAM_RW_ONCE);
95+
mp_obj_t file = mp_vfs_open(MP_ARRAY_SIZE(args), &args[0], (mp_map_t *)&mp_const_empty_map);
96+
97+
const mp_stream_p_t *stream_p = mp_get_stream(file);
98+
int errcode = 0;
99+
mp_uint_t bufsize = stream_p->ioctl(file, MP_STREAM_GET_BUFSIZE, 0, &errcode);
100+
if (errcode || bufsize > 255) {
101+
errcode = 0;
102+
bufsize = MICROPY_READER_VFS_DEFAULT_BUF_SIZE;
103+
}
104+
105+
mp_reader_vfs_t *rf = m_new_obj_var(mp_reader_vfs_t, uint8_t, bufsize);
106+
rf->file = file;
107+
rf->bufsize = bufsize;
108+
rf->len = mp_stream_rw(rf->file, rf->buf, rf->bufsize, &errcode, MP_STREAM_RW_READ | MP_STREAM_RW_ONCE);
81109
if (errcode != 0) {
82110
mp_raise_OSError(errcode);
83111
}

py/mpconfig.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -597,6 +597,10 @@
597597
#define MICROPY_READER_VFS (0)
598598
#endif
599599

600+
#ifndef MICROPY_READER_VFS_DEFAULT_BUF_SIZE
601+
#define MICROPY_READER_VFS_DEFAULT_BUF_SIZE (48)
602+
#endif
603+
600604
// Whether any readers have been defined
601605
#ifndef MICROPY_HAS_FILE_READER
602606
#define MICROPY_HAS_FILE_READER (MICROPY_READER_POSIX || MICROPY_READER_VFS)

py/stream.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
#define MP_STREAM_GET_DATA_OPTS (8) // Get data/message options
4444
#define MP_STREAM_SET_DATA_OPTS (9) // Set data/message options
4545
#define MP_STREAM_GET_FILENO (10) // Get fileno of underlying file
46+
#define MP_STREAM_GET_BUFSIZE (11) // Get preferred buffer size for file
4647

4748
// These poll ioctl values are compatible with Linux
4849
#define MP_STREAM_POLL_RD (0x0001)

0 commit comments

Comments
 (0)
0