aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/mm-callback-info.c39
-rw-r--r--src/mm-callback-info.h6
2 files changed, 37 insertions, 8 deletions
diff --git a/src/mm-callback-info.c b/src/mm-callback-info.c
index 089f0b73..b554f79b 100644
--- a/src/mm-callback-info.c
+++ b/src/mm-callback-info.c
@@ -72,14 +72,7 @@ callback_info_done (gpointer user_data)
if (info->invoke_fn && info->callback)
info->invoke_fn (info);
- if (info->error)
- g_error_free (info->error);
-
- if (info->modem)
- g_object_weak_unref (G_OBJECT (info->modem), modem_destroyed_cb, info);
-
- g_datalist_clear (&info->qdata);
- g_slice_free (MMCallbackInfo, info);
+ mm_callback_info_unref (info);
}
static gboolean
@@ -117,6 +110,7 @@ mm_callback_info_new_full (MMModem *modem,
info->invoke_fn = invoke_fn;
info->callback = callback;
info->user_data = user_data;
+ info->refcount = 1;
return info;
}
@@ -184,3 +178,32 @@ mm_callback_info_get_data (MMCallbackInfo *info, const char *key)
return quark ? g_datalist_id_get_data (&info->qdata, quark) : NULL;
}
+
+MMCallbackInfo *
+mm_callback_info_ref (MMCallbackInfo *info)
+{
+ g_return_val_if_fail (info != NULL, NULL);
+ g_return_val_if_fail (info->refcount > 0, NULL);
+
+ info->refcount++;
+ return info;
+}
+
+void
+mm_callback_info_unref (MMCallbackInfo *info)
+{
+ g_return_if_fail (info != NULL);
+
+ info->refcount--;
+ if (info->refcount == 0) {
+ if (info->error)
+ g_error_free (info->error);
+
+ if (info->modem)
+ g_object_weak_unref (G_OBJECT (info->modem), modem_destroyed_cb, info);
+
+ g_datalist_clear (&info->qdata);
+ g_slice_free (MMCallbackInfo, info);
+ }
+}
+
diff --git a/src/mm-callback-info.h b/src/mm-callback-info.h
index 783e1282..66c20487 100644
--- a/src/mm-callback-info.h
+++ b/src/mm-callback-info.h
@@ -23,6 +23,8 @@ typedef struct _MMCallbackInfo MMCallbackInfo;
typedef void (*MMCallbackInfoInvokeFn) (MMCallbackInfo *info);
struct _MMCallbackInfo {
+ guint32 refcount;
+
GData *qdata;
MMModem *modem;
@@ -65,4 +67,8 @@ void mm_callback_info_set_data (MMCallbackInfo *info,
gpointer mm_callback_info_get_data (MMCallbackInfo *info,
const char *key);
+MMCallbackInfo *mm_callback_info_ref (MMCallbackInfo *info);
+void mm_callback_info_unref (MMCallbackInfo *info);
+
#endif /* MM_CALLBACK_INFO_H */
+