OSDN Git Service

2004-02-18 Paolo Carlini <pcarlini@suse.de>
authorpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 18 Feb 2004 08:36:27 +0000 (08:36 +0000)
committerpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 18 Feb 2004 08:36:27 +0000 (08:36 +0000)
* config/io/basic_file_stdio.cc (__gnu_internal::xwritev):
Rewrite, avoiding recursion.
(__gnu_internal::xwrite): Minor tweaks.

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

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

index c40c080..822c781 100644 (file)
@@ -1,3 +1,9 @@
+2004-02-18  Paolo Carlini  <pcarlini@suse.de>
+
+       * config/io/basic_file_stdio.cc (__gnu_internal::xwritev):
+       Rewrite, avoiding recursion.
+       (__gnu_internal::xwrite): Minor tweaks.
+
 2004-02-17  Stefan Olsson  <stefan@xapa.se>
 
        * include/ext/mt_allocator.h: Removed the last
index f83b7a2..53c1a26 100644 (file)
@@ -111,16 +111,22 @@ namespace __gnu_internal
   xwrite(int __fd, const char* __s, std::streamsize __n)
   {
     std::streamsize __nleft = __n;
-    while (__nleft > 0)
+
+    for (;;)
       {
        const std::streamsize __ret = write(__fd, __s, __nleft);
        if (__ret == -1L && errno == EINTR)
          continue;
-       else if (__ret == -1L)
+       if (__ret == -1L)
          break;
+
        __nleft -= __ret;
+       if (__nleft == 0)
+         break;
+
        __s += __ret;
       }
+
     return __n - __nleft;
   }
 
@@ -130,33 +136,40 @@ namespace __gnu_internal
   xwritev(int __fd, const char* __s1, std::streamsize __n1,
          const char* __s2, std::streamsize __n2)
   {
-    std::streamsize __ret;
+    std::streamsize __nleft = __n1 + __n2;
+    std::streamsize __n1_left = __n1;
 
     struct iovec __iov[2];
-    __iov[0].iov_base = const_cast<char*>(__s1);
-    __iov[0].iov_len = __n1;
     __iov[1].iov_base = const_cast<char*>(__s2);
     __iov[1].iov_len = __n2;
 
-    do
-      __ret = writev(__fd, __iov, 2);
-    while (__ret == -1L && errno == EINTR);
-
-    if (__ret == -1L)
-      __ret = 0;
-    else if (__ret < __n1 + __n2)
+    for (;;)
       {
-       if (__ret >= __n1)
+       __iov[0].iov_base = const_cast<char*>(__s1);
+       __iov[0].iov_len = __n1_left;
+
+       const std::streamsize __ret = writev(__fd, __iov, 2);
+       if (__ret == -1L && errno == EINTR)
+         continue;
+       if (__ret == -1L)
+         break;
+
+       __nleft -= __ret;
+       if (__nleft == 0)
+         break;
+
+       const std::streamsize __off = __ret - __n1_left;
+       if (__off >= 0)
          {
-           const std::streamsize __off = __ret - __n1;
-           __ret += xwrite(__fd, __s2 + __off, __n2 - __off);
+           __nleft -= xwrite(__fd, __s2 + __off, __n2 - __off);
+           break;
          }
-       else
-         __ret += xwritev(__fd, __s1 + __ret, __n1 - __ret,
-                          __s2, __n2);
+       
+       __s1 += __ret;
+       __n1_left -= __ret;
       }
 
-    return __ret;
+    return __n1 + __n2 - __nleft;
   }
 #endif
 } // namespace __gnu_internal