OLD | NEW |
1 // Copyright 2014 The Crashpad Authors. All rights reserved. | 1 // Copyright 2014 The Crashpad Authors. All rights reserved. |
2 // | 2 // |
3 // Licensed under the Apache License, Version 2.0 (the "License"); | 3 // Licensed under the Apache License, Version 2.0 (the "License"); |
4 // you may not use this file except in compliance with the License. | 4 // you may not use this file except in compliance with the License. |
5 // You may obtain a copy of the License at | 5 // You may obtain a copy of the License at |
6 // | 6 // |
7 // http://www.apache.org/licenses/LICENSE-2.0 | 7 // http://www.apache.org/licenses/LICENSE-2.0 |
8 // | 8 // |
9 // Unless required by applicable law or agreed to in writing, software | 9 // Unless required by applicable law or agreed to in writing, software |
10 // distributed under the License is distributed on an "AS IS" BASIS, | 10 // distributed under the License is distributed on an "AS IS" BASIS, |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
86 // between WritableIoVec and iovec is that WritableIoVec’s iov_base is a | 86 // between WritableIoVec and iovec is that WritableIoVec’s iov_base is a |
87 // pointer to a const buffer, where iovec’s iov_base isn’t. writev doesn’t | 87 // pointer to a const buffer, where iovec’s iov_base isn’t. writev doesn’t |
88 // actually write to the data, so this cast is safe here. iovec’s iov_base is | 88 // actually write to the data, so this cast is safe here. iovec’s iov_base is |
89 // non-const because the same structure is used for readv and writev, and | 89 // non-const because the same structure is used for readv and writev, and |
90 // readv needs to write to the buffer that iov_base points to. | 90 // readv needs to write to the buffer that iov_base points to. |
91 iovec* iov = reinterpret_cast<iovec*>(&(*iovecs)[0]); | 91 iovec* iov = reinterpret_cast<iovec*>(&(*iovecs)[0]); |
92 size_t remaining_iovecs = iovecs->size(); | 92 size_t remaining_iovecs = iovecs->size(); |
93 | 93 |
94 while (size > 0) { | 94 while (size > 0) { |
95 size_t writev_iovec_count = | 95 size_t writev_iovec_count = |
96 std::min(remaining_iovecs, static_cast<size_t>(IOV_MAX)); | 96 std::min(remaining_iovecs, implicit_cast<size_t>(IOV_MAX)); |
97 ssize_t written = HANDLE_EINTR(writev(fd_.get(), iov, writev_iovec_count)); | 97 ssize_t written = HANDLE_EINTR(writev(fd_.get(), iov, writev_iovec_count)); |
98 if (written < 0) { | 98 if (written < 0) { |
99 PLOG(ERROR) << "writev"; | 99 PLOG(ERROR) << "writev"; |
100 return false; | 100 return false; |
101 } else if (written == 0) { | 101 } else if (written == 0) { |
102 LOG(ERROR) << "writev: returned 0"; | 102 LOG(ERROR) << "writev: returned 0"; |
103 return false; | 103 return false; |
104 } | 104 } |
105 | 105 |
106 size -= written; | 106 size -= written; |
107 DCHECK_GE(size, 0); | 107 DCHECK_GE(size, 0); |
108 | 108 |
109 if (size == 0) { | 109 if (size == 0) { |
110 remaining_iovecs = 0; | 110 remaining_iovecs = 0; |
111 break; | 111 break; |
112 } | 112 } |
113 | 113 |
114 while (written > 0) { | 114 while (written > 0) { |
115 size_t wrote_this_iovec = | 115 size_t wrote_this_iovec = |
116 std::min(static_cast<size_t>(written), iov->iov_len); | 116 std::min(implicit_cast<size_t>(written), iov->iov_len); |
117 written -= wrote_this_iovec; | 117 written -= wrote_this_iovec; |
118 if (wrote_this_iovec < iov->iov_len) { | 118 if (wrote_this_iovec < iov->iov_len) { |
119 iov->iov_base = | 119 iov->iov_base = |
120 reinterpret_cast<char*>(iov->iov_base) + wrote_this_iovec; | 120 reinterpret_cast<char*>(iov->iov_base) + wrote_this_iovec; |
121 iov->iov_len -= wrote_this_iovec; | 121 iov->iov_len -= wrote_this_iovec; |
122 } else { | 122 } else { |
123 ++iov; | 123 ++iov; |
124 --remaining_iovecs; | 124 --remaining_iovecs; |
125 } | 125 } |
126 } | 126 } |
(...skipping 15 matching lines...) Expand all Loading... |
142 | 142 |
143 off_t rv = lseek(fd_.get(), offset, whence); | 143 off_t rv = lseek(fd_.get(), offset, whence); |
144 if (rv < 0) { | 144 if (rv < 0) { |
145 PLOG(ERROR) << "lseek"; | 145 PLOG(ERROR) << "lseek"; |
146 } | 146 } |
147 | 147 |
148 return rv; | 148 return rv; |
149 } | 149 } |
150 | 150 |
151 } // namespace crashpad | 151 } // namespace crashpad |
OLD | NEW |