Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #ifdef HAVE_CONFIG_H
00030 # include <config.h>
00031 #endif
00032
00033 #define DISABLE_DEBUGLOG
00034
00035 #include "ringbuffer_p.h"
00036 #include <gwenhywfar/misc.h>
00037 #include <gwenhywfar/debug.h>
00038 #include <stdlib.h>
00039
00040
00041
00042 GWEN_RINGBUFFER *GWEN_RingBuffer_new(unsigned int size){
00043 GWEN_RINGBUFFER *rb;
00044
00045 assert(size);
00046 GWEN_NEW_OBJECT(GWEN_RINGBUFFER, rb);
00047 DBG_MEM_INC("GWEN_RINGBUFFER", 0);
00048 rb->ptr=(char*)malloc(size);
00049 rb->bufferSize=size;
00050 return rb;
00051 }
00052
00053
00054
00055 void GWEN_RingBuffer_free(GWEN_RINGBUFFER *rb){
00056 if (rb) {
00057 DBG_MEM_DEC("GWEN_RINGBUFFER");
00058 free(rb->ptr);
00059 GWEN_FREE_OBJECT(rb);
00060 }
00061 }
00062
00063
00064
00065 int GWEN_RingBuffer_WriteBytes(GWEN_RINGBUFFER *rb,
00066 const char *buffer,
00067 uint32_t *size){
00068 uint32_t psize;
00069 uint32_t bytesLeft;
00070
00071 if ((rb->bufferSize-rb->bytesUsed)==0) {
00072 DBG_DEBUG(GWEN_LOGDOMAIN, "Buffer full");
00073 rb->fullCounter++;
00074 return -1;
00075 }
00076
00077 bytesLeft=*size;
00078 while(bytesLeft) {
00079 if ((rb->bufferSize-rb->bytesUsed)==0)
00080 break;
00081 if (rb->writePos>=rb->readPos)
00082 psize=rb->bufferSize-rb->writePos;
00083 else
00084 psize=rb->readPos-rb->writePos;
00085 if (psize>bytesLeft)
00086 psize=bytesLeft;
00087
00088 memmove(rb->ptr+rb->writePos, buffer, psize);
00089 rb->writePos+=psize;
00090 if (rb->writePos>=rb->bufferSize)
00091 rb->writePos=0;
00092 rb->bytesUsed+=psize;
00093 buffer+=psize;
00094 bytesLeft-=psize;
00095 }
00096 *size-=bytesLeft;
00097 if (rb->bytesUsed>rb->maxBytesUsed)
00098 rb->maxBytesUsed=rb->bytesUsed;
00099 return 0;
00100 }
00101
00102
00103
00104 uint32_t
00105 GWEN_RingBuffer_GetMaxUnsegmentedRead(GWEN_RINGBUFFER *rb) {
00106 uint32_t psize;
00107
00108 assert(rb);
00109 if (rb->bytesUsed==0) {
00110 DBG_DEBUG(GWEN_LOGDOMAIN, "Buffer empty");
00111 rb->emptyCounter++;
00112 return 0;
00113 }
00114
00115 if (rb->readPos>=rb->writePos)
00116 psize=rb->bufferSize-rb->readPos;
00117 else
00118 psize=rb->writePos-rb->readPos;
00119
00120 return psize;
00121 }
00122
00123
00124
00125 uint32_t
00126 GWEN_RingBuffer_GetMaxUnsegmentedWrite(GWEN_RINGBUFFER *rb) {
00127 uint32_t psize;
00128
00129 assert(rb);
00130 if ((rb->bufferSize-rb->bytesUsed)==0) {
00131 DBG_DEBUG(GWEN_LOGDOMAIN, "Buffer full");
00132 rb->fullCounter++;
00133 return 0;
00134 }
00135
00136 if (rb->writePos>=rb->readPos)
00137 psize=rb->bufferSize-rb->writePos;
00138 else
00139 psize=rb->readPos-rb->writePos;
00140
00141 return psize;
00142 }
00143
00144
00145
00146 void GWEN_RingBuffer_SkipBytesRead(GWEN_RINGBUFFER *rb,
00147 uint32_t psize) {
00148 assert(rb);
00149
00150 if (rb->bytesUsed<psize) {
00151 DBG_ERROR(GWEN_LOGDOMAIN, "Asked to skip more bytes than available");
00152 abort();
00153 }
00154 rb->readPos+=psize;
00155 if (rb->readPos>=rb->bufferSize)
00156 rb->readPos=0;
00157 rb->bytesUsed-=psize;
00158 rb->throughput+=psize;
00159 }
00160
00161
00162
00163 void GWEN_RingBuffer_SkipBytesWrite(GWEN_RINGBUFFER *rb,
00164 uint32_t psize) {
00165 assert(rb);
00166
00167 if ((rb->bufferSize-rb->bytesUsed)<psize) {
00168 DBG_ERROR(GWEN_LOGDOMAIN, "Asked to skip more bytes than possible");
00169 abort();
00170 }
00171
00172 rb->writePos+=psize;
00173 if (rb->writePos>=rb->bufferSize)
00174 rb->writePos=0;
00175 rb->bytesUsed+=psize;
00176 if (rb->bytesUsed>rb->maxBytesUsed)
00177 rb->maxBytesUsed=rb->bytesUsed;
00178 }
00179
00180
00181
00182 int GWEN_RingBuffer_ReadBytes(GWEN_RINGBUFFER *rb,
00183 char *buffer,
00184 uint32_t *size){
00185 uint32_t psize;
00186 uint32_t bytesLeft;
00187
00188 if (rb->bytesUsed==0) {
00189 DBG_DEBUG(GWEN_LOGDOMAIN, "Buffer empty");
00190 rb->emptyCounter++;
00191 return -1;
00192 }
00193
00194 bytesLeft=*size;
00195 while(bytesLeft) {
00196 if (rb->bytesUsed==0)
00197 break;
00198 if (rb->readPos>=rb->writePos)
00199 psize=rb->bufferSize-rb->readPos;
00200 else
00201 psize=rb->writePos-rb->readPos;
00202 if (psize>bytesLeft)
00203 psize=bytesLeft;
00204
00205 memmove(buffer, rb->ptr+rb->readPos, psize);
00206 rb->readPos+=psize;
00207 if (rb->readPos>=rb->bufferSize)
00208 rb->readPos=0;
00209 rb->bytesUsed-=psize;
00210 buffer+=psize;
00211 bytesLeft-=psize;
00212 }
00213 *size-=bytesLeft;
00214 rb->throughput+=*size;
00215 return 0;
00216 }
00217
00218
00219
00220 uint32_t GWEN_RingBuffer_GetUsedBytes(const GWEN_RINGBUFFER *rb){
00221 assert(rb);
00222 return rb->bytesUsed;
00223 }
00224
00225
00226
00227 uint32_t GWEN_RingBuffer_GetBytesLeft(const GWEN_RINGBUFFER *rb){
00228 assert(rb);
00229 return rb->bufferSize-rb->bytesUsed;
00230 }
00231
00232
00233
00234 uint32_t GWEN_RingBuffer_GetBufferSize(const GWEN_RINGBUFFER *rb){
00235 assert(rb);
00236 return rb->bufferSize;
00237 }
00238
00239
00240
00241 int GWEN_RingBuffer_WriteByte(GWEN_RINGBUFFER *rb,
00242 char c) {
00243 assert(rb);
00244 if ((rb->bufferSize-rb->bytesUsed)==0) {
00245 DBG_DEBUG(GWEN_LOGDOMAIN, "Buffer full");
00246 rb->fullCounter++;
00247 return -1;
00248 }
00249
00250 rb->ptr[rb->writePos]=c;
00251 rb->writePos++;
00252 if (rb->writePos>=rb->bufferSize)
00253 rb->writePos=0;
00254 rb->bytesUsed++;
00255 if (rb->bytesUsed>rb->maxBytesUsed)
00256 rb->maxBytesUsed=rb->bytesUsed;
00257 return 0;
00258 }
00259
00260
00261
00262 int GWEN_RingBuffer_ReadByte(GWEN_RINGBUFFER *rb) {
00263 int c;
00264
00265 assert(rb);
00266 if (rb->bytesUsed==0) {
00267 DBG_DEBUG(GWEN_LOGDOMAIN, "Buffer empty");
00268 rb->emptyCounter++;
00269 return -1;
00270 }
00271
00272 c=(unsigned char)rb->ptr[rb->readPos];
00273 rb->readPos++;
00274 if (rb->readPos>=rb->bufferSize)
00275 rb->readPos=0;
00276 rb->bytesUsed--;
00277 rb->throughput++;
00278 return c;
00279 }
00280
00281
00282
00283 uint32_t GWEN_RingBuffer_GetMaxUsedBytes(const GWEN_RINGBUFFER *rb){
00284 assert(rb);
00285 return rb->maxBytesUsed;
00286 }
00287
00288
00289
00290 void GWEN_RingBuffer_ResetMaxUsedBytes(GWEN_RINGBUFFER *rb) {
00291 assert(rb);
00292 rb->maxBytesUsed=0;
00293 }
00294
00295
00296
00297 uint32_t GWEN_RingBuffer_GetThroughput(GWEN_RINGBUFFER *rb) {
00298 assert(rb);
00299 return rb->throughput;
00300 }
00301
00302
00303
00304 void GWEN_RingBuffer_ResetThroughput(GWEN_RINGBUFFER *rb) {
00305 assert(rb);
00306 rb->throughput=0;
00307 }
00308
00309
00310
00311 uint32_t GWEN_RingBuffer_GetFullCounter(const GWEN_RINGBUFFER *rb){
00312 assert(rb);
00313 return rb->fullCounter;
00314 }
00315
00316
00317
00318 void GWEN_RingBuffer_ResetFullCounter(GWEN_RINGBUFFER *rb) {
00319 assert(rb);
00320 rb->fullCounter=0;
00321 }
00322
00323
00324
00325 uint32_t GWEN_RingBuffer_GetEmptyCounter(const GWEN_RINGBUFFER *rb){
00326 assert(rb);
00327 return rb->emptyCounter;
00328 }
00329
00330
00331
00332 void GWEN_RingBuffer_ResetEmptyCounter(GWEN_RINGBUFFER *rb) {
00333 assert(rb);
00334 rb->emptyCounter=0;
00335 }
00336
00337
00338
00339 const char *GWEN_RingBuffer_GetReadPointer(const GWEN_RINGBUFFER *rb) {
00340 assert(rb);
00341 return rb->ptr+rb->readPos;
00342 }
00343
00344
00345
00346 char *GWEN_RingBuffer_GetWritePointer(const GWEN_RINGBUFFER *rb) {
00347 assert(rb);
00348 return rb->ptr+rb->writePos;
00349 }
00350
00351
00352
00353 void GWEN_RingBuffer_Reset(GWEN_RINGBUFFER *rb){
00354 assert(rb);
00355
00356 rb->readPos=0;
00357 rb->writePos=0;
00358 rb->bytesUsed=0;
00359 rb->maxBytesUsed=0;
00360 rb->emptyCounter=0;
00361 rb->fullCounter=0;
00362 rb->throughput=0;
00363 }
00364
00365
00366
00367
00368
00369