summaryrefslogtreecommitdiff
path: root/nuttx/lib/stdio/lib_rawoutstream.c
diff options
context:
space:
mode:
authorpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2012-08-12 17:37:04 +0000
committerpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2012-08-12 17:37:04 +0000
commit4d7cbe088ed6ea14adc0672b339f1e0df4650f00 (patch)
treeb8701e6c319c085758d39c4dd7d08c380fc2088a /nuttx/lib/stdio/lib_rawoutstream.c
parent66fcc36c58e7670ef627985cc37ac99dc747c02f (diff)
downloadpx4-nuttx-4d7cbe088ed6ea14adc0672b339f1e0df4650f00.tar.gz
px4-nuttx-4d7cbe088ed6ea14adc0672b339f1e0df4650f00.tar.bz2
px4-nuttx-4d7cbe088ed6ea14adc0672b339f1e0df4650f00.zip
drivers/serial/serial.c open, read, write, and poll methods will not return a short transfer or an EINTR error if a signal is received while waiting (only)
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@5022 42af7a65-404d-4744-a932-0658087f49c3
Diffstat (limited to 'nuttx/lib/stdio/lib_rawoutstream.c')
-rw-r--r--nuttx/lib/stdio/lib_rawoutstream.c29
1 files changed, 20 insertions, 9 deletions
diff --git a/nuttx/lib/stdio/lib_rawoutstream.c b/nuttx/lib/stdio/lib_rawoutstream.c
index ce9d33280..b4a20958b 100644
--- a/nuttx/lib/stdio/lib_rawoutstream.c
+++ b/nuttx/lib/stdio/lib_rawoutstream.c
@@ -38,7 +38,9 @@
****************************************************************************/
#include <unistd.h>
+#include <assert.h>
#include <errno.h>
+
#include "lib_internal.h"
/****************************************************************************
@@ -52,19 +54,28 @@
static void rawoutstream_putc(FAR struct lib_outstream_s *this, int ch)
{
FAR struct lib_rawoutstream_s *rthis = (FAR struct lib_rawoutstream_s *)this;
+ int nwritten;
char buffer = ch;
- if (this && rthis->fd >= 0)
+
+ DEBUGASSERT(this && rthis->fd >= 0);
+
+ /* Loop until the character is successfully transferred */
+
+ for (;;)
{
- int nwritten;
- do
+ nwritten = write(rthis->fd, &buffer, 1);
+ if (nwritten == 1)
{
- nwritten = write(rthis->fd, &buffer, 1);
- if (nwritten == 1)
- {
- this->nput++;
- }
+ this->nput++;
+ return;
}
- while (nwritten < 0 && get_errno() == EINTR);
+
+ /* The only expected error is EINTR, meaning that the write operation
+ * was awakened by a signal. Zero would not be a valid return value
+ * either.
+ */
+
+ DEBUGASSERT(nwritten < 0 && get_errno() == EINTR);
}
}