Files
OpenCellular/common/consumer.c
Anton Staaf 1a0235e69f Streams: Define a lower level abstraction for queue access
This adds a new pair of interfaces called producer and consumer
which are simpler (in that they don't hold onto the underlying
queue) than the stream interfaces.  This makes it easier to
share a single queue between the endpoints that will manipulate
it.  It was not possible to share a queue between two objects
that implemented the in_stream and out_stream interfaces.

This also adds a pair of adaptors that can convert a producer
or consumer into a stream of the correct type.  These adaptors
will be used for existing code once the usb-stream and usart
drivers are converted over to use the producer/consumer
interfaces instead of the stream interfaces.

Signed-off-by: Anton Staaf <robotboy@chromium.org>

BRANCH=None
BUG=None
TEST=make buildall -j

Change-Id: I42b4b1ac15cca28e1adc6d3cea315f15e17a0b4d
Reviewed-on: https://chromium-review.googlesource.com/250941
Trybot-Ready: Anton Staaf <robotboy@chromium.org>
Tested-by: Anton Staaf <robotboy@chromium.org>
Reviewed-by: Randall Spangler <rspangler@chromium.org>
Commit-Queue: Anton Staaf <robotboy@chromium.org>
2015-02-24 00:27:50 +00:00

41 lines
988 B
C

/* 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;
}