32#ifndef MADNESS_WORLD_THREAD_H__INCLUDED
33#define MADNESS_WORLD_THREAD_H__INCLUDED
61#ifdef MADNESS_TASK_PROFILING
67 extern char * cplus_demangle (
const char *mangled,
int options);
76#include <tbb/task_arena.h>
77#ifndef TBB_PREVIEW_GLOBAL_CONTROL
78# define TBB_PREVIEW_GLOBAL_CONTROL 1
80# include <tbb/global_control.h>
84#ifndef _SC_NPROCESSORS_CONF
88#include <sys/sysctl.h>
98 void error(
const char *msg);
119 sched_getaffinity(0,
sizeof(
mask), &
mask);
120 for (
size_t i=0; i<
maxncpu; i++) {
121 if (CPU_ISSET(
int(i),&
mask)) {
127 std::cout <<
"ncpu: " <<
get_ncpu() << std::endl;
128 for (
size_t i=0; i<
get_ncpu(); i++) {
131 std::cout << std::endl;
135 if (this->print) { };
152 sched_setaffinity(0,
sizeof(
mask), &
mask);
153 if (
print) std::cout <<
"bound thread to " << cpu << std::endl;
159 extern ThreadBinder
binder;
181 static void*
main(
void* self);
188 const int rc = pthread_key_create(&
thread_key,
nullptr);
206#if defined(HAVE_IBMBGQ) and defined(HPM)
207 static const int hpm_thread_id_all = -10;
208 static const int hpm_thread_id_main = -2;
209 static bool main_instrumented;
210 static bool all_instrumented;
211 static int hpm_thread_id;
251 return pthread_cancel(
get_id());
268#if defined(HAVE_IBMBGQ) and defined(HPM)
273 static void set_hpm_thread_env(
int hpm_thread_id);
392 else flags &= ~STEALABLE;
403 flags &= ~HIGHPRIORITY;
440 template <
typename Archive>
532#ifdef MADNESS_TASK_PROFILING
534 namespace profiling {
543 std::pair<void*, unsigned short>
id_;
559 const char*
name = abi::__cxa_demangle(symbol, 0, 0, &
status);
561 char*
name = cplus_demangle(symbol, DMGL_NO_OPTS);
568 os << symbol <<
"\t";
582 void*
const * func_ptr =
const_cast<void*
const *
>(&
id_.first);
583 char** bt_sym = backtrace_symbols(func_ptr, 1);
587 std::string mangled_name;
592 std::istringstream iss(bt_sym[0]);
594 std::string file, address;
595 iss >> frame >> file >> address >> mangled_name;
599 const char* first = strchr(bt_sym[0],
'(');
602 const char* last = strrchr(first,
'+');
604 mangled_name.assign(first, (last - first) - 1);
625 void start(
const std::pair<void*, unsigned short>&
id,
626 const unsigned short threads,
const double submit_time)
654 os << std::hex << std::showbase << te.
id_.first <<
655 std::dec << std::noshowbase <<
"\t";
658 switch(te.
id_.second) {
661 const std::string mangled_name = te.
get_name();
664 if(! mangled_name.empty())
680 const std::streamsize precision = os.precision();
682 os << std::fixed <<
"\t" << te.
times_[0]
684 os.precision(precision);
784 for(std::size_t i = 0; i <
n_; ++i)
785 os << thread_id <<
"\t" <<
events_[i] << std::endl;
824 while(
head_ !=
nullptr) {
841 if(
head_ !=
nullptr) {
879#ifdef MADNESS_TASK_PROFILING
882 std::pair<void*, unsigned short>
id_;
905 template <
typename T>
920 template <
typename fnT>
921 static typename std::enable_if<detail::function_traits<fnT>::value ||
923 make_id(std::pair<void*,unsigned short>&
id, fnT fn) {
935 template <
typename fnobjT>
938 make_id(std::pair<void*,unsigned short>&
id,
const fnobjT&) {
939 id.first =
reinterpret_cast<void*
>(
const_cast<char*
>(
typeid(fnobjT).
name()));
949 virtual void get_id(std::pair<void*,unsigned short>&
id)
const {
954#ifndef HAVE_INTEL_TBB
975 bool run_multi_threaded() {
982#ifdef MADNESS_TASK_PROFILING
986#ifdef MADNESS_TASK_PROFILING
993 std::atomic<bool> barrier_flag{
false};
996#ifdef MADNESS_TASK_PROFILING
1001 run(TaskThreadEnv(nthread,
id, barrier));
1003#ifdef MADNESS_TASK_PROFILING
1004 const bool cleanup = barrier->
enter(
id);
1008 return barrier->
enter(
id);
1045 void set_nqueued(
int n) { nqueued = n; }
1051 bool release_nqueued() {
return nqueued.
dec_and_test(); }
1058 ParsecRuntime::delete_parsec_task(parsec_task);
1059 parsec_task =
nullptr;
1076 barrier =
new Barrier(nthread);
1083 parsec_task_t *parsec_task;
1159 virtual void get_id(std::pair<void*,unsigned short>&
id)
const {
1171#ifdef MADNESS_TASK_PROFILING
1179#ifdef MADNESS_TASK_PROFILING
1223#if defined(HAVE_IBMBGQ) and defined(HPM)
1224 static unsigned int main_hpmctx;
1243 if (!wait &&
queue.empty())
return false;
1244 std::pair<PoolTaskInterface*,bool> t =
queue.pop_front(wait);
1245#ifdef MADNESS_TASK_PROFILING
1250 if (t.second && t.first) {
1251#ifdef MADNESS_TASK_PROFILING
1252 t.first->set_event(event_list->
event());
1258 task->run_multi_threaded();
1259 if (
task->release_nqueued())
delete task;
1287 int ntask =
queue.pop_front(
nmax, taskbuf, wait);
1288#ifdef MADNESS_TASK_PROFILING
1292 for (
int i=0; i<ntask; ++i) {
1294#ifdef MADNESS_TASK_PROFILING
1298 task->run_multi_threaded();
1301 if (
task->release_nqueued())
delete task;
1307 ntask = parsec_runtime->test();
1333#ifndef MADNESS_ASSERTIONS_DISABLE
1335 std::cerr <<
"!!! ERROR: The thread pool has not been initialized.\n"
1336 <<
"!!! ERROR: Call madness::initialize before submitting tasks to the task queue.\n";
1344#if !(defined(HAVE_INTEL_TBB) || defined(HAVE_PARSEC))
1345 queue.lock_and_flush_prebuf();
1351 static ParsecRuntime *parsec_runtime;
1364 static void begin(
int nthread=-1);
1374#ifdef MADNESS_TASK_PROFILING
1380 parsec_runtime->schedule(
task);
1390 [task_p = std::unique_ptr<PoolTaskInterface>(
task)] ()
noexcept {
1396 int task_threads =
task->get_nthread();
1403 task->set_nqueued(task_threads);
1406 if (
task->is_high_priority() && (task_threads == 1)) {
1420 template <
typename opT>
1428 static void add(
const std::vector<PoolTaskInterface*>& tasks) {
1430 MADNESS_EXCEPTION(
"Do not add tasks to the madness task queue when using Intel TBB.", 1);
1432 typedef std::vector<PoolTaskInterface*>::const_iterator iteratorT;
1433 for (iteratorT it=tasks.begin(); it!=tasks.end(); ++it) {
1443#ifdef HAVE_INTEL_TBB
1447#ifdef MADNESS_TASK_PROFILING
1490 template <
typename Probe>
1491 static void await(
const Probe& probe,
bool dowork =
true,
bool sleep =
false) {
1511 if(((
current_time - start) > timeout) && (timeout > 1.0)) {
1512 std::cerr <<
"!!MADNESS: Hung queue?" << std::endl;
1513 if (counter++ > 3) {
1516 snprintf(errstr,
bufsize,
"ThreadPool::await() timed out after %.1lf seconds", timeout);
1518 __LINE__, __FUNCTION__,
1552 delete parsec_runtime;
1563 int sleep_duration_in_microseconds = 0) {
1564#if !HAVE_INTEL_TBB && !HAVE_PARSEC
1566 sleep_duration_in_microseconds);
1583 int sleep_duration_in_microseconds = 0) {
1590#if !(defined(HAVE_PARSEC) || defined(HAVE_INTEL_TBB))
1596 template<
class F,
class... Args>
1598 noexcept(std::is_nothrow_invocable_v<
F, Args...>) {
1600 return std::invoke(std::forward<F>(
f), std::forward<Args>(args)...);
1603 template<
class R,
class F,
class... Args>
1605 noexcept(std::is_nothrow_invocable_v<
F, Args...>) {
1607#if __cplusplus < 202302L
1608 if constexpr (std::is_void_v<R>)
1609 std::invoke(std::forward<F>(
f), std::forward<Args>(args)...);
1611 return std::invoke(std::forward<F>(
f), std::forward<Args>(args)...);
1613 return std::invoke_r<R>(std::forward<F>(
f), std::forward<Args>(args)...);
simple class for testing the solver
Definition derivatives.cc:60
An integer with atomic set, get, read+increment, read+decrement, and decrement+test operations.
Definition atomicint.h:126
bool dec_and_test()
Decrements the counter and returns true if the new value is zero,.
Definition atomicint.h:297
Definition worldmutex.h:730
void register_thread(int id, std::atomic< bool > *pflag)
Each thread calls this once before first use.
Definition worldmutex.h:749
bool enter(const int id)
Each thread calls this with its id (0,..,nthread-1) to enter the barrier.
Definition worldmutex.h:760
A thread safe, fast but simple doubled-ended queue.
Definition dqueue.h:80
Base class for exceptions thrown in MADNESS.
Definition madness_exception.h:66
Definition worldmutex.h:128
void wait()
Definition worldmutex.cc:103
void reset()
Definition worldmutex.h:143
Mutex using pthread mutex operations.
Definition worldmutex.h:150
Lowest level task interface.
Definition thread.h:874
double submit_time_
Definition thread.h:881
void execute()
Definition thread.h:1121
virtual ~PoolTaskInterface()=default
Destructor.
static std::enable_if<!(detail::function_traits< fnobjT >::value||detail::memfunc_traits< fnobjT >::value)>::type make_id(std::pair< void *, unsigned short > &id, const fnobjT &)
Definition thread.h:938
profiling::TaskEvent * task_event_
Definition thread.h:880
PoolTaskInterface()
Default constructor.
Definition thread.h:1092
virtual void run(const TaskThreadEnv &info)=0
Override this method to implement a multi-threaded task.
PoolTaskInterface(const TaskAttributes &attr)
Definition thread.h:1099
std::pair< void *, unsigned short > id_
Definition thread.h:882
void set_event(profiling::TaskEvent *task_event)
Definition thread.h:888
void submit()
Collect info on the task and record the submit time.
Definition thread.h:893
static std::enable_if< detail::function_traits< fnT >::value||detail::memfunc_traits< fnT >::value >::type make_id(std::pair< void *, unsigned short > &id, fnT fn)
Definition thread.h:923
virtual void get_id(std::pair< void *, unsigned short > &id) const
Definition thread.h:949
void set_nthread(int nthread)
Call this to reset the number of threads before the task is submitted.
Definition thread.h:1112
A no-operation task used for various purposes.
Definition thread.h:1146
void run(const TaskThreadEnv &)
Execution function that does nothing.
Definition thread.h:1149
virtual ~PoolTaskNull()
Destructor.
Definition thread.h:1152
virtual void get_id(std::pair< void *, unsigned short > &id) const
Definition thread.h:1159
Contains attributes of a task.
Definition thread.h:330
TaskAttributes & set_highpriority(bool hipri)
Sets the high priority attribute.
Definition thread.h:399
TaskAttributes(const TaskAttributes &attr)
Copy constructor.
Definition thread.h:350
bool is_generator() const
Test if the generator attribute is true.
Definition thread.h:358
static TaskAttributes hipri()
Definition thread.h:457
TaskAttributes & set_generator(bool generator_hint)
Sets the generator attribute.
Definition thread.h:379
static const unsigned long GENERATOR
Mask for generator bit.
Definition thread.h:335
static const unsigned long STEALABLE
Mask for stealable bit.
Definition thread.h:336
bool is_stealable() const
Test if the stealable attribute is true.
Definition thread.h:365
TaskAttributes(unsigned long flags=0)
Sets the attributes to the desired values.
Definition thread.h:344
static const unsigned long NTHREAD
Mask for nthread byte.
Definition thread.h:334
void set_nthread(int nthread)
Set the number of threads.
Definition thread.h:421
static TaskAttributes generator()
Definition thread.h:449
bool is_high_priority() const
Test if the high priority attribute is true.
Definition thread.h:372
TaskAttributes & set_stealable(bool stealable)
Sets the stealable attribute.
Definition thread.h:390
static TaskAttributes multi_threaded(int nthread)
Definition thread.h:465
void serialize(Archive &ar)
Serializes the attributes for I/O.
Definition thread.h:441
unsigned long flags
Byte-string storing the specified attributes.
Definition thread.h:331
int get_nthread() const
Get the number of threads.
Definition thread.h:429
static const unsigned long HIGHPRIORITY
Mask for priority bit.
Definition thread.h:337
virtual ~TaskAttributes()
Definition thread.h:353
Used to pass information about the thread environment to a user's task.
Definition thread.h:473
int id() const
Get the ID of this thread.
Definition thread.h:513
TaskThreadEnv(int nthread, int id, Barrier *barrier)
Constructor collecting necessary environmental information.
Definition thread.h:485
TaskThreadEnv(int nthread, int id)
Constructor collecting necessary environmental information.
Definition thread.h:498
bool barrier() const
Definition thread.h:521
Barrier * _barrier
Pointer to the shared barrier, null if there is only a single thread.
Definition thread.h:476
const int _nthread
Number of threads collaborating on task.
Definition thread.h:474
int nthread() const
Get the number of threads collaborating on this task.
Definition thread.h:506
const int _id
ID of this thread (0,...,nthread-1).
Definition thread.h:475
Simplified thread wrapper to hide pthread complexity.
Definition thread.h:171
virtual void run()=0
Function to be executed by the thread.
int pool_num
Stores index of thread in pool or -1.
Definition thread.h:183
void set_pool_thread_index(int i)
Sets the index of this thread within the pool.
Definition thread.h:202
static void exit()
A thread can call this to terminate its execution.
Definition thread.h:233
ThreadBase()
Default constructor.
Definition thread.h:220
const pthread_t & get_id() const
Get the pthread id of this thread (if running).
Definition thread.h:238
static pthread_key_t thread_key
Thread id key.
Definition thread.h:174
static ThreadBase * this_thread()
Definition thread.h:264
int cancel() const
Cancel this thread.
Definition thread.h:250
pthread_t id
Definition thread.h:184
static void delete_thread_key()
Definition thread.h:194
static int num_hw_processors()
Get number of actual hardware processors.
Definition thread.cc:174
void start()
Start the thread running.
Definition thread.cc:158
virtual ~ThreadBase()
Definition thread.h:222
static void init_thread_key()
Definition thread.h:187
int get_pool_thread_index() const
Get index of this thread in ThreadPool.
Definition thread.h:245
bool do_bind
Definition thread.h:108
void bind()
Definition thread.h:144
size_t get_ncpu() const
Definition thread.h:142
ThreadBinder(bool print=false)
Definition thread.h:115
size_t cpus[maxncpu]
Definition thread.h:109
std::atomic< size_t > nextcpu
Definition thread.h:110
const size_t * get_cpus() const
Definition thread.h:140
bool print
Definition thread.h:106
static const size_t maxncpu
Definition thread.h:105
static thread_local bool bound
Definition thread.h:111
void set_do_bind(bool value)
Definition thread.h:138
size_t ncpu
Definition thread.h:107
ThreadPool thread object.
Definition thread.h:1168
ThreadPoolThread()
Definition thread.h:1176
profiling::TaskProfiler profiler_
Definition thread.h:1172
profiling::TaskProfiler & profiler()
Task profiler accessor.
Definition thread.h:1184
virtual ~ThreadPoolThread()=default
A singleton pool of threads for dynamic execution of tasks.
Definition thread.h:1194
static void add(PoolTaskInterface *task)
Add a new task to the pool.
Definition thread.h:1373
int nthreads
Number of threads.
Definition thread.h:1214
static std::unique_ptr< tbb::task_arena > tbb_arena
Definition thread.h:1357
static bool run_task()
An otherwise idle thread can all this to run a task.
Definition thread.h:1442
static void add(const std::vector< PoolTaskInterface * > &tasks)
Add a vector of tasks to the pool.
Definition thread.h:1428
ThreadPool(ThreadPool &&)=delete
void operator=(ThreadPool &&)=delete
volatile bool finish
Set to true when time to stop.
Definition thread.h:1215
ThreadPool(const ThreadPool &)=delete
static void set_wait_policy(WaitPolicy policy, int sleep_duration_in_microseconds=0)
Definition thread.h:1561
static int default_nthread()
Get the number of threads from the environment.
Definition thread.cc:325
static const DQStats & get_stats()
Returns queue statistics.
Definition thread.cc:466
static void end()
Definition thread.cc:437
AtomicInt nfinished
Thread pool exit counter.
Definition thread.h:1216
void operator=(const ThreadPool &)=delete
static ThreadPool * instance_ptr
Singleton pointer.
Definition thread.h:1219
ThreadPoolThread * threads
Array of threads.
Definition thread.h:1211
void thread_main(ThreadPoolThread *const thread)
Definition thread.cc:349
~ThreadPool()
Destructor.
Definition thread.h:1549
void scan(opT &op)
Definition thread.h:1421
void flush_prebuf()
Definition thread.h:1343
static void begin(int nthread=-1)
Please invoke while in a single-threaded environment.
Definition thread.cc:379
static ThreadPool * instance()
Return a pointer to the only instance, constructing as necessary.
Definition thread.h:1332
static double await_timeout
Waiter timeout.
Definition thread.h:1221
DQueue< PoolTaskInterface * > queue
Queue of tasks.
Definition thread.h:1213
bool run_tasks(bool wait, ThreadPoolThread *const this_thread)
Definition thread.h:1271
static std::size_t queue_size()
Returns the number of tasks in the queue.
Definition thread.h:1467
ThreadPoolThread main_thread
Placeholder for main thread tls.
Definition thread.h:1212
static const int nmax
Number of task a worker thread will pop from the task queue.
Definition thread.h:1220
bool run_task(bool wait, ThreadPoolThread *this_thread)
Run the next task.
Definition thread.h:1238
static void * pool_thread_main(void *v)
Forwards the thread to bound member function.
Definition thread.cc:374
static void await(const Probe &probe, bool dowork=true, bool sleep=false)
Gracefully wait for a condition to become true, executing any tasks in the queue.
Definition thread.h:1491
static std::unique_ptr< tbb::global_control > tbb_control
Definition thread.h:1356
static const ThreadPoolThread * get_threads()
Definition thread.h:1478
static std::size_t size()
Returns the number of threads in the pool.
Definition thread.h:1460
Simplified thread wrapper to hide pthread complexity.
Definition thread.h:278
void start(void *(*f)(void *), void *args=nullptr)
Start the thread by running f(args).
Definition thread.h:306
virtual ~Thread()=default
Thread(void *(*f)(void *), void *args=nullptr)
Create a thread and start it running f(args).
Definition thread.h:297
Thread()
Default constructor.
Definition thread.h:291
void run()
Invokes the function for this thread.
Definition thread.h:283
void * args
The arguments passed to this thread for execution.
Definition thread.h:280
void *(* f)(void *)
The function called for executing this thread.
Definition thread.h:279
Multi-threaded queue to manage and run tasks.
Definition world_task_queue.h:319
Task event list base class.
Definition thread.h:693
virtual ~TaskEventListBase()=default
Virtual destructor.
TaskEventListBase * next_
The next task event in the list.
Definition thread.h:695
friend std::ostream & operator<<(std::ostream &os, const TaskEventListBase &tel)
Output a task event list to an output stream.
Definition thread.h:730
TaskEventListBase & operator=(const TaskEventListBase &)=delete
TaskEventListBase * next() const
Get the next event list in the linked list.
Definition thread.h:712
virtual std::ostream & print_events(std::ostream &) const =0
Print the events.
TaskEventListBase()
Default constructor.
Definition thread.h:703
void insert(TaskEventListBase *list)
Insert list after this list.
Definition thread.h:719
TaskEventListBase(const TaskEventListBase &)=delete
A list of task events.
Definition thread.h:744
TaskEvent * event()
Get a new event from this list.
Definition thread.h:772
TaskEventList & operator=(const TaskEventList &)=delete
TaskEventList(const unsigned int nmax)
Default constructor.
Definition thread.h:759
virtual std::ostream & print_events(std::ostream &os) const
Print events recorded in this list.
Definition thread.h:782
unsigned int n_
The number of events recorded.
Definition thread.h:746
TaskEventList(const TaskEventList &)=delete
virtual ~TaskEventList()=default
Virtual destructor.
std::unique_ptr< TaskEvent[]> events_
The event array.
Definition thread.h:747
Task event class.
Definition thread.h:540
std::string get_name() const
Get name of the function pointer.
Definition thread.h:578
friend std::ostream & operator<<(std::ostream &os, const TaskEvent &te)
Output the task data using a tab-separated list.
Definition thread.h:652
void start(const std::pair< void *, unsigned short > &id, const unsigned short threads, const double submit_time)
Record the start time of the task and collect task information.
Definition thread.h:625
static void print_demangled(std::ostream &os, const char *symbol)
Print demangled symbol name.
Definition thread.h:554
unsigned short threads_
Number of threads used by the task.
Definition thread.h:544
void stop()
Record the stop time of the task.
Definition thread.h:635
double times_[3]
Task trace times: { submit, start, stop }.
Definition thread.h:542
std::pair< void *, unsigned short > id_
Task identification information.
Definition thread.h:543
This class collects and prints task profiling data.
Definition thread.h:796
TaskEventListBase * head_
The head of the linked list of data.
Definition thread.h:798
TaskProfiler()
Default constructor.
Definition thread.h:816
void write_to_file()
Write the profile data to file.
Definition thread.cc:213
~TaskProfiler()
Destructor.
Definition thread.h:821
TaskEventList * new_list(const std::size_t nmax)
Create a new task event list.
Definition thread.h:836
TaskProfiler & operator=(const TaskProfiler &)=delete
TaskEventListBase * tail_
The tail of the linked list of data.
Definition thread.h:799
TaskProfiler(const TaskProfiler &)=delete
static const char * output_file_name_
The output file name.
Definition thread.h:812
static Mutex output_mutex_
Mutex used to lock the output file.
Definition thread.h:801
static const double R
Definition csqrt.cc:46
const std::size_t bufsize
Definition derivatives.cc:16
real_function_3d mask
Definition dirac-hatom.cc:27
void threadpool_wait_policy(WaitPolicy policy, int sleep_duration_in_microseconds=0)
Definition thread.h:1582
static const double v
Definition hatom_sf_dirac.cc:20
Tensor< double > op(const Tensor< double > &x)
Definition kain.cc:508
#define MADNESS_CHECK(condition)
Check a condition — even in a release build the condition is always evaluated so it can have side eff...
Definition madness_exception.h:182
#define MADNESS_EXCEPTION(msg, value)
Macro for throwing a MADNESS exception.
Definition madness_exception.h:119
#define MADNESS_ASSERT(condition)
Assert a condition that should be free of side-effects since in release builds this might be a no-op.
Definition madness_exception.h:134
Namespace for all elements and tools of MADNESS.
Definition DFConvergence.h:9
WaitPolicy
wait policies supported by ConditionVariable/DQueue/ThreadPool
Definition worldmutex.h:511
static double cpu_time()
Returns the cpu time in seconds relative to an arbitrary origin.
Definition timers.h:128
ThreadBinder binder
Definition thread.cc:71
void thread_purge()
Definition thread.h:1589
static void myusleep(unsigned int us)
Sleep or spin for specified number of microseconds.
Definition timers.h:186
bool is_madness_thread()
Definition thread_info.h:70
NDIM & f
Definition mra.h:2668
void error(const char *msg)
Definition world.cc:147
double wall_time()
Returns the wall time in seconds relative to an arbitrary origin.
Definition timers.cc:48
std::string type(const PairType &n)
Definition PNOParameters.h:18
constexpr R blocking_invoke_r(F &&f, Args &&... args) noexcept(std::is_nothrow_invocable_v< F, Args... >)
Definition thread.h:1604
constexpr decltype(auto) blocking_invoke(F &&f, Args &&... args) noexcept(std::is_nothrow_invocable_v< F, Args... >)
Definition thread.h:1597
std::string name(const FuncType &type, const int ex=-1)
Definition ccpairfunction.h:28
Function traits in the spirit of boost function traits.
Definition function_traits.h:13
Member function traits in the spirit of boost function traits.
Definition function_traits.h:21
static double current_time
Definition tdse1d.cc:160
int task(int i)
Definition test_runtime.cpp:4
int main()
Definition test_workflow_builders.cpp:14
const char * status[2]
Definition testperiodic.cc:43
Implements thread introspection for Pthreads backend.
Object that is used to convert function and member function pointers into void*.
Definition thread.h:906
T in
Definition thread.h:907
void * out
Definition thread.h:908