[evolution-data-server] CamelService: Make "password" property thread-safe.



commit 021031fffd40ea14d56d22eccc42a82b975c80dc
Author: Matthew Barnes <mbarnes redhat com>
Date:   Tue Nov 5 11:26:02 2013 -0500

    CamelService: Make "password" property thread-safe.
    
    New functions:
    
      camel_service_dup_password()

 camel/camel-service.c                   |   43 ++++++++++++++++++++++++++++--
 camel/camel-service.h                   |    1 +
 docs/reference/camel/camel-sections.txt |    1 +
 3 files changed, 42 insertions(+), 3 deletions(-)
---
diff --git a/camel/camel-service.c b/camel/camel-service.c
index cc2e92d..0fd6c78 100644
--- a/camel/camel-service.c
+++ b/camel/camel-service.c
@@ -617,9 +617,9 @@ service_get_property (GObject *object,
                        return;
 
                case PROP_PASSWORD:
-                       g_value_set_string (
+                       g_value_take_string (
                                value,
-                               camel_service_get_password (
+                               camel_service_dup_password (
                                CAMEL_SERVICE (object)));
                        return;
 
@@ -1413,6 +1413,37 @@ camel_service_get_password (CamelService *service)
 }
 
 /**
+ * camel_service_dup_password:
+ * @service: a #CamelService
+ *
+ * Thread-safe variation of camel_service_get_password().
+ * Use this function when accessing @service from multiple threads.
+ *
+ * The returned string should be freed with g_free() when no longer needed.
+ *
+ * Returns: a newly-allocated copy of #CamelService:password
+ *
+ * Since: 3.12
+ **/
+gchar *
+camel_service_dup_password (CamelService *service)
+{
+       const gchar *protected;
+       gchar *duplicate;
+
+       g_return_val_if_fail (CAMEL_IS_SERVICE (service), NULL);
+
+       g_mutex_lock (&service->priv->property_lock);
+
+       protected = camel_service_get_password (service);
+       duplicate = g_strdup (protected);
+
+       g_mutex_unlock (&service->priv->property_lock);
+
+       return duplicate;
+}
+
+/**
  * camel_service_set_password:
  * @service: a #CamelService
  * @password: the password for @service
@@ -1429,12 +1460,18 @@ camel_service_set_password (CamelService *service,
 {
        g_return_if_fail (CAMEL_IS_SERVICE (service));
 
-       if (g_strcmp0 (service->priv->password, password) == 0)
+       g_mutex_lock (&service->priv->property_lock);
+
+       if (g_strcmp0 (service->priv->password, password) == 0) {
+               g_mutex_unlock (&service->priv->property_lock);
                return;
+       }
 
        g_free (service->priv->password);
        service->priv->password = g_strdup (password);
 
+       g_mutex_unlock (&service->priv->property_lock);
+
        g_object_notify (G_OBJECT (service), "password");
 }
 
diff --git a/camel/camel-service.h b/camel/camel-service.h
index b0c5655..2c92e89 100644
--- a/camel/camel-service.h
+++ b/camel/camel-service.h
@@ -176,6 +176,7 @@ gchar *             camel_service_dup_display_name  (CamelService *service);
 void           camel_service_set_display_name  (CamelService *service,
                                                 const gchar *display_name);
 const gchar *  camel_service_get_password      (CamelService *service);
+gchar *                camel_service_dup_password      (CamelService *service);
 void           camel_service_set_password      (CamelService *service,
                                                 const gchar *password);
 const gchar *  camel_service_get_user_data_dir (CamelService *service);
diff --git a/docs/reference/camel/camel-sections.txt b/docs/reference/camel/camel-sections.txt
index f3cbe0c..805dee6 100644
--- a/docs/reference/camel/camel-sections.txt
+++ b/docs/reference/camel/camel-sections.txt
@@ -1917,6 +1917,7 @@ camel_service_get_display_name
 camel_service_dup_display_name
 camel_service_set_display_name
 camel_service_get_password
+camel_service_dup_password
 camel_service_set_password
 camel_service_get_user_data_dir
 camel_service_get_user_cache_dir


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