Initial IPC signal support.

Added an API for creating signals with attributes.
Added two APIs for IPC operations on signals.
Initial use of exceptions for error handling.

Add ref counting to signals.
Removed spin loops from signal destructors.
Signals are no longer to be destroyed with delete, use DeleteSignal instead.
Added delete safety to doorbells.
Added secondary hsa_signal_t -> Signal* translation path for IPC enabled signals.

Change-Id: Id59065d002f0c2566b0a9425694da2ed27cb7d7f
This commit is contained in:
Sean Keely
2017-07-05 22:27:21 -05:00
vanhempi 2732b18092
commit c9642cf7af
20 muutettua tiedostoa jossa 1063 lisäystä ja 488 poistoa
@@ -89,10 +89,6 @@ InterruptSignal::InterruptSignal(hsa_signal_value_t initial_value, HsaEvent* use
}
InterruptSignal::~InterruptSignal() {
invalid_ = true;
SetEvent();
while (InUse())
;
if (free_event_) hsaKmtDestroyEvent(event_);
}
@@ -119,14 +115,14 @@ void InterruptSignal::StoreRelease(hsa_signal_value_t value) {
hsa_signal_value_t InterruptSignal::WaitRelaxed(
hsa_signal_condition_t condition, hsa_signal_value_t compare_value,
uint64_t timeout, hsa_wait_state_t wait_hint) {
uint32_t prior = atomic::Increment(&waiting_);
Retain();
MAKE_SCOPE_GUARD([&]() { Release(); });
// assert(prior == 0 && "Multiple waiters on interrupt signal!");
uint32_t prior = waiting_++;
MAKE_SCOPE_GUARD([&]() { waiting_--; });
// Allow only the first waiter to sleep (temporary, known to be bad).
if (prior != 0) wait_hint = HSA_WAIT_STATE_ACTIVE;
MAKE_SCOPE_GUARD([&]() { atomic::Decrement(&waiting_); });
int64_t value;
timer::fast_clock::time_point start_time = timer::fast_clock::now();
@@ -143,7 +139,7 @@ hsa_signal_value_t InterruptSignal::WaitRelaxed(
bool condition_met = false;
while (true) {
if (invalid_) return 0;
if (!IsValid()) return 0;
value = atomic::Load(&signal_.value, std::memory_order_relaxed);