Skip to content

Commit 3e42570

Browse files
committed
stmhal: Change cc3k.recv to only make 1 call to underlying recv().
Also make cc3k.send and cc3k.recv independent functions (not wrapped by stream write/read). Also make wiznet5k.recv more memory efficient. This might address issue adafruit#920.
1 parent 481d714 commit 3e42570

2 files changed

Lines changed: 33 additions & 37 deletions

File tree

stmhal/modcc3k.c

Lines changed: 30 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -365,57 +365,57 @@ STATIC void cc3k_socket_print(void (*print)(void *env, const char *fmt, ...), vo
365365
printf("<CC3k.socket fd=%d>", self->fd);
366366
}
367367

368-
STATIC mp_uint_t cc3k_socket_send(mp_obj_t self_in, const void *buf, mp_uint_t size, int *errcode) {
368+
STATIC mp_obj_t cc3k_socket_send(mp_obj_t self_in, mp_obj_t buf_in) {
369369
cc3k_socket_obj_t *self = self_in;
370370

371371
if (cc3k_get_fd_closed_state(self->fd)) {
372372
CC3000_EXPORT(closesocket)(self->fd);
373-
*errcode = EPIPE;
374-
return 0;
373+
nlr_raise(mp_obj_new_exception_arg1(&mp_type_OSError, MP_OBJ_NEW_SMALL_INT(EPIPE)));
375374
}
376375

376+
mp_buffer_info_t bufinfo;
377+
mp_get_buffer_raise(buf_in, &bufinfo, MP_BUFFER_READ);
378+
377379
// CC3K does not handle fragmentation, and will overflow,
378380
// split the packet into smaller ones and send them out.
379-
int bytes = 0;
380-
while (bytes < size) {
381-
int n = MIN((size-bytes), MAX_TX_PACKET);
382-
n = CC3000_EXPORT(send)(self->fd, buf+bytes, n, 0);
381+
mp_int_t bytes = 0;
382+
while (bytes < bufinfo.len) {
383+
int n = MIN((bufinfo.len - bytes), MAX_TX_PACKET);
384+
n = CC3000_EXPORT(send)(self->fd, bufinfo.buf + bytes, n, 0);
383385
if (n <= 0) {
384-
bytes = n;
385-
*errcode = CC3000_EXPORT(errno);
386-
break;
386+
nlr_raise(mp_obj_new_exception_arg1(&mp_type_OSError, MP_OBJ_NEW_SMALL_INT(CC3000_EXPORT(errno))));
387387
}
388388
bytes += n;
389389
}
390390

391-
return bytes;
391+
return MP_OBJ_NEW_SMALL_INT(bytes);
392392
}
393+
STATIC MP_DEFINE_CONST_FUN_OBJ_2(cc3k_socket_send_obj, cc3k_socket_send);
393394

394-
STATIC mp_uint_t cc3k_socket_recv(mp_obj_t self_in, void *buf, mp_uint_t size, int *errcode) {
395+
STATIC mp_obj_t cc3k_socket_recv(mp_obj_t self_in, mp_obj_t len_in) {
395396
cc3k_socket_obj_t *self = self_in;
396397

397398
if (cc3k_get_fd_closed_state(self->fd)) {
398399
CC3000_EXPORT(closesocket)(self->fd);
399-
return 0;
400+
nlr_raise(mp_obj_new_exception_arg1(&mp_type_OSError, MP_OBJ_NEW_SMALL_INT(EPIPE)));
400401
}
401402

402-
// recv MAX_RX_PACKET
403-
int bytes = 0;
404-
while (bytes < size) {
405-
int n = MIN((size-bytes), MAX_RX_PACKET);
406-
n = CC3000_EXPORT(recv)(self->fd, buf+bytes, n, 0);
407-
if (n == 0) {
408-
break;
409-
} else if (n < 0) {
410-
bytes = n;
411-
*errcode = CC3000_EXPORT(errno);
412-
break;
413-
}
414-
bytes += n;
403+
// recv upto MAX_RX_PACKET
404+
mp_int_t len = mp_obj_get_int(len_in);
405+
len = MIN(len, MAX_RX_PACKET);
406+
407+
byte *buf;
408+
mp_obj_t ret_obj = mp_obj_str_builder_start(&mp_type_bytes, len, &buf);
409+
len = CC3000_EXPORT(recv)(self->fd, buf, len, 0);
410+
if (len == 0) {
411+
return mp_const_empty_bytes;
412+
} else if (len < 0) {
413+
nlr_raise(mp_obj_new_exception_arg1(&mp_type_OSError, MP_OBJ_NEW_SMALL_INT(CC3000_EXPORT(errno))));
414+
} else {
415+
return mp_obj_str_builder_end_with_len(ret_obj, len);
415416
}
416-
417-
return bytes;
418417
}
418+
STATIC MP_DEFINE_CONST_FUN_OBJ_2(cc3k_socket_recv_obj, cc3k_socket_recv);
419419

420420
STATIC mp_obj_t cc3k_socket_bind(mp_obj_t self_in, mp_obj_t addr_obj) {
421421
cc3k_socket_obj_t *self = self_in;
@@ -565,9 +565,8 @@ STATIC mp_obj_t cc3k_socket_close(mp_obj_t self_in) {
565565
STATIC MP_DEFINE_CONST_FUN_OBJ_1(cc3k_socket_close_obj, cc3k_socket_close);
566566

567567
STATIC const mp_map_elem_t cc3k_socket_locals_dict_table[] = {
568-
// TODO read/write/send/recv distinctions
569-
{ MP_OBJ_NEW_QSTR(MP_QSTR_send), (mp_obj_t)&mp_stream_write_obj },
570-
{ MP_OBJ_NEW_QSTR(MP_QSTR_recv), (mp_obj_t)&mp_stream_read_obj },
568+
{ MP_OBJ_NEW_QSTR(MP_QSTR_send), (mp_obj_t)&cc3k_socket_send_obj },
569+
{ MP_OBJ_NEW_QSTR(MP_QSTR_recv), (mp_obj_t)&cc3k_socket_recv_obj },
571570
{ MP_OBJ_NEW_QSTR(MP_QSTR_bind), (mp_obj_t)&cc3k_socket_bind_obj },
572571
{ MP_OBJ_NEW_QSTR(MP_QSTR_listen), (mp_obj_t)&cc3k_socket_listen_obj },
573572
{ MP_OBJ_NEW_QSTR(MP_QSTR_accept), (mp_obj_t)&cc3k_socket_accept_obj },
@@ -644,8 +643,6 @@ mp_uint_t cc3k_ioctl(mp_obj_t self_in, mp_uint_t request, int *errcode, ...) {
644643
}
645644

646645
STATIC const mp_stream_p_t cc3k_socket_stream_p = {
647-
.read = cc3k_socket_recv,
648-
.write = cc3k_socket_send,
649646
.ioctl = cc3k_ioctl,
650647
.is_text = false,
651648
};

stmhal/modwiznet5k.c

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -415,12 +415,11 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_2(wiznet5k_socket_send_obj, wiznet5k_socket_send)
415415
STATIC mp_obj_t wiznet5k_socket_recv(mp_obj_t self_in, mp_obj_t len_in) {
416416
wiznet5k_socket_obj_t *self = self_in;
417417
mp_int_t len = mp_obj_get_int(len_in);
418-
uint8_t *buf = m_new(uint8_t, len);
418+
byte *buf;
419+
mp_obj_t ret_obj = mp_obj_str_builder_start(&mp_type_bytes, len, &buf);
419420
mp_int_t ret = WIZCHIP_EXPORT(recv)(self->sn, buf, len);
420421
check_sock_return_value(ret);
421-
mp_obj_t ret_buf = mp_obj_new_bytes(buf, ret);
422-
m_del(uint8_t, buf, len);
423-
return ret_buf;
422+
return mp_obj_str_builder_end_with_len(ret_obj, len);
424423
}
425424
STATIC MP_DEFINE_CONST_FUN_OBJ_2(wiznet5k_socket_recv_obj, wiznet5k_socket_recv);
426425

0 commit comments

Comments
 (0)