254 TObjArray *TRef::fgExecs = 0;
255 TObject *TRef::fgObject = 0;
262 TRef::TRef(TObject *obj)
270 TRef::TRef(
const TRef &ref) : TObject(ref)
278 void TRef::operator=(TObject *obj)
283 if (obj->IsA()->CanIgnoreTObjectStreamer()) {
284 Error(
"operator= ",
"Class: %s IgnoreTObjectStreamer. Cannot reference object",obj->ClassName());
287 if (obj->TestBit(kHasUUID)) {
288 fPID = gROOT->GetUUIDs();
289 obj->SetBit(kIsReferenced);
291 uid = obj->GetUniqueID();
293 if (!obj->TestBit(kIsReferenced)) {
294 TProcessID::AssignID(obj);
296 uid = obj->GetUniqueID();
297 fPID = TProcessID::GetProcessWithUID(uid,obj);
307 TRef &TRef::operator=(
const TRef &ref)
310 SetUniqueID(ref.GetUniqueID());
312 SetBit(kHasUUID,ref.TestBit(kHasUUID));
320 Bool_t operator==(
const TRef &r1,
const TRef &r2)
322 if (r1.GetPID() == r2.GetPID() && r1.GetUniqueID() == r2.GetUniqueID())
return kTRUE;
329 Bool_t operator!=(
const TRef &r1,
const TRef &r2)
331 if (r1.GetPID() == r2.GetPID() && r1.GetUniqueID() == r2.GetUniqueID())
return kFALSE;
339 Int_t TRef::AddExec(
const char *name)
341 #ifdef R__COMPLETE_MEM_TERMINATION
342 if (!fgExecs) GetListOfExecs();
344 if (!fgExecs) fgExecs =
new TObjArray(10);
347 TExec *exec = (TExec*)fgExecs->FindObject(name);
350 exec =
new TExec(name,
"");
353 return fgExecs->IndexOf(exec);
359 TObjArray *TRef::GetListOfExecs()
361 #ifdef R__COMPLETE_MEM_TERMINATION
362 static TObjArray listOfExecs(10);
364 listOfExecs.SetOwner(kTRUE);
365 fgExecs = &listOfExecs;
368 if (!fgExecs) fgExecs =
new TObjArray(10);
377 TObject *TRef::GetObject()
const
381 if (!TProcessID::IsValid(fPID))
return 0;
382 UInt_t uid = GetUniqueID();
385 TRefTable *table = TRefTable::GetRefTable();
387 R__WRITE_LOCKGUARD(ROOT::gCoreMutex);
388 table->SetUID(uid, fPID);
393 TObject *obj = fPID->GetObjectWithID(uid);
398 Int_t execid = TestBits(0xff0000);
401 R__WRITE_LOCKGUARD(ROOT::gCoreMutex);
402 TExec *exec = (TExec*)fgExecs->At(execid-1);
405 fgObject =
const_cast<TRef*
>(
this);
407 if ((
const TRef*)fgObject !=
this)
411 uid = TProcessID::AssignID(obj);
412 ((TRef*)
this)->SetUniqueID(uid);
413 fPID->PutObjectWithID(obj,uid);
416 obj = fPID->GetObjectWithID(uid);
429 void TRef::SetAction(
const char *name)
431 TExec *exec = (TExec*)GetListOfExecs()->FindObject(name);
433 Error(
"SetAction",
"Unknown TExec: %s",name);
436 Int_t execid = 1 + fgExecs->IndexOf(exec);
437 SetBit(execid << 16);
449 void TRef::SetAction(TObject *parent)
452 if (gDirectory) gDirectory->SetTRefAction(
this,parent);
458 TObject *TRef::GetStaticObject() {
466 void TRef::SetObject(TObject *obj)
468 SetStaticObject(obj);
478 void TRef::SetStaticObject(TObject *obj)
486 void TRef::Streamer(TBuffer &R__b)
489 if (R__b.IsReading()) {
490 TObject::Streamer(R__b);
491 if (TestBit(kHasUUID)) {
494 TProcessUUID *pid = gROOT->GetUUIDs();
495 UInt_t number = pid->AddUUID(s.Data());
499 printf(
"Reading TRef (HasUUID) uid=%d, obj=%lx\n",GetUniqueID(),(Long_t)GetObject());
503 pidf += R__b.GetPidOffset();
504 fPID = R__b.ReadProcessID(pidf);
509 Int_t execid = R__b.GetTRefExecId();
510 if (execid) SetBit(execid<<16);
512 printf(
"Reading TRef, pidf=%d, fPID=%lx, uid=%d, obj=%lx\n",pidf,(Long_t)fPID,GetUniqueID(),(Long_t)GetObject());
516 TObject::Streamer(R__b);
518 if (TestBit(kHasUUID)) {
519 TObjString *objs = gROOT->GetUUIDs()->FindUUID(GetUniqueID());
520 objs->String().Streamer(R__b);
522 printf(
"Writing TRef (HasUUID) uid=%d, obj=%lx\n",GetUniqueID(),(Long_t)GetObject());
525 pidf = R__b.WriteProcessID(fPID);
528 printf(
"Writing TRef, pidf=%d, fPID=%lx, uid=%d, obj=%lx\n",pidf,(Long_t)fPID,GetUniqueID(),(Long_t)GetObject());