diff --git a/ports/unix/moduselect.c b/ports/unix/moduselect.c index a95663e31fa03..8b84a96696083 100644 --- a/ports/unix/moduselect.c +++ b/ports/unix/moduselect.c @@ -130,7 +130,10 @@ STATIC mp_obj_t poll_register(size_t n_args, const mp_obj_t *args) { MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(poll_register_obj, 2, 3, poll_register); /// \method unregister(obj) -STATIC mp_obj_t poll_unregister(mp_obj_t self_in, mp_obj_t obj_in) { +STATIC mp_obj_t poll_unregister(size_t n_args, const mp_obj_t *args) { + mp_obj_t self_in = args[0]; + mp_obj_t obj_in = args[1]; + mp_obj_poll_t *self = MP_OBJ_TO_PTR(self_in); struct pollfd *entries = self->entries; int fd = get_fd(obj_in); @@ -140,15 +143,19 @@ STATIC mp_obj_t poll_unregister(mp_obj_t self_in, mp_obj_t obj_in) { if (self->obj_map) { self->obj_map[entries - self->entries] = MP_OBJ_NULL; } - break; + return mp_const_true; } entries++; } - // TODO raise KeyError if obj didn't exist in map - return mp_const_none; + // If "throw" arg if False, don't raise exception. + if (n_args > 2 && args[2] == mp_const_false) { + return mp_const_false; + } + + mp_raise_msg(&mp_type_KeyError, NULL); } -MP_DEFINE_CONST_FUN_OBJ_2(poll_unregister_obj, poll_unregister); +MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(poll_unregister_obj, 2, 3, poll_unregister); /// \method modify(obj, eventmask) STATIC mp_obj_t poll_modify(mp_obj_t self_in, mp_obj_t obj_in, mp_obj_t eventmask_in) { diff --git a/tests/extmod/uselect_poll_basic.py b/tests/extmod/uselect_poll_basic.py index 828fda1bbe359..830f4ec51c6a5 100644 --- a/tests/extmod/uselect_poll_basic.py +++ b/tests/extmod/uselect_poll_basic.py @@ -32,3 +32,8 @@ poller.modify(s, select.POLLIN) except OSError as e: assert e.args[0] == errno.ENOENT + +try: + poller.unregister(s) +except KeyError: + print("KeyError") diff --git a/tests/extmod/uselect_poll_unreg.py b/tests/extmod/uselect_poll_unreg.py new file mode 100644 index 0000000000000..7ab014f6d1938 --- /dev/null +++ b/tests/extmod/uselect_poll_unreg.py @@ -0,0 +1,19 @@ +# Test MicroPython's idempotent extension to poll.unregister(). +try: + import usocket as socket, uselect as select, uerrno as errno +except ImportError: + print("SKIP") + raise SystemExit + + +poller = select.poll() + +s = socket.socket() + +poller.register(s) + +print(poller.unregister(s, False)) + +# Can unregister multiple times +print(poller.unregister(s, False)) +print(poller.unregister(s, False)) diff --git a/tests/extmod/uselect_poll_unreg.py.exp b/tests/extmod/uselect_poll_unreg.py.exp new file mode 100644 index 0000000000000..06eb4d10eecd8 --- /dev/null +++ b/tests/extmod/uselect_poll_unreg.py.exp @@ -0,0 +1,3 @@ +True +False +False
Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.
Alternative Proxies: