src/os/unix/ngx_aio_read.c - nginx-1.7.10

Functions defined

Source code


  1. /*
  2. * Copyright (C) Igor Sysoev
  3. * Copyright (C) Nginx, Inc.
  4. */


  5. #include <ngx_config.h>
  6. #include <ngx_core.h>
  7. #include <ngx_event.h>


  8. extern int  ngx_kqueue;


  9. ssize_t
  10. ngx_aio_read(ngx_connection_t *c, u_char *buf, size_t size)
  11. {
  12.     int           n;
  13.     ngx_event_t  *rev;

  14.     rev = c->read;

  15.     if (!rev->ready) {
  16.         ngx_log_error(NGX_LOG_ALERT, c->log, 0, "second aio post");
  17.         return NGX_AGAIN;
  18.     }

  19.     ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
  20.                    "rev->complete: %d", rev->complete);
  21.     ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
  22.                    "aio size: %d", size);

  23.     if (!rev->complete) {
  24.         ngx_memzero(&rev->aiocb, sizeof(struct aiocb));

  25.         rev->aiocb.aio_fildes = c->fd;
  26.         rev->aiocb.aio_buf = buf;
  27.         rev->aiocb.aio_nbytes = size;

  28. #if (NGX_HAVE_KQUEUE)
  29.         rev->aiocb.aio_sigevent.sigev_notify_kqueue = ngx_kqueue;
  30.         rev->aiocb.aio_sigevent.sigev_notify = SIGEV_KEVENT;
  31.         rev->aiocb.aio_sigevent.sigev_value.sigval_ptr = rev;
  32. #endif

  33.         if (aio_read(&rev->aiocb) == -1) {
  34.             ngx_log_error(NGX_LOG_CRIT, rev->log, ngx_errno,
  35.                           "aio_read() failed");
  36.             rev->error = 1;
  37.             return NGX_ERROR;
  38.         }

  39.         ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
  40.                        "aio_read: #%d OK", c->fd);

  41.         rev->active = 1;
  42.         rev->ready = 0;
  43.     }

  44.     rev->complete = 0;

  45.     n = aio_error(&rev->aiocb);
  46.     if (n == -1) {
  47.         ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno, "aio_error() failed");
  48.         rev->error = 1;
  49.         return NGX_ERROR;
  50.     }

  51.     if (n != 0) {
  52.         if (n == NGX_EINPROGRESS) {
  53.             if (rev->ready) {
  54.                 ngx_log_error(NGX_LOG_ALERT, c->log, n,
  55.                               "aio_read() still in progress");
  56.                 rev->ready = 0;
  57.             }
  58.             return NGX_AGAIN;
  59.         }

  60.         ngx_log_error(NGX_LOG_CRIT, c->log, n, "aio_read() failed");
  61.         rev->error = 1;
  62.         rev->ready = 0;
  63.         return NGX_ERROR;
  64.     }

  65.     n = aio_return(&rev->aiocb);
  66.     if (n == -1) {
  67.         ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno,
  68.                       "aio_return() failed");

  69.         rev->error = 1;
  70.         rev->ready = 0;
  71.         return NGX_ERROR;
  72.     }

  73.     ngx_log_debug2(NGX_LOG_DEBUG_EVENT, rev->log, 0,
  74.                    "aio_read: #%d %d", c->fd, n);

  75.     if (n == 0) {
  76.         rev->eof = 1;
  77.         rev->ready = 0;
  78.     } else {
  79.         rev->ready = 1;
  80.     }

  81.     rev->active = 0;

  82.     return n;
  83. }