xref: /unit/src/nxt_port_hash.c (revision 341)
175Smax.romanov@nginx.com 
275Smax.romanov@nginx.com /*
375Smax.romanov@nginx.com  * Copyright (C) Max Romanov
475Smax.romanov@nginx.com  * Copyright (C) NGINX, Inc.
575Smax.romanov@nginx.com  */
675Smax.romanov@nginx.com 
775Smax.romanov@nginx.com #include <nxt_port_hash.h>
875Smax.romanov@nginx.com 
975Smax.romanov@nginx.com 
1075Smax.romanov@nginx.com // Explicitly using 32 bit types to avoid possible alignment.
1175Smax.romanov@nginx.com typedef struct {
1275Smax.romanov@nginx.com     int32_t   pid;
1375Smax.romanov@nginx.com     uint32_t  port_id;
1475Smax.romanov@nginx.com } nxt_pid_port_id_t;
1575Smax.romanov@nginx.com 
1675Smax.romanov@nginx.com 
1775Smax.romanov@nginx.com static nxt_int_t
1875Smax.romanov@nginx.com nxt_port_hash_test(nxt_lvlhsh_query_t *lhq, void *data)
1975Smax.romanov@nginx.com {
2075Smax.romanov@nginx.com     nxt_port_t         *port;
2175Smax.romanov@nginx.com     nxt_pid_port_id_t  *pid_port_id;
2275Smax.romanov@nginx.com 
2375Smax.romanov@nginx.com     port = data;
2475Smax.romanov@nginx.com     pid_port_id = (nxt_pid_port_id_t *) lhq->key.start;
2575Smax.romanov@nginx.com 
26277Sigor@sysoev.ru     if (lhq->key.length == sizeof(nxt_pid_port_id_t)
27277Sigor@sysoev.ru         && pid_port_id->pid == port->pid
28277Sigor@sysoev.ru         && pid_port_id->port_id == port->id)
29277Sigor@sysoev.ru     {
3075Smax.romanov@nginx.com         return NXT_OK;
3175Smax.romanov@nginx.com     }
3275Smax.romanov@nginx.com 
3375Smax.romanov@nginx.com     return NXT_DECLINED;
3475Smax.romanov@nginx.com }
3575Smax.romanov@nginx.com 
3675Smax.romanov@nginx.com static const nxt_lvlhsh_proto_t  lvlhsh_ports_proto  nxt_aligned(64) = {
3775Smax.romanov@nginx.com     NXT_LVLHSH_DEFAULT,
3875Smax.romanov@nginx.com     nxt_port_hash_test,
3975Smax.romanov@nginx.com     nxt_lvlhsh_alloc,
4075Smax.romanov@nginx.com     nxt_lvlhsh_free,
4175Smax.romanov@nginx.com };
4275Smax.romanov@nginx.com 
4375Smax.romanov@nginx.com 
4475Smax.romanov@nginx.com nxt_port_t *
4575Smax.romanov@nginx.com nxt_port_hash_first(nxt_lvlhsh_t *port_hash, nxt_lvlhsh_each_t *lhe)
4675Smax.romanov@nginx.com {
4775Smax.romanov@nginx.com     nxt_memzero(lhe, sizeof(nxt_lvlhsh_each_t));
4875Smax.romanov@nginx.com 
4975Smax.romanov@nginx.com     lhe->proto = &lvlhsh_ports_proto;
5075Smax.romanov@nginx.com 
5175Smax.romanov@nginx.com     return nxt_port_hash_next(port_hash, lhe);
5275Smax.romanov@nginx.com }
5375Smax.romanov@nginx.com 
5475Smax.romanov@nginx.com 
55*341Smax.romanov@nginx.com nxt_inline void
56*341Smax.romanov@nginx.com nxt_port_hash_lhq(nxt_lvlhsh_query_t *lhq, nxt_pid_port_id_t *pid_port)
57*341Smax.romanov@nginx.com {
58*341Smax.romanov@nginx.com     lhq->key_hash = nxt_murmur_hash2(pid_port, sizeof(nxt_pid_port_id_t));
59*341Smax.romanov@nginx.com     lhq->key.length = sizeof(nxt_pid_port_id_t);
60*341Smax.romanov@nginx.com     lhq->key.start = (u_char *) pid_port;
61*341Smax.romanov@nginx.com     lhq->proto = &lvlhsh_ports_proto;
62*341Smax.romanov@nginx.com     lhq->pool = NULL;
63*341Smax.romanov@nginx.com }
64*341Smax.romanov@nginx.com 
65*341Smax.romanov@nginx.com 
6675Smax.romanov@nginx.com void
67*341Smax.romanov@nginx.com nxt_port_hash_add(nxt_lvlhsh_t *port_hash, nxt_port_t *port)
6875Smax.romanov@nginx.com {
6975Smax.romanov@nginx.com     nxt_pid_port_id_t   pid_port;
7075Smax.romanov@nginx.com     nxt_lvlhsh_query_t  lhq;
7175Smax.romanov@nginx.com 
7275Smax.romanov@nginx.com     pid_port.pid = port->pid;
7375Smax.romanov@nginx.com     pid_port.port_id = port->id;
7475Smax.romanov@nginx.com 
75*341Smax.romanov@nginx.com     nxt_port_hash_lhq(&lhq, &pid_port);
7675Smax.romanov@nginx.com     lhq.replace = 0;
7775Smax.romanov@nginx.com     lhq.value = port;
7875Smax.romanov@nginx.com 
7975Smax.romanov@nginx.com     switch (nxt_lvlhsh_insert(port_hash, &lhq)) {
8075Smax.romanov@nginx.com 
8175Smax.romanov@nginx.com     case NXT_OK:
8275Smax.romanov@nginx.com         break;
8375Smax.romanov@nginx.com 
8475Smax.romanov@nginx.com     default:
8575Smax.romanov@nginx.com         nxt_thread_log_error(NXT_LOG_WARN, "port #%d for pid %PI add failed",
8675Smax.romanov@nginx.com                              port->id, port->pid);
8775Smax.romanov@nginx.com         break;
8875Smax.romanov@nginx.com     }
8975Smax.romanov@nginx.com }
9075Smax.romanov@nginx.com 
9175Smax.romanov@nginx.com 
9275Smax.romanov@nginx.com void
93*341Smax.romanov@nginx.com nxt_port_hash_remove(nxt_lvlhsh_t *port_hash, nxt_port_t *port)
9475Smax.romanov@nginx.com {
9575Smax.romanov@nginx.com     nxt_pid_port_id_t   pid_port;
9675Smax.romanov@nginx.com     nxt_lvlhsh_query_t  lhq;
9775Smax.romanov@nginx.com 
9875Smax.romanov@nginx.com     pid_port.pid = port->pid;
9975Smax.romanov@nginx.com     pid_port.port_id = port->id;
10075Smax.romanov@nginx.com 
101*341Smax.romanov@nginx.com     nxt_port_hash_lhq(&lhq, &pid_port);
10275Smax.romanov@nginx.com 
10375Smax.romanov@nginx.com     switch (nxt_lvlhsh_delete(port_hash, &lhq)) {
10475Smax.romanov@nginx.com 
10575Smax.romanov@nginx.com     case NXT_OK:
10675Smax.romanov@nginx.com         break;
10775Smax.romanov@nginx.com 
10875Smax.romanov@nginx.com     default:
10975Smax.romanov@nginx.com         break;
11075Smax.romanov@nginx.com     }
11175Smax.romanov@nginx.com }
11275Smax.romanov@nginx.com 
11375Smax.romanov@nginx.com 
11475Smax.romanov@nginx.com nxt_port_t *
11575Smax.romanov@nginx.com nxt_port_hash_find(nxt_lvlhsh_t *port_hash, nxt_pid_t pid,
11675Smax.romanov@nginx.com     nxt_port_id_t port_id)
11775Smax.romanov@nginx.com {
11875Smax.romanov@nginx.com     nxt_pid_port_id_t   pid_port;
11975Smax.romanov@nginx.com     nxt_lvlhsh_query_t  lhq;
12075Smax.romanov@nginx.com 
12175Smax.romanov@nginx.com     pid_port.pid = pid;
12275Smax.romanov@nginx.com     pid_port.port_id = port_id;
12375Smax.romanov@nginx.com 
124*341Smax.romanov@nginx.com     nxt_port_hash_lhq(&lhq, &pid_port);
12575Smax.romanov@nginx.com 
12675Smax.romanov@nginx.com     if (nxt_lvlhsh_find(port_hash, &lhq) == NXT_OK) {
12775Smax.romanov@nginx.com         nxt_thread_log_debug("process port (%PI, %d) found", pid, port_id);
12875Smax.romanov@nginx.com         return lhq.value;
12975Smax.romanov@nginx.com     }
13075Smax.romanov@nginx.com 
13175Smax.romanov@nginx.com     nxt_thread_log_debug("process port (%PI, %d) not found", pid, port_id);
13275Smax.romanov@nginx.com 
13375Smax.romanov@nginx.com     return NULL;
13475Smax.romanov@nginx.com }
135