33 #include <sys/types.h>
45 static const int maxBuffSz = 1 << 30;
49 static const int isBigBuff = 0x40000000;
71 if (bucket) {
delete [] bucket; bucket = 0;}
75 if (maxMSZ <= iniBuffSz) {maxsz = iniBuffSz;
return;}
79 if (maxMSZ > maxBuffSz) maxMSZ = maxBuffSz;
83 chunksz = maxMSZ >> minBShift;
85 chunksz = 1<<(lg2+minBShift);
86 if (chunksz < maxMSZ) {lg2++; maxsz = chunksz << 1;}
91 bucket =
new BuckVec[lg2+1];
103 int mk, buffSz, bindex = 0;
107 if (sz <= 0 || sz > maxsz)
return 0;
112 mk = sz >> minBShift;
113 if (!mk) buffSz = minBuffSz;
115 buffSz = (bindex ? minBuffSz << bindex : minBuffSz);
116 if (buffSz < sz) {bindex++; buffSz = buffSz << 1;}
118 if (bindex >= slots)
return 0;
124 bucket[bindex].numreq++;
125 if ((bp = bucket[bindex].bnext))
126 {bucket[bindex].bnext = bp->next; bucket[bindex].numbuf--;}
135 if (posix_memalign((
void **)&memp, pagsz, buffSz))
return 0;
139 if (!(bp =
new XrdBuffer(memp, buffSz, bindex|isBigBuff)))
140 {free(memp);
return 0;}
144 slotXL.
Lock(); totalo += buffSz; totbuf++; slotXL.
UnLock();
157 int buffSz, mk, bindex = 0;
161 if (sz <= 0 || sz > maxsz)
return 0;
165 mk = sz >> minBShift;
166 if (!mk) buffSz = minBuffSz;
168 buffSz = (bindex ? minBuffSz << bindex : minBuffSz);
169 if (buffSz < sz) {bindex++; buffSz = buffSz << 1;}
171 if (bindex >= slots)
return 0;
184 int bindex = bp->bindex & ~isBigBuff;
189 bp->next = bucket[bindex].bnext;
190 bucket[bindex].bnext = bp;
191 bucket[bindex].numbuf++;
201 static char statfmt[] =
"<xlreqs>%d</xlreqs>"
202 "<xlmem>%lld</xlmem><xlbuffs>%d</xlbuffs>";
207 if (!buff)
return sizeof(statfmt) + 16*3;
211 if (do_sync) slotXL.
Lock();
212 nlen = snprintf(buff, blen, statfmt, totreq, totalo, totbuf);
213 if (do_sync) slotXL.
UnLock();
232 for (
int i = 0; i < slots; i++)
233 {
if (bucket[i].numbuf > 1 && bucket[i].numbuf > bucket[i].numreq)
234 {n = bucket[i].numbuf - bucket[i].numreq;
235 m = bucket[i].numbuf/2;
237 while(n-- && (bP = bucket[i].bnext))
238 {bucket[i].bnext = bP->next;
240 totalo -= bP->
bsize; totbuf--;
244 bucket[i].numreq = 0;
void Release(XrdBuffer *bp)
int Stats(char *buff, int blen, int do_sync=0)
XrdBuffer * Obtain(int bsz)
static int Log2(unsigned long long n)