[evolution-data-server] Add book/calendar-factory argument to override backend-per-process compile-time option



commit 1bb5cf7322091700fa8fed2f576773977f105924
Author: Milan Crha <mcrha redhat com>
Date:   Thu Feb 1 18:17:42 2018 +0100

    Add book/calendar-factory argument to override backend-per-process compile-time option
    
    The evolution-addressbook-factory and evolution-calendar-factory processes
    have now an argument --backend-per-process, which can be any integer, where
    value 0 means to not use backend-per-process feature, value 1 means to use it
    and any other value means to use as evolution-data-server had been configured
    during compile-time. The default is to respect the compile-time option.

 .../libedata-book/e-data-book-factory.c            |   11 ++--
 .../libedata-book/e-data-book-factory.h            |    3 +-
 src/calendar/libedata-cal/e-data-cal-factory.c     |   11 ++--
 src/calendar/libedata-cal/e-data-cal-factory.h     |    3 +-
 src/libebackend/e-data-factory.c                   |   77 ++++++++++++++++++--
 src/libebackend/e-data-factory.h                   |    2 +
 .../evolution-addressbook-factory.c                |    5 +-
 .../evolution-calendar-factory.c                   |    5 +-
 8 files changed, 95 insertions(+), 22 deletions(-)
---
diff --git a/src/addressbook/libedata-book/e-data-book-factory.c 
b/src/addressbook/libedata-book/e-data-book-factory.c
index ba18068..d34b65f 100644
--- a/src/addressbook/libedata-book/e-data-book-factory.c
+++ b/src/addressbook/libedata-book/e-data-book-factory.c
@@ -190,11 +190,12 @@ e_data_book_factory_init (EDataBookFactory *factory)
 }
 
 EDBusServer *
-e_data_book_factory_new (GCancellable *cancellable,
+e_data_book_factory_new (gint backend_per_process,
+                        GCancellable *cancellable,
                          GError **error)
 {
-       return g_initable_new (
-               E_TYPE_DATA_BOOK_FACTORY,
-               cancellable, error,
-               "reload-supported", TRUE, NULL);
+       return g_initable_new (E_TYPE_DATA_BOOK_FACTORY, cancellable, error,
+               "reload-supported", TRUE,
+               "backend-per-process", backend_per_process,
+               NULL);
 }
diff --git a/src/addressbook/libedata-book/e-data-book-factory.h 
b/src/addressbook/libedata-book/e-data-book-factory.h
index 40a2988..4903cb8 100644
--- a/src/addressbook/libedata-book/e-data-book-factory.h
+++ b/src/addressbook/libedata-book/e-data-book-factory.h
@@ -77,7 +77,8 @@ struct _EDataBookFactoryClass {
 };
 
 GType          e_data_book_factory_get_type    (void) G_GNUC_CONST;
-EDBusServer *  e_data_book_factory_new         (GCancellable *cancellable,
+EDBusServer *  e_data_book_factory_new         (gint backend_per_process,
+                                                GCancellable *cancellable,
                                                 GError **error);
 
 G_END_DECLS
diff --git a/src/calendar/libedata-cal/e-data-cal-factory.c b/src/calendar/libedata-cal/e-data-cal-factory.c
index 810b310..baaeb5f 100644
--- a/src/calendar/libedata-cal/e-data-cal-factory.c
+++ b/src/calendar/libedata-cal/e-data-cal-factory.c
@@ -268,7 +268,8 @@ e_data_cal_factory_init (EDataCalFactory *factory)
 }
 
 EDBusServer *
-e_data_cal_factory_new (GCancellable *cancellable,
+e_data_cal_factory_new (gint backend_per_process,
+                       GCancellable *cancellable,
                         GError **error)
 {
        icalarray *builtin_timezones;
@@ -305,8 +306,8 @@ e_data_cal_factory_new (GCancellable *cancellable,
                icaltimezone_get_component (zone);
        }
 
-       return g_initable_new (
-               E_TYPE_DATA_CAL_FACTORY,
-               cancellable, error,
-               "reload-supported", TRUE, NULL);
+       return g_initable_new (E_TYPE_DATA_CAL_FACTORY, cancellable, error,
+               "reload-supported", TRUE,
+               "backend-per-process", backend_per_process,
+               NULL);
 }
diff --git a/src/calendar/libedata-cal/e-data-cal-factory.h b/src/calendar/libedata-cal/e-data-cal-factory.h
index 1e01826..47f9c7f 100644
--- a/src/calendar/libedata-cal/e-data-cal-factory.h
+++ b/src/calendar/libedata-cal/e-data-cal-factory.h
@@ -78,7 +78,8 @@ struct _EDataCalFactoryClass {
 };
 
 GType          e_data_cal_factory_get_type     (void);
-EDBusServer *  e_data_cal_factory_new          (GCancellable *cancellable,
+EDBusServer *  e_data_cal_factory_new          (gint backend_per_process,
+                                                GCancellable *cancellable,
                                                 GError **error);
 
 G_END_DECLS
diff --git a/src/libebackend/e-data-factory.c b/src/libebackend/e-data-factory.c
index 7be9883..26faa6a 100644
--- a/src/libebackend/e-data-factory.c
+++ b/src/libebackend/e-data-factory.c
@@ -84,12 +84,14 @@ struct _EDataFactoryPrivate {
        DataFactorySpawnSubprocessStates spawn_subprocess_state;
 
        gboolean reload_supported;
+       gint backend_per_process;
 };
 
 enum {
        PROP_0,
        PROP_REGISTRY,
-       PROP_RELOAD_SUPPORTED
+       PROP_RELOAD_SUPPORTED,
+       PROP_BACKEND_PER_PROCESS
 };
 
 /* Forward Declarations */
@@ -285,19 +287,31 @@ data_factory_subprocess_data_free (DataFactorySubprocessData *sd)
 }
 
 static gchar *
-data_factory_dup_subprocess_helper_hash_key (const gchar *factory_name,
+data_factory_dup_subprocess_helper_hash_key (gint override_backend_per_process,
+                                            const gchar *factory_name,
                                             const gchar *extension_name,
                                             const gchar *uid,
                                             gboolean backend_factory_share_subprocess)
 {
        gchar *helper_hash_key;
+       gboolean backend_per_process;
 
-#ifdef ENABLE_BACKEND_PER_PROCESS
-       helper_hash_key = backend_factory_share_subprocess ?
-               g_strdup (factory_name) : g_strdup_printf ("%s:%s:%s", factory_name, extension_name, uid);
-#else
-       helper_hash_key = g_strdup ("not-using-bacend-per-process");
-#endif
+       if (override_backend_per_process == 0 || override_backend_per_process == 1) {
+               backend_per_process = override_backend_per_process == 1;
+       } else {
+               #ifdef ENABLE_BACKEND_PER_PROCESS
+               backend_per_process = TRUE;
+               #else
+               backend_per_process = FALSE;
+               #endif
+       }
+
+       if (backend_per_process) {
+               helper_hash_key = backend_factory_share_subprocess ?
+                       g_strdup (factory_name) : g_strdup_printf ("%s:%s:%s", factory_name, extension_name, 
uid);
+       } else {
+               helper_hash_key = g_strdup ("not-using-backend-per-process");
+       }
 
        return helper_hash_key;
 }
@@ -830,6 +844,16 @@ e_data_factory_set_reload_supported (EDataFactory *data_factory,
        data_factory->priv->reload_supported = is_supported;
 }
 
+
+static void
+e_data_factory_set_backend_per_process (EDataFactory *data_factory,
+                                       gint backend_per_process)
+{
+       g_return_if_fail (E_IS_DATA_FACTORY (data_factory));
+
+       data_factory->priv->backend_per_process = backend_per_process;
+}
+
 static void
 e_data_factory_get_property (GObject *object,
                             guint property_id,
@@ -850,6 +874,14 @@ e_data_factory_get_property (GObject *object,
                                e_data_factory_get_reload_supported (
                                E_DATA_FACTORY (object)));
                        return;
+
+               case PROP_BACKEND_PER_PROCESS:
+                       g_value_set_int (
+                               value,
+                               e_data_factory_get_backend_per_process (
+                               E_DATA_FACTORY (object)));
+                       return;
+
        }
 
        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
@@ -867,6 +899,12 @@ e_data_factory_set_property (GObject *object,
                                E_DATA_FACTORY (object),
                                g_value_get_boolean (value));
                        return;
+
+               case PROP_BACKEND_PER_PROCESS:
+                       e_data_factory_set_backend_per_process (
+                               E_DATA_FACTORY (object),
+                               g_value_get_int (value));
+                       return;
        }
 
        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
@@ -1026,6 +1064,19 @@ e_data_factory_class_init (EDataFactoryClass *class)
                        G_PARAM_READWRITE |
                        G_PARAM_CONSTRUCT_ONLY |
                        G_PARAM_STATIC_STRINGS));
+
+       g_object_class_install_property (
+               object_class,
+               PROP_BACKEND_PER_PROCESS,
+               g_param_spec_int (
+                       "backend-per-process",
+                       "Backend Per Process",
+                       "Override backend-per-process compile-time option",
+                       G_MININT, G_MAXINT,
+                       -1,
+                       G_PARAM_READWRITE |
+                       G_PARAM_CONSTRUCT_ONLY |
+                       G_PARAM_STATIC_STRINGS));
 }
 
 static void
@@ -1071,6 +1122,7 @@ e_data_factory_init (EDataFactory *data_factory)
 
        data_factory->priv->spawn_subprocess_state = DATA_FACTORY_SPAWN_SUBPROCESS_NONE;
        data_factory->priv->reload_supported = FALSE;
+       data_factory->priv->backend_per_process = -1;
 }
 
 /**
@@ -1222,6 +1274,7 @@ data_factory_spawn_subprocess_backend (EDataFactory *data_factory,
                factory_name = class->get_factory_name (backend_factory);
 
                subprocess_helpers_hash_key = data_factory_dup_subprocess_helper_hash_key (
+                       e_data_factory_get_backend_per_process (data_factory),
                        factory_name, extension_name, uid, e_backend_factory_share_subprocess 
(backend_factory));
 
                g_mutex_lock (&priv->mutex);
@@ -1393,3 +1446,11 @@ e_data_factory_get_reload_supported (EDataFactory *data_factory)
 
        return data_factory->priv->reload_supported;
 }
+
+gint
+e_data_factory_get_backend_per_process (EDataFactory *data_factory)
+{
+       g_return_val_if_fail (E_IS_DATA_FACTORY (data_factory), -1);
+
+       return data_factory->priv->backend_per_process;
+}
diff --git a/src/libebackend/e-data-factory.h b/src/libebackend/e-data-factory.h
index 630806b..8d4e5a0 100644
--- a/src/libebackend/e-data-factory.h
+++ b/src/libebackend/e-data-factory.h
@@ -105,6 +105,8 @@ void                e_data_factory_spawn_subprocess_backend
                                                 const gchar *subprocess_path);
 gboolean       e_data_factory_get_reload_supported
                                                (EDataFactory *data_factory);
+gint           e_data_factory_get_backend_per_process
+                                               (EDataFactory *data_factory);
 
 G_END_DECLS
 
diff --git a/src/services/evolution-addressbook-factory/evolution-addressbook-factory.c 
b/src/services/evolution-addressbook-factory/evolution-addressbook-factory.c
index ad66d8f..78dd6fc 100644
--- a/src/services/evolution-addressbook-factory/evolution-addressbook-factory.c
+++ b/src/services/evolution-addressbook-factory/evolution-addressbook-factory.c
@@ -30,6 +30,7 @@
 
 static gboolean opt_keep_running = FALSE;
 static gboolean opt_wait_for_client = FALSE;
+static gint opt_backend_per_process = -1;
 
 static GOptionEntry entries[] = {
 
@@ -37,6 +38,8 @@ static GOptionEntry entries[] = {
          N_("Keep running after the last client is closed"), NULL },
        { "wait-for-client", 'w', 0, G_OPTION_ARG_NONE, &opt_wait_for_client,
          N_("Wait running until at least one client is connected"), NULL },
+       { "backend-per-process", 'b', 0, G_OPTION_ARG_INT, &opt_backend_per_process,
+         N_("Overrides compile-time backend per process option; use 1 to enable, 0 to disable, any other 
value is to use compile-time option"), NULL },
        { NULL }
 };
 
@@ -83,7 +86,7 @@ main (gint argc,
        e_xml_initialize_in_main ();
 
  reload:
-       server = e_data_book_factory_new (NULL, &error);
+       server = e_data_book_factory_new (opt_backend_per_process, NULL, &error);
 
        if (error != NULL) {
                g_printerr ("%s\n", error->message);
diff --git a/src/services/evolution-calendar-factory/evolution-calendar-factory.c 
b/src/services/evolution-calendar-factory/evolution-calendar-factory.c
index 55d093a..1c7a5bd 100644
--- a/src/services/evolution-calendar-factory/evolution-calendar-factory.c
+++ b/src/services/evolution-calendar-factory/evolution-calendar-factory.c
@@ -32,6 +32,7 @@
 
 static gboolean opt_keep_running = FALSE;
 static gboolean opt_wait_for_client = FALSE;
+static gint opt_backend_per_process = -1;
 
 static GOptionEntry entries[] = {
 
@@ -39,6 +40,8 @@ static GOptionEntry entries[] = {
          N_("Keep running after the last client is closed"), NULL },
        { "wait-for-client", 'w', 0, G_OPTION_ARG_NONE, &opt_wait_for_client,
          N_("Wait running until at least one client is connected"), NULL },
+       { "backend-per-process", 'b', 0, G_OPTION_ARG_INT, &opt_backend_per_process,
+         N_("Overrides compile-time backend per process option; use 1 to enable, 0 to disable, any other 
value is to use compile-time option"), NULL },
        { NULL }
 };
 
@@ -93,7 +96,7 @@ main (gint argc,
        e_xml_initialize_in_main ();
 
  reload:
-       server = e_data_cal_factory_new (NULL, &error);
+       server = e_data_cal_factory_new (opt_backend_per_process, NULL, &error);
 
        if (error != NULL) {
                g_printerr ("%s\n", error->message);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]