From c264338e31dfe5df587003c2d34ca8254a61b3db Mon Sep 17 00:00:00 2001 From: Ludwig Ortmann Date: Tue, 8 Jul 2014 15:28:31 +0200 Subject: [PATCH 1/4] sys/transceiver: fix t9r_register API compliance --- sys/transceiver/transceiver.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sys/transceiver/transceiver.c b/sys/transceiver/transceiver.c index 0ea0892e8..e712124b1 100644 --- a/sys/transceiver/transceiver.c +++ b/sys/transceiver/transceiver.c @@ -241,7 +241,7 @@ uint8_t transceiver_register(transceiver_type_t t, int pid) (reg[i].transceivers != TRANSCEIVER_NONE)); i++); if (i >= TRANSCEIVER_MAX_REGISTERED) { - return ENOMEM; + return 0; } else { reg[i].transceivers |= t; From d034cfac294a55dcde0c520ba00631b40a308b10 Mon Sep 17 00:00:00 2001 From: Ludwig Ortmann Date: Tue, 8 Jul 2014 15:29:31 +0200 Subject: [PATCH 2/4] sys/transceiver: implement transceiver_unregister --- sys/include/transceiver.h | 10 ++++++++++ sys/transceiver/transceiver.c | 19 +++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/sys/include/transceiver.h b/sys/include/transceiver.h index e8025b815..ad01c7a3f 100644 --- a/sys/include/transceiver.h +++ b/sys/include/transceiver.h @@ -228,5 +228,15 @@ int transceiver_start(void); */ uint8_t transceiver_register(transceiver_type_t transceivers, int pid); +/** + * @brief unregister a thread for events from certain transceivers + * + * @param transceivers The transceiver types to register for + * @param pid The pid of the thread to register + * + * @return 1 on success, 0 otherwise + */ +uint8_t transceiver_unregister(transceiver_type_t transceivers, int pid); + #endif /* TRANSCEIVER_H */ /** @} */ diff --git a/sys/transceiver/transceiver.c b/sys/transceiver/transceiver.c index e712124b1..ca588a6af 100644 --- a/sys/transceiver/transceiver.c +++ b/sys/transceiver/transceiver.c @@ -251,6 +251,25 @@ uint8_t transceiver_register(transceiver_type_t t, int pid) } } +/* Unregister an upper layer thread */ +uint8_t transceiver_unregister(transceiver_type_t t, int pid) +{ + uint8_t i; + + /* find pid in unregistered threads or first unused space */ + for (i = 0; ((i < TRANSCEIVER_MAX_REGISTERED) && + (reg[i].pid != pid) && + (reg[i].transceivers != TRANSCEIVER_NONE)); i++); + + if (i >= TRANSCEIVER_MAX_REGISTERED) { + return 0; + } + else if (reg[i].pid == pid) { + reg[i].transceivers ^= t; + } + return 1; +} + /*------------------------------------------------------------------------------------*/ /* Internal functions */ /*------------------------------------------------------------------------------------*/ From 8e93886d36981591646618e0b45ce2048fa58e74 Mon Sep 17 00:00:00 2001 From: Ludwig Ortmann Date: Wed, 9 Jul 2014 15:56:52 +0200 Subject: [PATCH 3/4] sys/transceiver: refactor un/register remove race conditions make less restrictive (allow double-un/registers) make loops more readable --- sys/transceiver/transceiver.c | 52 ++++++++++++++++------------------- 1 file changed, 24 insertions(+), 28 deletions(-) diff --git a/sys/transceiver/transceiver.c b/sys/transceiver/transceiver.c index ca588a6af..0f7ea038d 100644 --- a/sys/transceiver/transceiver.c +++ b/sys/transceiver/transceiver.c @@ -233,41 +233,37 @@ int transceiver_start(void) /* Register an upper layer thread */ uint8_t transceiver_register(transceiver_type_t t, int pid) { - uint8_t i; - - /* find pid in registered threads or first unused space */ - for (i = 0; ((i < TRANSCEIVER_MAX_REGISTERED) && - (reg[i].pid != pid) && - (reg[i].transceivers != TRANSCEIVER_NONE)); i++); - - if (i >= TRANSCEIVER_MAX_REGISTERED) { - return 0; - } - else { - reg[i].transceivers |= t; - reg[i].pid = pid; - DEBUG("transceiver: Thread %i registered for %i\n", reg[i].pid, reg[i].transceivers); - return 1; + int result = 0; + int state = disableIRQ(); + for (uint8_t i = 0; i < TRANSCEIVER_MAX_REGISTERED; i++) { + if ((reg[i].pid == pid) || (reg[i].transceivers == TRANSCEIVER_NONE)) { + reg[i].transceivers |= t; + reg[i].pid = pid; + DEBUG("transceiver: Thread %i registered for %i\n", reg[i].pid, reg[i].transceivers); + restoreIRQ(state); + result = 1; + break; + } } + restoreIRQ(state); + return result; } /* Unregister an upper layer thread */ uint8_t transceiver_unregister(transceiver_type_t t, int pid) { - uint8_t i; - - /* find pid in unregistered threads or first unused space */ - for (i = 0; ((i < TRANSCEIVER_MAX_REGISTERED) && - (reg[i].pid != pid) && - (reg[i].transceivers != TRANSCEIVER_NONE)); i++); - - if (i >= TRANSCEIVER_MAX_REGISTERED) { - return 0; - } - else if (reg[i].pid == pid) { - reg[i].transceivers ^= t; + int result = 0; + int state = disableIRQ(); + for (uint8_t i = 0; i < TRANSCEIVER_MAX_REGISTERED; ++i) { + if (reg[i].pid == pid) { + reg[i].transceivers &= ~t; + restoreIRQ(state); + result = 1; + break; + } } - return 1; + restoreIRQ(state); + return result; } /*------------------------------------------------------------------------------------*/ From a992d4d8488d3543ff2c1db104b3f3863d1ecec0 Mon Sep 17 00:00:00 2001 From: Ludwig Ortmann Date: Wed, 9 Jul 2014 18:20:00 +0200 Subject: [PATCH 4/4] sys/transceiver: use size_t instead of u8 in loops --- sys/transceiver/transceiver.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/sys/transceiver/transceiver.c b/sys/transceiver/transceiver.c index 0f7ea038d..03f491ca6 100644 --- a/sys/transceiver/transceiver.c +++ b/sys/transceiver/transceiver.c @@ -235,7 +235,7 @@ uint8_t transceiver_register(transceiver_type_t t, int pid) { int result = 0; int state = disableIRQ(); - for (uint8_t i = 0; i < TRANSCEIVER_MAX_REGISTERED; i++) { + for (size_t i = 0; i < TRANSCEIVER_MAX_REGISTERED; i++) { if ((reg[i].pid == pid) || (reg[i].transceivers == TRANSCEIVER_NONE)) { reg[i].transceivers |= t; reg[i].pid = pid; @@ -254,7 +254,7 @@ uint8_t transceiver_unregister(transceiver_type_t t, int pid) { int result = 0; int state = disableIRQ(); - for (uint8_t i = 0; i < TRANSCEIVER_MAX_REGISTERED; ++i) { + for (size_t i = 0; i < TRANSCEIVER_MAX_REGISTERED; ++i) { if (reg[i].pid == pid) { reg[i].transceivers &= ~t; restoreIRQ(state); @@ -480,7 +480,7 @@ static void receive_packet(uint16_t type, uint8_t pos) #ifdef DBG_IGNORE - for (uint8_t i = 0; (i < TRANSCEIVER_MAX_IGNORED_ADDR) && (transceiver_ignored_addr[i]); i++) { + for (size_t i = 0; (i < TRANSCEIVER_MAX_IGNORED_ADDR) && (transceiver_ignored_addr[i]); i++) { DEBUG("check if source (%u) is ignored -> %u\n", transceiver_buffer[transceiver_buffer_pos].src, transceiver_ignored_addr[i]); if (transceiver_buffer[transceiver_buffer_pos].src == transceiver_ignored_addr[i]) { @@ -1238,7 +1238,7 @@ static int16_t ignore_add(transceiver_type_t transceiver, void *address) (void) transceiver; radio_address_t addr = *((radio_address_t *)address); - for (uint8_t i = 0; i < TRANSCEIVER_MAX_IGNORED_ADDR; i++) { + for (size_t i = 0; i < TRANSCEIVER_MAX_IGNORED_ADDR; i++) { if (transceiver_ignored_addr[i] == 0) { transceiver_ignored_addr[i] = addr; DEBUG("addr %u will be ignored (%u)\n", addr, i);