src/core/ngx_buf.h - nginx source code

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. typedef void (*ngx_output_chain_aio_pt)(ngx_output_chain_ctx_t *ctx,
  51.     ngx_file_t *file);

  52. struct ngx_output_chain_ctx_s {
  53.     ngx_buf_t                   *buf;
  54.     ngx_chain_t                 *in;
  55.     ngx_chain_t                 *free;
  56.     ngx_chain_t                 *busy;

  57.     unsigned                     sendfile:1;
  58.     unsigned                     directio:1;
  59.     unsigned                     unaligned:1;
  60.     unsigned                     need_in_memory:1;
  61.     unsigned                     need_in_temp:1;
  62.     unsigned                     aio:1;

  63. #if (NGX_HAVE_FILE_AIO || NGX_COMPAT)
  64.     ngx_output_chain_aio_pt      aio_handler;
  65. #endif

  66. #if (NGX_THREADS || NGX_COMPAT)
  67.     ngx_int_t                  (*thread_handler)(ngx_thread_task_t *task,
  68.                                                  ngx_file_t *file);
  69.     ngx_thread_task_t           *thread_task;
  70. #endif

  71.     off_t                        alignment;

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

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


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


  86. #define NGX_CHAIN_ERROR     (ngx_chain_t *) NGX_ERROR


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

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

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

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

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


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

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



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

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

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

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

  115. #endif /* _NGX_BUF_H_INCLUDED_ */