kernel: User{Event, Timer}: Use atomic access where necessary

This commit is contained in:
Pawel Dziepak 2013-11-05 20:28:25 +01:00
parent f4b088a992
commit e7dba861fd
2 changed files with 10 additions and 13 deletions

View File

@ -38,16 +38,13 @@ struct SignalEvent::EventSignal : Signal {
void SetUnused() void SetUnused()
{ {
fInUse = 0; // mark not-in-use
atomic_set(&fInUse, 0);
} }
virtual void Handled() virtual void Handled()
{ {
// mark not-in-use SetUnused();
{
InterruptsSpinLocker _(gSchedulerLock);
fInUse = 0;
}
Signal::Handled(); Signal::Handled();
} }
@ -121,11 +118,12 @@ TeamSignalEvent::Fire()
InterruptsSpinLocker locker(gSchedulerLock); InterruptsSpinLocker locker(gSchedulerLock);
status_t error = send_signal_to_team_locked(fTeam, fSignal->Number(), status_t error = send_signal_to_team_locked(fTeam, fSignal->Number(),
fSignal, B_DO_NOT_RESCHEDULE); fSignal, B_DO_NOT_RESCHEDULE);
locker.Unlock();
// There are situations (for certain signals), in which // There are situations (for certain signals), in which
// send_signal_to_team_locked() succeeds without queuing the signal. // send_signal_to_team_locked() succeeds without queuing the signal.
if (error != B_OK || !fSignal->IsPending()) if (error != B_OK || !fSignal->IsPending())
fSignal->SetUnused(); fSignal->SetUnused();
locker.Unlock();
return error; return error;
} }
@ -166,8 +164,6 @@ ThreadSignalEvent::Create(Thread* thread, uint32 signalNumber, int32 signalCode,
status_t status_t
ThreadSignalEvent::Fire() ThreadSignalEvent::Fire()
{ {
dprintf("THREAD\n");
if (fSignal->MarkUsed()) if (fSignal->MarkUsed())
return B_BUSY; return B_BUSY;
@ -177,11 +173,12 @@ ThreadSignalEvent::Fire()
InterruptsSpinLocker locker(gSchedulerLock); InterruptsSpinLocker locker(gSchedulerLock);
status_t error = send_signal_to_thread_locked(fThread, fSignal->Number(), status_t error = send_signal_to_thread_locked(fThread, fSignal->Number(),
fSignal, B_DO_NOT_RESCHEDULE); fSignal, B_DO_NOT_RESCHEDULE);
locker.Unlock();
// There are situations (for certain signals), in which // There are situations (for certain signals), in which
// send_signal_to_team_locked() succeeds without queuing the signal. // send_signal_to_team_locked() succeeds without queuing the signal.
if (error != B_OK || !fSignal->IsPending()) if (error != B_OK || !fSignal->IsPending())
fSignal->SetUnused(); fSignal->SetUnused();
locker.Unlock();
return error; return error;
} }
@ -233,7 +230,7 @@ void
CreateThreadEvent::DoDPC(DPCQueue* queue) CreateThreadEvent::DoDPC(DPCQueue* queue)
{ {
// We're no longer queued in the DPC queue, so we can be reused. // We're no longer queued in the DPC queue, so we can be reused.
fPendingDPC = 0; atomic_set(&fPendingDPC, 0);
// create the thread // create the thread
thread_id threadID = thread_create_thread(fCreationAttributes, false); thread_id threadID = thread_create_thread(fCreationAttributes, false);

View File

@ -287,9 +287,9 @@ UserTimer::CancelTimer()
{ {
ASSERT(fScheduled); ASSERT(fScheduled);
fSkip = 1; atomic_set(&fSkip, 1);
cancel_timer(&fTimer); cancel_timer(&fTimer);
fSkip = 0; atomic_set(&fSkip, 0);
} }