@@ -755,35 +755,44 @@ hsa_status_t Runtime::SetAsyncSignalHandler(hsa_signal_t signal,
755755 hsa_signal_value_t value,
756756 hsa_amd_signal_handler handler,
757757 void * arg) {
758- // Indicate that this signal is in use.
759- if (signal.handle != 0 ) hsa_signal_handle (signal)->Retain ();
760758
761- ScopedAcquire<HybridMutex> scope_lock (&async_events_control_.lock );
759+ struct AsyncEventsInfo * asyncInfo = &asyncSignals_;
760+
761+ if (signal.handle != 0 ) {
762+ // Indicate that this signal is in use.
763+ hsa_signal_handle (signal)->Retain ();
764+
765+ core::Signal* coreSignal = core::Signal::Convert (signal);
766+ if (coreSignal->EopEvent () && coreSignal->EopEvent ()->EventData .EventType != HSA_EVENTTYPE_SIGNAL)
767+ asyncInfo = &asyncExceptions_;
768+ }
769+
770+ ScopedAcquire<HybridMutex> scope_lock (&asyncInfo->control .lock );
762771
763772 // Lazy initializer
764- if (async_events_control_ .async_events_thread_ == NULL ) {
773+ if (asyncInfo-> control .async_events_thread_ == NULL ) {
765774 // Create monitoring thread control signal
766- auto err = HSA::hsa_signal_create (0 , 0 , NULL , &async_events_control_ .wake );
775+ auto err = HSA::hsa_signal_create (0 , 0 , NULL , &asyncInfo-> control .wake );
767776 if (err != HSA_STATUS_SUCCESS) {
768777 assert (false && " Asyncronous events control signal creation error." );
769778 return HSA_STATUS_ERROR_OUT_OF_RESOURCES;
770779 }
771- async_events_ .PushBack (async_events_control_ .wake , HSA_SIGNAL_CONDITION_NE,
772- 0 , NULL , NULL );
780+ asyncInfo-> events .PushBack (asyncInfo-> control .wake , HSA_SIGNAL_CONDITION_NE,
781+ 0 , NULL , NULL );
773782
774783 // Start event monitoring thread
775- async_events_control_ .exit = false ;
776- async_events_control_ .async_events_thread_ =
777- os::CreateThread (AsyncEventsLoop, NULL );
778- if (async_events_control_ .async_events_thread_ == NULL ) {
784+ asyncInfo-> control .exit = false ;
785+ asyncInfo-> control .async_events_thread_ =
786+ os::CreateThread (AsyncEventsLoop, asyncInfo );
787+ if (asyncInfo-> control .async_events_thread_ == NULL ) {
779788 assert (false && " Asyncronous events thread creation error." );
780789 return HSA_STATUS_ERROR_OUT_OF_RESOURCES;
781790 }
782791 }
783792
784- new_async_events_ .PushBack (signal, cond, value, handler, arg);
793+ asyncInfo-> new_events .PushBack (signal, cond, value, handler, arg);
785794
786- hsa_signal_handle (async_events_control_ .wake )->StoreRelease (1 );
795+ hsa_signal_handle (asyncInfo-> control .wake )->StoreRelease (1 );
787796
788797 return HSA_STATUS_SUCCESS;
789798}
@@ -1499,18 +1508,35 @@ hsa_status_t Runtime::IPCDetach(void* ptr) {
14991508 return HSA_STATUS_SUCCESS;
15001509}
15011510
1502- void Runtime::AsyncEventsLoop (void *) {
1503- auto & async_events_control_ = runtime_singleton_->async_events_control_ ;
1504- auto & async_events_ = runtime_singleton_->async_events_ ;
1505- auto & new_async_events_ = runtime_singleton_->new_async_events_ ;
1511+ void Runtime::AsyncEventsLoop (void * _eventsInfo) {
1512+ struct AsyncEventsInfo * eventsInfo = reinterpret_cast <struct AsyncEventsInfo *>(_eventsInfo);
1513+
1514+ auto & async_events_control_ = eventsInfo->control ;
1515+ auto & async_events_ = eventsInfo->events ;
1516+ auto & new_async_events_ = eventsInfo->new_events ;
15061517
15071518 while (!async_events_control_.exit ) {
15081519 // Wait for a signal
15091520 hsa_signal_value_t value;
1510- uint32_t index = AMD::hsa_amd_signal_wait_any (
1511- uint32_t (async_events_.Size ()), &async_events_.signal_ [0 ],
1512- &async_events_.cond_ [0 ], &async_events_.value_ [0 ], uint64_t (-1 ),
1513- HSA_WAIT_STATE_BLOCKED, &value);
1521+ uint32_t index = 0 ;
1522+
1523+ if (eventsInfo->monitor_exceptions ) {
1524+ index = Signal::WaitAnyExceptions (
1525+ uint32_t (async_events_.Size ()),
1526+ &async_events_.signal_ [0 ],
1527+ &async_events_.cond_ [0 ],
1528+ &async_events_.value_ [0 ],
1529+ &value);
1530+ } else {
1531+ index = AMD::hsa_amd_signal_wait_any (
1532+ uint32_t (async_events_.Size ()),
1533+ &async_events_.signal_ [0 ],
1534+ &async_events_.cond_ [0 ],
1535+ &async_events_.value_ [0 ],
1536+ uint64_t (-1 ),
1537+ HSA_WAIT_STATE_BLOCKED,
1538+ &value);
1539+ }
15141540
15151541 // Reset the control signal
15161542 if (index == 0 ) {
@@ -1875,7 +1901,11 @@ Runtime::Runtime()
18751901 hw_exception_event_(nullptr ),
18761902 hw_exception_signal_(nullptr ),
18771903 ref_count_(0 ),
1878- kfd_version{} {}
1904+ kfd_version{} {
1905+
1906+ asyncSignals_.monitor_exceptions = false ;
1907+ asyncExceptions_.monitor_exceptions = true ;
1908+ }
18791909
18801910hsa_status_t Runtime::Load () {
18811911 os::cpuid_t cpuinfo;
@@ -1953,7 +1983,8 @@ void Runtime::Unload() {
19531983 std::for_each (disabled_gpu_agents_.begin (), disabled_gpu_agents_.end (), DeleteObject ());
19541984 disabled_gpu_agents_.clear ();
19551985
1956- async_events_control_.Shutdown ();
1986+ asyncSignals_.control .Shutdown ();
1987+ asyncExceptions_.control .Shutdown ();
19571988
19581989 if (vm_fault_signal_ != nullptr ) {
19591990 vm_fault_signal_->DestroySignal ();
0 commit comments