From f05dd6ac079556654f3bc6c10c20e7f86336b827 Mon Sep 17 00:00:00 2001 From: Erik Boasson Date: Fri, 28 Jun 2019 08:51:59 +0200 Subject: [PATCH] Remove use of globals from config processing Signed-off-by: Erik Boasson --- src/core/ddsc/src/dds_domain.c | 2 +- src/core/ddsc/src/dds_writer.c | 2 +- src/core/ddsi/include/dds/ddsi/q_config.h | 10 +-- src/core/ddsi/src/q_config.c | 90 +++++++++++------------ src/core/ddsi/src/q_ddsi_discovery.c | 2 +- src/core/ddsi/src/q_entity.c | 8 +- 6 files changed, 56 insertions(+), 58 deletions(-) diff --git a/src/core/ddsc/src/dds_domain.c b/src/core/ddsc/src/dds_domain.c index 2cc7f4e..5648abc 100644 --- a/src/core/ddsc/src/dds_domain.c +++ b/src/core/ddsc/src/dds_domain.c @@ -52,7 +52,7 @@ static dds_return_t dds_domain_init (dds_domain *domain, dds_domainid_t domain_i gv.tstart = now (); (void) ddsrt_getenv ("CYCLONEDDS_URI", &uri); - domain->cfgst = config_init (uri); + domain->cfgst = config_init (uri, &config); if (domain->cfgst == NULL) { DDS_LOG (DDS_LC_CONFIG, "Failed to parse configuration XML file %s\n", uri); diff --git a/src/core/ddsc/src/dds_writer.c b/src/core/ddsc/src/dds_writer.c index 856d828..9f24737 100644 --- a/src/core/ddsc/src/dds_writer.c +++ b/src/core/ddsc/src/dds_writer.c @@ -158,7 +158,7 @@ static void dds_writer_status_cb (void *ventity, const status_cb_data_t *data) static uint32_t get_bandwidth_limit (dds_transport_priority_qospolicy_t transport_priority) { #ifdef DDSI_INCLUDE_NETWORK_CHANNELS - struct config_channel_listelem *channel = find_channel (transport_priority); + struct config_channel_listelem *channel = find_channel (&config, transport_priority); return channel->data_bandwidth_limit; #else (void) transport_priority; diff --git a/src/core/ddsi/include/dds/ddsi/q_config.h b/src/core/ddsi/include/dds/ddsi/q_config.h index 7a96a76..3334fe3 100644 --- a/src/core/ddsi/include/dds/ddsi/q_config.h +++ b/src/core/ddsi/include/dds/ddsi/q_config.h @@ -396,18 +396,18 @@ extern struct config DDS_EXPORT config; struct cfgst; -struct cfgst *config_init (const char *configfile); +struct cfgst *config_init (const char *configfile, struct config *cfg); void config_print_cfgst (struct cfgst *cfgst); void config_free_source_info (struct cfgst *cfgst); void config_fini (struct cfgst *cfgst); #ifdef DDSI_INCLUDE_NETWORK_PARTITIONS -struct config_partitionmapping_listelem *find_partitionmapping (const char *partition, const char *topic); -struct config_networkpartition_listelem *find_networkpartition_by_id (uint32_t id); -int is_ignored_partition (const char *partition, const char *topic); +struct config_partitionmapping_listelem *find_partitionmapping (const struct config *cfg, const char *partition, const char *topic); +struct config_networkpartition_listelem *find_networkpartition_by_id (const struct config *cfg, uint32_t id); +int is_ignored_partition (const struct config *cfg, const char *partition, const char *topic); #endif #ifdef DDSI_INCLUDE_NETWORK_CHANNELS -struct config_channel_listelem *find_channel (nn_transport_priority_qospolicy_t transport_priority); +struct config_channel_listelem *find_channel (const struct config *cfg, nn_transport_priority_qospolicy_t transport_priority); #endif #if defined (__cplusplus) diff --git a/src/core/ddsi/src/q_config.c b/src/core/ddsi/src/q_config.c index 89df843..26ada1d 100644 --- a/src/core/ddsi/src/q_config.c +++ b/src/core/ddsi/src/q_config.c @@ -1500,7 +1500,7 @@ static void pf_logcat (struct cfgst *cfgst, UNUSED_ARG (void *parent), UNUSED_AR assert (key.e != NULL); if ((n = ddsrt_avl_lookup_succ_eq (&cfgst_found_treedef, &cfgst->found, &key)) != NULL && n->key.e == key.e) sources |= n->sources; - do_print_uint32_bitset (cfgst, config.enabled_logcats, sizeof (logcat_codes) / sizeof (*logcat_codes), logcat_names, logcat_codes, sources, ""); + do_print_uint32_bitset (cfgst, cfgst->cfg->enabled_logcats, sizeof (logcat_codes) / sizeof (*logcat_codes), logcat_names, logcat_codes, sources, ""); } static const char *xcheck_names[] = { @@ -2535,30 +2535,30 @@ static FILE *config_open_file (char *tok, char **cursor) return fp; } -struct cfgst *config_init (const char *configfile) +struct cfgst *config_init (const char *configfile, struct config *cfg) { int ok = 1; struct cfgst *cfgst; - memset (&config, 0, sizeof (config)); + memset (cfg, 0, sizeof (*cfg)); - config.tracingOutputFile = stderr; - config.enabled_logcats = DDS_LC_ERROR | DDS_LC_WARNING; + cfgst = ddsrt_malloc (sizeof (*cfgst)); + memset (cfgst, 0, sizeof (*cfgst)); + ddsrt_avl_init (&cfgst_found_treedef, &cfgst->found); + cfgst->cfg = cfg; + cfgst->error = 0; + cfgst->source = 0; + cfgst->enabled_logcats = 0; + + /* Initial logging configuration: configuration errors and warnings are dumped to stderr */ + cfgst->cfg->tracingOutputFile = stderr; + cfgst->cfg->enabled_logcats = DDS_LC_ERROR | DDS_LC_WARNING; /* eventually, we domainId.value will be the real domain id selected, even if it was configured to the default of "any" and has "isdefault" set; initializing it to the default-default value of 0 means "any" in the config & DDS_DOMAIN_DEFAULT in create participant automatically ends up on the right value */ - config.domainId.value = 0; - - cfgst = ddsrt_malloc (sizeof (*cfgst)); - memset (cfgst, 0, sizeof (*cfgst)); - - ddsrt_avl_init (&cfgst_found_treedef, &cfgst->found); - cfgst->cfg = &config; - cfgst->error = 0; - cfgst->source = 0; - cfgst->enabled_logcats = 0; + cfgst->cfg->domainId.value = 0; /* configfile == NULL will get you the default configuration */ if (configfile) { @@ -2597,7 +2597,7 @@ struct cfgst *config_init (const char *configfile) } cfgst->implicit_toplevel = (fp == NULL) ? ITL_ALLOWED : ITL_DISALLOWED; - cfgst_push (cfgst, 0, &root_cfgelem, &config); + cfgst_push (cfgst, 0, &root_cfgelem, cfgst->cfg); ok = (ddsrt_xmlp_parse (qx) >= 0) && !cfgst->error; assert (!ok || (cfgst->path_depth == 1 && cfgst->implicit_toplevel != ITL_INSERTED) || @@ -2632,9 +2632,9 @@ struct cfgst *config_init (const char *configfile) { case TRANS_DEFAULT: if (cfgst->cfg->compat_tcp_enable == BOOLDEF_TRUE) - cfgst->cfg->transport_selector = (config.compat_use_ipv6 == BOOLDEF_TRUE) ? TRANS_TCP6 : TRANS_TCP; + cfgst->cfg->transport_selector = (cfgst->cfg->compat_use_ipv6 == BOOLDEF_TRUE) ? TRANS_TCP6 : TRANS_TCP; else - cfgst->cfg->transport_selector = (config.compat_use_ipv6 == BOOLDEF_TRUE) ? TRANS_UDP6 : TRANS_UDP; + cfgst->cfg->transport_selector = (cfgst->cfg->compat_use_ipv6 == BOOLDEF_TRUE) ? TRANS_UDP6 : TRANS_UDP; break; case TRANS_TCP: ok1 = !(cfgst->cfg->compat_tcp_enable == BOOLDEF_FALSE || cfgst->cfg->compat_use_ipv6 == BOOLDEF_TRUE); @@ -2671,7 +2671,7 @@ struct cfgst *config_init (const char *configfile) #ifdef DDSI_INCLUDE_ENCRYPTION /* Check security profiles */ { - struct config_securityprofile_listelem *s = config.securityProfiles; + struct config_securityprofile_listelem *s = cfgst->cfg->securityProfiles; while (s) { switch (s->cipher) @@ -2708,8 +2708,8 @@ struct cfgst *config_init (const char *configfile) securityProfiles and signal errors if profiles do not exist */ #endif /* DDSI_INCLUDE_ENCRYPTION */ { - struct config_networkpartition_listelem *p = config.networkPartitions; - config.nof_networkPartitions = 0; + struct config_networkpartition_listelem *p = cfgst->cfg->networkPartitions; + cfgst->cfg->nof_networkPartitions = 0; while (p) { #ifdef DDSI_INCLUDE_ENCRYPTION @@ -2717,7 +2717,7 @@ struct cfgst *config_init (const char *configfile) p->securityProfile = NULL; else { - struct config_securityprofile_listelem *s = config.securityProfiles; + struct config_securityprofile_listelem *s = cfgst->cfg->securityProfiles; while (s && ddsrt_strcasecmp(p->profileName, s->name) != 0) s = s->next; if (s) @@ -2729,12 +2729,12 @@ struct cfgst *config_init (const char *configfile) } } #endif /* DDSI_INCLUDE_ENCRYPTION */ - config.nof_networkPartitions++; + cfgst->cfg->nof_networkPartitions++; /* also use crc32 just like native nw and ordinary ddsi2e, only for interoperability because it is asking for trouble & forces us to include a crc32 routine when we have md5 available anyway */ - p->partitionId = config.nof_networkPartitions; /* starting at 1 */ + p->partitionId = cfgst->cfg->nof_networkPartitions; /* starting at 1 */ p->partitionHash = crc32_calc(p->name, strlen(p->name)); p = p->next; } @@ -2743,10 +2743,10 @@ struct cfgst *config_init (const char *configfile) /* Create links from the partitionmappings to the network partitions and signal errors if partitions do not exist */ { - struct config_partitionmapping_listelem * m = config.partitionMappings; + struct config_partitionmapping_listelem * m = cfgst->cfg->partitionMappings; while (m) { - struct config_networkpartition_listelem * p = config.networkPartitions; + struct config_networkpartition_listelem * p = cfgst->cfg->networkPartitions; while (p && ddsrt_strcasecmp(m->networkPartition, p->name) != 0) p = p->next; if (p) @@ -2762,11 +2762,11 @@ struct cfgst *config_init (const char *configfile) #endif /* DDSI_INCLUDE_NETWORK_PARTITIONS */ /* Now switch to configured tracing settings */ - config.enabled_logcats = cfgst->enabled_logcats; + cfgst->cfg->enabled_logcats = cfgst->enabled_logcats; if (ok) { - config.valid = 1; + cfgst->cfg->valid = 1; return cfgst; } @@ -2793,18 +2793,16 @@ void config_free_source_info (struct cfgst *cfgst) void config_fini (struct cfgst *cfgst) { assert (cfgst); - assert (cfgst->cfg == &config); - assert (config.valid); + assert (cfgst->cfg != NULL); + assert (cfgst->cfg->valid); free_all_elements (cfgst, cfgst->cfg, root_cfgelems); dds_set_log_file (stderr); dds_set_trace_file (stderr); - if (config.tracingOutputFile && config.tracingOutputFile != stdout && config.tracingOutputFile != stderr) { - fclose(config.tracingOutputFile); + if (cfgst->cfg->tracingOutputFile && cfgst->cfg->tracingOutputFile != stdout && cfgst->cfg->tracingOutputFile != stderr) { + fclose(cfgst->cfg->tracingOutputFile); } - memset (&config, 0, sizeof (config)); - config.valid = 0; - + memset (cfgst->cfg, 0, sizeof (*cfgst->cfg)); ddsrt_avl_free (&cfgst_found_treedef, &cfgst->found, ddsrt_free); ddsrt_free (cfgst); } @@ -2818,31 +2816,31 @@ static char *get_partition_search_pattern (const char *partition, const char *to return pt; } -struct config_partitionmapping_listelem *find_partitionmapping (const char *partition, const char *topic) +struct config_partitionmapping_listelem *find_partitionmapping (const struct config *cfg, const char *partition, const char *topic) { char *pt = get_partition_search_pattern (partition, topic); struct config_partitionmapping_listelem *pm; - for (pm = config.partitionMappings; pm; pm = pm->next) + for (pm = cfg->partitionMappings; pm; pm = pm->next) if (WildcardOverlap (pt, pm->DCPSPartitionTopic)) break; ddsrt_free (pt); return pm; } -struct config_networkpartition_listelem *find_networkpartition_by_id (uint32_t id) +struct config_networkpartition_listelem *find_networkpartition_by_id (const struct config *cfg, uint32_t id) { struct config_networkpartition_listelem *np; - for (np = config.networkPartitions; np; np = np->next) + for (np = cfg->networkPartitions; np; np = np->next) if (np->partitionId == id) return np; return 0; } -int is_ignored_partition (const char *partition, const char *topic) +int is_ignored_partition (const struct config *cfg, const char *partition, const char *topic) { char *pt = get_partition_search_pattern (partition, topic); struct config_ignoredpartition_listelem *ip; - for (ip = config.ignoredPartitions; ip; ip = ip->next) + for (ip = cfg->ignoredPartitions; ip; ip = ip->next) if (WildcardOverlap(pt, ip->DCPSPartitionTopic)) break; ddsrt_free (pt); @@ -2851,20 +2849,20 @@ int is_ignored_partition (const char *partition, const char *topic) #endif /* DDSI_INCLUDE_NETWORK_PARTITIONS */ #ifdef DDSI_INCLUDE_NETWORK_CHANNELS -struct config_channel_listelem *find_channel (nn_transport_priority_qospolicy_t transport_priority) +struct config_channel_listelem *find_channel (const struct config *cfg, nn_transport_priority_qospolicy_t transport_priority) { struct config_channel_listelem *c; /* Channel selection is to use the channel with the lowest priority not less than transport_priority, or else the one with the highest priority. */ - assert(config.channels != NULL); - assert(config.max_channel != NULL); - for (c = config.channels; c; c = c->next) + assert(cfg->channels != NULL); + assert(cfg->max_channel != NULL); + for (c = cfg->channels; c; c = c->next) { assert(c->next == NULL || c->next->priority > c->priority); if (transport_priority.value <= c->priority) return c; } - return config.max_channel; + return cfg->max_channel; } #endif /* DDSI_INCLUDE_NETWORK_CHANNELS */ diff --git a/src/core/ddsi/src/q_ddsi_discovery.c b/src/core/ddsi/src/q_ddsi_discovery.c index 5bfabc4..2e984b5 100644 --- a/src/core/ddsi/src/q_ddsi_discovery.c +++ b/src/core/ddsi/src/q_ddsi_discovery.c @@ -1265,7 +1265,7 @@ static void handle_SEDP_alive (const struct receiver_state *rst, nn_plist_t *dat assert (!is_builtin_entityid (datap->endpoint_guid.entityid, vendorid)); #ifdef DDSI_INCLUDE_NETWORK_CHANNELS { - struct config_channel_listelem *channel = find_channel (xqos->transport_priority); + struct config_channel_listelem *channel = find_channel (&config, xqos->transport_priority); new_proxy_writer (&ppguid, &datap->endpoint_guid, as, datap, channel->dqueue, channel->evq ? channel->evq : gv.xevents, timestamp); } #else diff --git a/src/core/ddsi/src/q_entity.c b/src/core/ddsi/src/q_entity.c index c5fe908..936bec4 100644 --- a/src/core/ddsi/src/q_entity.c +++ b/src/core/ddsi/src/q_entity.c @@ -2501,7 +2501,7 @@ static int set_topic_type_name (dds_qos_t *xqos, const struct ddsi_sertopic * to static uint32_t get_partitionid_from_mapping (const char *partition, const char *topic) { struct config_partitionmapping_listelem *pm; - if ((pm = find_partitionmapping (partition, topic)) == NULL) + if ((pm = find_partitionmapping (&config, partition, topic)) == NULL) return 0; else { @@ -2767,7 +2767,7 @@ static void new_writer_guid_common_init (struct writer *wr, const struct ddsi_se } else { - const struct config_networkpartition_listelem *np = find_networkpartition_by_id (wr->partition_id); + const struct config_networkpartition_listelem *np = find_networkpartition_by_id (&config, wr->partition_id); assert (np); if (addrset_any_ssm (np->as, &loc)) have_loc = 1; @@ -2789,7 +2789,7 @@ static void new_writer_guid_common_init (struct writer *wr, const struct ddsi_se #ifdef DDSI_INCLUDE_NETWORK_CHANNELS if (!is_builtin_entityid (wr->e.guid.entityid, ownvendorid)) { - struct config_channel_listelem *channel = find_channel (wr->xqos->transport_priority); + struct config_channel_listelem *channel = find_channel (&config, wr->xqos->transport_priority); DDS_LOG(DDS_LC_DISCOVERY, "writer "PGUIDFMT": transport priority %d => channel '%s' priority %d\n", PGUID (wr->e.guid), wr->xqos->transport_priority.value, channel->name, channel->priority); wr->evq = channel->evq ? channel->evq : gv.xevents; @@ -3121,7 +3121,7 @@ static struct addrset * get_as_from_mapping (const char *partition, const char * { struct config_partitionmapping_listelem *pm; struct addrset *as = new_addrset (); - if ((pm = find_partitionmapping (partition, topic)) != NULL) + if ((pm = find_partitionmapping (&config, partition, topic)) != NULL) { DDS_LOG(DDS_LC_DISCOVERY, "matched reader for topic \"%s\" in partition \"%s\" to networkPartition \"%s\"\n", topic, partition, pm->networkPartition); assert (pm->partition->as);