summaryrefslogtreecommitdiff
path: root/common/consumer.c
diff options
context:
space:
mode:
Diffstat (limited to 'common/consumer.c')
-rw-r--r--common/consumer.c40
1 files changed, 40 insertions, 0 deletions
diff --git a/common/consumer.c b/common/consumer.c
new file mode 100644
index 0000000000..3d424479e4
--- /dev/null
+++ b/common/consumer.c
@@ -0,0 +1,40 @@
+/* Copyright (c) 2015 The Chromium OS Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ *
+ * Consumer methods
+ */
+#include "consumer.h"
+#include "producer.h"
+
+void consumer_notify_directly(struct consumer const *consumer, size_t count)
+{
+ if (count && consumer->ops->written)
+ consumer->ops->written(consumer, count);
+}
+
+size_t consumer_read_unit(struct consumer const *consumer, void *unit)
+{
+ size_t removed = queue_remove_unit(consumer->queue, unit);
+
+ producer_notify_directly(consumer->producer, removed);
+
+ return removed;
+}
+
+size_t consumer_read_memcpy(struct consumer const *consumer,
+ void *units,
+ size_t count,
+ void *(*memcpy)(void *dest,
+ void const *src,
+ size_t n))
+{
+ size_t removed = queue_remove_memcpy(consumer->queue,
+ units,
+ count,
+ memcpy);
+
+ producer_notify_directly(consumer->producer, removed);
+
+ return removed;
+}