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