OSDN Git Service

2004-02-12 Paolo Carlini <pcarlini@suse.de>
authorpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 12 Feb 2004 18:24:07 +0000 (18:24 +0000)
committerpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 12 Feb 2004 18:24:07 +0000 (18:24 +0000)
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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@77717 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 b74af67..b4a8084 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 1419fde..f83b7a2 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 9c0ccfd..57ff432 100644 (file)
@@ -84,9 +84,6 @@ namespace std
       ~__basic_file();
 
       streamsize 
-      xwrite(const char* __s, streamsize __n);
-
-      streamsize 
       xsputn(const char* __s, streamsize __n);
 
       streamsize