Changeset 5915:ac3f78219f85 in nginx


Ignore:
Timestamp:
08/13/14 11:11:45 (6 years ago)
Author:
Valentin Bartenev <vbart@…>
Branch:
default
Phase:
public
Message:

Moved the code for coalescing file buffers to a separate function.

Location:
src
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • src/core/ngx_buf.c

    r5912 r5915  
    221221
    222222
     223off_t
     224ngx_chain_coalesce_file(ngx_chain_t **in, off_t limit)
     225{
     226    off_t         total, size, aligned, fprev;
     227    ngx_fd_t      fd;
     228    ngx_chain_t  *cl;
     229
     230    total = 0;
     231
     232    cl = *in;
     233    fd = cl->buf->file->fd;
     234
     235    do {
     236        size = cl->buf->file_last - cl->buf->file_pos;
     237
     238        if (size > limit - total) {
     239            size = limit - total;
     240
     241            aligned = (cl->buf->file_pos + size + ngx_pagesize - 1)
     242                       & ~((off_t) ngx_pagesize - 1);
     243
     244            if (aligned <= cl->buf->file_last) {
     245                size = aligned - cl->buf->file_pos;
     246            }
     247        }
     248
     249        total += size;
     250        fprev = cl->buf->file_pos + size;
     251        cl = cl->next;
     252
     253    } while (cl
     254             && cl->buf->in_file
     255             && total < limit
     256             && fd == cl->buf->file->fd
     257             && fprev == cl->buf->file_pos);
     258
     259    *in = cl;
     260
     261    return total;
     262}
     263
     264
    223265ngx_chain_t *
    224266ngx_chain_update_sent(ngx_chain_t *in, off_t sent)
  • src/core/ngx_buf.h

    r5912 r5915  
    159159    ngx_chain_t **busy, ngx_chain_t **out, ngx_buf_tag_t tag);
    160160
     161off_t ngx_chain_coalesce_file(ngx_chain_t **in, off_t limit);
     162
    161163ngx_chain_t *ngx_chain_update_sent(ngx_chain_t *in, off_t sent);
    162164
  • src/os/unix/ngx_darwin_sendfile_chain.c

    r5913 r5915  
    3232{
    3333    int              rc;
    34     off_t            size, send, prev_send, aligned, sent, fprev;
     34    off_t            send, prev_send, sent;
    3535    off_t            file_size;
    3636    ngx_uint_t       eintr;
     
    9696            /* coalesce the neighbouring file bufs */
    9797
    98             do {
    99                 size = cl->buf->file_last - cl->buf->file_pos;
    100 
    101                 if (send + size > limit) {
    102                     size = limit - send;
    103 
    104                     aligned = (cl->buf->file_pos + size + ngx_pagesize - 1)
    105                                & ~((off_t) ngx_pagesize - 1);
    106 
    107                     if (aligned <= cl->buf->file_last) {
    108                         size = aligned - cl->buf->file_pos;
    109                     }
    110                 }
    111 
    112                 file_size += size;
    113                 send += size;
    114                 fprev = cl->buf->file_pos + size;
    115                 cl = cl->next;
    116 
    117             } while (cl
    118                      && cl->buf->in_file
    119                      && send < limit
    120                      && file->file->fd == cl->buf->file->fd
    121                      && fprev == cl->buf->file_pos);
     98            file_size = ngx_chain_coalesce_file(&cl, limit - send);
     99
     100            send += file_size;
    122101        }
    123102
  • src/os/unix/ngx_freebsd_sendfile_chain.c

    r5913 r5915  
    3434{
    3535    int              rc, flags;
    36     off_t            size, send, prev_send, aligned, sent, fprev;
     36    off_t            send, prev_send, sent;
    3737    size_t           file_size;
    3838    ngx_uint_t       eintr, eagain;
     
    100100            /* coalesce the neighbouring file bufs */
    101101
    102             do {
    103                 size = cl->buf->file_last - cl->buf->file_pos;
    104 
    105                 if (send + size > limit) {
    106                     size = limit - send;
    107 
    108                     aligned = (cl->buf->file_pos + size + ngx_pagesize - 1)
    109                                & ~((off_t) ngx_pagesize - 1);
    110 
    111                     if (aligned <= cl->buf->file_last) {
    112                         size = aligned - cl->buf->file_pos;
    113                     }
    114                 }
    115 
    116                 file_size += (size_t) size;
    117                 send += size;
    118                 fprev = cl->buf->file_pos + size;
    119                 cl = cl->next;
    120 
    121             } while (cl
    122                      && cl->buf->in_file
    123                      && send < limit
    124                      && file->file->fd == cl->buf->file->fd
    125                      && fprev == cl->buf->file_pos);
     102            file_size = (size_t) ngx_chain_coalesce_file(&cl, limit - send);
     103
     104            send += file_size;
    126105        }
    127106
  • src/os/unix/ngx_linux_sendfile_chain.c

    r5913 r5915  
    3232{
    3333    int            rc, tcp_nodelay;
    34     off_t          size, send, prev_send, aligned, sent, fprev;
     34    off_t          send, prev_send, sent;
    3535    size_t         file_size;
    3636    ngx_err_t      err;
     
    154154            /* coalesce the neighbouring file bufs */
    155155
    156             do {
    157                 size = cl->buf->file_last - cl->buf->file_pos;
    158 
    159                 if (send + size > limit) {
    160                     size = limit - send;
    161 
    162                     aligned = (cl->buf->file_pos + size + ngx_pagesize - 1)
    163                                & ~((off_t) ngx_pagesize - 1);
    164 
    165                     if (aligned <= cl->buf->file_last) {
    166                         size = aligned - cl->buf->file_pos;
    167                     }
    168                 }
    169 
    170                 file_size += (size_t) size;
    171                 send += size;
    172                 fprev = cl->buf->file_pos + size;
    173                 cl = cl->next;
    174 
    175             } while (cl
    176                      && cl->buf->in_file
    177                      && send < limit
    178                      && file->file->fd == cl->buf->file->fd
    179                      && fprev == cl->buf->file_pos);
     156            file_size = (size_t) ngx_chain_coalesce_file(&cl, limit - send);
     157
     158            send += file_size;
    180159        }
    181160
Note: See TracChangeset for help on using the changeset viewer.