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;