[evolution-data-server] Eliminate the assertion in camel_provider_register().
- From: Matthew Barnes <mbarnes src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution-data-server] Eliminate the assertion in camel_provider_register().
- Date: Wed, 10 Oct 2012 14:41:34 +0000 (UTC)
commit e4160726f897de9f2e697f8df319f68c2f39d6f2
Author: Matthew Barnes <mbarnes redhat com>
Date: Wed Oct 10 10:08:15 2012 -0400
Eliminate the assertion in camel_provider_register().
camel_provider_register() should automatically set up the module and
provider hash tables if needed instead of aborting, but the problem
is the GOnce function that sets up these hash tables also calls
camel_provider_register().
Break this cycle by moving the bulk of camel_provider_register() to a
new internal function (provider_register_internal) and calling it from
the GOnce function (provider_setup).
The public camel_provider_register() function is then simply:
g_once (&setup_once, provider_setup, NULL);
provider_register_internal (provider);
camel/camel-provider.c | 128 ++++++++++++++++++++++++++----------------------
1 files changed, 70 insertions(+), 58 deletions(-)
---
diff --git a/camel/camel-provider.c b/camel/camel-provider.c
index 42f0fff..6b74699 100644
--- a/camel/camel-provider.c
+++ b/camel/camel-provider.c
@@ -73,16 +73,79 @@ static CamelProvider vee_provider = {
static GOnce setup_once = G_ONCE_INIT;
+static void
+provider_register_internal (CamelProvider *provider)
+{
+ CamelProviderConfEntry *conf;
+ CamelProviderPortEntry *port;
+ GList *link;
+ gint ii;
+
+ g_return_if_fail (provider != NULL);
+ g_return_if_fail (provider->protocol != NULL);
+
+ LOCK ();
+
+ if (g_hash_table_lookup (provider_table, provider->protocol) != NULL) {
+ g_warning (
+ "Trying to re-register CamelProvider for protocol '%s'",
+ provider->protocol);
+ UNLOCK ();
+ return;
+ }
+
+ /* Translate all strings here */
+#define P_(string) dgettext (provider->translation_domain, string)
+
+ provider->name = P_(provider->name);
+ provider->description = P_(provider->description);
+
+ conf = provider->extra_conf;
+ if (conf != NULL) {
+ for (ii = 0; conf[ii].type != CAMEL_PROVIDER_CONF_END; ii++) {
+ if (conf[ii].text != NULL)
+ conf[ii].text = P_(conf[ii].text);
+ }
+ }
+
+ for (link = provider->authtypes; link != NULL; link = link->next) {
+ CamelServiceAuthType *auth = link->data;
+
+ auth->name = P_(auth->name);
+ auth->description = P_(auth->description);
+ }
+
+ if (provider->port_entries != NULL) {
+ provider->url_flags |= CAMEL_URL_NEED_PORT;
+ port = provider->port_entries;
+ for (ii = 0; port[ii].port != 0; ii++)
+ if (port[ii].desc != NULL)
+ port[ii].desc = P_(port[ii].desc);
+ } else {
+ provider->url_flags &= ~CAMEL_URL_NEED_PORT;
+ }
+
+ g_hash_table_insert (
+ provider_table,
+ (gpointer) provider->protocol, provider);
+
+ UNLOCK ();
+}
+
static gpointer
provider_setup (gpointer param)
{
- module_table = g_hash_table_new (camel_strcase_hash, camel_strcase_equal);
- provider_table = g_hash_table_new (camel_strcase_hash, camel_strcase_equal);
-
- vee_provider.object_types[CAMEL_PROVIDER_STORE] = camel_vee_store_get_type ();
+ module_table = g_hash_table_new (
+ (GHashFunc) camel_strcase_hash,
+ (GEqualFunc) camel_strcase_equal);
+ provider_table = g_hash_table_new (
+ (GHashFunc) camel_strcase_hash,
+ (GEqualFunc) camel_strcase_equal);
+
+ vee_provider.object_types[CAMEL_PROVIDER_STORE] = CAMEL_TYPE_VEE_STORE;
vee_provider.url_hash = camel_url_hash;
vee_provider.url_equal = camel_url_equal;
- camel_provider_register (&vee_provider);
+ provider_register_internal (&vee_provider);
return NULL;
}
@@ -230,60 +293,9 @@ camel_provider_load (const gchar *path,
void
camel_provider_register (CamelProvider *provider)
{
- gint i;
- CamelProviderConfEntry *conf;
- CamelProviderPortEntry *port;
- GList *l;
-
- g_return_if_fail (provider != NULL);
-
- g_assert (provider_table);
-
- LOCK ();
-
- if (g_hash_table_lookup (provider_table, provider->protocol) != NULL) {
- g_warning ("Trying to re-register camel provider for protocol '%s'", provider->protocol);
- UNLOCK ();
- return;
- }
-
- /* Translate all strings here */
-#define P_(string) dgettext (provider->translation_domain, string)
-
- provider->name = P_(provider->name);
- provider->description = P_(provider->description);
- conf = provider->extra_conf;
- if (conf) {
- for (i = 0; conf[i].type != CAMEL_PROVIDER_CONF_END; i++) {
- if (conf[i].text)
- conf[i].text = P_(conf[i].text);
- }
- }
-
- l = provider->authtypes;
- while (l) {
- CamelServiceAuthType *auth = l->data;
-
- auth->name = P_(auth->name);
- auth->description = P_(auth->description);
- l = l->next;
- }
-
- if (provider->port_entries) {
- provider->url_flags |= CAMEL_URL_NEED_PORT;
- port = provider->port_entries;
- for (i = 0; port[i].port != 0; i++)
- if (port[i].desc)
- port[i].desc = P_(port[i].desc);
- }
- else
- provider->url_flags &= ~CAMEL_URL_NEED_PORT;
-
- g_hash_table_insert (
- provider_table,
- (gpointer) provider->protocol, provider);
+ g_once (&setup_once, provider_setup, NULL);
- UNLOCK ();
+ provider_register_internal (provider);
}
static gint
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]