xref: /aosp_15_r20/external/deqp/framework/delibs/destream/deRingbuffer.c (revision 35238bce31c2a825756842865a792f8cf7f89930)
1*35238bceSAndroid Build Coastguard Worker /*-------------------------------------------------------------------------
2*35238bceSAndroid Build Coastguard Worker  * drawElements Stream Library
3*35238bceSAndroid Build Coastguard Worker  * ---------------------------
4*35238bceSAndroid Build Coastguard Worker  *
5*35238bceSAndroid Build Coastguard Worker  * Copyright 2014 The Android Open Source Project
6*35238bceSAndroid Build Coastguard Worker  *
7*35238bceSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
8*35238bceSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
9*35238bceSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
10*35238bceSAndroid Build Coastguard Worker  *
11*35238bceSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
12*35238bceSAndroid Build Coastguard Worker  *
13*35238bceSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
14*35238bceSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
15*35238bceSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16*35238bceSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
17*35238bceSAndroid Build Coastguard Worker  * limitations under the License.
18*35238bceSAndroid Build Coastguard Worker  *
19*35238bceSAndroid Build Coastguard Worker  *//*!
20*35238bceSAndroid Build Coastguard Worker  * \file
21*35238bceSAndroid Build Coastguard Worker  * \brief Thread safe ringbuffer
22*35238bceSAndroid Build Coastguard Worker  *//*--------------------------------------------------------------------*/
23*35238bceSAndroid Build Coastguard Worker #include "deRingbuffer.h"
24*35238bceSAndroid Build Coastguard Worker 
25*35238bceSAndroid Build Coastguard Worker #include "deInt32.h"
26*35238bceSAndroid Build Coastguard Worker #include "deMemory.h"
27*35238bceSAndroid Build Coastguard Worker #include "deSemaphore.h"
28*35238bceSAndroid Build Coastguard Worker 
29*35238bceSAndroid Build Coastguard Worker #include <stdlib.h>
30*35238bceSAndroid Build Coastguard Worker #include <stdio.h>
31*35238bceSAndroid Build Coastguard Worker 
32*35238bceSAndroid Build Coastguard Worker struct deRingbuffer_s
33*35238bceSAndroid Build Coastguard Worker {
34*35238bceSAndroid Build Coastguard Worker     int32_t blockSize;
35*35238bceSAndroid Build Coastguard Worker     int32_t blockCount;
36*35238bceSAndroid Build Coastguard Worker     int32_t *blockUsage;
37*35238bceSAndroid Build Coastguard Worker     uint8_t *buffer;
38*35238bceSAndroid Build Coastguard Worker 
39*35238bceSAndroid Build Coastguard Worker     deSemaphore emptyCount;
40*35238bceSAndroid Build Coastguard Worker     deSemaphore fullCount;
41*35238bceSAndroid Build Coastguard Worker 
42*35238bceSAndroid Build Coastguard Worker     int32_t outBlock;
43*35238bceSAndroid Build Coastguard Worker     int32_t outPos;
44*35238bceSAndroid Build Coastguard Worker 
45*35238bceSAndroid Build Coastguard Worker     int32_t inBlock;
46*35238bceSAndroid Build Coastguard Worker     int32_t inPos;
47*35238bceSAndroid Build Coastguard Worker 
48*35238bceSAndroid Build Coastguard Worker     bool stopNotified;
49*35238bceSAndroid Build Coastguard Worker     bool consumerStopping;
50*35238bceSAndroid Build Coastguard Worker };
51*35238bceSAndroid Build Coastguard Worker 
deRingbuffer_create(int32_t blockSize,int32_t blockCount)52*35238bceSAndroid Build Coastguard Worker deRingbuffer *deRingbuffer_create(int32_t blockSize, int32_t blockCount)
53*35238bceSAndroid Build Coastguard Worker {
54*35238bceSAndroid Build Coastguard Worker     deRingbuffer *ringbuffer = (deRingbuffer *)deCalloc(sizeof(deRingbuffer));
55*35238bceSAndroid Build Coastguard Worker 
56*35238bceSAndroid Build Coastguard Worker     DE_ASSERT(ringbuffer);
57*35238bceSAndroid Build Coastguard Worker     DE_ASSERT(blockCount > 0);
58*35238bceSAndroid Build Coastguard Worker     DE_ASSERT(blockSize > 0);
59*35238bceSAndroid Build Coastguard Worker 
60*35238bceSAndroid Build Coastguard Worker     ringbuffer->blockSize  = blockSize;
61*35238bceSAndroid Build Coastguard Worker     ringbuffer->blockCount = blockCount;
62*35238bceSAndroid Build Coastguard Worker     ringbuffer->buffer     = (uint8_t *)deMalloc(sizeof(uint8_t) * (size_t)blockSize * (size_t)blockCount);
63*35238bceSAndroid Build Coastguard Worker     ringbuffer->blockUsage = (int32_t *)deMalloc(sizeof(uint32_t) * (size_t)blockCount);
64*35238bceSAndroid Build Coastguard Worker     ringbuffer->emptyCount = deSemaphore_create(ringbuffer->blockCount, DE_NULL);
65*35238bceSAndroid Build Coastguard Worker     ringbuffer->fullCount  = deSemaphore_create(0, DE_NULL);
66*35238bceSAndroid Build Coastguard Worker 
67*35238bceSAndroid Build Coastguard Worker     if (!ringbuffer->buffer || !ringbuffer->blockUsage || !ringbuffer->emptyCount || !ringbuffer->fullCount)
68*35238bceSAndroid Build Coastguard Worker     {
69*35238bceSAndroid Build Coastguard Worker         if (ringbuffer->emptyCount)
70*35238bceSAndroid Build Coastguard Worker             deSemaphore_destroy(ringbuffer->emptyCount);
71*35238bceSAndroid Build Coastguard Worker         if (ringbuffer->fullCount)
72*35238bceSAndroid Build Coastguard Worker             deSemaphore_destroy(ringbuffer->fullCount);
73*35238bceSAndroid Build Coastguard Worker         deFree(ringbuffer->buffer);
74*35238bceSAndroid Build Coastguard Worker         deFree(ringbuffer->blockUsage);
75*35238bceSAndroid Build Coastguard Worker         deFree(ringbuffer);
76*35238bceSAndroid Build Coastguard Worker         return DE_NULL;
77*35238bceSAndroid Build Coastguard Worker     }
78*35238bceSAndroid Build Coastguard Worker 
79*35238bceSAndroid Build Coastguard Worker     memset(ringbuffer->blockUsage, 0, sizeof(int32_t) * (size_t)blockCount);
80*35238bceSAndroid Build Coastguard Worker 
81*35238bceSAndroid Build Coastguard Worker     ringbuffer->outBlock = 0;
82*35238bceSAndroid Build Coastguard Worker     ringbuffer->outPos   = 0;
83*35238bceSAndroid Build Coastguard Worker 
84*35238bceSAndroid Build Coastguard Worker     ringbuffer->inBlock = 0;
85*35238bceSAndroid Build Coastguard Worker     ringbuffer->inPos   = 0;
86*35238bceSAndroid Build Coastguard Worker 
87*35238bceSAndroid Build Coastguard Worker     ringbuffer->stopNotified     = false;
88*35238bceSAndroid Build Coastguard Worker     ringbuffer->consumerStopping = false;
89*35238bceSAndroid Build Coastguard Worker 
90*35238bceSAndroid Build Coastguard Worker     return ringbuffer;
91*35238bceSAndroid Build Coastguard Worker }
92*35238bceSAndroid Build Coastguard Worker 
deRingbuffer_stop(deRingbuffer * ringbuffer)93*35238bceSAndroid Build Coastguard Worker void deRingbuffer_stop(deRingbuffer *ringbuffer)
94*35238bceSAndroid Build Coastguard Worker {
95*35238bceSAndroid Build Coastguard Worker     /* Set notify to true and increment fullCount to let consumer continue */
96*35238bceSAndroid Build Coastguard Worker     ringbuffer->stopNotified = true;
97*35238bceSAndroid Build Coastguard Worker     deSemaphore_increment(ringbuffer->fullCount);
98*35238bceSAndroid Build Coastguard Worker }
99*35238bceSAndroid Build Coastguard Worker 
deRingbuffer_destroy(deRingbuffer * ringbuffer)100*35238bceSAndroid Build Coastguard Worker void deRingbuffer_destroy(deRingbuffer *ringbuffer)
101*35238bceSAndroid Build Coastguard Worker {
102*35238bceSAndroid Build Coastguard Worker     deSemaphore_destroy(ringbuffer->emptyCount);
103*35238bceSAndroid Build Coastguard Worker     deSemaphore_destroy(ringbuffer->fullCount);
104*35238bceSAndroid Build Coastguard Worker 
105*35238bceSAndroid Build Coastguard Worker     free(ringbuffer->buffer);
106*35238bceSAndroid Build Coastguard Worker     free(ringbuffer->blockUsage);
107*35238bceSAndroid Build Coastguard Worker     free(ringbuffer);
108*35238bceSAndroid Build Coastguard Worker }
109*35238bceSAndroid Build Coastguard Worker 
producerStream_write(deStreamData * stream,const void * buf,int32_t bufSize,int32_t * written)110*35238bceSAndroid Build Coastguard Worker static deStreamResult producerStream_write(deStreamData *stream, const void *buf, int32_t bufSize, int32_t *written)
111*35238bceSAndroid Build Coastguard Worker {
112*35238bceSAndroid Build Coastguard Worker     deRingbuffer *ringbuffer = (deRingbuffer *)stream;
113*35238bceSAndroid Build Coastguard Worker 
114*35238bceSAndroid Build Coastguard Worker     DE_ASSERT(stream);
115*35238bceSAndroid Build Coastguard Worker     /* If ringbuffer is stopping return error on write */
116*35238bceSAndroid Build Coastguard Worker     if (ringbuffer->stopNotified)
117*35238bceSAndroid Build Coastguard Worker     {
118*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(false);
119*35238bceSAndroid Build Coastguard Worker         return DE_STREAMRESULT_ERROR;
120*35238bceSAndroid Build Coastguard Worker     }
121*35238bceSAndroid Build Coastguard Worker 
122*35238bceSAndroid Build Coastguard Worker     *written = 0;
123*35238bceSAndroid Build Coastguard Worker 
124*35238bceSAndroid Build Coastguard Worker     /* Write while more data available */
125*35238bceSAndroid Build Coastguard Worker     while (*written < bufSize)
126*35238bceSAndroid Build Coastguard Worker     {
127*35238bceSAndroid Build Coastguard Worker         int32_t writeSize = 0;
128*35238bceSAndroid Build Coastguard Worker         uint8_t *src      = DE_NULL;
129*35238bceSAndroid Build Coastguard Worker         uint8_t *dst      = DE_NULL;
130*35238bceSAndroid Build Coastguard Worker 
131*35238bceSAndroid Build Coastguard Worker         /* If between blocks accuire new block */
132*35238bceSAndroid Build Coastguard Worker         if (ringbuffer->inPos == 0)
133*35238bceSAndroid Build Coastguard Worker         {
134*35238bceSAndroid Build Coastguard Worker             deSemaphore_decrement(ringbuffer->emptyCount);
135*35238bceSAndroid Build Coastguard Worker         }
136*35238bceSAndroid Build Coastguard Worker 
137*35238bceSAndroid Build Coastguard Worker         writeSize = deMin32(ringbuffer->blockSize - ringbuffer->inPos, bufSize - *written);
138*35238bceSAndroid Build Coastguard Worker         dst       = ringbuffer->buffer + ringbuffer->blockSize * ringbuffer->inBlock + ringbuffer->inPos;
139*35238bceSAndroid Build Coastguard Worker         src       = (uint8_t *)buf + *written;
140*35238bceSAndroid Build Coastguard Worker 
141*35238bceSAndroid Build Coastguard Worker         deMemcpy(dst, src, (size_t)writeSize);
142*35238bceSAndroid Build Coastguard Worker 
143*35238bceSAndroid Build Coastguard Worker         ringbuffer->inPos += writeSize;
144*35238bceSAndroid Build Coastguard Worker         *written += writeSize;
145*35238bceSAndroid Build Coastguard Worker         ringbuffer->blockUsage[ringbuffer->inBlock] += writeSize;
146*35238bceSAndroid Build Coastguard Worker 
147*35238bceSAndroid Build Coastguard Worker         /* Block is full move to next one (or "between" this and next block) */
148*35238bceSAndroid Build Coastguard Worker         if (ringbuffer->inPos == ringbuffer->blockSize)
149*35238bceSAndroid Build Coastguard Worker         {
150*35238bceSAndroid Build Coastguard Worker             ringbuffer->inPos = 0;
151*35238bceSAndroid Build Coastguard Worker             ringbuffer->inBlock++;
152*35238bceSAndroid Build Coastguard Worker 
153*35238bceSAndroid Build Coastguard Worker             if (ringbuffer->inBlock == ringbuffer->blockCount)
154*35238bceSAndroid Build Coastguard Worker                 ringbuffer->inBlock = 0;
155*35238bceSAndroid Build Coastguard Worker             deSemaphore_increment(ringbuffer->fullCount);
156*35238bceSAndroid Build Coastguard Worker         }
157*35238bceSAndroid Build Coastguard Worker     }
158*35238bceSAndroid Build Coastguard Worker 
159*35238bceSAndroid Build Coastguard Worker     return DE_STREAMRESULT_SUCCESS;
160*35238bceSAndroid Build Coastguard Worker }
161*35238bceSAndroid Build Coastguard Worker 
producerStream_flush(deStreamData * stream)162*35238bceSAndroid Build Coastguard Worker static deStreamResult producerStream_flush(deStreamData *stream)
163*35238bceSAndroid Build Coastguard Worker {
164*35238bceSAndroid Build Coastguard Worker     deRingbuffer *ringbuffer = (deRingbuffer *)stream;
165*35238bceSAndroid Build Coastguard Worker 
166*35238bceSAndroid Build Coastguard Worker     DE_ASSERT(stream);
167*35238bceSAndroid Build Coastguard Worker 
168*35238bceSAndroid Build Coastguard Worker     /* No blocks reserved by producer */
169*35238bceSAndroid Build Coastguard Worker     if (ringbuffer->inPos == 0)
170*35238bceSAndroid Build Coastguard Worker         return DE_STREAMRESULT_SUCCESS;
171*35238bceSAndroid Build Coastguard Worker 
172*35238bceSAndroid Build Coastguard Worker     ringbuffer->inPos = 0;
173*35238bceSAndroid Build Coastguard Worker     ringbuffer->inBlock++;
174*35238bceSAndroid Build Coastguard Worker 
175*35238bceSAndroid Build Coastguard Worker     if (ringbuffer->inBlock == ringbuffer->blockCount)
176*35238bceSAndroid Build Coastguard Worker         ringbuffer->inBlock = 0;
177*35238bceSAndroid Build Coastguard Worker 
178*35238bceSAndroid Build Coastguard Worker     deSemaphore_increment(ringbuffer->fullCount);
179*35238bceSAndroid Build Coastguard Worker     return DE_STREAMRESULT_SUCCESS;
180*35238bceSAndroid Build Coastguard Worker }
181*35238bceSAndroid Build Coastguard Worker 
producerStream_deinit(deStreamData * stream)182*35238bceSAndroid Build Coastguard Worker static deStreamResult producerStream_deinit(deStreamData *stream)
183*35238bceSAndroid Build Coastguard Worker {
184*35238bceSAndroid Build Coastguard Worker     DE_ASSERT(stream);
185*35238bceSAndroid Build Coastguard Worker 
186*35238bceSAndroid Build Coastguard Worker     producerStream_flush(stream);
187*35238bceSAndroid Build Coastguard Worker 
188*35238bceSAndroid Build Coastguard Worker     /* \note mika Stream doesn't own ringbuffer, so it's not deallocated */
189*35238bceSAndroid Build Coastguard Worker     return DE_STREAMRESULT_SUCCESS;
190*35238bceSAndroid Build Coastguard Worker }
191*35238bceSAndroid Build Coastguard Worker 
consumerStream_read(deStreamData * stream,void * buf,int32_t bufSize,int32_t * read)192*35238bceSAndroid Build Coastguard Worker static deStreamResult consumerStream_read(deStreamData *stream, void *buf, int32_t bufSize, int32_t *read)
193*35238bceSAndroid Build Coastguard Worker {
194*35238bceSAndroid Build Coastguard Worker     deRingbuffer *ringbuffer = (deRingbuffer *)stream;
195*35238bceSAndroid Build Coastguard Worker 
196*35238bceSAndroid Build Coastguard Worker     DE_ASSERT(stream);
197*35238bceSAndroid Build Coastguard Worker 
198*35238bceSAndroid Build Coastguard Worker     *read = 0;
199*35238bceSAndroid Build Coastguard Worker     DE_ASSERT(ringbuffer);
200*35238bceSAndroid Build Coastguard Worker 
201*35238bceSAndroid Build Coastguard Worker     while (*read < bufSize)
202*35238bceSAndroid Build Coastguard Worker     {
203*35238bceSAndroid Build Coastguard Worker         int32_t writeSize = 0;
204*35238bceSAndroid Build Coastguard Worker         uint8_t *src      = DE_NULL;
205*35238bceSAndroid Build Coastguard Worker         uint8_t *dst      = DE_NULL;
206*35238bceSAndroid Build Coastguard Worker 
207*35238bceSAndroid Build Coastguard Worker         /* If between blocks accuire new block */
208*35238bceSAndroid Build Coastguard Worker         if (ringbuffer->outPos == 0)
209*35238bceSAndroid Build Coastguard Worker         {
210*35238bceSAndroid Build Coastguard Worker             /* If consumer is set to stop after everything is consumed,
211*35238bceSAndroid Build Coastguard Worker              * do not block if there is no more input left
212*35238bceSAndroid Build Coastguard Worker              */
213*35238bceSAndroid Build Coastguard Worker             if (ringbuffer->consumerStopping)
214*35238bceSAndroid Build Coastguard Worker             {
215*35238bceSAndroid Build Coastguard Worker                 /* Try to accuire new block, if can't there is no more input */
216*35238bceSAndroid Build Coastguard Worker                 if (!deSemaphore_tryDecrement(ringbuffer->fullCount))
217*35238bceSAndroid Build Coastguard Worker                 {
218*35238bceSAndroid Build Coastguard Worker                     return DE_STREAMRESULT_END_OF_STREAM;
219*35238bceSAndroid Build Coastguard Worker                 }
220*35238bceSAndroid Build Coastguard Worker             }
221*35238bceSAndroid Build Coastguard Worker             else
222*35238bceSAndroid Build Coastguard Worker             {
223*35238bceSAndroid Build Coastguard Worker                 /* If not stopping block until there is more input */
224*35238bceSAndroid Build Coastguard Worker                 deSemaphore_decrement(ringbuffer->fullCount);
225*35238bceSAndroid Build Coastguard Worker                 /* Ringbuffer was set to stop */
226*35238bceSAndroid Build Coastguard Worker                 if (ringbuffer->stopNotified)
227*35238bceSAndroid Build Coastguard Worker                 {
228*35238bceSAndroid Build Coastguard Worker                     ringbuffer->consumerStopping = true;
229*35238bceSAndroid Build Coastguard Worker                 }
230*35238bceSAndroid Build Coastguard Worker             }
231*35238bceSAndroid Build Coastguard Worker         }
232*35238bceSAndroid Build Coastguard Worker 
233*35238bceSAndroid Build Coastguard Worker         writeSize = deMin32(ringbuffer->blockUsage[ringbuffer->outBlock] - ringbuffer->outPos, bufSize - *read);
234*35238bceSAndroid Build Coastguard Worker         src       = ringbuffer->buffer + ringbuffer->blockSize * ringbuffer->outBlock + ringbuffer->outPos;
235*35238bceSAndroid Build Coastguard Worker         dst       = (uint8_t *)buf + *read;
236*35238bceSAndroid Build Coastguard Worker 
237*35238bceSAndroid Build Coastguard Worker         deMemcpy(dst, src, (size_t)writeSize);
238*35238bceSAndroid Build Coastguard Worker 
239*35238bceSAndroid Build Coastguard Worker         ringbuffer->outPos += writeSize;
240*35238bceSAndroid Build Coastguard Worker         *read += writeSize;
241*35238bceSAndroid Build Coastguard Worker 
242*35238bceSAndroid Build Coastguard Worker         /* Block is consumed move to next one (or "between" this and next block) */
243*35238bceSAndroid Build Coastguard Worker         if (ringbuffer->outPos == ringbuffer->blockUsage[ringbuffer->outBlock])
244*35238bceSAndroid Build Coastguard Worker         {
245*35238bceSAndroid Build Coastguard Worker             ringbuffer->blockUsage[ringbuffer->outBlock] = 0;
246*35238bceSAndroid Build Coastguard Worker             ringbuffer->outPos                           = 0;
247*35238bceSAndroid Build Coastguard Worker             ringbuffer->outBlock++;
248*35238bceSAndroid Build Coastguard Worker 
249*35238bceSAndroid Build Coastguard Worker             if (ringbuffer->outBlock == ringbuffer->blockCount)
250*35238bceSAndroid Build Coastguard Worker                 ringbuffer->outBlock = 0;
251*35238bceSAndroid Build Coastguard Worker 
252*35238bceSAndroid Build Coastguard Worker             deSemaphore_increment(ringbuffer->emptyCount);
253*35238bceSAndroid Build Coastguard Worker         }
254*35238bceSAndroid Build Coastguard Worker     }
255*35238bceSAndroid Build Coastguard Worker 
256*35238bceSAndroid Build Coastguard Worker     return DE_STREAMRESULT_SUCCESS;
257*35238bceSAndroid Build Coastguard Worker }
258*35238bceSAndroid Build Coastguard Worker 
consumerStream_deinit(deStreamData * stream)259*35238bceSAndroid Build Coastguard Worker static deStreamResult consumerStream_deinit(deStreamData *stream)
260*35238bceSAndroid Build Coastguard Worker {
261*35238bceSAndroid Build Coastguard Worker     DE_ASSERT(stream);
262*35238bceSAndroid Build Coastguard Worker     DE_UNREF(stream);
263*35238bceSAndroid Build Coastguard Worker 
264*35238bceSAndroid Build Coastguard Worker     return DE_STREAMRESULT_SUCCESS;
265*35238bceSAndroid Build Coastguard Worker }
266*35238bceSAndroid Build Coastguard Worker 
267*35238bceSAndroid Build Coastguard Worker /* There are no sensible errors so status is always good */
empty_getStatus(deStreamData * stream)268*35238bceSAndroid Build Coastguard Worker deStreamStatus empty_getStatus(deStreamData *stream)
269*35238bceSAndroid Build Coastguard Worker {
270*35238bceSAndroid Build Coastguard Worker     DE_UNREF(stream);
271*35238bceSAndroid Build Coastguard Worker 
272*35238bceSAndroid Build Coastguard Worker     return DE_STREAMSTATUS_GOOD;
273*35238bceSAndroid Build Coastguard Worker }
274*35238bceSAndroid Build Coastguard Worker 
275*35238bceSAndroid Build Coastguard Worker /* There are no sensible errors in ringbuffer */
empty_getError(deStreamData * stream)276*35238bceSAndroid Build Coastguard Worker static const char *empty_getError(deStreamData *stream)
277*35238bceSAndroid Build Coastguard Worker {
278*35238bceSAndroid Build Coastguard Worker     DE_ASSERT(stream);
279*35238bceSAndroid Build Coastguard Worker     DE_UNREF(stream);
280*35238bceSAndroid Build Coastguard Worker     return DE_NULL;
281*35238bceSAndroid Build Coastguard Worker }
282*35238bceSAndroid Build Coastguard Worker 
283*35238bceSAndroid Build Coastguard Worker static const deIOStreamVFTable producerStreamVFTable = {
284*35238bceSAndroid Build Coastguard Worker     DE_NULL, producerStream_write, empty_getError, producerStream_flush, producerStream_deinit, empty_getStatus};
285*35238bceSAndroid Build Coastguard Worker 
286*35238bceSAndroid Build Coastguard Worker static const deIOStreamVFTable consumerStreamVFTable = {consumerStream_read,   DE_NULL,        empty_getError, DE_NULL,
287*35238bceSAndroid Build Coastguard Worker                                                         consumerStream_deinit, empty_getStatus};
288*35238bceSAndroid Build Coastguard Worker 
deProducerStream_init(deOutStream * stream,deRingbuffer * buffer)289*35238bceSAndroid Build Coastguard Worker void deProducerStream_init(deOutStream *stream, deRingbuffer *buffer)
290*35238bceSAndroid Build Coastguard Worker {
291*35238bceSAndroid Build Coastguard Worker     stream->ioStream.streamData = (deStreamData *)buffer;
292*35238bceSAndroid Build Coastguard Worker     stream->ioStream.vfTable    = &producerStreamVFTable;
293*35238bceSAndroid Build Coastguard Worker }
294*35238bceSAndroid Build Coastguard Worker 
deConsumerStream_init(deInStream * stream,deRingbuffer * buffer)295*35238bceSAndroid Build Coastguard Worker void deConsumerStream_init(deInStream *stream, deRingbuffer *buffer)
296*35238bceSAndroid Build Coastguard Worker {
297*35238bceSAndroid Build Coastguard Worker     stream->ioStream.streamData = (deStreamData *)buffer;
298*35238bceSAndroid Build Coastguard Worker     stream->ioStream.vfTable    = &consumerStreamVFTable;
299*35238bceSAndroid Build Coastguard Worker }
300