OSDN Git Service

2004-02-11 Paolo Carlini <pcarlini@suse.de>
authorpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 12 Feb 2004 00:05:35 +0000 (00:05 +0000)
committerpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 12 Feb 2004 00:05:35 +0000 (00:05 +0000)
PR libstdc++/13731 (first part: write)
* config/io/basic_file_stdio.h (__basic_file<char>::xwrite):
New, declare.
* config/io/basic_file_stdio.cc (__basic_file<char>::xwrite):
Define it: a wrapper around write() handling partial write.
(__basic_file<char>::xsputn): Use it.
(__basic_file<char>::xsputn_2): Likewise.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@77680 138bc75d-0d04-0410-961f-82ee72b054a4

libstdc++-v3/ChangeLog
libstdc++-v3/config/io/basic_file_stdio.cc
libstdc++-v3/config/io/basic_file_stdio.h

index 9eef2c6..5926b91 100644 (file)
@@ -1,4 +1,14 @@
 2004-02-11  Paolo Carlini  <pcarlini@suse.de>
+
+       PR libstdc++/13731 (first part: write)
+       * config/io/basic_file_stdio.h (__basic_file<char>::xwrite):
+       New, declare.
+       * config/io/basic_file_stdio.cc (__basic_file<char>::xwrite):
+       Define it: a wrapper around write() handling partial write.
+       (__basic_file<char>::xsputn): Use it.
+       (__basic_file<char>::xsputn_2): Likewise.
+
+2004-02-11  Paolo Carlini  <pcarlini@suse.de>
            Petur Runolfsson  <peturr02@ru.is>
 
        PR libstdc++/14078
index 8cba0db..1419fde 100644 (file)
@@ -200,16 +200,28 @@ namespace std
     while (__ret == -1L && errno == EINTR);
     return __ret;
   }
-    
-  streamsize 
-  __basic_file<char>::xsputn(const char* __s, streamsize __n)
+
+  // Wrapper handling partial write.
+  streamsize
+  __basic_file<char>::xwrite(const char* __s, streamsize __n)
   {
-    streamsize __ret;
-    do
-      __ret = write(this->fd(), __s, __n);
-    while (__ret == -1L && errno == EINTR);
-    return __ret;
+    streamsize __nleft = __n;
+    while (__nleft > 0)
+      {
+       const streamsize __ret = write(this->fd(), __s, __nleft);
+       if (__ret == -1L && errno == EINTR)
+         continue;
+       else if (__ret == -1L)
+         break;
+       __nleft -= __ret;
+       __s += __ret;
+      }
+    return __n - __nleft;
   }
+  streamsize 
+  __basic_file<char>::xsputn(const char* __s, streamsize __n)
+  { return __basic_file<char>::xwrite(__s, __n); }
 
   streamsize 
   __basic_file<char>::xsputn_2(const char* __s1, streamsize __n1,
@@ -228,19 +240,10 @@ namespace std
     while (__ret == -1L && errno == EINTR);
 #else
     if (__n1)
-      do
-       __ret = write(this->fd(), __s1, __n1);
-      while (__ret == -1L && errno == EINTR);
+      __ret = __basic_file<char>::xwrite(__s1, __n1);
 
     if (__ret == __n1)
-      {
-       do
-         __ret = write(this->fd(), __s2, __n2);
-       while (__ret == -1L && errno == EINTR);
-       
-       if (__ret != -1L)
-         __ret += __n1;
-      }
+      __ret += __basic_file<char>::xwrite(__s2, __n2);
 #endif
     return __ret;
   }
index 57ff432..9c0ccfd 100644 (file)
@@ -84,6 +84,9 @@ namespace std
       ~__basic_file();
 
       streamsize 
+      xwrite(const char* __s, streamsize __n);
+
+      streamsize 
       xsputn(const char* __s, streamsize __n);
 
       streamsize