From 11c6be30491ebe4e41380f48a271c57bcff4b043 Mon Sep 17 00:00:00 2001 From: dimitri staessens Date: Wed, 10 Aug 2016 17:50:45 +0200 Subject: lib, irmd: Bind AP instances to AP_subsets This call will allow grouping AP instances of a certain AP together which are configured identically. Adds the bind operation to dev and updates the applications to make use of this call. Flow_alloc is now only called with the pid and doesn't send the apn anymore. --- src/irmd/main.c | 75 ++++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 71 insertions(+), 4 deletions(-) (limited to 'src/irmd/main.c') diff --git a/src/irmd/main.c b/src/irmd/main.c index e36fb98e..55764941 100644 --- a/src/irmd/main.c +++ b/src/irmd/main.c @@ -43,6 +43,7 @@ #include "utils.h" #include "registry.h" #include "irm_flow.h" +#include "api_table.h" #include #include @@ -78,8 +79,6 @@ struct spawned_api { pid_t api; }; -/* keeps track of port_id's between N and N - 1 */ - struct irm { /* FIXME: list of ipcps could be merged into the registry */ struct list_head ipcps; @@ -87,6 +86,7 @@ struct irm { struct list_head registry; pthread_rwlock_t reg_lock; + struct list_head api_table; struct list_head spawned_apis; /* keep track of all flows in this processing system */ @@ -717,14 +717,59 @@ static int ap_unreg(char * name, return ret; } +static int api_bind(pid_t api, char * apn, char * ap_subset) +{ + int ret = 0; + char * apn_dup; + char * ap_s_dup = ap_subset; + if (apn == NULL) + return -EINVAL; + + pthread_rwlock_rdlock(&irmd->state_lock); + + if (irmd->state != IRMD_RUNNING) { + pthread_rwlock_unlock(&irmd->state_lock); + return -EPERM; + } + + pthread_rwlock_wrlock(&irmd->reg_lock); + + apn_dup = strdup(apn); + if (apn_dup == NULL) { + pthread_rwlock_unlock(&irmd->reg_lock); + pthread_rwlock_unlock(&irmd->state_lock); + return -ENOMEM; + } + + if (ap_subset != NULL) { + ap_s_dup = strdup(ap_subset); + if (ap_s_dup == NULL) { + pthread_rwlock_unlock(&irmd->reg_lock); + pthread_rwlock_unlock(&irmd->state_lock); + return -ENOMEM; + } + } + + ret = api_table_add_api(&irmd->api_table, + api, + apn_dup, + ap_s_dup); + + pthread_rwlock_unlock(&irmd->reg_lock); + pthread_rwlock_unlock(&irmd->state_lock); + + return ret; +} + static struct irm_flow * flow_accept(pid_t api, - char * srv_ap_name, char ** dst_ae_name) { struct irm_flow * f = NULL; struct reg_entry * rne = NULL; struct reg_api * rgi = NULL; + char * srv_ap_name; + pthread_rwlock_rdlock(&irmd->state_lock); if (irmd->state != IRMD_RUNNING) { @@ -734,6 +779,10 @@ static struct irm_flow * flow_accept(pid_t api, pthread_rwlock_wrlock(&irmd->reg_lock); + srv_ap_name = api_table_get_apn(&irmd->api_table, api); + if (srv_ap_name == NULL) + return NULL; + rne = registry_get_entry_by_apn(&irmd->registry, srv_ap_name); if (rne == NULL) { pthread_rwlock_unlock(&irmd->reg_lock); @@ -1458,6 +1507,18 @@ void * irm_flow_cleaner() } } + list_for_each_safe(pos, n, &irmd->api_table) { + struct api_entry * e = + list_entry(pos, struct api_entry, next); + + if (kill(e->api, 0) < 0) { + LOG_INFO("Instance %d removed from api table.", + e->api); + list_del(&e->next); + api_entry_destroy(e); + } + } + pthread_rwlock_unlock(&irmd->reg_lock); pthread_rwlock_unlock(&irmd->state_lock); @@ -1542,6 +1603,12 @@ void * mainloop() msg->ap_name, msg->opts); break; + case IRM_MSG_CODE__IRM_API_BIND: + ret_msg.has_result = true; + ret_msg.result = api_bind(msg->api, + msg->ap_name, + msg->ap_subset); + break; case IRM_MSG_CODE__IRM_LIST_IPCPS: ret_msg.n_apis = list_ipcps(msg->dst_name, &apis); @@ -1562,7 +1629,6 @@ void * mainloop() break; case IRM_MSG_CODE__IRM_FLOW_ACCEPT: e = flow_accept(msg->api, - msg->ap_name, &ret_msg.ae_name); if (e == NULL) { @@ -1700,6 +1766,7 @@ static struct irm * irm_create() } INIT_LIST_HEAD(&irmd->ipcps); + INIT_LIST_HEAD(&irmd->api_table); INIT_LIST_HEAD(&irmd->spawned_apis); INIT_LIST_HEAD(&irmd->registry); INIT_LIST_HEAD(&irmd->irm_flows); -- cgit v1.2.3