12 #ifndef ROOT_TProcessID
13 #define ROOT_TProcessID
29 #include <type_traits>
43 template <
typename T>
class TAtomicPointer {
45 std::atomic<T> fAtomic;
48 TAtomicPointer() : fAtomic(nullptr)
50 static_assert(std::is_pointer<T>::value,
"Only pointer types supported");
53 ~TAtomicPointer() {
delete fAtomic.load(); }
55 T operator->()
const {
return fAtomic; }
57 operator T()
const {
return fAtomic; }
59 T operator=(
const T& t)
69 class TProcessID :
public TNamed {
72 TProcessID(
const TProcessID &ref);
73 TProcessID& operator=(
const TProcessID &ref);
76 std::atomic_int fCount;
77 ROOT::Internal::TAtomicPointer<TObjArray*> fObjects;
78 std::atomic_flag fLock;
80 static TProcessID *fgPID;
81 static TObjArray *fgPIDs;
82 static TExMap *fgObjPIDs;
84 static std::atomic_uint fgNumber;
88 virtual ~TProcessID();
90 virtual void Clear(Option_t *option=
"");
91 Int_t DecrementCount();
92 Int_t IncrementCount();
93 Int_t GetCount()
const {
return fCount;}
94 TObjArray *GetObjects()
const {
return fObjects;}
95 TObject *GetObjectWithID(UInt_t uid);
96 void PutObjectWithID(TObject *obj, UInt_t uid=0);
97 virtual void RecursiveRemove(TObject *obj);
99 static TProcessID *AddProcessID();
100 static UInt_t AssignID(TObject *obj);
101 static void Cleanup();
102 static UInt_t GetNProcessIDs();
103 static TProcessID *GetPID();
104 static TObjArray *GetPIDs();
105 static TProcessID *GetProcessID(UShort_t pid);
106 static TProcessID *GetProcessWithUID(
const TObject *obj);
107 static TProcessID *GetProcessWithUID(UInt_t uid,
const void *obj);
108 static TProcessID *GetSessionProcessID();
109 static UInt_t GetObjectCount();
110 static Bool_t IsValid(TProcessID *pid);
111 static void SetObjectCount(UInt_t number);
113 ClassDef(TProcessID,1)