diff --git a/headers/private/kernel/thread_types.h b/headers/private/kernel/thread_types.h index ec1d53f3c3..96014a22fd 100644 --- a/headers/private/kernel/thread_types.h +++ b/headers/private/kernel/thread_types.h @@ -483,7 +483,7 @@ struct Thread : TeamThreadIteratorEntry, KernelReferenceable, BKernel::Team *team; // protected by team lock, thread lock, scheduler // lock, team_lock - spinlock team_lock; + rw_spinlock team_lock; struct { sem_id sem; // immutable after thread creation diff --git a/src/system/kernel/UserEvent.cpp b/src/system/kernel/UserEvent.cpp index 751cebf1e3..f0c49b6f58 100644 --- a/src/system/kernel/UserEvent.cpp +++ b/src/system/kernel/UserEvent.cpp @@ -169,7 +169,7 @@ ThreadSignalEvent::Fire() fSignal->AcquireReference(); // one reference is transferred to send_signal_to_team_locked - InterruptsSpinLocker teamLocker(fThread->team_lock); + InterruptsReadSpinLocker teamLocker(fThread->team_lock); SpinLocker locker(fThread->team->signal_lock); status_t error = send_signal_to_thread_locked(fThread, fSignal->Number(), fSignal, B_DO_NOT_RESCHEDULE); diff --git a/src/system/kernel/signal.cpp b/src/system/kernel/signal.cpp index fe41dfea9a..7907dfa9b4 100644 --- a/src/system/kernel/signal.cpp +++ b/src/system/kernel/signal.cpp @@ -1494,7 +1494,7 @@ send_signal_to_thread(Thread* thread, const Signal& signal, uint32 flags) if (error != B_OK) return error; - InterruptsSpinLocker teamLocker(thread->team_lock); + InterruptsReadSpinLocker teamLocker(thread->team_lock); SpinLocker locker(thread->team->signal_lock); error = send_signal_to_thread_locked(thread, signal.Number(), signalToQueue, diff --git a/src/system/kernel/thread.cpp b/src/system/kernel/thread.cpp index e3b4a58954..fa63e16d01 100644 --- a/src/system/kernel/thread.cpp +++ b/src/system/kernel/thread.cpp @@ -206,7 +206,7 @@ Thread::Thread(const char* name, thread_id threadID, struct cpu_ent* cpu) mutex_init_etc(&fLock, lockName, MUTEX_FLAG_CLONE_NAME); B_INITIALIZE_SPINLOCK(&time_lock); - B_INITIALIZE_SPINLOCK(&team_lock); + B_INITIALIZE_RW_SPINLOCK(&team_lock); // init name if (name != NULL) @@ -1984,7 +1984,7 @@ thread_exit(void) // swap address spaces, to make sure we're running on the kernel's pgdir vm_swap_address_space(team->address_space, VMAddressSpace::Kernel()); - SpinLocker teamLocker(thread->team_lock); + WriteSpinLocker teamLocker(thread->team_lock); SpinLocker schedulerLocker(gSchedulerLock); // removing the thread and putting its death entry to the parent // team needs to be an atomic operation @@ -3281,7 +3281,7 @@ _user_cancel_thread(thread_id threadID, void (*cancelFunction)(int)) thread->cancel_function = cancelFunction; // send the cancellation signal to the thread - InterruptsSpinLocker teamLocker(thread->team_lock); + InterruptsReadSpinLocker teamLocker(thread->team_lock); SpinLocker locker(thread->team->signal_lock); return send_signal_to_thread_locked(thread, SIGNAL_CANCEL_THREAD, NULL, 0); }