23#include "RConfigure.h"
165 int r =
fC->TimedWaitRelative(100);
177 if (
r == 0 ||
r == 1) {
291 Info(
"TThread::TThread",
"TThread attached to running thread");
349#ifdef ROOT_CORE_THREAD_TBB
373 SetComment(
"Constructor: MainInternalMutex Locking");
375 SetComment(
"Constructor: MainInternalMutex Locked");
394 Info(
"TThread::~TThread",
"thread deleted");
398 SetComment(
"Destructor: MainInternalMutex Locking");
400 SetComment(
"Destructor: MainInternalMutex Locked");
427 th->
Info(
"TThread::Delete",
"deleting thread");
499 TTHREAD_TLS(
TThread *) self =
nullptr;
516 Error(
"Join",
"thread not running");
521 Error(
"Join",
"cannot join detached thread");
531 return helper.
Join();
542 ::Error(
"TThread::Join",
"cannot find thread 0x%lx", jid);
582 Info(
"TThread::Run",
"thread run requested");
597 Warning(
"TThread::Kill",
"thread is not running");
616 ::Warning(
"TThread::Kill(Long_t)",
"thread 0x%lx not found",
id);
632 ::Warning(
"TThread::Kill(const char*)",
"thread %s not found",
name);
737 th->
Info(
"TThread::AfterCancel",
"thread is canceled");
739 ::Error(
"TThread::AfterCancel",
"zero thread pointer passed");
767 if (absSec) *absSec = t.
GetSec();
817 th->
Info(
"TThread::Function",
"thread is running");
836 th->
Info(
"TThread::Function",
"thread has finished");
852 ::Info(
"TThread::Ps",
"no threads have been created");
863 printf(
" Thread State\n");
865 memset(cbuf,
' ',
sizeof(cbuf));
866 snprintf(cbuf,
sizeof(cbuf),
"%3d %s:0x%lx", num--,
l->GetName(),
l->fId);
867 i = (
int)strlen(cbuf);
871 printf(
"%30s", cbuf);
881 default: printf(
"Invalid ");
883 if (
l->fComment[0]) printf(
" // %s",
l->fComment);
922 va_start(ap,
va_(fmt));
924 Int_t buf_size = 2048;
928 buf =
new char[buf_size];
930 int n = vsnprintf(buf, buf_size,
va_(fmt), ap);
933 if (
n == -1 ||
n >= buf_size) {
942 arr[1] = (
void*) buf;
943 if (
XARequest(
"PRTF", 2, arr,
nullptr)) {
961 Int_t buf_size = 2048;
965 buf =
new char[buf_size];
967 int n = vsnprintf(buf, buf_size, fmt, ap);
970 if (
n == -1 ||
n >= buf_size) {
976 const std::size_t bufferSize = buf_size + strlen(
gSystem->GetError()) + 5;
977 char *buf1 =
new char[bufferSize];
986 arr[2] = (
void*) location;
994 ::GetErrorHandler()(level,
kTRUE, location, bp);
1007 char *loc =
nullptr;
1010 const std::size_t bufferSize = strlen(location) + strlen(
GetName()) + 32;
1011 loc =
new char[bufferSize];
1014 const std::size_t bufferSize = strlen(
GetName()) + 32;
1015 loc =
new char[bufferSize];
1044 th->
SetComment(
"XARequest: XActMutex Locking");
1046 th->
SetComment(
"XARequest: XActMutex Locked");
1061 if (condimp) condimp->
Wait();
1064 if (iret) *iret =
fgXArt;
1083 char const acts[] =
"PRTF CUPD CANV CDEL PDCD METH ERRO";
1084 enum { kPRTF = 0, kCUPD = 5, kCANV = 10, kCDEL = 15,
1085 kPDCD = 20, kMETH = 25, kERRO = 30 };
1086 int iact = strstr(acts,
fgXAct) - acts;
1092 printf(
"%s\n", (
const char*)
fgXArr[1]);
1099 const char *location = (
const char*)
fgXArr[2];
1100 char *mess = (
char*)
fgXArr[3];
1111 union CastFromFuncToVoidPtr_t {
1112 void (*fFuncPtr)(
void*);
1114 } castFromFuncToVoidPtr;
1115 castFromFuncToVoidPtr.fVoidPtr =
fgXArr[2];
1116 (*castFromFuncToVoidPtr.fFuncPtr)(
fgXArr[1]);
1125 cmd.
Form(
"((TCanvas *)0x%zx)->Constructor();",(
size_t)
fgXArr[1]);
1134 cmd.
Form(
"((TCanvas *)0x%zx)->Constructor((char*)0x%zx,(char*)0x%zx,*((Int_t*)(0x%zx)));",(
size_t)
fgXArr[1],(
size_t)
fgXArr[2],(
size_t)
fgXArr[3],(
size_t)
fgXArr[4]);
1143 cmd.
Form(
"((TCanvas *)0x%zx)->Constructor((char*)0x%zx,(char*)0x%zx,*((Int_t*)(0x%zx)),*((Int_t*)(0x%zx)));",(
size_t)
fgXArr[1],(
size_t)
fgXArr[2],(
size_t)
fgXArr[3],(
size_t)
fgXArr[4],(
size_t)
fgXArr[5]);
1155 cmd.
Form(
"((TCanvas *)0x%zx)->Constructor((char*)0x%zx,(char*)0x%zx,*((Int_t*)(0x%zx)),*((Int_t*)(0x%zx)),*((Int_t*)(0x%zx)),*((Int_t*)(0x%zx)));",(
size_t)
fgXArr[1],(
size_t)
fgXArr[2],(
size_t)
fgXArr[3],(
size_t)
fgXArr[4],(
size_t)
fgXArr[5],(
size_t)
fgXArr[6],(
size_t)
fgXArr[7]);
1164 cmd.
Form(
"((TCanvas *)0x%zx)->Destructor();",(
size_t)
fgXArr[1]);
1180 ::Error(
"TThread::XAction",
"wrong case");
1184 if (condimp) condimp->
Signal();
int Int_t
Signed integer 4 bytes (int).
long Longptr_t
Integer large enough to hold a pointer (platform-dependent).
unsigned int UInt_t
Unsigned integer 4 bytes (unsigned int).
unsigned long ULong_t
Unsigned long integer 4 bytes (unsigned long). Size depends on architecture.
long Long_t
Signed long integer 4 bytes (long). Size depends on architecture.
bool Bool_t
Boolean (0=false, 1=true) (bool).
float Float_t
Float 4 bytes (float).
externTApplication * gApplication
ErrorHandlerFunc_t GetErrorHandler()
Returns the current error handler function.
externInt_t gErrorAbortLevel
non-ignored errors with level equal or above this value will call abort(). Default is kSysError+1.
constexpr Int_t kSysError
externTInterpreter * gCling
externTVirtualMutex * gInterpreterMutex
externTVirtualMutex * gROOTMutex
externTThreadFactory * gThreadFactory
R__EXTERN void **(* gThreadTsd)(void *, Int_t)
static TMutex * gMainInternalMutex
static void ThreadInternalUnLock()
static void CINT_alloc_lock()
static TThreadTearDownGuard gTearDownGuard
static Bool_t fgIsTearDown(kFALSE)
static void ThreadInternalLock()
void ROOT_TThread_Initialize()
static void CINT_alloc_unlock()
externTVirtualMutex * gGlobalMutex
#define R__LOCKGUARD(mutex)
externInt_t(* gThreadXAR)(const char *xact, Int_t nb, void **ar, Int_t *iret)
virtual void SetAlloclockfunc(void(*)()) const
static TInterpreter * Instance()
returns gInterpreter global
TJoinHelper(TThread *th, void **ret)
Constructor of Thread helper class.
Int_t Join()
Thread join function.
~TJoinHelper()
Destructor.
static void * JoinFunc(void *p)
Static method which runs in a separate thread to handle thread joins without blocking the main thread...
Method or function calling interface.
Int_t UnLock() override
Unlock the mutex.
Int_t Lock() override
Lock the mutex.
const char * GetName() const override
Returns name of object.
virtual void Warning(const char *method, const char *msgfmt,...) const
Issue warning message.
virtual void Error(const char *method, const char *msgfmt,...) const
Issue error message.
virtual void Info(const char *method, const char *msgfmt,...) const
Issue info message.
const char * Data() const
void Form(const char *fmt,...)
Formats a string using a printf style format descriptor.
~TThreadCleaner()
Call user clean up routines.
Bool_t Notify() override
Periodically execute the TThread::XAction() method in the main thread.
TThreadTimer(Long_t ms=kItimerResolution+5)
Create thread timer.
<div class="legacybox"><h2>Legacy Code</h2> TThread is a legacy interface: there will be no bug fixes...
static TThread * GetThread(Long_t id)
Static method to find a thread by id.
static Int_t CleanUpPop(Int_t exe=0)
Static method which pops thread cleanup method off stack.
static Int_t CancelPoint()
Static method to set a cancellation point.
static Int_t Sleep(ULong_t secs, ULong_t nanos=0)
Static method to sleep the calling thread.
static void **volatile fgXArr
static Int_t CleanUpPush(void *free, void *arg=nullptr)
Static method which pushes thread cleanup method on stack.
static Int_t TryLock()
Static method to try to lock the main thread mutex.
void SetPriority(EPriority pri)
Set thread priority.
static Int_t Exists()
Static method to check if threads exist.
static void Ps()
Static method listing the existing threads.
static void ** GetTls(Int_t k)
Static method that initializes the TLS array of a thread and returns the reference to a given positio...
static TThreadImp * fgThreadImp
static Int_t UnLock()
Static method to unlock the main thread mutex.
Int_t Kill()
Kill this thread.
static TMutex * fgMainMutex
static volatile Int_t fgXAnb
Long_t Join(void **ret=nullptr)
Join this thread.
static void XAction()
Static method called via the thread timer to execute in the main thread certain commands.
virtual ~TThread()
Cleanup the thread.
static Int_t SetCancelAsynchronous()
Static method to set the cancellation response type of the calling thread to asynchronous,...
static Int_t CleanUp()
Static method to cleanup the calling thread.
void ErrorHandler(int level, const char *location, const char *fmt, va_list ap) const
Thread specific error handler function.
static Int_t GetTime(ULong_t *absSec, ULong_t *absNanoSec)
Static method to get the current time.
static Long_t SelfId()
Static method returning the id for the current thread.
void Constructor()
Common thread constructor.
static Int_t SetCancelOn()
Static method to turn on thread cancellation.
static void ** Tsd(void *dflt, Int_t k)
Static method returning a pointer to thread specific data container of the calling thread.
Int_t Run(void *arg=nullptr, const int affinity=-1)
Start the thread.
static volatile Int_t fgXArt
void SetComment(const char *txt=nullptr)
void DoError(Int_t level, const char *location, const char *fmt, va_list va) const override
Interface to ErrorHandler.
static Int_t XARequest(const char *xact, Int_t nb, void **ar, Int_t *iret)
Static method used to allow commands to be executed by the main thread.
static std::atomic< char * > volatile fgXAct
static void * Function(void *ptr)
Static method which is called by the system thread function and which in turn calls the actual user f...
static void Printf(const char *fmt,...)
Static method providing a thread safe printf. Appends a newline.
static Int_t Lock()
Static method to lock the main thread mutex.
void(* VoidFunc_t)(void *)
friend class TThreadTimer
static Int_t SetCancelOff()
Static method to turn off thread cancellation.
static void Init()
Initialize global state and variables once.
static Int_t SetCancelDeferred()
Static method to set the cancellation response type of the calling thread to deferred,...
friend class TThreadCleaner
static void AfterCancel(TThread *th)
Static method which is called after the thread has been canceled.
static TMutex * fgXActMutex
static Bool_t IsInitialized()
Return true, if the TThread objects have been initialize.
static TThread * Self()
Static method returning pointer to current thread.
static Int_t Exit(void *ret=nullptr)
Static method which terminates the execution of the calling thread.
static void Initialize()
Initialize the Thread package.
static TCondition * fgXActCondi
TThread(const TThread &)=delete
void *(* VoidRtnFunc_t)(void *)
void Delete(Option_t *option="") override
Delete this object.
The TTimeStamp encapsulates seconds and ns since EPOCH.
void Reset()
Reset the timer.
TTimer(const TTimer &)=delete
This class implements a mutex interface.
TVirtualPad is an abstract base class for the Pad and Canvas classes.
externTVirtualRWMutex * gCoreMutex