[glib] GThreadedResolver: port to embedded GMutex/GCond
- From: Ryan Lortie <ryanl src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [glib] GThreadedResolver: port to embedded GMutex/GCond
- Date: Tue, 4 Oct 2011 15:14:26 +0000 (UTC)
commit 8bcdabf25a16bfcbc14696849ecf34689022469b
Author: Ryan Lortie <desrt desrt ca>
Date: Tue Oct 4 00:02:36 2011 -0400
GThreadedResolver: port to embedded GMutex/GCond
This is the only case that was non trivial to port, due to some of the
logic being based on checking the GCond* for being non-%NULL.
https://bugzilla.gnome.org/show_bug.cgi?id=660739
gio/gthreadedresolver.c | 41 ++++++++++++++++++++---------------------
1 files changed, 20 insertions(+), 21 deletions(-)
---
diff --git a/gio/gthreadedresolver.c b/gio/gthreadedresolver.c
index 2e6f18d..c1ddd02 100644
--- a/gio/gthreadedresolver.c
+++ b/gio/gthreadedresolver.c
@@ -158,10 +158,10 @@ struct _GThreadedResolverRequest {
GCancellable *cancellable;
GError *error;
- GMutex *mutex;
+ GMutex mutex;
guint ref_count;
- GCond *cond;
+ GCond cond;
GSimpleAsyncResult *async_result;
gboolean complete;
@@ -185,9 +185,10 @@ g_threaded_resolver_request_new (GThreadedResolverResolveFunc resolve_func,
/* Initial refcount is 2; one for the caller and one for resolve_func */
req->ref_count = 2;
- req->mutex = g_mutex_new ();
+ g_mutex_init (&req->mutex);
+ g_cond_init (&req->cond);
/* Initially locked; caller must unlock */
- g_mutex_lock (req->mutex);
+ g_mutex_lock (&req->mutex);
if (cancellable)
{
@@ -206,16 +207,14 @@ g_threaded_resolver_request_unref (GThreadedResolverRequest *req)
{
guint ref_count;
- g_mutex_lock (req->mutex);
+ g_mutex_lock (&req->mutex);
ref_count = --req->ref_count;
- g_mutex_unlock (req->mutex);
+ g_mutex_unlock (&req->mutex);
if (ref_count > 0)
return;
- g_mutex_free (req->mutex);
-
- if (req->cond)
- g_cond_free (req->cond);
+ g_mutex_clear (&req->mutex);
+ g_cond_clear (&req->cond);
if (req->error)
g_error_free (req->error);
@@ -235,19 +234,19 @@ static void
g_threaded_resolver_request_complete (GThreadedResolverRequest *req,
GError *error)
{
- g_mutex_lock (req->mutex);
+ g_mutex_lock (&req->mutex);
if (req->complete)
{
/* The req was cancelled, and now it has finished resolving as
* well. But we have nowhere to send the result, so just return.
*/
- g_mutex_unlock (req->mutex);
+ g_mutex_unlock (&req->mutex);
g_clear_error (&error);
return;
}
req->complete = TRUE;
- g_mutex_unlock (req->mutex);
+ g_mutex_unlock (&req->mutex);
if (error)
g_propagate_error (&req->error, error);
@@ -260,9 +259,7 @@ g_threaded_resolver_request_complete (GThreadedResolverRequest *req,
req->cancellable = NULL;
}
- if (req->cond)
- g_cond_signal (req->cond);
- else if (req->async_result)
+ if (req->async_result)
{
if (req->error)
g_simple_async_result_set_from_error (req->async_result, req->error);
@@ -274,6 +271,9 @@ g_threaded_resolver_request_complete (GThreadedResolverRequest *req,
g_object_unref (req->async_result);
req->async_result = NULL;
}
+
+ else
+ g_cond_signal (&req->cond);
}
static void
@@ -319,18 +319,17 @@ resolve_sync (GThreadedResolver *gtr,
if (!req->cancellable || !gtr->thread_pool)
{
req->resolve_func (req, error);
- g_mutex_unlock (req->mutex);
+ g_mutex_unlock (&req->mutex);
g_threaded_resolver_request_complete (req, FALSE);
g_threaded_resolver_request_unref (req);
return;
}
- req->cond = g_cond_new ();
g_thread_pool_push (gtr->thread_pool, req, &req->error);
if (!req->error)
- g_cond_wait (req->cond, req->mutex);
- g_mutex_unlock (req->mutex);
+ g_cond_wait (&req->cond, &req->mutex);
+ g_mutex_unlock (&req->mutex);
if (req->error)
{
@@ -351,7 +350,7 @@ resolve_async (GThreadedResolver *gtr,
g_simple_async_result_set_op_res_gpointer (req->async_result, req,
(GDestroyNotify)g_threaded_resolver_request_unref);
g_thread_pool_push (gtr->thread_pool, req, NULL);
- g_mutex_unlock (req->mutex);
+ g_mutex_unlock (&req->mutex);
}
static GThreadedResolverRequest *
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]