All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH BlueZ v2 1/5] unit/test-queue: Add /queue/foreach_destroy test
@ 2014-05-22 12:02 Luiz Augusto von Dentz
  2014-05-22 12:02 ` [PATCH BlueZ v2 2/5] shared/queue: Fix queue_foreach not detecting queue has been destroyed Luiz Augusto von Dentz
                   ` (4 more replies)
  0 siblings, 5 replies; 6+ messages in thread
From: Luiz Augusto von Dentz @ 2014-05-22 12:02 UTC (permalink / raw)
  To: linux-bluetooth

From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>

This tests queue_destroy from queue_foreach callback.
---
v2: Fix patch 4/5: queue_find cannot be used for entries nodes.

 unit/test-queue.c | 21 +++++++++++++++++++++
 1 file changed, 21 insertions(+)

diff --git a/unit/test-queue.c b/unit/test-queue.c
index 7c6d2ad..55273e3 100644
--- a/unit/test-queue.c
+++ b/unit/test-queue.c
@@ -58,11 +58,32 @@ static void test_basic(void)
 	queue_destroy(queue, NULL);
 }
 
+static void foreach_destroy(void *data, void *user_data)
+{
+	struct queue *queue = user_data;
+
+	queue_destroy(queue, NULL);
+}
+
+static void test_foreach_destroy(void)
+{
+	struct queue *queue;
+
+	queue = queue_new();
+	g_assert(queue != NULL);
+
+	queue_push_tail(queue, UINT_TO_PTR(1));
+	queue_push_tail(queue, UINT_TO_PTR(2));
+
+	queue_foreach(queue, foreach_destroy, queue);
+}
+
 int main(int argc, char *argv[])
 {
 	g_test_init(&argc, &argv, NULL);
 
 	g_test_add_func("/queue/basic", test_basic);
+	g_test_add_func("/queue/foreach_destroy", test_foreach_destroy);
 
 	return g_test_run();
 }
-- 
1.9.0


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH BlueZ v2 2/5] shared/queue: Fix queue_foreach not detecting queue has been destroyed
  2014-05-22 12:02 [PATCH BlueZ v2 1/5] unit/test-queue: Add /queue/foreach_destroy test Luiz Augusto von Dentz
@ 2014-05-22 12:02 ` Luiz Augusto von Dentz
  2014-05-22 12:03 ` [PATCH BlueZ v2 3/5] unit/test-queue: Add /queue/foreach_remove_all test Luiz Augusto von Dentz
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 6+ messages in thread
From: Luiz Augusto von Dentz @ 2014-05-22 12:02 UTC (permalink / raw)
  To: linux-bluetooth

From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>

This fixes queue_foreach crashing if it callback call queue_destroy.
---
 src/shared/queue.c | 29 ++++++++++++++++++++++++++---
 1 file changed, 26 insertions(+), 3 deletions(-)

diff --git a/src/shared/queue.c b/src/shared/queue.c
index ea4ff96..c9c0812 100644
--- a/src/shared/queue.c
+++ b/src/shared/queue.c
@@ -34,11 +34,30 @@ struct queue_entry {
 };
 
 struct queue {
+	int ref_count;
 	struct queue_entry *head;
 	struct queue_entry *tail;
 	unsigned int entries;
 };
 
+static struct queue *queue_ref(struct queue *queue)
+{
+	if (!queue)
+		return NULL;
+
+	__sync_fetch_and_add(&queue->ref_count, 1);
+
+	return queue;
+}
+
+static void queue_unref(struct queue *queue)
+{
+	if (__sync_sub_and_fetch(&queue->ref_count, 1))
+		return;
+
+	free(queue);
+}
+
 struct queue *queue_new(void)
 {
 	struct queue *queue;
@@ -51,7 +70,7 @@ struct queue *queue_new(void)
 	queue->tail = NULL;
 	queue->entries = 0;
 
-	return queue;
+	return queue_ref(queue);
 }
 
 void queue_destroy(struct queue *queue, queue_destroy_func_t destroy)
@@ -74,7 +93,7 @@ void queue_destroy(struct queue *queue, queue_destroy_func_t destroy)
 		free(tmp);
 	}
 
-	free(queue);
+	queue_unref(queue);
 }
 
 bool queue_push_tail(struct queue *queue, void *data)
@@ -177,14 +196,18 @@ void queue_foreach(struct queue *queue, queue_foreach_func_t function,
 		return;
 
 	entry = queue->head;
+	if (!entry)
+		return;
 
-	while (entry) {
+	queue_ref(queue);
+	while (entry && queue->ref_count > 1) {
 		struct queue_entry *tmp = entry;
 
 		entry = tmp->next;
 
 		function(tmp->data, user_data);
 	}
+	queue_unref(queue);
 }
 
 void *queue_find(struct queue *queue, queue_match_func_t function,
-- 
1.9.0


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH BlueZ v2 3/5] unit/test-queue: Add /queue/foreach_remove_all test
  2014-05-22 12:02 [PATCH BlueZ v2 1/5] unit/test-queue: Add /queue/foreach_destroy test Luiz Augusto von Dentz
  2014-05-22 12:02 ` [PATCH BlueZ v2 2/5] shared/queue: Fix queue_foreach not detecting queue has been destroyed Luiz Augusto von Dentz
@ 2014-05-22 12:03 ` Luiz Augusto von Dentz
  2014-05-22 12:03 ` [PATCH BlueZ v2 4/5] shared/queue: Fix queue_foreach not detecting queue has changed Luiz Augusto von Dentz
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 6+ messages in thread
From: Luiz Augusto von Dentz @ 2014-05-22 12:03 UTC (permalink / raw)
  To: linux-bluetooth

From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>

This tests queue_remove_all from queue_foreach callback.
---
 unit/test-queue.c | 21 +++++++++++++++++++++
 1 file changed, 21 insertions(+)

diff --git a/unit/test-queue.c b/unit/test-queue.c
index 55273e3..af7dfd3 100644
--- a/unit/test-queue.c
+++ b/unit/test-queue.c
@@ -78,12 +78,33 @@ static void test_foreach_destroy(void)
 	queue_foreach(queue, foreach_destroy, queue);
 }
 
+static void foreach_remove_all(void *data, void *user_data)
+{
+	struct queue *queue = user_data;
+
+	queue_remove_all(queue, NULL, NULL, NULL);
+}
+
+static void test_foreach_remove_all(void)
+{
+	struct queue *queue;
+
+	queue = queue_new();
+	g_assert(queue != NULL);
+
+	queue_push_tail(queue, UINT_TO_PTR(1));
+	queue_push_tail(queue, UINT_TO_PTR(2));
+
+	queue_foreach(queue, foreach_remove_all, queue);
+}
+
 int main(int argc, char *argv[])
 {
 	g_test_init(&argc, &argv, NULL);
 
 	g_test_add_func("/queue/basic", test_basic);
 	g_test_add_func("/queue/foreach_destroy", test_foreach_destroy);
+	g_test_add_func("/queue/foreach_remove_all", test_foreach_remove_all);
 
 	return g_test_run();
 }
-- 
1.9.0


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH BlueZ v2 4/5] shared/queue: Fix queue_foreach not detecting queue has changed
  2014-05-22 12:02 [PATCH BlueZ v2 1/5] unit/test-queue: Add /queue/foreach_destroy test Luiz Augusto von Dentz
  2014-05-22 12:02 ` [PATCH BlueZ v2 2/5] shared/queue: Fix queue_foreach not detecting queue has been destroyed Luiz Augusto von Dentz
  2014-05-22 12:03 ` [PATCH BlueZ v2 3/5] unit/test-queue: Add /queue/foreach_remove_all test Luiz Augusto von Dentz
@ 2014-05-22 12:03 ` Luiz Augusto von Dentz
  2014-05-22 12:03 ` [PATCH BlueZ v2 5/5] shared/queue: Make queue_find default do direct match for NULL callback Luiz Augusto von Dentz
  2014-05-23 13:51 ` [PATCH BlueZ v2 1/5] unit/test-queue: Add /queue/foreach_destroy test Luiz Augusto von Dentz
  4 siblings, 0 replies; 6+ messages in thread
From: Luiz Augusto von Dentz @ 2014-05-22 12:03 UTC (permalink / raw)
  To: linux-bluetooth

From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>

This fixes queue_foreach crashing if callback calls queue_remove_all.
---
 src/shared/queue.c | 14 ++++++++++++++
 1 file changed, 14 insertions(+)

diff --git a/src/shared/queue.c b/src/shared/queue.c
index c9c0812..20f51b8 100644
--- a/src/shared/queue.c
+++ b/src/shared/queue.c
@@ -187,6 +187,17 @@ void *queue_peek_tail(struct queue *queue)
 	return queue->tail->data;
 }
 
+static bool queue_find_entry(struct queue *queue, const void *data)
+{
+	struct queue_entry *entry;
+
+	for (entry = queue->head; entry; entry = entry->next)
+		if (entry == data)
+			return true;
+
+	return false;
+}
+
 void queue_foreach(struct queue *queue, queue_foreach_func_t function,
 							void *user_data)
 {
@@ -206,6 +217,9 @@ void queue_foreach(struct queue *queue, queue_foreach_func_t function,
 		entry = tmp->next;
 
 		function(tmp->data, user_data);
+
+		if (!queue_find_entry(queue, entry))
+			break;
 	}
 	queue_unref(queue);
 }
-- 
1.9.0


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH BlueZ v2 5/5] shared/queue: Make queue_find default do direct match for NULL callback
  2014-05-22 12:02 [PATCH BlueZ v2 1/5] unit/test-queue: Add /queue/foreach_destroy test Luiz Augusto von Dentz
                   ` (2 preceding siblings ...)
  2014-05-22 12:03 ` [PATCH BlueZ v2 4/5] shared/queue: Fix queue_foreach not detecting queue has changed Luiz Augusto von Dentz
@ 2014-05-22 12:03 ` Luiz Augusto von Dentz
  2014-05-23 13:51 ` [PATCH BlueZ v2 1/5] unit/test-queue: Add /queue/foreach_destroy test Luiz Augusto von Dentz
  4 siblings, 0 replies; 6+ messages in thread
From: Luiz Augusto von Dentz @ 2014-05-22 12:03 UTC (permalink / raw)
  To: linux-bluetooth

From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>

---
 src/shared/queue.c | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/src/shared/queue.c b/src/shared/queue.c
index 20f51b8..8bbb7df 100644
--- a/src/shared/queue.c
+++ b/src/shared/queue.c
@@ -224,6 +224,11 @@ void queue_foreach(struct queue *queue, queue_foreach_func_t function,
 	queue_unref(queue);
 }
 
+static bool direct_match(const void *a, const void *b)
+{
+	return a == b;
+}
+
 void *queue_find(struct queue *queue, queue_match_func_t function,
 							const void *match_data)
 {
@@ -232,6 +237,9 @@ void *queue_find(struct queue *queue, queue_match_func_t function,
 	if (!queue || !function)
 		return NULL;
 
+	if (!function)
+		function = direct_match;
+
 	for (entry = queue->head; entry; entry = entry->next)
 		if (function(entry->data, match_data))
 			return entry->data;
-- 
1.9.0


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH BlueZ v2 1/5] unit/test-queue: Add /queue/foreach_destroy test
  2014-05-22 12:02 [PATCH BlueZ v2 1/5] unit/test-queue: Add /queue/foreach_destroy test Luiz Augusto von Dentz
                   ` (3 preceding siblings ...)
  2014-05-22 12:03 ` [PATCH BlueZ v2 5/5] shared/queue: Make queue_find default do direct match for NULL callback Luiz Augusto von Dentz
@ 2014-05-23 13:51 ` Luiz Augusto von Dentz
  4 siblings, 0 replies; 6+ messages in thread
From: Luiz Augusto von Dentz @ 2014-05-23 13:51 UTC (permalink / raw)
  To: linux-bluetooth

Hi,

On Thu, May 22, 2014 at 3:02 PM, Luiz Augusto von Dentz
<luiz.dentz@gmail.com> wrote:
> From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
>
> This tests queue_destroy from queue_foreach callback.
> ---
> v2: Fix patch 4/5: queue_find cannot be used for entries nodes.
>
>  unit/test-queue.c | 21 +++++++++++++++++++++
>  1 file changed, 21 insertions(+)
>
> diff --git a/unit/test-queue.c b/unit/test-queue.c
> index 7c6d2ad..55273e3 100644
> --- a/unit/test-queue.c
> +++ b/unit/test-queue.c
> @@ -58,11 +58,32 @@ static void test_basic(void)
>         queue_destroy(queue, NULL);
>  }
>
> +static void foreach_destroy(void *data, void *user_data)
> +{
> +       struct queue *queue = user_data;
> +
> +       queue_destroy(queue, NULL);
> +}
> +
> +static void test_foreach_destroy(void)
> +{
> +       struct queue *queue;
> +
> +       queue = queue_new();
> +       g_assert(queue != NULL);
> +
> +       queue_push_tail(queue, UINT_TO_PTR(1));
> +       queue_push_tail(queue, UINT_TO_PTR(2));
> +
> +       queue_foreach(queue, foreach_destroy, queue);
> +}
> +
>  int main(int argc, char *argv[])
>  {
>         g_test_init(&argc, &argv, NULL);
>
>         g_test_add_func("/queue/basic", test_basic);
> +       g_test_add_func("/queue/foreach_destroy", test_foreach_destroy);
>
>         return g_test_run();
>  }
> --
> 1.9.0

Pushed.


-- 
Luiz Augusto von Dentz

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2014-05-23 13:51 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-05-22 12:02 [PATCH BlueZ v2 1/5] unit/test-queue: Add /queue/foreach_destroy test Luiz Augusto von Dentz
2014-05-22 12:02 ` [PATCH BlueZ v2 2/5] shared/queue: Fix queue_foreach not detecting queue has been destroyed Luiz Augusto von Dentz
2014-05-22 12:03 ` [PATCH BlueZ v2 3/5] unit/test-queue: Add /queue/foreach_remove_all test Luiz Augusto von Dentz
2014-05-22 12:03 ` [PATCH BlueZ v2 4/5] shared/queue: Fix queue_foreach not detecting queue has changed Luiz Augusto von Dentz
2014-05-22 12:03 ` [PATCH BlueZ v2 5/5] shared/queue: Make queue_find default do direct match for NULL callback Luiz Augusto von Dentz
2014-05-23 13:51 ` [PATCH BlueZ v2 1/5] unit/test-queue: Add /queue/foreach_destroy test Luiz Augusto von Dentz

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.