00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 #include "TMessageHandler.h"
00033 #include "TClass.h"
00034 #include "TROOT.h"
00035 #include "TVirtualMutex.h"
00036
00037 ClassImp(TMessageHandler)
00038
00039
00040 TMessageHandler::TMessageHandler(const TClass *cl, Bool_t derived)
00041 {
00042
00043
00044
00045 fClass = cl;
00046 fMessObj = 0;
00047 fMessId = 0;
00048 fSize = 0;
00049 fCnts = 0;
00050 fMessIds = 0;
00051 fDerived = derived;
00052
00053 if (fClass)
00054 SetName(fClass->GetName());
00055 else
00056 SetName("DefaultMessageHandler");
00057
00058 Add();
00059 }
00060
00061
00062 TMessageHandler::TMessageHandler(const char *cl, Bool_t derived)
00063 {
00064
00065
00066
00067 fClass = TClass::GetClass(cl);
00068 fMessObj = 0;
00069 fMessId = 0;
00070 fSize = 0;
00071 fCnts = 0;
00072 fMessIds = 0;
00073 fDerived = derived;
00074
00075 SetName(cl);
00076
00077 SetName(fClass->GetName());
00078 Add();
00079 }
00080
00081
00082 TMessageHandler:: ~TMessageHandler()
00083 {
00084
00085
00086 Remove();
00087 if (fSize <= 0) return;
00088 delete [] fCnts;
00089 delete [] fMessIds;
00090 }
00091
00092
00093 void TMessageHandler::Add()
00094 {
00095
00096
00097 R__LOCKGUARD2(gROOTMutex);
00098 gROOT->GetListOfMessageHandlers()->Add(this);
00099 if (fClass) {
00100
00101
00102
00103 Added();
00104 }
00105 }
00106
00107
00108 Int_t TMessageHandler::GetMessageCount(Int_t messId) const
00109 {
00110
00111
00112 if (fSize <= 0) return 0;
00113 for (Int_t i = 0; i < fSize; i++) {
00114 if (fMessIds[i] == messId) return fCnts[i];
00115 }
00116 return 0;
00117 }
00118
00119
00120 Int_t TMessageHandler::GetTotalMessageCount() const
00121 {
00122
00123
00124 if (fSize <= 0) return 0;
00125 Int_t count = 0;
00126 for (Int_t i = 0; i < fSize; i++) {
00127 count += fCnts[i];
00128 }
00129 return count;
00130 }
00131
00132
00133 void TMessageHandler::HandleMessage(Int_t id, const TObject *obj)
00134 {
00135
00136
00137
00138 if (fClass) {
00139 if (fDerived) {
00140 if(!obj->InheritsFrom(fClass)) return;
00141 } else {
00142 if (obj->IsA() != fClass) return;
00143 }
00144 }
00145
00146 fMessId = id;
00147 fMessObj = obj;
00148
00149 Notify();
00150
00151
00152 Int_t i;
00153
00154 if (fSize <= 0) {
00155 fSize = 1;
00156 fCnts = new Int_t[fSize];
00157 fMessIds = new Int_t[fSize];
00158 } else {
00159
00160 for (i = 0; i < fSize; i++) {
00161 if (fMessIds[i] == fMessId) {
00162 fCnts[i]++;
00163 return;
00164 }
00165 }
00166
00167 fSize++;
00168 Int_t *newCnts = new Int_t[fSize];
00169 Int_t *newMessIds = new Int_t[fSize];
00170 for (i = 0; i < fSize-1; i++) {
00171 newCnts[i] = fCnts[i];
00172 newMessIds[i] = fMessIds[i];
00173 }
00174 delete [] fCnts;
00175 delete [] fMessIds;
00176 fCnts = newCnts;
00177 fMessIds = newMessIds;
00178 }
00179 fCnts[fSize-1] = 1;
00180 fMessIds[fSize-1] = fMessId;
00181 }
00182
00183
00184 Bool_t TMessageHandler::Notify()
00185 {
00186
00187
00188 if (fClass) return kFALSE;
00189
00190
00191 if (!fMessObj) return kFALSE;
00192 Int_t uid = Int_t(fMessObj->IsA()->GetUniqueID());
00193 fMessId += 10000*uid;
00194 fMessId = -fMessId;
00195 Notified();
00196 return kFALSE;
00197 }
00198
00199
00200 void TMessageHandler::Print(Option_t *) const
00201 {
00202
00203
00204 printf("\n ****** Message Handler: %s has a total of %d messages\n",GetName(),GetTotalMessageCount());
00205 if (fSize <= 0) return;
00206 Int_t id, uid;
00207 const TClass *cl;
00208 TIter next(gROOT->GetListOfClasses());
00209 for (Int_t i = 0; i < fSize; i++) {
00210 id = fMessIds[i];
00211 cl = fClass;
00212 if (id < 0) {
00213 id = -id;
00214 uid = id/10000;
00215 id = id%10000;
00216 next.Reset();
00217 while ((cl = (TClass*)next())) {
00218 if (cl->GetUniqueID() == UInt_t(uid)) break;
00219 }
00220 }
00221 if (!cl) cl = gROOT->IsA();
00222 if (id == 1001) {
00223 printf(" Class: %-20s WARNINGs has %d counts\n",cl->GetName(),fCnts[i]);
00224 continue;
00225 }
00226 if (id == 1002) {
00227 printf(" Class: %-20s ERRORs has %d counts\n",cl->GetName(),fCnts[i]);
00228 continue;
00229 }
00230 printf(" Class: %-20s MessID = %5d has %d counts\n",cl->GetName(),id,fCnts[i]);
00231 }
00232 }
00233
00234
00235 void TMessageHandler::Remove()
00236 {
00237
00238
00239 R__LOCKGUARD2(gROOTMutex);
00240 gROOT->GetListOfMessageHandlers()->Remove(this);
00241 Removed();
00242 }