diff --git a/modules/htable/htable.c b/modules/htable/htable.c index 7ee49214f63..dd29cb7036b 100644 --- a/modules/htable/htable.c +++ b/modules/htable/htable.c @@ -1,5 +1,5 @@ /** - * Copyright (C) 2008-2014 Elena-Ramona Modroiu (asipto.com) + * Copyright (C) 2008-2016 Elena-Ramona Modroiu (asipto.com) * * This file is part of Kamailio, a free SIP server. * @@ -36,6 +36,7 @@ #include "../../ut.h" #include "../../rpc.h" #include "../../rpc_lookup.h" +#include "../../kemi.h" #include "../../lib/kmi/mi.h" #include "../../lib/kcore/faked_msg.h" @@ -464,6 +465,47 @@ static int w_ht_iterator_end(struct sip_msg* msg, char* iname, char* foo) return 1; } +static int ki_ht_slot_xlock(sip_msg_t *msg, str *htname, str *skey, int lmode) +{ + ht_t *ht; + unsigned int hid; + unsigned int idx; + + ht = ht_get_table(htname); + if(ht==NULL) { + LM_ERR("cannot get hash table by name [%.*s] (%d)\n", + htname->len, htname->s, lmode); + return -1; + } + + hid = ht_compute_hash(skey); + + idx = ht_get_entry(hid, ht->htsize); + + if(lmode==0) { + LM_DBG("locking slot %.*s[%u] for key %.*s\n", + htname->len, htname->s, + idx, skey->len, skey->s); + ht_slot_lock(ht, idx); + } else { + LM_DBG("unlocking slot %.*s[%u] for key %.*s\n", + htname->len, htname->s, + idx, skey->len, skey->s); + ht_slot_unlock(ht, idx); + } + return 1; +} + +static int ki_ht_slot_lock(sip_msg_t *msg, str *htname, str *skey) +{ + return ki_ht_slot_xlock(msg, htname, skey, 0); +} + +static int ki_ht_slot_unlock(sip_msg_t *msg, str *htname, str *skey) +{ + return ki_ht_slot_xlock(msg, htname, skey, 1); +} + /** * lock the slot for a given key in a hash table */ @@ -497,7 +539,7 @@ static int w_ht_slot_lock(struct sip_msg* msg, char* key, char* foo) idx = ht_get_entry(hid, hpv->ht->htsize); - LM_DBG("unlocking slot %.*s[%u] for key %.*s\n", + LM_DBG("locking slot %.*s[%u] for key %.*s\n", hpv->htname.len, hpv->htname.s, idx, skey.len, skey.s); @@ -1256,3 +1298,30 @@ static int htable_init_rpc(void) } return 0; } + +/** + * + */ +static sr_kemi_t sr_kemi_htable_exports[] = { + { str_init("htable"), str_init("sht_lock"), + SR_KEMIP_INT, ki_ht_slot_lock, + { SR_KEMIP_STR, SR_KEMIP_STR, SR_KEMIP_NONE, + SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE } + }, + { str_init("htable"), str_init("sht_unlock"), + SR_KEMIP_INT, ki_ht_slot_unlock, + { SR_KEMIP_STR, SR_KEMIP_STR, SR_KEMIP_NONE, + SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE } + }, + + { {0, 0}, {0, 0}, 0, NULL, { 0, 0, 0, 0, 0, 0 } } +}; + +/** + * + */ +int mod_register(char *path, int *dlflags, void *p1, void *p2) +{ + sr_kemi_modules_add(sr_kemi_htable_exports); + return 0; +}