Lines Matching refs:ringbuffer
21 * \brief Thread safe ringbuffer
54 deRingbuffer* ringbuffer = (deRingbuffer*)deCalloc(sizeof(deRingbuffer));
56 DE_ASSERT(ringbuffer);
60 ringbuffer->blockSize = blockSize;
61 ringbuffer->blockCount = blockCount;
62 ringbuffer->buffer = (deUint8*)deMalloc(sizeof(deUint8) * (size_t)blockSize * (size_t)blockCount);
63 ringbuffer->blockUsage = (deInt32*)deMalloc(sizeof(deUint32) * (size_t)blockCount);
64 ringbuffer->emptyCount = deSemaphore_create(ringbuffer->blockCount, DE_NULL);
65 ringbuffer->fullCount = deSemaphore_create(0, DE_NULL);
67 if (!ringbuffer->buffer ||
68 !ringbuffer->blockUsage ||
69 !ringbuffer->emptyCount ||
70 !ringbuffer->fullCount)
72 if (ringbuffer->emptyCount)
73 deSemaphore_destroy(ringbuffer->emptyCount);
74 if (ringbuffer->fullCount)
75 deSemaphore_destroy(ringbuffer->fullCount);
76 deFree(ringbuffer->buffer);
77 deFree(ringbuffer->blockUsage);
78 deFree(ringbuffer);
82 memset(ringbuffer->blockUsage, 0, sizeof(deInt32) * (size_t)blockCount);
84 ringbuffer->outBlock = 0;
85 ringbuffer->outPos = 0;
87 ringbuffer->inBlock = 0;
88 ringbuffer->inPos = 0;
90 ringbuffer->stopNotified = DE_FALSE;
91 ringbuffer->consumerStopping = DE_FALSE;
93 return ringbuffer;
96 void deRingbuffer_stop (deRingbuffer* ringbuffer)
99 ringbuffer->stopNotified = DE_TRUE;
100 deSemaphore_increment(ringbuffer->fullCount);
103 void deRingbuffer_destroy (deRingbuffer* ringbuffer)
105 deSemaphore_destroy(ringbuffer->emptyCount);
106 deSemaphore_destroy(ringbuffer->fullCount);
108 free(ringbuffer->buffer);
109 free(ringbuffer->blockUsage);
110 free(ringbuffer);
115 deRingbuffer* ringbuffer = (deRingbuffer*)stream;
118 /* If ringbuffer is stopping return error on write */
119 if (ringbuffer->stopNotified)
135 if (ringbuffer->inPos == 0)
137 deSemaphore_decrement(ringbuffer->emptyCount);
140 writeSize = deMin32(ringbuffer->blockSize - ringbuffer->inPos, bufSize - *written);
141 dst = ringbuffer->buffer + ringbuffer->blockSize * ringbuffer->inBlock + ringbuffer->inPos;
146 ringbuffer->inPos += writeSize;
148 ringbuffer->blockUsage[ringbuffer->inBlock] += writeSize;
151 if (ringbuffer->inPos == ringbuffer->blockSize)
153 ringbuffer->inPos = 0;
154 ringbuffer->inBlock++;
156 if (ringbuffer->inBlock == ringbuffer->blockCount)
157 ringbuffer->inBlock = 0;
158 deSemaphore_increment(ringbuffer->fullCount);
167 deRingbuffer* ringbuffer = (deRingbuffer*)stream;
172 if (ringbuffer->inPos == 0)
175 ringbuffer->inPos = 0;
176 ringbuffer->inBlock++;
178 if (ringbuffer->inBlock == ringbuffer->blockCount)
179 ringbuffer->inBlock = 0;
181 deSemaphore_increment(ringbuffer->fullCount);
191 /* \note mika Stream doesn't own ringbuffer, so it's not deallocated */
197 deRingbuffer* ringbuffer = (deRingbuffer*)stream;
202 DE_ASSERT(ringbuffer);
211 if (ringbuffer->outPos == 0)
216 if (ringbuffer->consumerStopping)
219 if (!deSemaphore_tryDecrement(ringbuffer->fullCount))
227 deSemaphore_decrement(ringbuffer->fullCount);
229 if (ringbuffer->stopNotified)
231 ringbuffer->consumerStopping = DE_TRUE;
237 writeSize = deMin32(ringbuffer->blockUsage[ringbuffer->outBlock] - ringbuffer->outPos, bufSize - *read);
238 src = ringbuffer->buffer + ringbuffer->blockSize * ringbuffer->outBlock + ringbuffer->outPos;
243 ringbuffer->outPos += writeSize;
247 if (ringbuffer->outPos == ringbuffer->blockUsage[ringbuffer->outBlock])
249 ringbuffer->blockUsage[ringbuffer->outBlock] = 0;
250 ringbuffer->outPos = 0;
251 ringbuffer->outBlock++;
253 if (ringbuffer->outBlock == ringbuffer->blockCount)
254 ringbuffer->outBlock = 0;
256 deSemaphore_increment(ringbuffer->emptyCount);
280 /* There are no sensible errors in ringbuffer */