LightEvent: remove magic numbers

This commit is contained in:
Nanquitas 2020-07-14 18:53:49 +02:00 committed by fincs
parent bc6c097dbb
commit c1c93b0880

View File

@ -222,6 +222,15 @@ void CondVar_WakeUp(CondVar* cv, s32 num_threads)
__dmb(); __dmb();
} }
// LightEvent state
enum
{
CLEARED_STICKY = -2,
CLEARED_ONESHOT = -1,
SIGNALED_ONESHOT = 0,
SIGNALED_STICKY = 1
};
static inline void LightEvent_SetState(LightEvent* event, int state) static inline void LightEvent_SetState(LightEvent* event, int state)
{ {
do do
@ -239,7 +248,7 @@ static inline int LightEvent_TryReset(LightEvent* event)
__clrex(); __clrex();
return 0; return 0;
} }
} while (__strex(&event->state, -1)); } while (__strex(&event->state, CLEARED_ONESHOT));
__dmb(); __dmb();
return 1; return 1;
} }
@ -247,29 +256,29 @@ static inline int LightEvent_TryReset(LightEvent* event)
void LightEvent_Init(LightEvent* event, ResetType reset_type) void LightEvent_Init(LightEvent* event, ResetType reset_type)
{ {
LightLock_Init(&event->lock); LightLock_Init(&event->lock);
LightEvent_SetState(event, reset_type == RESET_STICKY ? -2 : -1); LightEvent_SetState(event, reset_type == RESET_STICKY ? CLEARED_STICKY : CLEARED_ONESHOT);
} }
void LightEvent_Clear(LightEvent* event) void LightEvent_Clear(LightEvent* event)
{ {
if (event->state == 1) if (event->state == SIGNALED_STICKY)
{ {
LightLock_Lock(&event->lock); LightLock_Lock(&event->lock);
LightEvent_SetState(event, -2); LightEvent_SetState(event, CLEARED_STICKY);
LightLock_Unlock(&event->lock); LightLock_Unlock(&event->lock);
} else if (event->state == 0) } else if (event->state == SIGNALED_ONESHOT)
{ {
__dmb(); __dmb();
LightEvent_SetState(event, -1); LightEvent_SetState(event, CLEARED_ONESHOT);
__dmb(); __dmb();
} }
} }
void LightEvent_Pulse(LightEvent* event) void LightEvent_Pulse(LightEvent* event)
{ {
if (event->state == -2) if (event->state == CLEARED_STICKY)
syncArbitrateAddress(&event->state, ARBITRATION_SIGNAL, -1); syncArbitrateAddress(&event->state, ARBITRATION_SIGNAL, -1);
else if (event->state == -1) else if (event->state == CLEARED_ONESHOT)
syncArbitrateAddress(&event->state, ARBITRATION_SIGNAL, 1); syncArbitrateAddress(&event->state, ARBITRATION_SIGNAL, 1);
else else
LightEvent_Clear(event); LightEvent_Clear(event);
@ -277,15 +286,15 @@ void LightEvent_Pulse(LightEvent* event)
void LightEvent_Signal(LightEvent* event) void LightEvent_Signal(LightEvent* event)
{ {
if (event->state == -1) if (event->state == CLEARED_ONESHOT)
{ {
__dmb(); __dmb();
LightEvent_SetState(event, 0); LightEvent_SetState(event, SIGNALED_ONESHOT);
syncArbitrateAddress(&event->state, ARBITRATION_SIGNAL, 1); syncArbitrateAddress(&event->state, ARBITRATION_SIGNAL, 1);
} else if (event->state == -2) } else if (event->state == CLEARED_STICKY)
{ {
LightLock_Lock(&event->lock); LightLock_Lock(&event->lock);
LightEvent_SetState(event, 1); LightEvent_SetState(event, SIGNALED_STICKY);
syncArbitrateAddress(&event->state, ARBITRATION_SIGNAL, -1); syncArbitrateAddress(&event->state, ARBITRATION_SIGNAL, -1);
LightLock_Unlock(&event->lock); LightLock_Unlock(&event->lock);
} }
@ -293,7 +302,7 @@ void LightEvent_Signal(LightEvent* event)
int LightEvent_TryWait(LightEvent* event) int LightEvent_TryWait(LightEvent* event)
{ {
if (event->state == 1) if (event->state == SIGNALED_STICKY)
return 1; return 1;
return LightEvent_TryReset(event); return LightEvent_TryReset(event);
} }
@ -302,19 +311,19 @@ void LightEvent_Wait(LightEvent* event)
{ {
for (;;) for (;;)
{ {
if (event->state == -2) if (event->state == CLEARED_STICKY)
{ {
syncArbitrateAddress(&event->state, ARBITRATION_WAIT_IF_LESS_THAN, 0); syncArbitrateAddress(&event->state, ARBITRATION_WAIT_IF_LESS_THAN, SIGNALED_ONESHOT);
return; return;
} }
if (event->state != -1) if (event->state != CLEARED_ONESHOT)
{ {
if (event->state == 1) if (event->state == SIGNALED_STICKY)
return; return;
if (event->state == 0 && LightEvent_TryReset(event)) if (event->state == SIGNALED_ONESHOT && LightEvent_TryReset(event))
return; return;
} }
syncArbitrateAddress(&event->state, ARBITRATION_WAIT_IF_LESS_THAN, 0); syncArbitrateAddress(&event->state, ARBITRATION_WAIT_IF_LESS_THAN, SIGNALED_ONESHOT);
} }
} }
@ -325,22 +334,22 @@ int LightEvent_WaitTimeout(LightEvent* event, s64 timeout_ns)
while (res != timeoutRes) while (res != timeoutRes)
{ {
if (event->state == -2) if (event->state == CLEARED_STICKY)
{ {
res = syncArbitrateAddressWithTimeout(&event->state, ARBITRATION_WAIT_IF_LESS_THAN_TIMEOUT, 0, timeout_ns); res = syncArbitrateAddressWithTimeout(&event->state, ARBITRATION_WAIT_IF_LESS_THAN_TIMEOUT, SIGNALED_ONESHOT, timeout_ns);
return res == timeoutRes; return res == timeoutRes;
} }
if (event->state != -1) if (event->state != CLEARED_ONESHOT)
{ {
if (event->state == 1) if (event->state == SIGNALED_STICKY)
return 0; return 0;
if (event->state == 0 && LightEvent_TryReset(event)) if (event->state == SIGNALED_ONESHOT && LightEvent_TryReset(event))
return 0; return 0;
} }
res = syncArbitrateAddressWithTimeout(&event->state, ARBITRATION_WAIT_IF_LESS_THAN_TIMEOUT, 0, timeout_ns); res = syncArbitrateAddressWithTimeout(&event->state, ARBITRATION_WAIT_IF_LESS_THAN_TIMEOUT, SIGNALED_ONESHOT, timeout_ns);
} }
return res == timeoutRes; return res == timeoutRes;