3 #include <core/Event.h>
4 #include <core/Future.h>
5 #include <core/ThreadDefs.h>
7 #include <parallelism/Barrier.h>
21 MEL_API uint64_t getProcessAffinity();
39 YP_ANY_THREAD_ANY_PROCESSOR = 0,
40 YP_ANY_THREAD_SAME_PROCESSOR
47 template <
class F>
Thread( F&& f );
75 join(
unsigned int millis = 0xFFFFFFFF );
88 static void sleep(
const unsigned int millis );
97 static void yield( YieldPolicy yp = YP_ANY_THREAD_SAME_PROCESSOR );
102 inline std::thread::id getThreadId()
const;
130 constexpr
unsigned MINIMUM_SLEEP = 10;
131 return MINIMUM_SLEEP;
144 Thread(
const char* name );
145 enum class EJoinResult
151 #if defined( MEL_LINUX ) || defined( MEL_MACOSX ) || defined( MEL_ANDROID ) || \
156 uint64_t mAffinity = 0;
158 unsigned int mExitCode;
165 Thread::Thread( F&& f ) : mThread( std::forward<F>( f ) )
235 template <
class ErrorType = mel::core::WaitErrorAsException,
class T>
239 EVENT_WAIT_INFINITE ) noexcept( std::
246 constexpr
bool NotuseException =
247 std::is_same<ErrorType,
249 constexpr
bool UseException =
250 std::is_same<ErrorType,
252 static_assert( NotuseException || UseException,
253 "WaitForFutureMThread must specify either "
254 "WaitErrorNoException or WaitErrorAsException" );
255 using ::mel::core::Event;
258 _Receiver() : mEvent(
false,
false ) {}
264 [
this](
typename futT::ValueType& ) { mEvent.set(); } );
265 eventresult = mEvent.wait( msecs );
266 f.unsubscribeCallback( evId );
267 switch ( eventresult )
269 case ::mel::core::Event::EVENT_WAIT_OK:
270 return ::mel::core::EWaitError::FUTURE_WAIT_OK;
272 case ::mel::core::Event::EVENT_WAIT_TIMEOUT:
273 return ::mel::core::EWaitError::FUTURE_WAIT_TIMEOUT;
275 case ::mel::core::Event::EVENT_WAIT_ERROR:
276 return ::mel::core::EWaitError::FUTURE_UNKNOWN_ERROR;
279 return ::mel::core::EWaitError::
288 auto receiver = std::make_unique<_Receiver>();
290 if constexpr ( NotuseException )
294 case ::mel::core::EWaitError::FUTURE_WAIT_OK:
296 case ::mel::core::EWaitError::FUTURE_RECEIVED_KILL_SIGNAL:
300 "Kill signal received" ) ) );
302 case ::mel::core::EWaitError::FUTURE_WAIT_TIMEOUT:
306 "Time out exceeded" ) ) );
308 case ::mel::core::EWaitError::FUTURE_UNKNOWN_ERROR:
312 "Unknown error" ) ) );
318 "Unknown error" ) ) );
326 case ::mel::core::EWaitError::FUTURE_WAIT_OK:
327 if ( f.getValue().isValid() )
328 return ::mel::core::WaitResult( f );
330 std::rethrow_exception( f.getValue().error() );
332 case ::mel::core::EWaitError::FUTURE_RECEIVED_KILL_SIGNAL:
335 "Kill signal received" );
337 case ::mel::core::EWaitError::FUTURE_WAIT_TIMEOUT:
340 "Time out exceeded" );
342 case ::mel::core::EWaitError::FUTURE_UNKNOWN_ERROR:
361 MEL_API ::mel::core::Event::EWaitCode
363 unsigned int msecs = Event::EVENT_WAIT_INFINITE );
EWaitCode
Wait result codes.
Definition: Event.h:31
int subscribeCallback(F &&f) const
Subscribe callback to be executed when future is ready (valid or error)
Definition: Future.h:681
Represents a value that maybe is not present at the current moment.
Definition: Future.h:750
Wrapper around std::thread to prive more abstractions.
Definition: Thread.h:33
bool join(unsigned int millis=0xFFFFFFFF)
std::thread::id getThreadId() const
Definition: Thread.h:169
uint64_t getAffinity() const
virtual ~Thread()
Thread is joined on destruction.
bool setAffinity(uint64_t)
EThreadPriority getPriority() const
Definition: Thread.h:171
void setPriority(EThreadPriority tp)
void terminate(unsigned int exitCode=0)
static void yield(YieldPolicy yp=YP_ANY_THREAD_SAME_PROCESSOR)
static void sleep(const unsigned int millis)
constexpr static unsigned getMinimunSleepTime()
Definition: Thread.h:125
Exception class generated by WaitResult when wait for future gets an error.
Definition: Future.h:882
Wrapper for future value after wait.
Definition: Future.h:902
base functionalities
Definition: Callback_Impl.h:13
MEL_API unsigned int getNumProcessors()
Get the number of logical processors.
::mel::core::WaitResult< T > waitForFutureThread(const mel::core::Future< T > &f, unsigned int msecs=::mel::core::Event::EVENT_WAIT_INFINITE) noexcept(std::is_same< ErrorType, ::mel::core::WaitErrorNoException >::value)
Wait for a Future from a Thread.
Definition: Thread.h:236
MEL_API bool setAffinity(uint64_t)
Set affinity for current thread.
MEL_API ::mel::core::Event::EWaitCode waitForBarrierThread(const ::mel::parallelism::Barrier &b, unsigned int msecs=Event::EVENT_WAIT_INFINITE)
Wait for a barrier to activated in the context of a thread.
EThreadPriority
Definition: ThreadDefs.h:21
EWaitError
Generic result error codes for future waiting.
Definition: Future.h:29
@ FUTURE_RECEIVED_KILL_SIGNAL
@ FUTURE_WAIT_TIMEOUT
Time out expired while waiting for Future.
@ FUTURE_UNKNOWN_ERROR
Unknow error while waiting for Future.
Definition: Callback_Impl.h:11
Policy for treating error as exception in future wait functions.
Definition: Future.h:936
Policy for not treating error as exception in future wait functions.
Definition: Future.h:941