summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2011-08-18 14:07:52 +0000
committerpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2011-08-18 14:07:52 +0000
commitaad68a29984f20c2888f6897c2597d80df6bf8ee (patch)
tree2f1212b1ea86e4bedd984788699a03ad124840a8
parenta2ed85e342d6705578a222f3a1e0bf9c0ae08e21 (diff)
downloadpx4-nuttx-aad68a29984f20c2888f6897c2597d80df6bf8ee.tar.gz
px4-nuttx-aad68a29984f20c2888f6897c2597d80df6bf8ee.tar.bz2
px4-nuttx-aad68a29984f20c2888f6897c2597d80df6bf8ee.zip
Fix a semphore overflow problem in the CAN driver
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@3890 42af7a65-404d-4744-a932-0658087f49c3
-rw-r--r--nuttx/ChangeLog3
-rw-r--r--nuttx/drivers/can.c12
-rw-r--r--nuttx/include/nuttx/can.h1
3 files changed, 14 insertions, 2 deletions
diff --git a/nuttx/ChangeLog b/nuttx/ChangeLog
index e3e1ab566..604590f7d 100644
--- a/nuttx/ChangeLog
+++ b/nuttx/ChangeLog
@@ -2002,3 +2002,6 @@
and bit fields within all Kinetis registers.
* configs/twr-k60n512: Add support for the Kinetis K60 Tower board
(TWR-K60N512).
+ * drivers/can.c: Fixe a semaphore overflow problem in the CAN driver
+ (reported by Li Zhouy (Lzzy)).
+
diff --git a/nuttx/drivers/can.c b/nuttx/drivers/can.c
index accafce3c..fc70678a7 100644
--- a/nuttx/drivers/can.c
+++ b/nuttx/drivers/can.c
@@ -50,6 +50,7 @@
#include <string.h>
#include <semaphore.h>
#include <fcntl.h>
+#include <assert.h>
#include <errno.h>
#include <debug.h>
@@ -443,7 +444,11 @@ static ssize_t can_write(FAR struct file *filep, FAR const char *buffer, size_t
do
{
+ DEBUGASSERT(dev->cd_ntxwaiters < 255);
+ dev->cd_ntxwaiters++;
ret = sem_wait(&fifo->cf_sem);
+ dev->cd_ntxwaiters--;
+
if (ret < 0 && errno != EINTR)
{
ret = -errno;
@@ -750,9 +755,12 @@ int can_txdone(FAR struct can_dev_s *dev)
/* Send the next message in the FIFO */
ret = can_xmit(dev);
- if (ret == OK)
+
+ /* Are there any threads waiting for space in the TX FIFO? */
+
+ if (ret == OK && dev->cd_ntxwaiters > 0)
{
- /* Inform any waiting threads that new xmit space is available */
+ /* Yes.. Inform them that new xmit space is available */
ret = sem_post(&dev->cd_xmit.cf_sem);
}
diff --git a/nuttx/include/nuttx/can.h b/nuttx/include/nuttx/can.h
index 5841aff7a..8b438ffda 100644
--- a/nuttx/include/nuttx/can.h
+++ b/nuttx/include/nuttx/can.h
@@ -219,6 +219,7 @@ struct can_dev_s
{
uint8_t cd_ocount; /* The number of times the device has been opened */
uint8_t cd_npendrtr; /* Number of pending RTR messages */
+ uint8_t cd_ntxwaiters; /* Number of threads waiting to enqueue a message */
sem_t cd_closesem; /* Locks out new opens while close is in progress */
sem_t cd_recvsem; /* Used to wakeup user waiting for space in cd_recv.buffer */
struct can_fifo_s cd_xmit; /* Describes transmit FIFO */