Mercurial > hg > nginx
comparison src/os/unix/ngx_files.c @ 6299:5170c3040ce1
Handled EINTR from write() and pwrite() syscalls.
This is in addition to 6fce16b1fc10.
author | Valentin Bartenev <vbart@nginx.com> |
---|---|
date | Tue, 17 Nov 2015 19:01:41 +0300 |
parents | 8f6d753c1953 |
children | be6af0906a4d |
comparison
equal
deleted
inserted
replaced
6298:8f6d753c1953 | 6299:5170c3040ce1 |
---|---|
174 | 174 |
175 | 175 |
176 ssize_t | 176 ssize_t |
177 ngx_write_file(ngx_file_t *file, u_char *buf, size_t size, off_t offset) | 177 ngx_write_file(ngx_file_t *file, u_char *buf, size_t size, off_t offset) |
178 { | 178 { |
179 ssize_t n, written; | 179 ssize_t n, written; |
180 ngx_err_t err; | |
180 | 181 |
181 ngx_log_debug4(NGX_LOG_DEBUG_CORE, file->log, 0, | 182 ngx_log_debug4(NGX_LOG_DEBUG_CORE, file->log, 0, |
182 "write: %d, %p, %uz, %O", file->fd, buf, size, offset); | 183 "write: %d, %p, %uz, %O", file->fd, buf, size, offset); |
183 | 184 |
184 written = 0; | 185 written = 0; |
187 | 188 |
188 for ( ;; ) { | 189 for ( ;; ) { |
189 n = pwrite(file->fd, buf + written, size, offset); | 190 n = pwrite(file->fd, buf + written, size, offset); |
190 | 191 |
191 if (n == -1) { | 192 if (n == -1) { |
192 ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno, | 193 err = ngx_errno; |
194 | |
195 if (err == NGX_EINTR) { | |
196 ngx_log_debug0(NGX_LOG_DEBUG_CORE, file->log, err, | |
197 "pwrite() was interrupted"); | |
198 continue; | |
199 } | |
200 | |
201 ngx_log_error(NGX_LOG_CRIT, file->log, err, | |
193 "pwrite() \"%s\" failed", file->name.data); | 202 "pwrite() \"%s\" failed", file->name.data); |
194 return NGX_ERROR; | 203 return NGX_ERROR; |
195 } | 204 } |
196 | 205 |
197 file->offset += n; | 206 file->offset += n; |
219 | 228 |
220 for ( ;; ) { | 229 for ( ;; ) { |
221 n = write(file->fd, buf + written, size); | 230 n = write(file->fd, buf + written, size); |
222 | 231 |
223 if (n == -1) { | 232 if (n == -1) { |
224 ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno, | 233 err = ngx_errno; |
234 | |
235 if (err == NGX_EINTR) { | |
236 ngx_log_debug0(NGX_LOG_DEBUG_CORE, file->log, err, | |
237 "write() was interrupted"); | |
238 continue; | |
239 } | |
240 | |
241 ngx_log_error(NGX_LOG_CRIT, file->log, err, | |
225 "write() \"%s\" failed", file->name.data); | 242 "write() \"%s\" failed", file->name.data); |
226 return NGX_ERROR; | 243 return NGX_ERROR; |
227 } | 244 } |
228 | 245 |
229 file->sys_offset += n; | 246 file->sys_offset += n; |