mirror of
https://github.com/Telecominfraproject/OpenCellular.git
synced 2026-01-10 01:21:49 +00:00
Previously the Producer and Consumer interfaces tracked the Consumer and Producer respectively at the other end of the queue that they interacted with. This was done to avoid modifying the queue implementation, but resulted in a rougher interface that required additional initialization steps and prevented alternative configurations; many producers and one consumer for example. This commit uses the new queue policies to track this information. The new direct policy behaves as the old producer and consumers did. Now the producers and consumers are just named references to the queue that they work on and a convenient location for a notification callback when the queue is updated in a way that is relevent to the producer or consumer. All users of Producer and Consumer have been updated including the stream adaptors which are in use by the echo test code and the mcdp28x0 driver. Use of the stream adaptors has also been simplified. Signed-off-by: Anton Staaf <robotboy@chromium.org> BRANCH=None BUG=None TEST=make buildall -j Manual testing of Ryu (P5) and discovery board echo task Change-Id: I704be6378a31b4e20f5063295eff9943e4900409 Reviewed-on: https://chromium-review.googlesource.com/271792 Reviewed-by: Anton Staaf <robotboy@chromium.org> Commit-Queue: Anton Staaf <robotboy@chromium.org> Trybot-Ready: Anton Staaf <robotboy@chromium.org> Tested-by: Anton Staaf <robotboy@chromium.org>
109 lines
3.1 KiB
C
109 lines
3.1 KiB
C
/* Copyright 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.
|
|
*/
|
|
#ifndef INCLUDE_STREAM_ADAPTOR_H
|
|
#define INCLUDE_STREAM_ADAPTOR_H
|
|
|
|
#include "common.h"
|
|
#include "in_stream.h"
|
|
#include "out_stream.h"
|
|
#include "consumer.h"
|
|
#include "producer.h"
|
|
#include "queue.h"
|
|
#include "queue_policies.h"
|
|
|
|
/*
|
|
* +..........+ +..........+------+...........+
|
|
* . .<------------->. | | .
|
|
* . Producer . +---------+ . Consumer | ISFQ | In Stream .
|
|
* . .->| Queue |->. | | .
|
|
* +..........+ +---------+ +..........+------+...........+
|
|
*/
|
|
|
|
struct in_stream_from_queue {
|
|
struct consumer consumer;
|
|
struct in_stream in;
|
|
};
|
|
|
|
/*
|
|
*
|
|
*/
|
|
extern struct in_stream_ops const in_stream_from_queue_in_stream_ops;
|
|
extern struct consumer_ops const in_stream_from_queue_consumer_ops;
|
|
|
|
#define IN_STREAM_FROM_QUEUE(NAME, QUEUE, READY) \
|
|
struct in_stream_from_queue const NAME = { \
|
|
.consumer = { \
|
|
.queue = &QUEUE, \
|
|
.ops = &in_stream_from_queue_consumer_ops, \
|
|
}, \
|
|
.in = { \
|
|
.ready = READY, \
|
|
.ops = &in_stream_from_queue_in_stream_ops, \
|
|
}, \
|
|
};
|
|
|
|
/*
|
|
* +..........+ +..........+------+............+
|
|
* . .<------------->. | | .
|
|
* . Consumer . +---------+ . Producer | OSFQ | Out Stream .
|
|
* . .<-| Queue |<-. | | .
|
|
* +..........+ +---------+ +..........+------+............+
|
|
*/
|
|
|
|
struct out_stream_from_queue {
|
|
struct producer producer;
|
|
struct out_stream out;
|
|
};
|
|
|
|
/*
|
|
*
|
|
*/
|
|
extern struct out_stream_ops const out_stream_from_queue_out_stream_ops;
|
|
extern struct producer_ops const out_stream_from_queue_producer_ops;
|
|
|
|
#define OUT_STREAM_FROM_QUEUE(NAME, QUEUE, READY) \
|
|
struct out_stream_from_queue const NAME = { \
|
|
.producer = { \
|
|
.queue = &QUEUE, \
|
|
.ops = &out_stream_from_queue_producer_ops, \
|
|
}, \
|
|
.out = { \
|
|
.ready = READY, \
|
|
.ops = &out_stream_from_queue_out_stream_ops, \
|
|
}, \
|
|
};
|
|
|
|
/*
|
|
* Given a forward declared device configuration called NAME that implements
|
|
* producer and consumer interfaces construct RX/TX queues and expose them as
|
|
* streams called <NAME>_in and <NAME>_out.
|
|
*/
|
|
#define IO_STREAM_CONFIG(NAME, RX_SIZE, TX_SIZE, IN_READY, OUT_READY) \
|
|
\
|
|
struct in_stream_from_queue const CONCAT2(NAME, _in); \
|
|
\
|
|
struct queue const CONCAT2(NAME, _rx_queue) = \
|
|
QUEUE_DIRECT(RX_SIZE, \
|
|
uint8_t, \
|
|
NAME.producer, \
|
|
CONCAT2(NAME, _in).consumer); \
|
|
IN_STREAM_FROM_QUEUE(CONCAT2(NAME, _in), \
|
|
CONCAT2(NAME, _rx_queue), \
|
|
IN_READY) \
|
|
\
|
|
\
|
|
struct out_stream_from_queue const CONCAT2(NAME, _out); \
|
|
\
|
|
struct queue const CONCAT2(NAME, _tx_queue) = \
|
|
QUEUE_DIRECT(TX_SIZE, \
|
|
uint8_t, \
|
|
CONCAT2(NAME, _out).producer, \
|
|
NAME.consumer); \
|
|
OUT_STREAM_FROM_QUEUE(CONCAT2(NAME, _out), \
|
|
CONCAT2(NAME, _tx_queue), \
|
|
OUT_READY)
|
|
|
|
#endif /* INCLUDE_STREAM_ADAPTOR_H */
|