[evolution-data-server] Add camel_stream_ref_base_stream().
- From: Matthew Barnes <mbarnes src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution-data-server] Add camel_stream_ref_base_stream().
- Date: Fri, 27 Sep 2013 01:14:16 +0000 (UTC)
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]