aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Williams <dcbw@redhat.com>2010-03-19 10:54:10 -0700
committerDan Williams <dcbw@redhat.com>2010-03-19 10:54:10 -0700
commit6ca5765eb63e1cb0374489607b255feeca8e2ba7 (patch)
tree54d641be5f28cd501b1bcfa9e4ecf8b9a480096e
parentbb62cfe07a47189645da985cc02b47549611aa01 (diff)
core: add chaining helper functions to callback info
Helpful when chaining a number of commands together when you want to schedule the callback info only after all of them complete.
-rw-r--r--src/mm-callback-info.c23
-rw-r--r--src/mm-callback-info.h6
2 files changed, 29 insertions, 0 deletions
diff --git a/src/mm-callback-info.c b/src/mm-callback-info.c
index 1882898a..1986bb55 100644
--- a/src/mm-callback-info.c
+++ b/src/mm-callback-info.c
@@ -91,6 +91,8 @@ mm_callback_info_schedule (MMCallbackInfo *info)
g_return_if_fail (info->pending_id == 0);
g_return_if_fail (info->called == FALSE);
+ g_warn_if_fail (info->chain_left == 0);
+
info->pending_id = g_idle_add_full (G_PRIORITY_DEFAULT_IDLE, callback_info_do, info, callback_info_done);
}
@@ -208,3 +210,24 @@ mm_callback_info_unref (MMCallbackInfo *info)
}
}
+void
+mm_callback_info_chain_start (MMCallbackInfo *info, guint num)
+{
+ g_return_if_fail (info != NULL);
+ g_return_if_fail (num > 0);
+ g_return_if_fail (info->chain_left == 0);
+
+ info->chain_left = num;
+}
+
+void
+mm_callback_info_chain_complete_one (MMCallbackInfo *info)
+{
+ g_return_if_fail (info != NULL);
+ g_return_if_fail (info->chain_left > 0);
+
+ info->chain_left--;
+ if (info->chain_left == 0)
+ mm_callback_info_schedule (info);
+}
+
diff --git a/src/mm-callback-info.h b/src/mm-callback-info.h
index 66c20487..ef4d65fc 100644
--- a/src/mm-callback-info.h
+++ b/src/mm-callback-info.h
@@ -25,6 +25,9 @@ typedef void (*MMCallbackInfoInvokeFn) (MMCallbackInfo *info);
struct _MMCallbackInfo {
guint32 refcount;
+ /* # of ops left in this callback chain */
+ guint32 chain_left;
+
GData *qdata;
MMModem *modem;
@@ -70,5 +73,8 @@ gpointer mm_callback_info_get_data (MMCallbackInfo *info,
MMCallbackInfo *mm_callback_info_ref (MMCallbackInfo *info);
void mm_callback_info_unref (MMCallbackInfo *info);
+void mm_callback_info_chain_start (MMCallbackInfo *info, guint num);
+void mm_callback_info_chain_complete_one (MMCallbackInfo *info);
+
#endif /* MM_CALLBACK_INFO_H */