Event engine memory cache refactored.

This commit is contained in:
Igor Sysoev
2019-11-14 16:39:48 +03:00
parent d4e3951c4d
commit 07c007af57
3 changed files with 48 additions and 14 deletions

View File

@@ -556,19 +556,19 @@ nxt_event_engine_start(nxt_event_engine_t *engine)
void * void *
nxt_event_engine_mem_alloc(nxt_event_engine_t *engine, uint8_t *slot, nxt_event_engine_mem_alloc(nxt_event_engine_t *engine, uint8_t *hint,
size_t size) size_t size)
{ {
uint8_t n; uint32_t n;
nxt_uint_t items; nxt_uint_t items;
nxt_array_t *mem_cache; nxt_array_t *mem_cache;
nxt_mem_cache_t *cache; nxt_mem_cache_t *cache;
nxt_mem_cache_block_t *block; nxt_mem_cache_block_t *block;
mem_cache = engine->mem_cache; mem_cache = engine->mem_cache;
n = *slot; n = *hint;
if (n == (uint8_t) -1) { if (n == NXT_EVENT_ENGINE_NO_MEM_HINT) {
if (mem_cache == NULL) { if (mem_cache == NULL) {
/* IPv4 nxt_sockaddr_t and HTTP/1 and HTTP/2 buffers. */ /* IPv4 nxt_sockaddr_t and HTTP/1 and HTTP/2 buffers. */
@@ -607,7 +607,9 @@ nxt_event_engine_mem_alloc(nxt_event_engine_t *engine, uint8_t *slot,
found: found:
*slot = n; if (n < NXT_EVENT_ENGINE_NO_MEM_HINT) {
*hint = (uint8_t) n;
}
} }
cache = mem_cache->elts; cache = mem_cache->elts;
@@ -626,15 +628,39 @@ nxt_event_engine_mem_alloc(nxt_event_engine_t *engine, uint8_t *slot,
void void
nxt_event_engine_mem_free(nxt_event_engine_t *engine, uint8_t *slot, void *p) nxt_event_engine_mem_free(nxt_event_engine_t *engine, uint8_t hint, void *p,
size_t size)
{ {
uint32_t n;
nxt_array_t *mem_cache;
nxt_mem_cache_t *cache; nxt_mem_cache_t *cache;
nxt_mem_cache_block_t *block; nxt_mem_cache_block_t *block;
block = p; block = p;
mem_cache = engine->mem_cache;
cache = mem_cache->elts;
cache = engine->mem_cache->elts; n = hint;
cache = cache + *slot;
if (nxt_slow_path(n == NXT_EVENT_ENGINE_NO_MEM_HINT)) {
if (size != 0) {
for (n = 0; n < mem_cache->nelts; n++) {
if (cache[n].size == size) {
goto found;
}
}
nxt_alert(&engine->task,
"event engine mem free(%p, %z) not found", p, size);
}
goto done;
}
found:
cache = cache + n;
if (cache->count < 16) { if (cache->count < 16) {
cache->count++; cache->count++;
@@ -644,6 +670,8 @@ nxt_event_engine_mem_free(nxt_event_engine_t *engine, uint8_t *slot, void *p)
return; return;
} }
done:
nxt_mp_free(engine->mem_pool, p); nxt_mp_free(engine->mem_pool, p);
} }

View File

@@ -514,10 +514,12 @@ NXT_EXPORT void nxt_event_engine_post(nxt_event_engine_t *engine,
NXT_EXPORT void nxt_event_engine_signal(nxt_event_engine_t *engine, NXT_EXPORT void nxt_event_engine_signal(nxt_event_engine_t *engine,
nxt_uint_t signo); nxt_uint_t signo);
void *nxt_event_engine_mem_alloc(nxt_event_engine_t *engine, uint8_t *slot, #define NXT_EVENT_ENGINE_NO_MEM_HINT 255
void *nxt_event_engine_mem_alloc(nxt_event_engine_t *engine, uint8_t *hint,
size_t size); size_t size);
void nxt_event_engine_mem_free(nxt_event_engine_t *engine, uint8_t *slot, void nxt_event_engine_mem_free(nxt_event_engine_t *engine, uint8_t hint,
void *p); void *p, size_t size);
nxt_inline nxt_event_engine_t * nxt_inline nxt_event_engine_t *

View File

@@ -23,11 +23,11 @@ static nxt_int_t nxt_job_sockaddr_inet_parse(nxt_job_sockaddr_parse_t *jbs);
nxt_sockaddr_t * nxt_sockaddr_t *
nxt_sockaddr_cache_alloc(nxt_event_engine_t *engine, nxt_listen_socket_t *ls) nxt_sockaddr_cache_alloc(nxt_event_engine_t *engine, nxt_listen_socket_t *ls)
{ {
uint8_t hint;
size_t size; size_t size;
uint8_t hint;
nxt_sockaddr_t *sa; nxt_sockaddr_t *sa;
hint = (uint8_t) -1; hint = NXT_EVENT_ENGINE_NO_MEM_HINT;
size = offsetof(nxt_sockaddr_t, u) + ls->socklen + ls->address_length; size = offsetof(nxt_sockaddr_t, u) + ls->socklen + ls->address_length;
sa = nxt_event_engine_mem_alloc(engine, &hint, size); sa = nxt_event_engine_mem_alloc(engine, &hint, size);
@@ -56,7 +56,11 @@ nxt_sockaddr_cache_alloc(nxt_event_engine_t *engine, nxt_listen_socket_t *ls)
void void
nxt_sockaddr_cache_free(nxt_event_engine_t *engine, nxt_conn_t *c) nxt_sockaddr_cache_free(nxt_event_engine_t *engine, nxt_conn_t *c)
{ {
nxt_event_engine_mem_free(engine, &c->remote->cache_hint, c->remote); nxt_sockaddr_t *sa;
sa = c->remote;
nxt_event_engine_mem_free(engine, sa->cache_hint, sa, 0);
} }