]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
PR libstdc++/13731 (final part: writev)
authorPaolo Carlini <pcarlini@suse.de>
Thu, 12 Feb 2004 18:24:07 +0000 (18:24 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Thu, 12 Feb 2004 18:24:07 +0000 (18:24 +0000)
2004-02-12  Paolo Carlini  <pcarlini@suse.de>

PR libstdc++/13731 (final part: writev)
* config/io/basic_file_stdio.cc (__gnu_internal::xwrite):
New, a wrapper around writev() handling partial writes.
(__basic_file<char>::xwrite): Move to __gnu_internal and make
static.
(__basic_file<char>::xsputn): Update call.
(__basic_file<char>::xsputn_2): Likewise.
* config/io/basic_file_stdio.h (__basic_file<char>::write):
Don't declare, now static.

From-SVN: r77717

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

index b74af678a174441f21c611f6bc643ae134339496..b4a808445aeca1201b26b9124b8e65867f5dddae 100644 (file)
@@ -1,3 +1,15 @@
+2004-02-12  Paolo Carlini  <pcarlini@suse.de>
+
+       PR libstdc++/13731 (final part: writev)
+       * config/io/basic_file_stdio.cc (__gnu_internal::xwrite):
+       New, a wrapper around writev() handling partial writes.
+       (__basic_file<char>::xwrite): Move to __gnu_internal and make
+       static.
+       (__basic_file<char>::xsputn): Update call.
+       (__basic_file<char>::xsputn_2): Likewise.       
+       * config/io/basic_file_stdio.h (__basic_file<char>::write):
+       Don't declare, now static.
+
 2004-02-11  Stefan Olsson  <stefan@xapa.se>
 
        * docs/html/ext/mt_allocator.html: New.
index 1419fdedf4bf5e5e4da6d27bc0ee46331605895b..f83b7a25f88dee88eb98e380cb238ae1ad71ab3b 100644 (file)
@@ -105,6 +105,60 @@ namespace __gnu_internal
       default: return 0; // invalid
       }
   }
+
+  // Wrapper handling partial write.
+  static std::streamsize
+  xwrite(int __fd, const char* __s, std::streamsize __n)
+  {
+    std::streamsize __nleft = __n;
+    while (__nleft > 0)
+      {
+       const std::streamsize __ret = write(__fd, __s, __nleft);
+       if (__ret == -1L && errno == EINTR)
+         continue;
+       else if (__ret == -1L)
+         break;
+       __nleft -= __ret;
+       __s += __ret;
+      }
+    return __n - __nleft;
+  }
+
+#ifdef _GLIBCXX_HAVE_WRITEV
+  // Wrapper handling partial writev.
+  static std::streamsize
+  xwritev(int __fd, const char* __s1, std::streamsize __n1,
+         const char* __s2, std::streamsize __n2)
+  {
+    std::streamsize __ret;
+
+    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)
+      {
+       if (__ret >= __n1)
+         {
+           const std::streamsize __off = __ret - __n1;
+           __ret += xwrite(__fd, __s2 + __off, __n2 - __off);
+         }
+       else
+         __ret += xwritev(__fd, __s1 + __ret, __n1 - __ret,
+                          __s2, __n2);
+      }
+
+    return __ret;
+  }
+#endif
 } // namespace __gnu_internal
 
 namespace std 
@@ -201,27 +255,9 @@ namespace std
     return __ret;
   }
 
-  // Wrapper handling partial write.
-  streamsize
-  __basic_file<char>::xwrite(const char* __s, streamsize __n)
-  {
-    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); }
+  { return __gnu_internal::xwrite(this->fd(), __s, __n); }
 
   streamsize 
   __basic_file<char>::xsputn_2(const char* __s1, streamsize __n1,
@@ -229,21 +265,13 @@ namespace std
   {
     streamsize __ret = 0;
 #ifdef _GLIBCXX_HAVE_WRITEV
-    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(this->fd(), __iov, 2);
-    while (__ret == -1L && errno == EINTR);
+    __ret = __gnu_internal::xwritev(this->fd(), __s1, __n1, __s2, __n2);
 #else
     if (__n1)
-      __ret = __basic_file<char>::xwrite(__s1, __n1);
+      __ret = __gnu_internal::xwrite(this->fd(), __s1, __n1);
 
     if (__ret == __n1)
-      __ret += __basic_file<char>::xwrite(__s2, __n2);
+      __ret += __gnu_internal::xwrite(this->fd(), __s2, __n2);
 #endif
     return __ret;
   }
index 9c0ccfd1bad82023a55ff0ad970d13f5ccad0f68..57ff4326e6b190498d5f9c153ca4186e26450dce 100644 (file)
@@ -83,9 +83,6 @@ namespace std
 
       ~__basic_file();
 
-      streamsize 
-      xwrite(const char* __s, streamsize __n);
-
       streamsize 
       xsputn(const char* __s, streamsize __n);