From 0be1a13c60b6e43d1ef6357444111c35b4c0a942 Mon Sep 17 00:00:00 2001 From: Klaus Schmidinger Date: Fri, 22 Mar 2002 15:18:58 +0100 Subject: [PATCH] Improved file I/O in case of EINTR --- HISTORY | 2 ++ tools.c | 25 ++++++++++++++++--------- 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/HISTORY b/HISTORY index 0aa75d4b..1d60f8c4 100644 --- a/HISTORY +++ b/HISTORY @@ -1125,3 +1125,5 @@ Video Disk Recorder Revision History - Fixed restoring CICAM setup values for a fourth DVB card. - Completed internationalization of OSD texts (thanks to Hannu Savolainen, Arnold Niessen, Paulo Lopes). +- Improved file I/O in case of EINTR, which may occur e.g. with heavy system + load (thanks to Werner Fink). diff --git a/tools.c b/tools.c index 3764a644..21a91dc1 100644 --- a/tools.c +++ b/tools.c @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: tools.c 1.59 2002/02/17 12:57:23 kls Exp $ + * $Id: tools.c 1.60 2002/03/22 15:18:58 kls Exp $ */ #include "tools.h" @@ -33,14 +33,21 @@ ssize_t safe_read(int filedes, void *buffer, size_t size) ssize_t safe_write(int filedes, const void *buffer, size_t size) { - for (;;) { - ssize_t p = write(filedes, buffer, size); - if (p < 0 && errno == EINTR) { - dsyslog(LOG_INFO, "EINTR while writing to file handle %d - retrying", filedes); - continue; - } - return p; - } + ssize_t p = -1; + const unsigned char *ptr = (const unsigned char *)buffer; + while (size > 0) { + p = write(filedes, ptr, size); + if (p < 0) { + if (errno == EINTR) { + dsyslog(LOG_INFO, "EINTR while writing to file handle %d - retrying", filedes); + continue; + } + break; + } + ptr += p; + size -= p; + } + return p; } void writechar(int filedes, char c)