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
This commit is contained in:
patacongo 2011-08-18 14:07:52 +00:00
parent b1edd6327a
commit b2f3e916ef
3 changed files with 14 additions and 2 deletions

View File

@ -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)).

View File

@ -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);
}

View File

@ -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 */