xref: /unit/src/nxt_fd_event.c (revision 596:7d08f1a74b74)
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