diff options
Diffstat (limited to 'src/core')
| -rw-r--r-- | src/core/ngx_open_file_cache.c | 7 | ||||
| -rw-r--r-- | src/core/ngx_open_file_cache.h | 1 | ||||
| -rw-r--r-- | src/core/ngx_output_chain.c | 25 | ||||
| -rw-r--r-- | src/core/ngx_palloc.c | 28 | ||||
| -rw-r--r-- | src/core/ngx_palloc.h | 1 |
5 files changed, 53 insertions, 9 deletions
diff --git a/src/core/ngx_open_file_cache.c b/src/core/ngx_open_file_cache.c index 704d0ab79..f2e8afc51 100644 --- a/src/core/ngx_open_file_cache.c +++ b/src/core/ngx_open_file_cache.c @@ -497,6 +497,13 @@ ngx_open_and_stat_file(u_char *name, ngx_open_file_info_t *of, ngx_log_t *log) } else { of->fd = fd; + + if (of->directio <= ngx_file_size(&fi)) { + if (ngx_directio(fd) == -1) { + ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, + ngx_directio_n " \"%s\" failed", name); + } + } } done: diff --git a/src/core/ngx_open_file_cache.h b/src/core/ngx_open_file_cache.h index 4d8393b5d..1e1a27915 100644 --- a/src/core/ngx_open_file_cache.h +++ b/src/core/ngx_open_file_cache.h @@ -17,6 +17,7 @@ typedef struct { ngx_file_uniq_t uniq; time_t mtime; off_t size; + off_t directio; ngx_err_t err; time_t valid; diff --git a/src/core/ngx_output_chain.c b/src/core/ngx_output_chain.c index 423a650d3..c4bd67851 100644 --- a/src/core/ngx_output_chain.c +++ b/src/core/ngx_output_chain.c @@ -32,6 +32,7 @@ ngx_output_chain(ngx_output_chain_ctx_t *ctx, ngx_chain_t *in) size_t size; ngx_int_t rc, last; ngx_uint_t recycled; + ngx_buf_t *b; ngx_chain_t *cl, *out, **last_out; if (ctx->in == NULL && ctx->busy == NULL) { @@ -161,13 +162,29 @@ ngx_output_chain(ngx_output_chain_ctx_t *ctx, ngx_chain_t *in) } } - ctx->buf = ngx_create_temp_buf(ctx->pool, size); - if (ctx->buf == NULL) { + b = ngx_calloc_buf(ctx->pool); + if (b == NULL) { return NGX_ERROR; } - ctx->buf->tag = ctx->tag; - ctx->buf->recycled = recycled; + /* + * allocate block aligned to a disk sector size + * to enable O_DIRECT + */ + + b->start = ngx_pmemalign(ctx->pool, size, 512); + if (b->start == NULL) { + return NGX_ERROR; + } + + b->pos = b->start; + b->last = b->start; + b->end = b->last + size; + b->temporary = 1; + b->tag = ctx->tag; + b->recycled = recycled; + + ctx->buf = b; ctx->allocated++; } } diff --git a/src/core/ngx_palloc.c b/src/core/ngx_palloc.c index 5a0ea5121..0cadd4aed 100644 --- a/src/core/ngx_palloc.c +++ b/src/core/ngx_palloc.c @@ -195,17 +195,35 @@ ngx_palloc_large(ngx_pool_t *pool, size_t size) void *p; ngx_pool_large_t *large; -#if 0 - p = ngx_memalign(ngx_pagesize, size, pool->log); + p = ngx_alloc(size, pool->log); if (p == NULL) { return NULL; } -#else - p = ngx_alloc(size, pool->log); + + large = ngx_palloc(pool, sizeof(ngx_pool_large_t)); + if (large == NULL) { + ngx_free(p); + return NULL; + } + + large->alloc = p; + large->next = pool->large; + pool->large = large; + + return p; +} + + +void * +ngx_pmemalign(ngx_pool_t *pool, size_t size, size_t alignment) +{ + void *p; + ngx_pool_large_t *large; + + p = ngx_memalign(alignment, size, pool->log); if (p == NULL) { return NULL; } -#endif large = ngx_palloc(pool, sizeof(ngx_pool_large_t)); if (large == NULL) { diff --git a/src/core/ngx_palloc.h b/src/core/ngx_palloc.h index 34878f5f2..2b3a30cbd 100644 --- a/src/core/ngx_palloc.h +++ b/src/core/ngx_palloc.h @@ -77,6 +77,7 @@ void ngx_destroy_pool(ngx_pool_t *pool); void *ngx_palloc(ngx_pool_t *pool, size_t size); void *ngx_pnalloc(ngx_pool_t *pool, size_t size); void *ngx_pcalloc(ngx_pool_t *pool, size_t size); +void *ngx_pmemalign(ngx_pool_t *pool, size_t size, size_t alignment); ngx_int_t ngx_pfree(ngx_pool_t *pool, void *p); |
