summaryrefslogtreecommitdiffhomepage
path: root/src/core
diff options
context:
space:
mode:
Diffstat (limited to 'src/core')
-rw-r--r--src/core/ngx_open_file_cache.c7
-rw-r--r--src/core/ngx_open_file_cache.h1
-rw-r--r--src/core/ngx_output_chain.c25
-rw-r--r--src/core/ngx_palloc.c28
-rw-r--r--src/core/ngx_palloc.h1
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);