31 #define DISABLE_DEBUGLOG
34 #include "pointerlist_p.h"
35 #include <gwenhywfar/debug.h>
45 GWEN_POINTERLIST_TABLE *idt;
50 idt->freeEntries=GWEN_POINTERLIST_TABLE_MAXENTRIES;
58 assert(idt->refCount);
59 if (--(idt->refCount)==0) {
70 for (i=0; i<GWEN_POINTERLIST_TABLE_MAXENTRIES; i++) {
71 if (idt->entries[i]==0) {
83 if (idt->freeEntries) {
86 i=GWEN_POINTERLIST_TABLE_MAXENTRIES-idt->freeEntries;
100 for (i=0; i<GWEN_POINTERLIST_TABLE_MAXENTRIES; i++) {
101 if (idt->entries[i]==ptr) {
113 for (i=0; i<GWEN_POINTERLIST_TABLE_MAXENTRIES; i++) {
114 if (idt->entries[i]==ptr) {
126 return GWEN_POINTERLIST_TABLE_MAXENTRIES==idt->freeEntries;
132 return idt->freeEntries==0;
138 return GWEN_POINTERLIST_TABLE_MAXENTRIES-idt->freeEntries;
146 for (i=0; i<GWEN_POINTERLIST_TABLE_MAXENTRIES; i++) {
147 if (idt->entries[i]!=0) {
149 return idt->entries[i];
160 for (i=(*tabIdx)+1; i<GWEN_POINTERLIST_TABLE_MAXENTRIES; i++) {
161 if (idt->entries[i]!=0) {
163 return idt->entries[i];
179 idl->tableStep=GWEN_POINTERLIST_DEFAULT_STEP;
187 assert(idl->refCount);
195 assert(idl->refCount);
196 if (idl->refCount==1) {
209 GWEN_POINTERLIST_TABLE **tablePtr;
214 tablePtr=idl->pIdTablePointers;
215 for (idx=0, tablePtr=idl->pIdTablePointers; idx<idl->idTableCount; idx++, tablePtr++) {
220 if (idx>=idl->idTableCount) {
222 GWEN_POINTERLIST_TABLE **newPtr;
225 newCount=idl->idTableCount+idl->tableStep;
226 newPtr=(GWEN_POINTERLIST_TABLE **)realloc(idl->pIdTablePointers,
sizeof(GWEN_POINTERLIST_TABLE*)*newCount);
229 memset((
void*)(newPtr+idl->idTableCount),
231 sizeof(GWEN_POINTERLIST_TABLE*)*(newCount-idl->idTableCount));
232 idl->pIdTablePointers=newPtr;
233 idl->pIdTablePointers[idl->idTableCount]=idt;
234 idl->lastTableIdx=idl->idTableCount;
235 idl->idTableCount=newCount;
238 idl->pIdTablePointers[idx]=idt;
239 idl->lastTableIdx=idx;
246 GWEN_POINTERLIST_TABLE *idt=
NULL;
247 GWEN_POINTERLIST_TABLE **tablePtr;
252 if (idl->pIdTablePointers==
NULL) {
254 idl->pIdTablePointers=(GWEN_POINTERLIST_TABLE **) malloc(
sizeof(GWEN_POINTERLIST_TABLE*)*(idl->tableStep));
255 assert(idl->pIdTablePointers);
256 memset(idl->pIdTablePointers, 0,
sizeof(
GWEN_POINTERLIST*)*(idl->tableStep));
257 idl->idTableCount=idl->tableStep;
260 for (idx=0, tablePtr=idl->pIdTablePointers; idx<idl->idTableCount; idx++, tablePtr++) {
266 if (idx>=idl->idTableCount) {
279 if (idl->pIdTablePointers) {
280 GWEN_POINTERLIST_TABLE *idt=
NULL;
281 GWEN_POINTERLIST_TABLE **tablePtr;
284 for (idx=0, tablePtr=idl->pIdTablePointers; idx<idl->idTableCount; idx++, tablePtr++) {
301 if (idl->pIdTablePointers) {
302 GWEN_POINTERLIST_TABLE *idt=
NULL;
303 GWEN_POINTERLIST_TABLE **tablePtr;
306 for (idx=0, tablePtr=idl->pIdTablePointers; idx<idl->idTableCount; idx++, tablePtr++) {
319 GWEN_POINTERLIST_TABLE *idt=
NULL;
320 GWEN_POINTERLIST_TABLE **tablePtr;
323 for (idx=0, tablePtr=idl->pIdTablePointers; idx<idl->idTableCount; idx++, tablePtr++) {
335 if (idl->pIdTablePointers) {
336 GWEN_POINTERLIST_TABLE *idt=
NULL;
337 GWEN_POINTERLIST_TABLE **tablePtr;
340 for (idx=0, tablePtr=idl->pIdTablePointers; idx<idl->idTableCount; idx++, tablePtr++) {
347 free(idl->pIdTablePointers);
348 idl->pIdTablePointers=
NULL;
361 nidl->tableStep=idl->tableStep;
363 nidl->idTableCount=idl->idTableCount;
364 nidl->entryCount=idl->entryCount;
365 if (idl->pIdTablePointers) {
366 for (idx=0; idx<idl->idTableCount; idx++) {
367 GWEN_POINTERLIST_TABLE *idt;
369 idt=idl->pIdTablePointers[idx];
371 GWEN_POINTERLIST_TABLE *nidt;
374 memmove(nidt->entries, idt->entries, GWEN_POINTERLIST_TABLE_MAXENTRIES*
sizeof(
void*));
375 nidt->freeEntries=idt->freeEntries;
388 assert(idl->refCount);
390 return idl->entryCount;
396 GWEN_POINTERLIST_TABLE *idt=
NULL;
397 GWEN_POINTERLIST_TABLE **tablePtr;
402 for (idx=0, tablePtr=idl->pIdTablePointers; idx<idl->idTableCount; idx++, tablePtr++) {
408 for (i=0; i<GWEN_POINTERLIST_TABLE_MAXENTRIES; i++) {
409 if (idt->entries[i]!=0) {
416 idIndex+=GWEN_POINTERLIST_TABLE_MAXENTRIES;
426 GWEN_POINTERLIST_TABLE *idt;
427 uint64_t tableNum=*pos / GWEN_POINTERLIST_TABLE_MAXENTRIES;
428 uint64_t tableIdx=*pos % GWEN_POINTERLIST_TABLE_MAXENTRIES;
429 GWEN_POINTERLIST_TABLE **tablePtr;
433 if (tableNum>idl->idTableCount) {
439 idIndex=(tableNum*GWEN_POINTERLIST_TABLE_MAXENTRIES);
440 for (idx=tableNum, tablePtr=idl->pIdTablePointers+tableNum; idx<idl->idTableCount; idx++, tablePtr++) {
447 for (i=tableIdx; i<GWEN_POINTERLIST_TABLE_MAXENTRIES; i++) {
448 if (idt->entries[i]!=0) {
456 for (i=0; i<GWEN_POINTERLIST_TABLE_MAXENTRIES; i++) {
457 if (idt->entries[i]!=0) {
465 idIndex+=GWEN_POINTERLIST_TABLE_MAXENTRIES;
512 GWEN_POINTERLIST_TABLE *idt=
NULL;
516 if (idl->pIdTablePointers==
NULL) {
518 idl->pIdTablePointers=(GWEN_POINTERLIST_TABLE **) malloc(
sizeof(GWEN_POINTERLIST_TABLE*)*(idl->tableStep));
519 assert(idl->pIdTablePointers);
520 memset(idl->pIdTablePointers, 0,
sizeof(GWEN_POINTERLIST_TABLE*)*(idl->tableStep));
521 idl->idTableCount=idl->tableStep;
524 idt=idl->pIdTablePointers[idl->lastTableIdx];
538 GWEN_POINTERLIST_TABLE *idt;
539 uint64_t tableNum=idx / GWEN_POINTERLIST_TABLE_MAXENTRIES;
540 uint64_t tableIdx=idx % GWEN_POINTERLIST_TABLE_MAXENTRIES;
543 if (tableNum>idl->idTableCount) {
548 idt=idl->pIdTablePointers[tableNum];
554 return idt->entries[tableIdx];