00001 
00002 
00011 #include  "RingBuffer.h"
00012 
00013 
00014 using namespace jbxl;
00015 
00016 
00017 
00018 
00019 void  CRingBuffer::init_data(void)
00020 {
00021     buf     = NULL;
00022     bufsz   = 0;
00023     datasz  = 0;
00024     spoint  = 0;
00025     epoint  = 0;
00026     datano  = 0;
00027     state   = 0;
00028     enable  = FALSE;
00029 }
00030 
00031 
00032 
00033 BOOL  CRingBuffer::init(int ring_size, int data_size)
00034 {
00035     init_data();
00036 
00037     buf = (void**)malloc(ring_size*sizeof(void*));
00038     if (buf==NULL) return FALSE;
00039     memset(buf, 0, ring_size*sizeof(void*));
00040     bufsz  = ring_size;
00041     datasz = data_size;
00042 
00043     BOOL ret = TRUE;
00044     for (int i=0; i<bufsz; i++) {
00045         buf[i] = (void*)malloc(datasz);
00046         if (buf[i]==NULL) {
00047             this->free();
00048             ret = FALSE;
00049             state = -1;
00050             break;
00051         }
00052         memset(buf[i], 0, datasz);
00053     }
00054 
00055     if (ret) enable = TRUE;
00056 
00057     return ret;
00058 }
00059 
00060 
00061 
00062 void  CRingBuffer::free(void)
00063 {
00064     if (!isNull(buf)) {
00065         for (int i=0; i<bufsz; i++) {
00066             if (!isNull(buf[i])) {
00067                 ::free(buf[i]);
00068             }
00069         }
00070         ::free(buf);
00071     }    
00072     init_data();
00073 
00074     return;
00075 }
00076 
00077 
00078 
00079 void  CRingBuffer::clear(void)
00080 {
00081     for (int i=0; i<bufsz; i++) {
00082         memset(buf[i], 0, datasz);
00083     }
00084     spoint  = 0;
00085     epoint  = 0;
00086     datano  = 0;
00087     state   = 0;
00088 
00089     return;
00090 }
00091 
00092 
00093 
00094 void* CRingBuffer::get(void)
00095 {
00096     void* ptr = NULL;
00097 
00098     if (datano>0) {
00099         ptr = buf[spoint];
00100         spoint++;
00101         if (spoint==bufsz) spoint = 0;
00102         datano--;
00103     }
00104 
00105     return ptr;
00106 }
00107 
00108 
00109 
00110 void* CRingBuffer::get(int pos)
00111 {
00112     pos = epoint + pos;
00113     if (pos<0) pos = bufsz + pos % bufsz;
00114     else       pos = pos % bufsz;
00115 
00116     return buf[pos];
00117 }
00118 
00119 
00120 
00121 void  CRingBuffer::put(void* ptr)
00122 {
00123     memcpy(buf[epoint], ptr, datasz);
00124     epoint++;
00125     if (epoint==bufsz) epoint = 0;
00126     if (datano<bufsz)  datano++;
00127 
00128     return;
00129 }
00130 
00131 
00132 
00133 void  CRingBuffer::put(void* ptr, int pos)
00134 {
00135     pos = epoint + pos;
00136     if (pos<0) pos = bufsz + pos % bufsz;
00137     else       pos = pos % bufsz;
00138 
00139     memcpy(buf[pos], ptr, datasz);
00140 
00141     return;
00142 }
00143 
00144 
00145 
00146