[evolution-data-server] Add camel_stream_ref_base_stream().



commit ebbe711de6d1a2145112742321ce8ed7dfdaae8a
Author: Matthew Barnes <mbarnes redhat com>
Date:   Thu Sep 26 16:30:34 2013 -0400

    Add camel_stream_ref_base_stream().
    
    Replaces camel_stream_get_base_stream().
    
    Now that the base stream is replacable, this needs to be thread-safe.

 camel/camel-stream.c                    |   90 ++++++++++++++++++++-----------
 camel/camel-stream.h                    |    2 +-
 docs/reference/camel/camel-sections.txt |    2 +-
 3 files changed, 60 insertions(+), 34 deletions(-)
---
diff --git a/camel/camel-stream.c b/camel/camel-stream.c
index 738deb5..f2270f4 100644
--- a/camel/camel-stream.c
+++ b/camel/camel-stream.c
@@ -73,9 +73,9 @@ stream_get_property (GObject *object,
 {
        switch (property_id) {
                case PROP_BASE_STREAM:
-                       g_value_set_object (
+                       g_value_take_object (
                                value,
-                               camel_stream_get_base_stream (
+                               camel_stream_ref_base_stream (
                                CAMEL_STREAM (object)));
                        return;
        }
@@ -117,17 +117,22 @@ stream_read (CamelStream *stream,
              GError **error)
 {
        GIOStream *base_stream;
-       GInputStream *input_stream;
+       gssize n_bytes_read = 0;
 
-       base_stream = camel_stream_get_base_stream (stream);
+       base_stream = camel_stream_ref_base_stream (stream);
 
-       if (base_stream == NULL)
-               return 0;
+       if (base_stream != NULL) {
+               GInputStream *input_stream;
 
-       input_stream = g_io_stream_get_input_stream (base_stream);
+               input_stream = g_io_stream_get_input_stream (base_stream);
 
-       return g_input_stream_read (
-               input_stream, buffer, n, cancellable, error);
+               n_bytes_read = g_input_stream_read (
+                       input_stream, buffer, n, cancellable, error);
+
+               g_object_unref (base_stream);
+       }
+
+       return n_bytes_read;
 }
 
 static gssize
@@ -138,17 +143,22 @@ stream_write (CamelStream *stream,
               GError **error)
 {
        GIOStream *base_stream;
-       GOutputStream *output_stream;
+       gssize n_bytes_written = (gssize) n;
+
+       base_stream = camel_stream_ref_base_stream (stream);
 
-       base_stream = camel_stream_get_base_stream (stream);
+       if (base_stream != NULL) {
+               GOutputStream *output_stream;
 
-       if (base_stream == NULL)
-               return n;
+               output_stream = g_io_stream_get_output_stream (base_stream);
 
-       output_stream = g_io_stream_get_output_stream (base_stream);
+               n_bytes_written = g_output_stream_write (
+                       output_stream, buffer, n, cancellable, error);
 
-       return g_output_stream_write (
-               output_stream, buffer, n, cancellable, error);
+               g_object_unref (base_stream);
+       }
+
+       return n_bytes_written;
 }
 
 static gint
@@ -157,15 +167,16 @@ stream_close (CamelStream *stream,
               GError **error)
 {
        GIOStream *base_stream;
-       gboolean success;
+       gboolean success = TRUE;
 
-       base_stream = camel_stream_get_base_stream (stream);
+       base_stream = camel_stream_ref_base_stream (stream);
 
-       if (base_stream == NULL)
-               return 0;
+       if (base_stream != NULL) {
+               success = g_io_stream_close (
+                       base_stream, cancellable, error);
 
-       success = g_io_stream_close (
-               stream->priv->base_stream, cancellable, error);
+               g_object_unref (base_stream);
+       }
 
        return success ? 0 : -1;
 }
@@ -176,17 +187,20 @@ stream_flush (CamelStream *stream,
               GError **error)
 {
        GIOStream *base_stream;
-       GOutputStream *output_stream;
-       gboolean success;
+       gboolean success = TRUE;
+
+       base_stream = camel_stream_ref_base_stream (stream);
 
-       base_stream = camel_stream_get_base_stream (stream);
+       if (base_stream != NULL) {
+               GOutputStream *output_stream;
 
-       if (base_stream == NULL)
-               return 0;
+               output_stream = g_io_stream_get_output_stream (base_stream);
 
-       output_stream = g_io_stream_get_output_stream (base_stream);
+               success = g_output_stream_flush (
+                       output_stream, cancellable, error);
 
-       success = g_output_stream_flush (output_stream, cancellable, error);
+               g_object_unref (base_stream);
+       }
 
        return success ? 0 : -1;
 }
@@ -256,23 +270,35 @@ camel_stream_new (GIOStream *base_stream)
 }
 
 /**
- * camel_stream_get_base_stream:
+ * camel_stream_ref_base_stream:
  * @stream: a #CamelStream
  *
  * Returns the #GIOStream for @stream.  This is only valid if @stream was
  * created with camel_stream_new().  For all other #CamelStream subclasses
  * this function returns %NULL.
  *
+ * The returned #GIOStream is referenced for thread-safety and should be
+ * unreferenced with g_object_unref() when finished with it.
+ *
  * Returns: a #GIOStream, or %NULL
  *
  * Since: 3.12
  **/
 GIOStream *
-camel_stream_get_base_stream (CamelStream *stream)
+camel_stream_ref_base_stream (CamelStream *stream)
 {
+       GIOStream *base_stream = NULL;
+
        g_return_val_if_fail (CAMEL_IS_STREAM (stream), NULL);
 
-       return stream->priv->base_stream;
+       g_mutex_lock (&stream->priv->base_stream_lock);
+
+       if (stream->priv->base_stream != NULL)
+               base_stream = g_object_ref (stream->priv->base_stream);
+
+       g_mutex_unlock (&stream->priv->base_stream_lock);
+
+       return base_stream;
 }
 
 /**
diff --git a/camel/camel-stream.h b/camel/camel-stream.h
index 72de006..dc6f8f3 100644
--- a/camel/camel-stream.h
+++ b/camel/camel-stream.h
@@ -89,7 +89,7 @@ struct _CamelStreamClass {
 
 GType          camel_stream_get_type           (void);
 CamelStream *  camel_stream_new                (GIOStream *base_stream);
-GIOStream *    camel_stream_get_base_stream    (CamelStream *stream);
+GIOStream *    camel_stream_ref_base_stream    (CamelStream *stream);
 void           camel_stream_set_base_stream    (CamelStream *stream,
                                                 GIOStream *base_stream);
 gssize         camel_stream_read               (CamelStream *stream,
diff --git a/docs/reference/camel/camel-sections.txt b/docs/reference/camel/camel-sections.txt
index be840de..d3f21d1 100644
--- a/docs/reference/camel/camel-sections.txt
+++ b/docs/reference/camel/camel-sections.txt
@@ -2584,7 +2584,7 @@ CamelStoreSummaryPrivate
 <TITLE>CamelStream</TITLE>
 CamelStream
 camel_stream_new
-camel_stream_get_base_stream
+camel_stream_ref_base_stream
 camel_stream_set_base_stream
 camel_stream_read
 camel_stream_write


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