summaryrefslogtreecommitdiff
path: root/content/content.c
diff options
context:
space:
mode:
Diffstat (limited to 'content/content.c')
-rw-r--r--content/content.c33
1 files changed, 25 insertions, 8 deletions
diff --git a/content/content.c b/content/content.c
index 39b1c7389..dacb46df8 100644
--- a/content/content.c
+++ b/content/content.c
@@ -627,6 +627,29 @@ void content_add_user(struct content *c,
/**
+ * Search the users of a content for the specified user.
+ *
+ * \return a content_user struct for the user, or 0 if not found
+ */
+
+struct content_user * content_find_user(struct content *c,
+ void (*callback)(content_msg msg, struct content *c, void *p1,
+ void *p2, union content_msg_data data),
+ void *p1, void *p2)
+{
+ struct content_user *user;
+
+ /* user_list starts with a sentinel */
+ for (user = c->user_list; user->next &&
+ !(user->next->callback == callback &&
+ user->next->p1 == p1 &&
+ user->next->p2 == p2); user = user->next)
+ ;
+ return user->next;
+}
+
+
+/**
* Remove a callback user.
*
* The callback function, p1, and p2 must be identical to those passed to
@@ -690,18 +713,12 @@ void content_stop(struct content *c,
assert(c->status == CONTENT_STATUS_READY);
- /* user_list starts with a sentinel */
- for (user = c->user_list; user->next != 0 &&
- !(user->next->callback == callback &&
- user->next->p1 == p1 &&
- user->next->p2 == p2); user = user->next)
- ;
- if (user->next == 0) {
+ user = content_find_user(c, callback, p1, p2);
+ if (!user) {
LOG(("user not found in list"));
assert(0);
return;
}
- user = user->next;
LOG(("%p %s: stop user %p %p %p", c, c->url, callback, p1, p2));
user->stop = true;