Groonga 3.0.9 Source Code Document
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
ngx_aio_read_chain.c
Go to the documentation of this file.
1 
2 /*
3  * Copyright (C) Igor Sysoev
4  * Copyright (C) Nginx, Inc.
5  */
6 
7 
8 #include <ngx_config.h>
9 #include <ngx_core.h>
10 #include <ngx_event.h>
11 
12 
13 ssize_t
15 {
16  int n;
17  u_char *buf, *prev;
18  size_t size;
19  ssize_t total;
20 
21  if (c->read->pending_eof) {
22  c->read->ready = 0;
23  return 0;
24  }
25 
26  total = 0;
27 
28  while (cl) {
29 
30  /* we can post the single aio operation only */
31 
32  if (!c->read->ready) {
33  return total ? total : NGX_AGAIN;
34  }
35 
36  buf = cl->buf->last;
37  prev = cl->buf->last;
38  size = 0;
39 
40  /* coalesce the neighbouring bufs */
41 
42  while (cl && prev == cl->buf->last) {
43  size += cl->buf->end - cl->buf->last;
44  prev = cl->buf->end;
45  cl = cl->next;
46  }
47 
48  n = ngx_aio_read(c, buf, size);
49 
50  ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "aio_read: %d", n);
51 
52  if (n == NGX_AGAIN) {
53  return total ? total : NGX_AGAIN;
54  }
55 
56  if (n == NGX_ERROR) {
57  return NGX_ERROR;
58  }
59 
60  if (n == 0) {
61  c->read->pending_eof = 1;
62  if (total) {
63  c->read->eof = 0;
64  c->read->ready = 1;
65  }
66  return total;
67  }
68 
69  if (n > 0) {
70  total += n;
71  }
72 
74  "aio_read total: %d", total);
75  }
76 
77  return total ? total : NGX_AGAIN;
78 }