Skip to content

Commit edc0dcb

Browse files
committed
extmod/moduselect: Refactor towards introduction of poll.ipoll().
This follows previous refactor made to unix/moduselect.
1 parent b082869 commit edc0dcb

1 file changed

Lines changed: 33 additions & 23 deletions

File tree

extmod/moduselect.c

Lines changed: 33 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,7 @@ MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mp_select_select_obj, 3, 4, select_select);
182182
typedef struct _mp_obj_poll_t {
183183
mp_obj_base_t base;
184184
mp_map_t poll_map;
185+
int flags;
185186
} mp_obj_poll_t;
186187

187188
/// \method register(obj[, eventmask])
@@ -219,9 +220,7 @@ STATIC mp_obj_t poll_modify(mp_obj_t self_in, mp_obj_t obj_in, mp_obj_t eventmas
219220
}
220221
MP_DEFINE_CONST_FUN_OBJ_3(poll_modify_obj, poll_modify);
221222

222-
/// \method poll([timeout])
223-
/// Timeout is in milliseconds.
224-
STATIC mp_obj_t poll_poll(uint n_args, const mp_obj_t *args) {
223+
STATIC mp_uint_t poll_poll_internal(uint n_args, const mp_obj_t *args) {
225224
mp_obj_poll_t *self = args[0];
226225

227226
// work out timeout (its given already in ms)
@@ -239,33 +238,44 @@ STATIC mp_obj_t poll_poll(uint n_args, const mp_obj_t *args) {
239238
}
240239
}
241240

241+
self->flags = flags;
242+
242243
mp_uint_t start_tick = mp_hal_ticks_ms();
244+
mp_uint_t n_ready;
243245
for (;;) {
244246
// poll the objects
245-
mp_uint_t n_ready = poll_map_poll(&self->poll_map, NULL);
246-
247+
n_ready = poll_map_poll(&self->poll_map, NULL);
247248
if (n_ready > 0 || (timeout != -1 && mp_hal_ticks_ms() - start_tick >= timeout)) {
248-
// one or more objects are ready, or we had a timeout
249-
mp_obj_list_t *ret_list = mp_obj_new_list(n_ready, NULL);
250-
n_ready = 0;
251-
for (mp_uint_t i = 0; i < self->poll_map.alloc; ++i) {
252-
if (!MP_MAP_SLOT_IS_FILLED(&self->poll_map, i)) {
253-
continue;
254-
}
255-
poll_obj_t *poll_obj = (poll_obj_t*)self->poll_map.table[i].value;
256-
if (poll_obj->flags_ret != 0) {
257-
mp_obj_t tuple[2] = {poll_obj->obj, MP_OBJ_NEW_SMALL_INT(poll_obj->flags_ret)};
258-
ret_list->items[n_ready++] = mp_obj_new_tuple(2, tuple);
259-
if (flags & FLAG_ONESHOT) {
260-
// Don't poll next time, until new event flags will be set explicitly
261-
poll_obj->flags = 0;
262-
}
263-
}
264-
}
265-
return ret_list;
249+
break;
266250
}
267251
MICROPY_EVENT_POLL_HOOK
268252
}
253+
254+
return n_ready;
255+
}
256+
257+
STATIC mp_obj_t poll_poll(uint n_args, const mp_obj_t *args) {
258+
mp_obj_poll_t *self = args[0];
259+
mp_uint_t n_ready = poll_poll_internal(n_args, args);
260+
261+
// one or more objects are ready, or we had a timeout
262+
mp_obj_list_t *ret_list = mp_obj_new_list(n_ready, NULL);
263+
n_ready = 0;
264+
for (mp_uint_t i = 0; i < self->poll_map.alloc; ++i) {
265+
if (!MP_MAP_SLOT_IS_FILLED(&self->poll_map, i)) {
266+
continue;
267+
}
268+
poll_obj_t *poll_obj = (poll_obj_t*)self->poll_map.table[i].value;
269+
if (poll_obj->flags_ret != 0) {
270+
mp_obj_t tuple[2] = {poll_obj->obj, MP_OBJ_NEW_SMALL_INT(poll_obj->flags_ret)};
271+
ret_list->items[n_ready++] = mp_obj_new_tuple(2, tuple);
272+
if (self->flags & FLAG_ONESHOT) {
273+
// Don't poll next time, until new event flags will be set explicitly
274+
poll_obj->flags = 0;
275+
}
276+
}
277+
}
278+
return ret_list;
269279
}
270280
MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(poll_poll_obj, 1, 3, poll_poll);
271281

0 commit comments

Comments
 (0)