|
xrootd
|
00001 #ifndef __XrdBuffer_H__ 00002 #define __XrdBuffer_H__ 00003 /******************************************************************************/ 00004 /* */ 00005 /* X r d B u f f e r . h h */ 00006 /* */ 00007 /* (c) 2004 by the Board of Trustees of the Leland Stanford, Jr., University */ 00008 /* All Rights Reserved. See XrdInfo.cc for complete License Terms */ 00009 /* Produced by Andrew Hanushevsky for Stanford University under contract */ 00010 /* DE-AC03-76-SFO0515 with the Department of Energy */ 00011 /******************************************************************************/ 00012 00013 #include <stdlib.h> 00014 #include <unistd.h> 00015 #include <sys/types.h> 00016 #include "XrdSys/XrdSysPthread.hh" 00017 00018 /******************************************************************************/ 00019 /* x r d _ B u f f e r */ 00020 /******************************************************************************/ 00021 00022 class XrdBuffer 00023 { 00024 public: 00025 00026 char * buff; // -> buffer 00027 int bsize; // size of this buffer 00028 00029 XrdBuffer(char *bp, int sz, int ix) 00030 {buff = bp; bsize = sz; bindex = ix; next = 0;} 00031 00032 ~XrdBuffer() {if (buff) free(buff);} 00033 00034 friend class XrdBuffManager; 00035 private: 00036 00037 XrdBuffer *next; 00038 int bindex; 00039 static int pagesz; 00040 }; 00041 00042 /******************************************************************************/ 00043 /* x r d _ B u f f M a n a g e r */ 00044 /******************************************************************************/ 00045 00046 #define XRD_BUCKETS 12 00047 #define XRD_BUSHIFT 10 00048 00049 // There should be only one instance of this class per buffer pool. 00050 // 00051 class XrdOucTrace; 00052 class XrdSysError; 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(XrdSysError *lP, XrdOucTrace *tP, int minrst=20*60); 00075 00076 ~XrdBuffManager() {} // The buffmanager is never deleted 00077 00078 private: 00079 00080 XrdOucTrace *XrdTrace; 00081 XrdSysError *XrdLog; 00082 00083 const int slots; 00084 const int shift; 00085 const int pagsz; 00086 const int maxsz; 00087 00088 struct {XrdBuffer *bnext; 00089 int numbuf; 00090 int numreq; 00091 } bucket[XRD_BUCKETS]; // 1K to 1<<(szshift+slots-1)M buffers 00092 00093 int totreq; 00094 int totbuf; 00095 long long totalo; 00096 long long maxalo; 00097 int minrsw; 00098 int rsinprog; 00099 int totadj; 00100 00101 XrdSysCondVar Reshaper; 00102 static const char *TraceID; 00103 }; 00104 #endif
1.7.5