diff options
author | patacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3> | 2012-08-12 17:37:04 +0000 |
---|---|---|
committer | patacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3> | 2012-08-12 17:37:04 +0000 |
commit | 4d7cbe088ed6ea14adc0672b339f1e0df4650f00 (patch) | |
tree | b8701e6c319c085758d39c4dd7d08c380fc2088a /nuttx/lib/stdio/lib_rawoutstream.c | |
parent | 66fcc36c58e7670ef627985cc37ac99dc747c02f (diff) | |
download | px4-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.c | 29 |
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); } } |