112Sigor@sysoev.ru
212Sigor@sysoev.ru /*
312Sigor@sysoev.ru * Copyright (C) Igor Sysoev
412Sigor@sysoev.ru * Copyright (C) NGINX, Inc.
512Sigor@sysoev.ru */
612Sigor@sysoev.ru
712Sigor@sysoev.ru #include <nxt_main.h>
812Sigor@sysoev.ru
912Sigor@sysoev.ru
1012Sigor@sysoev.ru static nxt_int_t nxt_fd_event_hash_test(nxt_lvlhsh_query_t *lhq, void *data);
1112Sigor@sysoev.ru static void nxt_fd_event_hash_error(nxt_task_t *task, nxt_fd_t fd);
1212Sigor@sysoev.ru
1312Sigor@sysoev.ru
1412Sigor@sysoev.ru static const nxt_lvlhsh_proto_t nxt_event_set_fd_hash_proto nxt_aligned(64) =
1512Sigor@sysoev.ru {
1612Sigor@sysoev.ru NXT_LVLHSH_LARGE_MEMALIGN,
1712Sigor@sysoev.ru nxt_fd_event_hash_test,
1812Sigor@sysoev.ru nxt_lvlhsh_alloc,
1912Sigor@sysoev.ru nxt_lvlhsh_free,
2012Sigor@sysoev.ru };
2112Sigor@sysoev.ru
2212Sigor@sysoev.ru
2312Sigor@sysoev.ru /* nxt_murmur_hash2() is unique for 4 bytes. */
2412Sigor@sysoev.ru
2512Sigor@sysoev.ru static nxt_int_t
nxt_fd_event_hash_test(nxt_lvlhsh_query_t * lhq,void * data)2612Sigor@sysoev.ru nxt_fd_event_hash_test(nxt_lvlhsh_query_t *lhq, void *data)
2712Sigor@sysoev.ru {
2812Sigor@sysoev.ru return NXT_OK;
2912Sigor@sysoev.ru }
3012Sigor@sysoev.ru
3112Sigor@sysoev.ru
3212Sigor@sysoev.ru nxt_int_t
nxt_fd_event_hash_add(nxt_lvlhsh_t * lvlhsh,nxt_fd_t fd,nxt_fd_event_t * ev)3312Sigor@sysoev.ru nxt_fd_event_hash_add(nxt_lvlhsh_t *lvlhsh, nxt_fd_t fd, nxt_fd_event_t *ev)
3412Sigor@sysoev.ru {
3512Sigor@sysoev.ru nxt_int_t ret;
3612Sigor@sysoev.ru nxt_lvlhsh_query_t lhq;
3712Sigor@sysoev.ru
3812Sigor@sysoev.ru lhq.key_hash = nxt_murmur_hash2(&fd, sizeof(nxt_fd_t));
3912Sigor@sysoev.ru lhq.replace = 0;
4012Sigor@sysoev.ru lhq.value = ev;
4112Sigor@sysoev.ru lhq.proto = &nxt_event_set_fd_hash_proto;
4212Sigor@sysoev.ru
4312Sigor@sysoev.ru ret = nxt_lvlhsh_insert(lvlhsh, &lhq);
4412Sigor@sysoev.ru
4512Sigor@sysoev.ru if (nxt_fast_path(ret == NXT_OK)) {
4612Sigor@sysoev.ru return NXT_OK;
4712Sigor@sysoev.ru }
4812Sigor@sysoev.ru
49564Svbart@nginx.com nxt_alert(ev->task, "fd event %d is already in hash", ev->fd);
5012Sigor@sysoev.ru
5112Sigor@sysoev.ru return NXT_ERROR;
5212Sigor@sysoev.ru }
5312Sigor@sysoev.ru
5412Sigor@sysoev.ru
5512Sigor@sysoev.ru void *
nxt_fd_event_hash_get(nxt_task_t * task,nxt_lvlhsh_t * lvlhsh,nxt_fd_t fd)5612Sigor@sysoev.ru nxt_fd_event_hash_get(nxt_task_t *task, nxt_lvlhsh_t *lvlhsh, nxt_fd_t fd)
5712Sigor@sysoev.ru {
5812Sigor@sysoev.ru nxt_int_t ret;
5912Sigor@sysoev.ru nxt_lvlhsh_query_t lhq;
6012Sigor@sysoev.ru
6112Sigor@sysoev.ru lhq.key_hash = nxt_murmur_hash2(&fd, sizeof(nxt_fd_t));
6212Sigor@sysoev.ru lhq.proto = &nxt_event_set_fd_hash_proto;
6312Sigor@sysoev.ru
6412Sigor@sysoev.ru ret = nxt_lvlhsh_find(lvlhsh, &lhq);
6512Sigor@sysoev.ru
6612Sigor@sysoev.ru if (nxt_fast_path(ret == NXT_OK)) {
6712Sigor@sysoev.ru return lhq.value;
6812Sigor@sysoev.ru }
6912Sigor@sysoev.ru
7012Sigor@sysoev.ru nxt_fd_event_hash_error(task, fd);
7112Sigor@sysoev.ru
7212Sigor@sysoev.ru return NULL;
7312Sigor@sysoev.ru }
7412Sigor@sysoev.ru
7512Sigor@sysoev.ru
7612Sigor@sysoev.ru void
nxt_fd_event_hash_delete(nxt_task_t * task,nxt_lvlhsh_t * lvlhsh,nxt_fd_t fd,nxt_bool_t ignore)7712Sigor@sysoev.ru nxt_fd_event_hash_delete(nxt_task_t *task, nxt_lvlhsh_t *lvlhsh, nxt_fd_t fd,
7812Sigor@sysoev.ru nxt_bool_t ignore)
7912Sigor@sysoev.ru {
8012Sigor@sysoev.ru nxt_int_t ret;
8112Sigor@sysoev.ru nxt_lvlhsh_query_t lhq;
8212Sigor@sysoev.ru
8312Sigor@sysoev.ru lhq.key_hash = nxt_murmur_hash2(&fd, sizeof(nxt_fd_t));
8412Sigor@sysoev.ru lhq.proto = &nxt_event_set_fd_hash_proto;
8512Sigor@sysoev.ru
8612Sigor@sysoev.ru ret = nxt_lvlhsh_delete(lvlhsh, &lhq);
8712Sigor@sysoev.ru
8812Sigor@sysoev.ru if (nxt_slow_path(ret != NXT_OK)) {
8912Sigor@sysoev.ru if (!ignore) {
9012Sigor@sysoev.ru nxt_fd_event_hash_error(task, fd);
9112Sigor@sysoev.ru }
9212Sigor@sysoev.ru }
9312Sigor@sysoev.ru }
9412Sigor@sysoev.ru
9512Sigor@sysoev.ru
9612Sigor@sysoev.ru void
nxt_fd_event_hash_destroy(nxt_lvlhsh_t * lvlhsh)9712Sigor@sysoev.ru nxt_fd_event_hash_destroy(nxt_lvlhsh_t *lvlhsh)
9812Sigor@sysoev.ru {
99*596Sigor@sysoev.ru nxt_fd_event_t *ev;
10012Sigor@sysoev.ru
101*596Sigor@sysoev.ru do {
102*596Sigor@sysoev.ru ev = nxt_lvlhsh_retrieve(lvlhsh, &nxt_event_set_fd_hash_proto, NULL);
10312Sigor@sysoev.ru
104*596Sigor@sysoev.ru } while (ev != NULL);
10512Sigor@sysoev.ru }
10612Sigor@sysoev.ru
10712Sigor@sysoev.ru
10812Sigor@sysoev.ru static void
nxt_fd_event_hash_error(nxt_task_t * task,nxt_fd_t fd)10912Sigor@sysoev.ru nxt_fd_event_hash_error(nxt_task_t *task, nxt_fd_t fd)
11012Sigor@sysoev.ru {
111564Svbart@nginx.com nxt_alert(task, "fd event %d not found in hash", fd);
11212Sigor@sysoev.ru }
113