core: add refcounts to MMCallbackInfo
This commit is contained in:
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -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 */
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user