6 #ifndef INCLUDED_ILM_THREAD_PROCESS_GROUP_H
7 #define INCLUDED_ILM_THREAD_PROCESS_GROUP_H
28 #include <type_traits>
36 std::is_same <decltype (
P {}.next),
P *>::
value,
bool> =
true>
44 , _avail_head (nullptr)
45 , _first_failure (nullptr)
47 _fixed_pool.resize (numThreads);
48 for (
unsigned int i = 0; i < numThreads; ++i )
50 if (i == (numThreads - 1))
51 _fixed_pool[i].next =
nullptr;
53 _fixed_pool[i].next = &(_fixed_pool[i+1]);
55 _avail_head = &(_fixed_pool[0]);
64 std::string *cur = _first_failure.load ();
70 Process* oldhead = _avail_head.load (std::memory_order_relaxed);
75 }
while (!_avail_head.compare_exchange_weak (
77 std::memory_order_release,
78 std::memory_order_relaxed));
98 ret = _avail_head.load (std::memory_order_acquire);
104 std::cerr <<
"GACK: serious failure case???" << std::endl;
107 }
while ( !_avail_head.compare_exchange_weak(
108 ret, newhead, std::memory_order_acquire));
119 std::string *cur = _first_failure.load ();
122 std::string *msg =
new std::string (e);
123 if (! _first_failure.compare_exchange_strong (cur, msg))
130 std::string *cur = _first_failure.load ();
131 _first_failure.store (
nullptr);
135 std::string msg (*cur);
144 std::vector<Process> _fixed_pool;
146 std::atomic<Process *> _avail_head;
148 std::atomic<std::string *> _first_failure;
154 #endif // INCLUDED_ILM_THREAD_POOL_H
typename std::enable_if< B, T >::type enable_if_t
Define Imath::enable_if_t to be std for C++14, equivalent for C++11.
GLsizei const GLfloat * value
#define ILMTHREAD_INTERNAL_NAMESPACE_HEADER_ENTER
#define ILMTHREAD_INTERNAL_NAMESPACE_HEADER_EXIT
void record_failure(const char *e)
ProcessGroup(unsigned int numThreads)
LeafData & operator=(const LeafData &)=delete