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



commit 77ef6fca1831bd1774f0b68ae9f8baace059bd69
Author: Matthew Barnes <mbarnes redhat com>
Date:   Tue Nov 5 11:11:35 2013 -0500

    CamelService: Make "display-name" property thread-safe.
    
    New functions:
    
      camel_service_dup_display_name()

 camel/camel-service.c                   |   47 +++++++++++++++++++++++++++---
 camel/camel-service.h                   |    1 +
 docs/reference/camel/camel-sections.txt |    1 +
 3 files changed, 44 insertions(+), 5 deletions(-)
---
diff --git a/camel/camel-service.c b/camel/camel-service.c
index 6a45a36..cc2e92d 100644
--- a/camel/camel-service.c
+++ b/camel/camel-service.c
@@ -610,9 +610,9 @@ service_get_property (GObject *object,
                        return;
 
                case PROP_DISPLAY_NAME:
-                       g_value_set_string (
+                       g_value_take_string (
                                value,
-                               camel_service_get_display_name (
+                               camel_service_dup_display_name (
                                CAMEL_SERVICE (object)));
                        return;
 
@@ -1325,6 +1325,37 @@ camel_service_get_display_name (CamelService *service)
 }
 
 /**
+ * camel_service_dup_display_name:
+ * @service: a #CamelService
+ *
+ * Thread-safe variation of camel_service_get_display_name().
+ * 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:display-name
+ *
+ * Since: 3.12
+ **/
+gchar *
+camel_service_dup_display_name (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_display_name (service);
+       duplicate = g_strdup (protected);
+
+       g_mutex_unlock (&service->priv->property_lock);
+
+       return duplicate;
+}
+
+/**
  * camel_service_set_display_name:
  * @service: a #CamelService
  * @display_name: a valid UTF-8 string, or %NULL
@@ -1344,15 +1375,21 @@ camel_service_set_display_name (CamelService *service,
 {
        g_return_if_fail (CAMEL_IS_SERVICE (service));
 
-       if (g_strcmp0 (service->priv->display_name, display_name) == 0)
-               return;
-
        if (display_name != NULL)
                g_return_if_fail (g_utf8_validate (display_name, -1, NULL));
 
+       g_mutex_lock (&service->priv->property_lock);
+
+       if (g_strcmp0 (service->priv->display_name, display_name) == 0) {
+               g_mutex_unlock (&service->priv->property_lock);
+               return;
+       }
+
        g_free (service->priv->display_name);
        service->priv->display_name = g_strdup (display_name);
 
+       g_mutex_unlock (&service->priv->property_lock);
+
        g_object_notify (G_OBJECT (service), "display-name");
 }
 
diff --git a/camel/camel-service.h b/camel/camel-service.h
index b17c0ba..b0c5655 100644
--- a/camel/camel-service.h
+++ b/camel/camel-service.h
@@ -172,6 +172,7 @@ CamelServiceConnectionStatus
                camel_service_get_connection_status
                                                (CamelService *service);
 const gchar *  camel_service_get_display_name  (CamelService *service);
+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);
diff --git a/docs/reference/camel/camel-sections.txt b/docs/reference/camel/camel-sections.txt
index 383373c..f3cbe0c 100644
--- a/docs/reference/camel/camel-sections.txt
+++ b/docs/reference/camel/camel-sections.txt
@@ -1914,6 +1914,7 @@ camel_service_new_camel_url
 CamelServiceConnectionStatus
 camel_service_get_connection_status
 camel_service_get_display_name
+camel_service_dup_display_name
 camel_service_set_display_name
 camel_service_get_password
 camel_service_set_password


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