148 if (sz <= 0)
return 0;
149 if (sz > maxsz)
return xlBuff.Obtain(sz);
155 mk = minBuffSz << bindex;
156 if (mk < sz) {bindex++; mk = mk << 1;}
157 if (bindex >= slots)
return 0;
163 bucket[bindex].numreq++;
164 if ((bp = bucket[bindex].bnext))
165 {bucket[bindex].bnext = bp->next; bucket[bindex].numbuf--;}
174 pk = (mk < pagsz ? mk : pagsz);
175 if (posix_memalign((
void **)&memp, pk, mk))
return 0;
179 if (!(bp =
new XrdBuffer(memp, mk, bindex))) {free(memp);
return 0;}
185 if ((totalo += mk) > maxalo && !rsinprog)
186 {rsinprog = 1; Reshaper.Signal();}
245time_t delta, lastshape = time(0);
246long long memslot, memhave, memtarget = (
long long)(.80*(
float)maxalo);
248float requests, buffers;
255 while(Reshaper.Wait(minrsw) && totalo <= maxalo)
256 {
TRACE(MEM,
"Reshaper has " <<(totalo>>10) <<
"K; target " <<(memtarget>>10) <<
"K");}
257 if ((delta = (time(0) - lastshape)) < minrsw)
259 Timer.
Wait((minrsw-delta)*1000);
266 {requests = (float)totreq;
267 buffers = (float)totbuf;
268 for (i = 0; i < slots; i++)
269 {bufprof[i] = (int)(buffers*(((
float)bucket[i].numreq)/requests));
270 bucket[i].numreq = 0;
272 totreq = 0; memhave = totalo;
278 memslot = maxsz; numfreed = 0;
279 for (i = slots-1; i >= 0 && memhave > memtarget; i--)
281 while(bucket[i].numbuf > bufprof[i])
282 if ((bp = bucket[i].bnext))
283 {bucket[i].bnext = bp->next;
285 bucket[i].numbuf--; numfreed++;
286 memhave -= memslot; totalo -= memslot;
288 }
else {bucket[i].numbuf = 0;
break;}
290 memslot = memslot>>1;
296 TRACE(MEM,
"Pool reshaped; " <<numfreed <<
" freed; have " <<(memhave>>10) <<
"K; target " <<(memtarget>>10) <<
"K");
325 static char statfmt[] =
"<stats id=\"buff\"><reqs>%d</reqs>"
326 "<mem>%lld</mem><buffs>%d</buffs><adj>%d</adj>%s</stats>";
332 if (!buff)
return sizeof(statfmt) + 16*4 +
xlBuff.Stats(0,0);
336 if (do_sync) Reshaper.Lock();
337 xlBuff.Stats(xlStats,
sizeof(xlStats), do_sync);
338 nlen = snprintf(buff,blen,statfmt,totreq,totalo,totbuf,totadj,xlStats);
339 if (do_sync) Reshaper.UnLock();