diff options
author | paolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-02-18 08:36:27 +0000 |
---|---|---|
committer | paolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-02-18 08:36:27 +0000 |
commit | 41ae48fe7796b93be9e6c603ed396951e3a01bee (patch) | |
tree | 27649f2406ed864798c973f4333fb7b40794a345 /libstdc++-v3/config | |
parent | a26caf7c6699c3b7d2d7e6f0e8f86828f368840b (diff) | |
download | gcc-41ae48fe7796b93be9e6c603ed396951e3a01bee.tar.gz |
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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@78015 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libstdc++-v3/config')
-rw-r--r-- | libstdc++-v3/config/io/basic_file_stdio.cc | 51 |
1 files changed, 32 insertions, 19 deletions
diff --git a/libstdc++-v3/config/io/basic_file_stdio.cc b/libstdc++-v3/config/io/basic_file_stdio.cc index f83b7a25f88..53c1a26a472 100644 --- a/libstdc++-v3/config/io/basic_file_stdio.cc +++ b/libstdc++-v3/config/io/basic_file_stdio.cc @@ -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 |