aboutsummaryrefslogtreecommitdiff
path: root/extmod/modlwip.c
diff options
context:
space:
mode:
authorDamien George <damien.p.george@gmail.com>2018-03-07 17:48:53 +1100
committerDamien George <damien.p.george@gmail.com>2018-04-10 13:41:32 +1000
commitcf31d384f1d2ca09f817f154892eaa6860c10144 (patch)
tree27b6dacefc471a394636e86ac787f6dd29f4a809 /extmod/modlwip.c
parent8f11d0b532bd0203c875ad9e3e4efd8a7014ca15 (diff)
py/stream: Switch stream close operation from method to ioctl.
This patch moves the implementation of stream closure from a dedicated method to the ioctl of the stream protocol, for each type that implements closing. The benefits of this are: 1. Rounds out the stream ioctl function, which already includes flush, seek and poll (among other things). 2. Makes calling mp_stream_close() on an object slightly more efficient because it now no longer needs to lookup the close method and call it, rather it just delegates straight to the ioctl function (if it exists). 3. Reduces code size and allows future types that implement the stream protocol to be smaller because they don't need a dedicated close method. Code size reduction is around 200 bytes smaller for x86 archs and around 30 bytes smaller for the bare-metal archs.
Diffstat (limited to 'extmod/modlwip.c')
-rw-r--r--extmod/modlwip.c72
1 files changed, 34 insertions, 38 deletions
diff --git a/extmod/modlwip.c b/extmod/modlwip.c
index 2c194e1bd..9810089da 100644
--- a/extmod/modlwip.c
+++ b/extmod/modlwip.c
@@ -637,42 +637,6 @@ STATIC mp_obj_t lwip_socket_make_new(const mp_obj_type_t *type, size_t n_args, s
return socket;
}
-STATIC mp_obj_t lwip_socket_close(mp_obj_t self_in) {
- lwip_socket_obj_t *socket = self_in;
- bool socket_is_listener = false;
-
- if (socket->pcb.tcp == NULL) {
- return mp_const_none;
- }
- switch (socket->type) {
- case MOD_NETWORK_SOCK_STREAM: {
- if (socket->pcb.tcp->state == LISTEN) {
- socket_is_listener = true;
- }
- if (tcp_close(socket->pcb.tcp) != ERR_OK) {
- DEBUG_printf("lwip_close: had to call tcp_abort()\n");
- tcp_abort(socket->pcb.tcp);
- }
- break;
- }
- case MOD_NETWORK_SOCK_DGRAM: udp_remove(socket->pcb.udp); break;
- //case MOD_NETWORK_SOCK_RAW: raw_remove(socket->pcb.raw); break;
- }
- socket->pcb.tcp = NULL;
- socket->state = _ERR_BADF;
- if (socket->incoming.pbuf != NULL) {
- if (!socket_is_listener) {
- pbuf_free(socket->incoming.pbuf);
- } else {
- tcp_abort(socket->incoming.connection);
- }
- socket->incoming.pbuf = NULL;
- }
-
- return mp_const_none;
-}
-STATIC MP_DEFINE_CONST_FUN_OBJ_1(lwip_socket_close_obj, lwip_socket_close);
-
STATIC mp_obj_t lwip_socket_bind(mp_obj_t self_in, mp_obj_t addr_in) {
lwip_socket_obj_t *socket = self_in;
@@ -1179,6 +1143,38 @@ STATIC mp_uint_t lwip_socket_ioctl(mp_obj_t self_in, mp_uint_t request, uintptr_
ret |= flags & (MP_STREAM_POLL_RD | MP_STREAM_POLL_WR);
}
+ } else if (request == MP_STREAM_CLOSE) {
+ bool socket_is_listener = false;
+
+ if (socket->pcb.tcp == NULL) {
+ return 0;
+ }
+ switch (socket->type) {
+ case MOD_NETWORK_SOCK_STREAM: {
+ if (socket->pcb.tcp->state == LISTEN) {
+ socket_is_listener = true;
+ }
+ if (tcp_close(socket->pcb.tcp) != ERR_OK) {
+ DEBUG_printf("lwip_close: had to call tcp_abort()\n");
+ tcp_abort(socket->pcb.tcp);
+ }
+ break;
+ }
+ case MOD_NETWORK_SOCK_DGRAM: udp_remove(socket->pcb.udp); break;
+ //case MOD_NETWORK_SOCK_RAW: raw_remove(socket->pcb.raw); break;
+ }
+ socket->pcb.tcp = NULL;
+ socket->state = _ERR_BADF;
+ if (socket->incoming.pbuf != NULL) {
+ if (!socket_is_listener) {
+ pbuf_free(socket->incoming.pbuf);
+ } else {
+ tcp_abort(socket->incoming.connection);
+ }
+ socket->incoming.pbuf = NULL;
+ }
+ ret = 0;
+
} else {
*errcode = MP_EINVAL;
ret = MP_STREAM_ERROR;
@@ -1188,8 +1184,8 @@ STATIC mp_uint_t lwip_socket_ioctl(mp_obj_t self_in, mp_uint_t request, uintptr_
}
STATIC const mp_rom_map_elem_t lwip_socket_locals_dict_table[] = {
- { MP_ROM_QSTR(MP_QSTR___del__), MP_ROM_PTR(&lwip_socket_close_obj) },
- { MP_ROM_QSTR(MP_QSTR_close), MP_ROM_PTR(&lwip_socket_close_obj) },
+ { MP_ROM_QSTR(MP_QSTR___del__), MP_ROM_PTR(&mp_stream_close_obj) },
+ { MP_ROM_QSTR(MP_QSTR_close), MP_ROM_PTR(&mp_stream_close_obj) },
{ MP_ROM_QSTR(MP_QSTR_bind), MP_ROM_PTR(&lwip_socket_bind_obj) },
{ MP_ROM_QSTR(MP_QSTR_listen), MP_ROM_PTR(&lwip_socket_listen_obj) },
{ MP_ROM_QSTR(MP_QSTR_accept), MP_ROM_PTR(&lwip_socket_accept_obj) },