mirror of
https://github.com/apache/nuttx.git
synced 2026-06-01 07:45:16 +08:00
Check return from nxsem_wait_initialize()
Resolution of Issue 619 will require multiple steps, this part of the first step in that resolution: Every call to nxsem_wait_uninterruptible() must handle the return value from nxsem_wait_uninterruptible properly. This commit is only for those files under drivers/audio, drivers/net, and drivers/lcd.
This commit is contained in:
committed by
Abdelatif Guettouche
parent
7f510a61b4
commit
5b74974919
+22
-10
@@ -819,7 +819,8 @@ static ssize_t telnet_read(FAR struct file *filep, FAR char *buffer,
|
||||
{
|
||||
FAR struct inode *inode = filep->f_inode;
|
||||
FAR struct telnet_dev_s *priv = inode->i_private;
|
||||
ssize_t ret = 0;
|
||||
ssize_t nread = 0;
|
||||
int ret;
|
||||
|
||||
ninfo("len: %d\n", len);
|
||||
|
||||
@@ -848,33 +849,44 @@ static ssize_t telnet_read(FAR struct file *filep, FAR char *buffer,
|
||||
return -EAGAIN;
|
||||
}
|
||||
|
||||
/* Wait for new data (or error) */
|
||||
/* Wait for new data, interrupt, or thread cancellation */
|
||||
|
||||
ret = nxsem_wait(&priv->td_iosem);
|
||||
if (ret < 0)
|
||||
{
|
||||
nerr("ERROR: nxsem_wait failed: %d\n", ret);
|
||||
return (ssize_t)ret;
|
||||
}
|
||||
|
||||
nxsem_wait_uninterruptible(&priv->td_iosem);
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Take exclusive access to data buffer */
|
||||
|
||||
nxsem_wait(&priv->td_exclsem);
|
||||
ret = nxsem_wait(&priv->td_exclsem);
|
||||
if (ret < 0)
|
||||
{
|
||||
nerr("ERROR: nxsem_wait failed: %d\n", ret);
|
||||
return (ssize_t)ret;
|
||||
}
|
||||
|
||||
/* Process the buffered telnet data */
|
||||
|
||||
src = &priv->td_rxbuffer[priv->td_offset];
|
||||
ret = telnet_receive(priv, src, priv->td_pending, buffer, len);
|
||||
nread = telnet_receive(priv, src, priv->td_pending, buffer, len);
|
||||
|
||||
nxsem_post(&priv->td_exclsem);
|
||||
}
|
||||
while (ret == 0);
|
||||
while (nread == 0);
|
||||
|
||||
/* Returned Value:
|
||||
*
|
||||
* ret > 0: The number of characters copied into the user buffer by
|
||||
* telnet_receive().
|
||||
* ret <= 0: Loss of connection or error events reported by recv().
|
||||
* nread > 0: The number of characters copied into the user buffer by
|
||||
* telnet_receive().
|
||||
* nread <= 0: Loss of connection or error events reported by recv().
|
||||
*/
|
||||
|
||||
return ret;
|
||||
return nread;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
|
||||
Reference in New Issue
Block a user