1 2/* 3 * Copyright (C) Igor Sysoev 4 * Copyright (C) NGINX, Inc. 5 */ 6 7#include <nxt_main.h> 8 9 10static nxt_int_t nxt_fd_event_hash_test(nxt_lvlhsh_query_t *lhq, void *data); 11static void nxt_fd_event_hash_error(nxt_task_t *task, nxt_fd_t fd); 12 13 14static const nxt_lvlhsh_proto_t nxt_event_set_fd_hash_proto nxt_aligned(64) = 15{ 16 NXT_LVLHSH_LARGE_MEMALIGN, 17 nxt_fd_event_hash_test, 18 nxt_lvlhsh_alloc, 19 nxt_lvlhsh_free, 20}; 21 22 23/* nxt_murmur_hash2() is unique for 4 bytes. */ 24 25static nxt_int_t 26nxt_fd_event_hash_test(nxt_lvlhsh_query_t *lhq, void *data) 27{ 28 return NXT_OK; 29} 30 31 32nxt_int_t 33nxt_fd_event_hash_add(nxt_lvlhsh_t *lvlhsh, nxt_fd_t fd, nxt_fd_event_t *ev) 34{ 35 nxt_int_t ret; 36 nxt_lvlhsh_query_t lhq; 37 38 lhq.key_hash = nxt_murmur_hash2(&fd, sizeof(nxt_fd_t)); 39 lhq.replace = 0; 40 lhq.value = ev; 41 lhq.proto = &nxt_event_set_fd_hash_proto; 42 43 ret = nxt_lvlhsh_insert(lvlhsh, &lhq); 44 45 if (nxt_fast_path(ret == NXT_OK)) { 46 return NXT_OK; 47 } 48
| 1 2/* 3 * Copyright (C) Igor Sysoev 4 * Copyright (C) NGINX, Inc. 5 */ 6 7#include <nxt_main.h> 8 9 10static nxt_int_t nxt_fd_event_hash_test(nxt_lvlhsh_query_t *lhq, void *data); 11static void nxt_fd_event_hash_error(nxt_task_t *task, nxt_fd_t fd); 12 13 14static const nxt_lvlhsh_proto_t nxt_event_set_fd_hash_proto nxt_aligned(64) = 15{ 16 NXT_LVLHSH_LARGE_MEMALIGN, 17 nxt_fd_event_hash_test, 18 nxt_lvlhsh_alloc, 19 nxt_lvlhsh_free, 20}; 21 22 23/* nxt_murmur_hash2() is unique for 4 bytes. */ 24 25static nxt_int_t 26nxt_fd_event_hash_test(nxt_lvlhsh_query_t *lhq, void *data) 27{ 28 return NXT_OK; 29} 30 31 32nxt_int_t 33nxt_fd_event_hash_add(nxt_lvlhsh_t *lvlhsh, nxt_fd_t fd, nxt_fd_event_t *ev) 34{ 35 nxt_int_t ret; 36 nxt_lvlhsh_query_t lhq; 37 38 lhq.key_hash = nxt_murmur_hash2(&fd, sizeof(nxt_fd_t)); 39 lhq.replace = 0; 40 lhq.value = ev; 41 lhq.proto = &nxt_event_set_fd_hash_proto; 42 43 ret = nxt_lvlhsh_insert(lvlhsh, &lhq); 44 45 if (nxt_fast_path(ret == NXT_OK)) { 46 return NXT_OK; 47 } 48
|
49 nxt_log(ev->task, NXT_LOG_CRIT, "fd event %d is already in hash", ev->fd);
| 49 nxt_alert(ev->task, "fd event %d is already in hash", ev->fd);
|
50 51 return NXT_ERROR; 52} 53 54 55void * 56nxt_fd_event_hash_get(nxt_task_t *task, nxt_lvlhsh_t *lvlhsh, nxt_fd_t fd) 57{ 58 nxt_int_t ret; 59 nxt_lvlhsh_query_t lhq; 60 61 lhq.key_hash = nxt_murmur_hash2(&fd, sizeof(nxt_fd_t)); 62 lhq.proto = &nxt_event_set_fd_hash_proto; 63 64 ret = nxt_lvlhsh_find(lvlhsh, &lhq); 65 66 if (nxt_fast_path(ret == NXT_OK)) { 67 return lhq.value; 68 } 69 70 nxt_fd_event_hash_error(task, fd); 71 72 return NULL; 73} 74 75 76void 77nxt_fd_event_hash_delete(nxt_task_t *task, nxt_lvlhsh_t *lvlhsh, nxt_fd_t fd, 78 nxt_bool_t ignore) 79{ 80 nxt_int_t ret; 81 nxt_lvlhsh_query_t lhq; 82 83 lhq.key_hash = nxt_murmur_hash2(&fd, sizeof(nxt_fd_t)); 84 lhq.proto = &nxt_event_set_fd_hash_proto; 85 86 ret = nxt_lvlhsh_delete(lvlhsh, &lhq); 87 88 if (nxt_slow_path(ret != NXT_OK)) { 89 if (!ignore) { 90 nxt_fd_event_hash_error(task, fd); 91 } 92 } 93} 94 95 96void 97nxt_fd_event_hash_destroy(nxt_lvlhsh_t *lvlhsh) 98{ 99 nxt_int_t ret; 100 nxt_fd_event_t *ev; 101 nxt_lvlhsh_each_t lhe; 102 nxt_lvlhsh_query_t lhq; 103 104 nxt_memzero(&lhe, sizeof(nxt_lvlhsh_each_t)); 105 lhe.proto = &nxt_event_set_fd_hash_proto; 106 lhq.proto = &nxt_event_set_fd_hash_proto; 107 108 for ( ;; ) { 109 ev = nxt_lvlhsh_each(lvlhsh, &lhe); 110 111 if (ev == NULL) { 112 return; 113 } 114 115 lhq.key_hash = nxt_murmur_hash2(&ev->fd, sizeof(nxt_fd_t)); 116 117 ret = nxt_lvlhsh_delete(lvlhsh, &lhq); 118 119 if (nxt_slow_path(ret != NXT_OK)) { 120 nxt_fd_event_hash_error(ev->task, ev->fd); 121 } 122 } 123} 124 125 126static void 127nxt_fd_event_hash_error(nxt_task_t *task, nxt_fd_t fd) 128{
| 50 51 return NXT_ERROR; 52} 53 54 55void * 56nxt_fd_event_hash_get(nxt_task_t *task, nxt_lvlhsh_t *lvlhsh, nxt_fd_t fd) 57{ 58 nxt_int_t ret; 59 nxt_lvlhsh_query_t lhq; 60 61 lhq.key_hash = nxt_murmur_hash2(&fd, sizeof(nxt_fd_t)); 62 lhq.proto = &nxt_event_set_fd_hash_proto; 63 64 ret = nxt_lvlhsh_find(lvlhsh, &lhq); 65 66 if (nxt_fast_path(ret == NXT_OK)) { 67 return lhq.value; 68 } 69 70 nxt_fd_event_hash_error(task, fd); 71 72 return NULL; 73} 74 75 76void 77nxt_fd_event_hash_delete(nxt_task_t *task, nxt_lvlhsh_t *lvlhsh, nxt_fd_t fd, 78 nxt_bool_t ignore) 79{ 80 nxt_int_t ret; 81 nxt_lvlhsh_query_t lhq; 82 83 lhq.key_hash = nxt_murmur_hash2(&fd, sizeof(nxt_fd_t)); 84 lhq.proto = &nxt_event_set_fd_hash_proto; 85 86 ret = nxt_lvlhsh_delete(lvlhsh, &lhq); 87 88 if (nxt_slow_path(ret != NXT_OK)) { 89 if (!ignore) { 90 nxt_fd_event_hash_error(task, fd); 91 } 92 } 93} 94 95 96void 97nxt_fd_event_hash_destroy(nxt_lvlhsh_t *lvlhsh) 98{ 99 nxt_int_t ret; 100 nxt_fd_event_t *ev; 101 nxt_lvlhsh_each_t lhe; 102 nxt_lvlhsh_query_t lhq; 103 104 nxt_memzero(&lhe, sizeof(nxt_lvlhsh_each_t)); 105 lhe.proto = &nxt_event_set_fd_hash_proto; 106 lhq.proto = &nxt_event_set_fd_hash_proto; 107 108 for ( ;; ) { 109 ev = nxt_lvlhsh_each(lvlhsh, &lhe); 110 111 if (ev == NULL) { 112 return; 113 } 114 115 lhq.key_hash = nxt_murmur_hash2(&ev->fd, sizeof(nxt_fd_t)); 116 117 ret = nxt_lvlhsh_delete(lvlhsh, &lhq); 118 119 if (nxt_slow_path(ret != NXT_OK)) { 120 nxt_fd_event_hash_error(ev->task, ev->fd); 121 } 122 } 123} 124 125 126static void 127nxt_fd_event_hash_error(nxt_task_t *task, nxt_fd_t fd) 128{
|
129 nxt_log(task, NXT_LOG_CRIT, "fd event %d not found in hash", fd);
| 129 nxt_alert(task, "fd event %d not found in hash", fd);
|
130}
| 130}
|