Changed nxt_mp_retain() and nxt_mp_release() interfaces.

This commit is contained in:
Igor Sysoev
2017-12-28 16:01:06 +03:00
parent b59535b22c
commit 497faf1b9a
9 changed files with 72 additions and 65 deletions

View File

@@ -892,7 +892,7 @@ nxt_app_http_req_body_read(nxt_task_t *task, nxt_app_parse_ctx_t *ctx,
nxt_int_t nxt_int_t
nxt_app_http_req_done(nxt_task_t *task, nxt_app_parse_ctx_t *ctx) nxt_app_http_req_done(nxt_task_t *task, nxt_app_parse_ctx_t *ctx)
{ {
nxt_mp_release(ctx->mem_pool, NULL); nxt_mp_release(ctx->mem_pool);
return NXT_OK; return NXT_OK;
} }

View File

@@ -59,11 +59,13 @@ nxt_buf_mem_ts_alloc(nxt_task_t *task, nxt_mp_t *mp, size_t size)
nxt_buf_t *b; nxt_buf_t *b;
nxt_buf_ts_t *ts; nxt_buf_ts_t *ts;
b = nxt_mp_retain(mp, NXT_BUF_MEM_SIZE + sizeof(nxt_buf_ts_t) + size); b = nxt_mp_alloc(mp, NXT_BUF_MEM_SIZE + sizeof(nxt_buf_ts_t) + size);
if (nxt_slow_path(b == NULL)) { if (nxt_slow_path(b == NULL)) {
return NULL; return NULL;
} }
nxt_mp_retain(mp);
nxt_memzero(b, NXT_BUF_MEM_SIZE + sizeof(nxt_buf_ts_t)); nxt_memzero(b, NXT_BUF_MEM_SIZE + sizeof(nxt_buf_ts_t));
b->data = mp; b->data = mp;
@@ -284,7 +286,8 @@ nxt_buf_ts_completion(nxt_task_t *task, void *obj, void *data)
#endif #endif
mp = b->data; mp = b->data;
nxt_mp_release(mp, b); nxt_mp_free(mp, b);
nxt_mp_release(mp);
if (parent != NULL) { if (parent != NULL) {
nxt_debug(task, "parent retain:%uD", parent->retain); nxt_debug(task, "parent retain:%uD", parent->retain);

View File

@@ -96,9 +96,13 @@ nxt_conn_create(nxt_mp_t *mp, nxt_task_t *task)
void void
nxt_conn_free(nxt_task_t *task, nxt_conn_t *c) nxt_conn_free(nxt_task_t *task, nxt_conn_t *c)
{ {
nxt_mp_t *mp;
task->thread->engine->connections--; task->thread->engine->connections--;
nxt_mp_release(c->mem_pool, c); mp = c->mem_pool;
nxt_mp_free(mp, c);
nxt_mp_release(mp);
} }

View File

@@ -281,6 +281,28 @@ nxt_mp_create(size_t cluster_size, size_t page_alignment, size_t page_size,
} }
void
nxt_mp_retain(nxt_mp_t *mp)
{
mp->retain++;
nxt_thread_log_debug("mp %p retain: %uD", mp, mp->retain);
}
void
nxt_mp_release(nxt_mp_t *mp)
{
mp->retain--;
nxt_thread_log_debug("mp %p release: %uD", mp, mp->retain);
if (mp->retain == 0) {
nxt_mp_destroy(mp);
}
}
void void
nxt_mp_destroy(nxt_mp_t *mp) nxt_mp_destroy(nxt_mp_t *mp)
{ {
@@ -933,43 +955,6 @@ nxt_mp_chunk_free(nxt_mp_t *mp, nxt_mp_block_t *cluster, u_char *p)
} }
void *
nxt_mp_retain(nxt_mp_t *mp, size_t size)
{
void *p;
p = nxt_mp_alloc(mp, size);
if (nxt_fast_path(p != NULL)) {
mp->retain++;
nxt_debug_alloc("mp %p retain: %uD", mp, mp->retain);
}
return p;
}
uint32_t
nxt_mp_release(nxt_mp_t *mp, void *p)
{
if (nxt_fast_path(p != NULL)) {
nxt_mp_free(mp, p);
}
mp->retain--;
nxt_debug_alloc("mp %p release: %uD", mp, mp->retain);
if (mp->retain == 0) {
nxt_mp_destroy(mp);
return 0;
}
return mp->retain;
}
void * void *
nxt_mp_nget(nxt_mp_t *mp, size_t size) nxt_mp_nget(nxt_mp_t *mp, size_t size)
{ {

View File

@@ -41,6 +41,17 @@ NXT_EXPORT nxt_mp_t *nxt_mp_create(size_t cluster_size, size_t page_alignment,
*/ */
NXT_EXPORT void nxt_mp_destroy(nxt_mp_t *mp); NXT_EXPORT void nxt_mp_destroy(nxt_mp_t *mp);
/*
* nxt_mp_retain() increases memory pool retention counter.
*/
NXT_EXPORT void nxt_mp_retain(nxt_mp_t *mp);
/*
* nxt_mp_release() decreases memory pool retention counter.
* If the counter becomes zero the pool is destroyed.
*/
NXT_EXPORT void nxt_mp_release(nxt_mp_t *mp);
/* nxt_mp_test_sizes() tests validity of memory pool parameters. */ /* nxt_mp_test_sizes() tests validity of memory pool parameters. */
NXT_EXPORT nxt_bool_t nxt_mp_test_sizes(size_t cluster_size, NXT_EXPORT nxt_bool_t nxt_mp_test_sizes(size_t cluster_size,
size_t page_alignment, size_t page_size, size_t min_chunk_size); size_t page_alignment, size_t page_size, size_t min_chunk_size);
@@ -76,20 +87,6 @@ NXT_EXPORT void *nxt_mp_zalign(nxt_mp_t *mp, size_t alignment, size_t size)
NXT_EXPORT void nxt_mp_free(nxt_mp_t *mp, void *p); NXT_EXPORT void nxt_mp_free(nxt_mp_t *mp, void *p);
/*
* nxt_mp_retain() returns aligned freeable memory and increases memory
* pool retention counter.
*/
NXT_EXPORT void *nxt_mp_retain(nxt_mp_t *mp, size_t size)
NXT_MALLOC_LIKE;
/*
* nxt_mp_release() returns freeable memory and decreases memory pool
* retention counter. If the counter becomes zero the pool is destroyed.
*/
NXT_EXPORT uint32_t nxt_mp_release(nxt_mp_t *mp, void *p);
/* nxt_mp_nget() returns non-aligned non-freeable memory. */ /* nxt_mp_nget() returns non-aligned non-freeable memory. */
NXT_EXPORT void *nxt_mp_nget(nxt_mp_t *mp, size_t size) NXT_EXPORT void *nxt_mp_nget(nxt_mp_t *mp, size_t size)
NXT_MALLOC_LIKE; NXT_MALLOC_LIKE;

View File

@@ -120,7 +120,7 @@ nxt_port_release(nxt_task_t *task, nxt_port_t *port)
nxt_process_use(task, port->process, -1); nxt_process_use(task, port->process, -1);
} }
nxt_mp_release(port->mem_pool, NULL); nxt_mp_release(port->mem_pool);
} }

View File

@@ -173,7 +173,8 @@ release_buf:
nxt_port_mmap_handler_use(mmap_handler, -1); nxt_port_mmap_handler_use(mmap_handler, -1);
nxt_mp_release(mp, b); nxt_mp_free(mp, b);
nxt_mp_release(mp);
} }
@@ -588,6 +589,7 @@ nxt_buf_t *
nxt_port_mmap_get_buf(nxt_task_t *task, nxt_port_t *port, size_t size) nxt_port_mmap_get_buf(nxt_task_t *task, nxt_port_t *port, size_t size)
{ {
size_t nchunks; size_t nchunks;
nxt_mp_t *mp;
nxt_buf_t *b; nxt_buf_t *b;
nxt_chunk_id_t c; nxt_chunk_id_t c;
nxt_port_mmap_header_t *hdr; nxt_port_mmap_header_t *hdr;
@@ -605,7 +607,9 @@ nxt_port_mmap_get_buf(nxt_task_t *task, nxt_port_t *port, size_t size)
mmap_handler = nxt_port_mmap_get(task, port, &c, 0); mmap_handler = nxt_port_mmap_get(task, port, &c, 0);
if (nxt_slow_path(mmap_handler == NULL)) { if (nxt_slow_path(mmap_handler == NULL)) {
nxt_mp_release(task->thread->engine->mem_pool, b); mp = task->thread->engine->mem_pool;
nxt_mp_free(mp, b);
nxt_mp_release(mp);
return NULL; return NULL;
} }

View File

@@ -159,21 +159,26 @@ nxt_port_release_send_msg(nxt_task_t *task, void *obj, void *data)
return; return;
} }
nxt_mp_release(engine->mem_pool, obj); nxt_mp_free(engine->mem_pool, obj);
nxt_mp_release(engine->mem_pool);
} }
static nxt_port_send_msg_t * static nxt_port_send_msg_t *
nxt_port_msg_create(nxt_task_t *task, nxt_port_send_msg_t *m) nxt_port_msg_create(nxt_task_t *task, nxt_port_send_msg_t *m)
{ {
nxt_mp_t *mp;
nxt_port_send_msg_t *msg; nxt_port_send_msg_t *msg;
msg = nxt_mp_retain(task->thread->engine->mem_pool, mp = task->thread->engine->mem_pool;
sizeof(nxt_port_send_msg_t));
msg = nxt_mp_alloc(mp, sizeof(nxt_port_send_msg_t));
if (nxt_slow_path(msg == NULL)) { if (nxt_slow_path(msg == NULL)) {
return NULL; return NULL;
} }
nxt_mp_retain(mp);
msg->link.next = NULL; msg->link.next = NULL;
msg->link.prev = NULL; msg->link.prev = NULL;

View File

@@ -270,6 +270,7 @@ nxt_router_start_worker_handler(nxt_task_t *task, nxt_port_t *port, void *data)
{ {
size_t size; size_t size;
uint32_t stream; uint32_t stream;
nxt_mp_t *mp;
nxt_app_t *app; nxt_app_t *app;
nxt_buf_t *b; nxt_buf_t *b;
nxt_port_t *main_port; nxt_port_t *main_port;
@@ -300,7 +301,9 @@ nxt_router_start_worker_handler(nxt_task_t *task, nxt_port_t *port, void *data)
-1, app); -1, app);
if (nxt_slow_path(stream == 0)) { if (nxt_slow_path(stream == 0)) {
nxt_mp_release(b->data, b); mp = b->data;
nxt_mp_free(mp, b);
nxt_mp_release(mp);
goto failed; goto failed;
} }
@@ -389,7 +392,7 @@ nxt_router_ra_create(nxt_task_t *task, nxt_req_app_link_t *ra_src)
mp = ra_src->ap->mem_pool; mp = ra_src->ap->mem_pool;
ra = nxt_mp_retain(mp, sizeof(nxt_req_app_link_t)); ra = nxt_mp_alloc(mp, sizeof(nxt_req_app_link_t));
if (nxt_slow_path(ra == NULL)) { if (nxt_slow_path(ra == NULL)) {
@@ -399,6 +402,8 @@ nxt_router_ra_create(nxt_task_t *task, nxt_req_app_link_t *ra_src)
return NULL; return NULL;
} }
nxt_mp_retain(mp);
nxt_router_ra_init(task, ra, ra_src->rc); nxt_router_ra_init(task, ra, ra_src->rc);
ra->mem_pool = mp; ra->mem_pool = mp;
@@ -497,6 +502,7 @@ nxt_router_ra_update_peer(nxt_task_t *task, nxt_req_app_link_t *ra)
static void static void
nxt_router_ra_release(nxt_task_t *task, nxt_req_app_link_t *ra) nxt_router_ra_release(nxt_task_t *task, nxt_req_app_link_t *ra)
{ {
nxt_mp_t *mp;
nxt_conn_t *c; nxt_conn_t *c;
nxt_req_conn_link_t *rc; nxt_req_conn_link_t *rc;
@@ -539,8 +545,11 @@ nxt_router_ra_release(nxt_task_t *task, nxt_req_app_link_t *ra)
nxt_router_msg_cancel(task, &ra->msg_info, ra->stream); nxt_router_msg_cancel(task, &ra->msg_info, ra->stream);
if (ra->mem_pool != NULL) { mp = ra->mem_pool;
nxt_mp_release(ra->mem_pool, ra);
if (mp != NULL) {
nxt_mp_free(mp, ra);
nxt_mp_release(mp);
} }
} }