diff options
author | dimitri staessens <[email protected]> | 2017-08-29 15:45:44 +0000 |
---|---|---|
committer | Sander Vrijders <[email protected]> | 2017-08-29 15:45:44 +0000 |
commit | f7942245a37c591d3c3b8d6526dcc38dcf255d25 (patch) | |
tree | 276c1b3d0d3dece08bd78162946df8433d1c04f3 /src/irmd | |
parent | 768064e211c311142697335b3e9c714ea54b204a (diff) | |
parent | b05dbd778f16eb4c977e7769bd1ba03dd4e55b90 (diff) | |
download | ouroboros-f7942245a37c591d3c3b8d6526dcc38dcf255d25.tar.gz ouroboros-f7942245a37c591d3c3b8d6526dcc38dcf255d25.zip |
Merged in dstaesse/ouroboros/be-dht (pull request #577)
ipcpd: Fix state in dht lookup at lookup_wait
Diffstat (limited to 'src/irmd')
-rw-r--r-- | src/irmd/main.c | 72 |
1 files changed, 48 insertions, 24 deletions
diff --git a/src/irmd/main.c b/src/irmd/main.c index 09a76214..1d62de85 100644 --- a/src/irmd/main.c +++ b/src/irmd/main.c @@ -922,6 +922,8 @@ static int name_reg(const char * name, for (i = 0; i < len; ++i) { uint8_t * hash; + pid_t api; + size_t len; if (wildcard_match(difs[i], e->dif_name)) continue; @@ -932,23 +934,33 @@ static int name_reg(const char * name, str_hash(e->dir_hash_algo, hash, name); - if (ipcp_reg(e->api, hash, IPCP_HASH_LEN(e))) { + api = e->api; + len = IPCP_HASH_LEN(e); + + pthread_rwlock_unlock(&irmd.reg_lock); + + if (ipcp_reg(api, hash, len)) { log_err("Could not register " HASH_FMT - " in DIF %s (IPCP %d).", - HASH_VAL(hash), e->dif_name, e->api); - } else { - if (registry_add_name_to_dif(&irmd.registry, - name, - e->dif_name, - e->type) < 0) - log_warn("Registered unbound name %s. " - "Registry may be corrupt.", - name); - log_info("Registered %s in %s as " HASH_FMT ".", - name, e->dif_name, HASH_VAL(hash)); - ++ret; + " with IPCP %d.", + HASH_VAL(hash), api); + pthread_rwlock_wrlock(&irmd.reg_lock); + free(hash); + break; } + pthread_rwlock_wrlock(&irmd.reg_lock); + + if (registry_add_name_to_dif(&irmd.registry, + name, + e->dif_name, + e->type) < 0) + log_warn("Registered unbound name %s. " + "Registry may be corrupt.", + name); + log_info("Registered %s in %s as " HASH_FMT ".", + name, e->dif_name, HASH_VAL(hash)); + ++ret; + free(hash); } } @@ -982,6 +994,8 @@ static int name_unreg(const char * name, for (i = 0; i < len; ++i) { uint8_t * hash; + pid_t api; + size_t len; if (wildcard_match(difs[i], e->dif_name)) continue; @@ -992,18 +1006,28 @@ static int name_unreg(const char * name, str_hash(e->dir_hash_algo, hash, name); - if (ipcp_unreg(e->api, hash, IPCP_HASH_LEN(e))) { - log_err("Could not unregister %s in DIF %s.", - name, e->dif_name); - } else { - registry_del_name_from_dif(&irmd.registry, - name, - e->dif_name); - log_info("Unregistered %s from %s.", - name, e->dif_name); - ++ret; + api = e->api; + len = IPCP_HASH_LEN(e); + + pthread_rwlock_unlock(&irmd.reg_lock); + + if (ipcp_unreg(api, hash, len)) { + log_err("Could not unregister %s with IPCP %d.", + name, api); + pthread_rwlock_wrlock(&irmd.reg_lock); + free(hash); + break; } + pthread_rwlock_wrlock(&irmd.reg_lock); + + registry_del_name_from_dif(&irmd.registry, + name, + e->dif_name); + log_info("Unregistered %s from %s.", + name, e->dif_name); + ++ret; + free(hash); } } |