00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #include "TFree.h"
00013 #include "TList.h"
00014 #include "TFile.h"
00015 #include "Bytes.h"
00016 #include "Riostream.h"
00017
00018 ClassImp(TFree)
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036 TFree::TFree()
00037 {
00038
00039
00040 fFirst = fLast = 0;
00041 }
00042
00043
00044 TFree::TFree(TList *lfree, Long64_t first, Long64_t last)
00045 {
00046
00047
00048 fFirst = first;
00049 fLast = last;
00050 lfree->Add(this);
00051 }
00052
00053
00054 TFree *TFree::AddFree(TList *lfree, Long64_t first, Long64_t last)
00055 {
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067 TFree *idcur = this;
00068 while (idcur) {
00069 Long64_t curfirst = idcur->GetFirst();
00070 Long64_t curlast = idcur->GetLast();
00071 if (curlast == first-1) {
00072 idcur->SetLast(last);
00073 TFree *idnext = (TFree*)lfree->After(idcur);
00074 if (idnext == 0) return idcur;
00075 if (idnext->GetFirst() > last+1) return idcur;
00076 idcur->SetLast( idnext->GetLast() );
00077 lfree->Remove(idnext);
00078 delete idnext;
00079 return idcur;
00080 }
00081 if (curfirst == last+1) {
00082 idcur->SetFirst(first);
00083 return idcur;
00084 }
00085 if (first < curfirst) {
00086 TFree * newfree = new TFree();
00087 newfree->SetFirst(first);
00088 newfree->SetLast(last);
00089 lfree->AddBefore(idcur, newfree);
00090 return newfree;
00091 }
00092 idcur = (TFree*)lfree->After(idcur);
00093 }
00094 return 0;
00095 }
00096
00097
00098 TFree::~TFree()
00099 {
00100
00101
00102 }
00103
00104
00105 void TFree::FillBuffer(char *&buffer)
00106 {
00107
00108
00109 Version_t version = TFree::Class_Version();
00110 if (fLast > TFile::kStartBigFile) version += 1000;
00111 tobuf(buffer, version);
00112
00113 if (version > 1000) {
00114 tobuf(buffer, fFirst);
00115 tobuf(buffer, fLast);
00116 } else {
00117 tobuf(buffer, (Int_t)fFirst);
00118 tobuf(buffer, (Int_t)fLast);
00119 }
00120 }
00121
00122
00123 TFree *TFree::GetBestFree(TList *lfree, Int_t nbytes)
00124 {
00125
00126
00127 TFree *idcur = this;
00128 if (idcur == 0) return 0;
00129 TFree *idcur1 = 0;
00130 do {
00131 Long64_t nleft = Long64_t(idcur->fLast - idcur->fFirst +1);
00132 if (nleft == nbytes) {
00133
00134 return idcur;
00135 }
00136 if(nleft > (Long64_t)(nbytes+3)) {
00137 if (idcur1 == 0) {
00138 idcur1=idcur;
00139 }
00140 }
00141 idcur = (TFree*)lfree->After(idcur);
00142 } while (idcur !=0);
00143
00144
00145 if (idcur1) return idcur1;
00146
00147
00148 idcur = (TFree*)lfree->Last();
00149 Long64_t last = idcur->fLast+1000000000;
00150 idcur->SetLast(last);
00151 return idcur;
00152 }
00153
00154
00155 void TFree::ls(Option_t *) const
00156 {
00157
00158
00159 cout <<"Free Segment: "<<fFirst<<"\t"<<fLast<<endl;
00160 }
00161
00162
00163 void TFree::ReadBuffer(char *&buffer)
00164 {
00165
00166
00167 Version_t version;
00168 frombuf(buffer, &version);
00169 if (version > 1000) {
00170 frombuf(buffer, &fFirst);
00171 frombuf(buffer, &fLast);
00172 } else {
00173 Int_t first,last;
00174 frombuf(buffer, &first); fFirst = (Long64_t)first;
00175 frombuf(buffer, &last); fLast = (Long64_t)last;
00176 }
00177 }
00178
00179
00180 Int_t TFree::Sizeof() const
00181 {
00182
00183
00184 if (fLast > TFile::kStartBigFile) return 18;
00185 else return 10;
00186 }
00187