00001 #ifndef __XrdBuffer_H__
00002 #define __XrdBuffer_H__
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #include <stdlib.h>
00016 #include <unistd.h>
00017 #include <sys/types.h>
00018 #include "XrdSys/XrdSysPthread.hh"
00019
00020
00021
00022
00023
00024 class XrdBuffer
00025 {
00026 public:
00027
00028 char * buff;
00029 int bsize;
00030
00031 XrdBuffer(char *bp, int sz, int ix)
00032 {buff = bp; bsize = sz; bindex = ix; next = 0;}
00033
00034 ~XrdBuffer() {if (buff) free(buff);}
00035
00036 friend class XrdBuffManager;
00037 private:
00038
00039 XrdBuffer *next;
00040 int bindex;
00041 static int pagesz;
00042 };
00043
00044
00045
00046
00047
00048 #define XRD_BUCKETS 12
00049 #define XRD_BUSHIFT 10
00050
00051
00052
00053
00054 class XrdBuffManager
00055 {
00056 public:
00057
00058 void Init();
00059
00060 XrdBuffer *Obtain(int bsz);
00061
00062 int Recalc(int bsz);
00063
00064 void Release(XrdBuffer *bp);
00065
00066 int MaxSize() {return maxsz;}
00067
00068 void Reshape();
00069
00070 void Set(int maxmem=-1, int minw=-1);
00071
00072 int Stats(char *buff, int blen, int do_sync=0);
00073
00074 XrdBuffManager(int minrst=20*60);
00075
00076 ~XrdBuffManager() {}
00077
00078 private:
00079
00080 const int slots;
00081 const int shift;
00082 const int pagsz;
00083 const int maxsz;
00084
00085 struct {XrdBuffer *bnext;
00086 int numbuf;
00087 int numreq;
00088 } bucket[XRD_BUCKETS];
00089
00090 int totreq;
00091 int totbuf;
00092 long long totalo;
00093 long long maxalo;
00094 int minrsw;
00095 int rsinprog;
00096 int totadj;
00097
00098 XrdSysCondVar Reshaper;
00099 static const char *TraceID;
00100 };
00101 #endif