src/core/ngx_buf.h - nginx-1.7.10

Data types defined

Macros defined

Source code


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


  5. #ifndef _NGX_BUF_H_INCLUDED_
  6. #define _NGX_BUF_H_INCLUDED_


  7. #include <ngx_config.h>
  8. #include <ngx_core.h>


  9. typedef void *            ngx_buf_tag_t;

  10. typedef struct ngx_buf_s  ngx_buf_t;

  11. struct ngx_buf_s {
  12.     u_char          *pos;
  13.     u_char          *last;
  14.     off_t            file_pos;
  15.     off_t            file_last;

  16.     u_char          *start;         /* start of buffer */
  17.     u_char          *end;           /* end of buffer */
  18.     ngx_buf_tag_t    tag;
  19.     ngx_file_t      *file;
  20.     ngx_buf_t       *shadow;


  21.     /* the buf's content could be changed */
  22.     unsigned         temporary:1;

  23.     /*
  24.      * the buf's content is in a memory cache or in a read only memory
  25.      * and must not be changed
  26.      */
  27.     unsigned         memory:1;

  28.     /* the buf's content is mmap()ed and must not be changed */
  29.     unsigned         mmap:1;

  30.     unsigned         recycled:1;
  31.     unsigned         in_file:1;
  32.     unsigned         flush:1;
  33.     unsigned         sync:1;
  34.     unsigned         last_buf:1;
  35.     unsigned         last_in_chain:1;

  36.     unsigned         last_shadow:1;
  37.     unsigned         temp_file:1;

  38.     /* STUB */ int   num;
  39. };


  40. struct ngx_chain_s {
  41.     ngx_buf_t    *buf;
  42.     ngx_chain_t  *next;
  43. };


  44. typedef struct {
  45.     ngx_int_t    num;
  46.     size_t       size;
  47. } ngx_bufs_t;


  48. typedef struct ngx_output_chain_ctx_s  ngx_output_chain_ctx_t;

  49. typedef ngx_int_t (*ngx_output_chain_filter_pt)(void *ctx, ngx_chain_t *in);

  50. #if (NGX_HAVE_FILE_AIO)
  51. typedef void (*ngx_output_chain_aio_pt)(ngx_output_chain_ctx_t *ctx,
  52.     ngx_file_t *file);
  53. #endif

  54. struct ngx_output_chain_ctx_s {
  55.     ngx_buf_t                   *buf;
  56.     ngx_chain_t                 *in;
  57.     ngx_chain_t                 *free;
  58.     ngx_chain_t                 *busy;

  59.     unsigned                     sendfile:1;
  60.     unsigned                     directio:1;
  61. #if (NGX_HAVE_ALIGNED_DIRECTIO)
  62.     unsigned                     unaligned:1;
  63. #endif
  64.     unsigned                     need_in_memory:1;
  65.     unsigned                     need_in_temp:1;
  66. #if (NGX_HAVE_FILE_AIO)
  67.     unsigned                     aio:1;

  68.     ngx_output_chain_aio_pt      aio_handler;
  69. #endif

  70.     off_t                        alignment;

  71.     ngx_pool_t                  *pool;
  72.     ngx_int_t                    allocated;
  73.     ngx_bufs_t                   bufs;
  74.     ngx_buf_tag_t                tag;

  75.     ngx_output_chain_filter_pt   output_filter;
  76.     void                        *filter_ctx;
  77. };


  78. typedef struct {
  79.     ngx_chain_t                 *out;
  80.     ngx_chain_t                **last;
  81.     ngx_connection_t            *connection;
  82.     ngx_pool_t                  *pool;
  83.     off_t                        limit;
  84. } ngx_chain_writer_ctx_t;


  85. #define NGX_CHAIN_ERROR     (ngx_chain_t *) NGX_ERROR


  86. #define ngx_buf_in_memory(b)        (b->temporary || b->memory || b->mmap)
  87. #define ngx_buf_in_memory_only(b)   (ngx_buf_in_memory(b) && !b->in_file)

  88. #define ngx_buf_special(b)                                                   \
  89.     ((b->flush || b->last_buf || b->sync)                                    \
  90.      && !ngx_buf_in_memory(b) && !b->in_file)

  91. #define ngx_buf_sync_only(b)                                                 \
  92.     (b->sync                                                                 \
  93.      && !ngx_buf_in_memory(b) && !b->in_file && !b->flush && !b->last_buf)

  94. #define ngx_buf_size(b)                                                      \
  95.     (ngx_buf_in_memory(b) ? (off_t) (b->last - b->pos):                      \
  96.                             (b->file_last - b->file_pos))

  97. ngx_buf_t *ngx_create_temp_buf(ngx_pool_t *pool, size_t size);
  98. ngx_chain_t *ngx_create_chain_of_bufs(ngx_pool_t *pool, ngx_bufs_t *bufs);


  99. #define ngx_alloc_buf(pool)  ngx_palloc(pool, sizeof(ngx_buf_t))
  100. #define ngx_calloc_buf(pool) ngx_pcalloc(pool, sizeof(ngx_buf_t))

  101. ngx_chain_t *ngx_alloc_chain_link(ngx_pool_t *pool);
  102. #define ngx_free_chain(pool, cl)                                             \
  103.     cl->next = pool->chain;                                                  \
  104.     pool->chain = cl



  105. ngx_int_t ngx_output_chain(ngx_output_chain_ctx_t *ctx, ngx_chain_t *in);
  106. ngx_int_t ngx_chain_writer(void *ctx, ngx_chain_t *in);

  107. ngx_int_t ngx_chain_add_copy(ngx_pool_t *pool, ngx_chain_t **chain,
  108.     ngx_chain_t *in);
  109. ngx_chain_t *ngx_chain_get_free_buf(ngx_pool_t *p, ngx_chain_t **free);
  110. void ngx_chain_update_chains(ngx_pool_t *p, ngx_chain_t **free,
  111.     ngx_chain_t **busy, ngx_chain_t **out, ngx_buf_tag_t tag);

  112. off_t ngx_chain_coalesce_file(ngx_chain_t **in, off_t limit);

  113. ngx_chain_t *ngx_chain_update_sent(ngx_chain_t *in, off_t sent);

  114. #endif /* _NGX_BUF_H_INCLUDED_ */