From f84b492779c2efc81ca6c7cb6133342c415eadc2 Mon Sep 17 00:00:00 2001 From: Louis Perreault Date: Wed, 22 Mar 2017 11:56:43 -0400 Subject: [PATCH 1/2] fixes for waitForAck and needsFree. --- internal.h | 1 + tx.c | 25 ++++++++++++------------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/internal.h b/internal.h index 73ccd25..092ad33 100644 --- a/internal.h +++ b/internal.h @@ -51,6 +51,7 @@ struct xbee_buf { struct xbee_sbuf { xsys_sem sem; size_t len; + int waitForAck; unsigned char data[1]; }; diff --git a/tx.c b/tx.c index e3d083d..6c7ce12 100644 --- a/tx.c +++ b/tx.c @@ -21,6 +21,7 @@ #include #include #include +#include #include "internal.h" #include "tx.h" @@ -106,10 +107,10 @@ xbee_err xbee_tx(struct xbee *xbee, int *restart, void *arg) { continue; } - if (xbee_ll_ext_item(needsFree, buf) == XBEE_ENONE) { - free(buf); + if (buf->waitForAck) { + xsys_sem_post(&buf->sem); } else { - xsys_sem_post(&buf->sem); + free(buf); } } @@ -144,6 +145,8 @@ xbee_err xbee_txHandler(struct xbee_con *con, const unsigned char *buf, int len, if (!oBuf) return XBEE_EUNKNOWN; + oBuf->waitForAck = waitForAck; + if (waitForAck) xsys_sem_init(&oBuf->sem); con->info.countTx++; @@ -161,18 +164,14 @@ xbee_err xbee_txHandler(struct xbee_con *con, const unsigned char *buf, int len, see xbee_tx() - this helps to keep the timeout value correct */ ret = xsys_sem_wait(&oBuf->sem); - /* perform this atomically */ - xbee_ll_lock(needsFree); - xsys_sem_destroy(&oBuf->sem); if (ret != 0) { - xbee_log(25, "[%p] Unable to wait for transfer to occur... The conType timeout may not be sufficient.", con); - _xbee_ll_add_tail(needsFree, oBuf, 0); - } else { - free(oBuf); + xbee_log(25, "[%p] Wait for transfer to occur returned with errno %d... The conType timeout may not be sufficient.", con, errno); } - xbee_ll_unlock(needsFree); - } else { - xbee_ll_add_tail(needsFree, oBuf); + + xsys_sem_destroy(&oBuf->sem); + + free(oBuf); + } return XBEE_ENONE; From c012b24b8a9feb36db749a692dc51c86093c6d36 Mon Sep 17 00:00:00 2001 From: Louis Perreault Date: Wed, 22 Mar 2017 12:02:19 -0400 Subject: [PATCH 2/2] avoids deadlock of buf->sem when ioFunc() returns an error. --- tx.c | 1 - 1 file changed, 1 deletion(-) diff --git a/tx.c b/tx.c index 6c7ce12..bc65541 100644 --- a/tx.c +++ b/tx.c @@ -104,7 +104,6 @@ xbee_err xbee_tx(struct xbee *xbee, int *restart, void *arg) { if ((ret = info->ioFunc(xbee, info->ioArg, buf)) != XBEE_ENONE) { xbee_log(1, "tx() returned %d... buffer was lost", ret); - continue; } if (buf->waitForAck) {