core: add refcounts to MMCallbackInfo

This commit is contained in:
Dan Williams
2009-12-07 18:39:18 -08:00
parent 1157b59a18
commit 5a4a9a6239
2 changed files with 37 additions and 8 deletions

View File

@@ -72,14 +72,7 @@ callback_info_done (gpointer user_data)
if (info->invoke_fn && info->callback) if (info->invoke_fn && info->callback)
info->invoke_fn (info); info->invoke_fn (info);
if (info->error) mm_callback_info_unref (info);
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);
} }
static gboolean static gboolean
@@ -117,6 +110,7 @@ mm_callback_info_new_full (MMModem *modem,
info->invoke_fn = invoke_fn; info->invoke_fn = invoke_fn;
info->callback = callback; info->callback = callback;
info->user_data = user_data; info->user_data = user_data;
info->refcount = 1;
return info; 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; 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);
}
}

View File

@@ -23,6 +23,8 @@ typedef struct _MMCallbackInfo MMCallbackInfo;
typedef void (*MMCallbackInfoInvokeFn) (MMCallbackInfo *info); typedef void (*MMCallbackInfoInvokeFn) (MMCallbackInfo *info);
struct _MMCallbackInfo { struct _MMCallbackInfo {
guint32 refcount;
GData *qdata; GData *qdata;
MMModem *modem; MMModem *modem;
@@ -65,4 +67,8 @@ void mm_callback_info_set_data (MMCallbackInfo *info,
gpointer mm_callback_info_get_data (MMCallbackInfo *info, gpointer mm_callback_info_get_data (MMCallbackInfo *info,
const char *key); const char *key);
MMCallbackInfo *mm_callback_info_ref (MMCallbackInfo *info);
void mm_callback_info_unref (MMCallbackInfo *info);
#endif /* MM_CALLBACK_INFO_H */ #endif /* MM_CALLBACK_INFO_H */