~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~ [ freetext search ] ~ [ file search ] ~

Linux Cross Reference
Nginx/os/unix/ngx_aio_read.c

Version: ~ [ nginx-0.8.20 ] ~ [ nginx-0.7.62 ] ~ [ nginx-0.6.39 ] ~

  1 
  2 /*
  3  * Copyright (C) Igor Sysoev
  4  */
  5 
  6 
  7 #include <ngx_config.h>
  8 #include <ngx_core.h>
  9 #include <ngx_event.h>
 10 
 11 
 12 extern int  ngx_kqueue;
 13 
 14 
 15 ssize_t
 16 ngx_aio_read(ngx_connection_t *c, u_char *buf, size_t size)
 17 {
 18     int           n;
 19     ngx_event_t  *rev;
 20 
 21     rev = c->read;
 22 
 23     if (!rev->ready) {
 24         ngx_log_error(NGX_LOG_ALERT, c->log, 0, "second aio post");
 25         return NGX_AGAIN;
 26     }
 27 
 28     ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
 29                    "rev->complete: %d", rev->complete);
 30     ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
 31                    "aio size: %d", size);
 32 
 33     if (!rev->complete) {
 34         ngx_memzero(&rev->aiocb, sizeof(struct aiocb));
 35 
 36         rev->aiocb.aio_fildes = c->fd;
 37         rev->aiocb.aio_buf = buf;
 38         rev->aiocb.aio_nbytes = size;
 39 
 40 #if (NGX_HAVE_KQUEUE)
 41         rev->aiocb.aio_sigevent.sigev_notify_kqueue = ngx_kqueue;
 42         rev->aiocb.aio_sigevent.sigev_notify = SIGEV_KEVENT;
 43         rev->aiocb.aio_sigevent.sigev_value.sigval_ptr = rev;
 44 #endif
 45 
 46         if (aio_read(&rev->aiocb) == -1) {
 47             ngx_log_error(NGX_LOG_CRIT, rev->log, ngx_errno,
 48                           "aio_read() failed");
 49             rev->error = 1;
 50             return NGX_ERROR;
 51         }
 52 
 53         ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
 54                        "aio_read: #%d OK", c->fd);
 55 
 56         rev->active = 1;
 57         rev->ready = 0;
 58     }
 59 
 60     rev->complete = 0;
 61 
 62     n = aio_error(&rev->aiocb);
 63     if (n == -1) {
 64         ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno, "aio_error() failed");
 65         rev->error = 1;
 66         return NGX_ERROR;
 67     }
 68 
 69     if (n != 0) {
 70         if (n == NGX_EINPROGRESS) {
 71             if (rev->ready) {
 72                 ngx_log_error(NGX_LOG_ALERT, c->log, n,
 73                               "aio_read() still in progress");
 74                 rev->ready = 0;
 75             }
 76             return NGX_AGAIN;
 77         }
 78 
 79         ngx_log_error(NGX_LOG_CRIT, c->log, n, "aio_read() failed");
 80         rev->error = 1;
 81         rev->ready = 0;
 82         return NGX_ERROR;
 83     }
 84 
 85     n = aio_return(&rev->aiocb);
 86     if (n == -1) {
 87         ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno,
 88                       "aio_return() failed");
 89 
 90         rev->error = 1;
 91         rev->ready = 0;
 92         return NGX_ERROR;
 93     }
 94 
 95     ngx_log_debug2(NGX_LOG_DEBUG_EVENT, rev->log, 0,
 96                    "aio_read: #%d %d", c->fd, n);
 97 
 98     if (n == 0) {
 99         rev->eof = 1;
100         rev->ready = 0;
101     } else {
102         rev->ready = 1;
103     }
104 
105     rev->active = 0;
106 
107     return n;
108 }
109 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~ [ freetext search ] ~ [ file search ] ~

This page was automatically generated by the LXR engine.
Visit the LXR main site for more information.