diff --git a/src/system/kernel/team.cpp b/src/system/kernel/team.cpp index d4ff25fbc6..ae60bd016f 100644 --- a/src/system/kernel/team.cpp +++ b/src/system/kernel/team.cpp @@ -143,7 +143,7 @@ typedef BOpenHashTable ProcessGroupHashTable; // the team_id -> Team hash table and the lock protecting it static TeamTable sTeamHash; -static spinlock sTeamHashLock = B_SPINLOCK_INITIALIZER; +static rw_spinlock sTeamHashLock = B_RW_SPINLOCK_INITIALIZER; // the pid_t -> ProcessGroup hash table and the lock protecting it static ProcessGroupHashTable sGroupHash; @@ -174,7 +174,7 @@ static const size_t kTeamUserDataInitialSize = 4 * B_PAGE_SIZE; TeamListIterator::TeamListIterator() { // queue the entry - InterruptsSpinLocker locker(sTeamHashLock); + InterruptsWriteSpinLocker locker(sTeamHashLock); sTeamHash.InsertIteratorEntry(&fEntry); } @@ -182,7 +182,7 @@ TeamListIterator::TeamListIterator() TeamListIterator::~TeamListIterator() { // remove the entry - InterruptsSpinLocker locker(sTeamHashLock); + InterruptsWriteSpinLocker locker(sTeamHashLock); sTeamHash.RemoveIteratorEntry(&fEntry); } @@ -191,7 +191,7 @@ Team* TeamListIterator::Next() { // get the next team -- if there is one, get reference for it - InterruptsSpinLocker locker(sTeamHashLock); + InterruptsWriteSpinLocker locker(sTeamHashLock); Team* team = sTeamHash.NextElement(&fEntry); if (team != NULL) team->AcquireReference(); @@ -591,7 +591,7 @@ Team::Get(team_id id) return team; } - InterruptsSpinLocker locker(sTeamHashLock); + InterruptsReadSpinLocker locker(sTeamHashLock); Team* team = sTeamHash.Lookup(id); if (team != NULL) team->AcquireReference(); @@ -1784,7 +1784,7 @@ load_image_internal(char**& _flatArgs, size_t flatArgsSize, int32 argCount, team->Lock(); { - InterruptsSpinLocker teamsLocker(sTeamHashLock); + InterruptsWriteSpinLocker teamsLocker(sTeamHashLock); sTeamHash.Insert(team); teamLimitReached = sUsedTeams >= sMaxTeams; @@ -1863,7 +1863,7 @@ err6: parent->UnlockTeamAndProcessGroup(); { - InterruptsSpinLocker teamsLocker(sTeamHashLock); + InterruptsWriteSpinLocker teamsLocker(sTeamHashLock); sTeamHash.Remove(team); if (!teamLimitReached) sUsedTeams--; @@ -2174,7 +2174,7 @@ fork_team(void) team->Lock(); { - InterruptsSpinLocker teamsLocker(sTeamHashLock); + InterruptsWriteSpinLocker teamsLocker(sTeamHashLock); sTeamHash.Insert(team); teamLimitReached = sUsedTeams >= sMaxTeams; @@ -2230,7 +2230,7 @@ err6: parentTeam->UnlockTeamAndProcessGroup(); { - InterruptsSpinLocker teamsLocker(sTeamHashLock); + InterruptsWriteSpinLocker teamsLocker(sTeamHashLock); sTeamHash.Remove(team); if (!teamLimitReached) sUsedTeams--; @@ -2864,7 +2864,7 @@ team_max_teams(void) int32 team_used_teams(void) { - InterruptsSpinLocker teamsLocker(sTeamHashLock); + InterruptsReadSpinLocker teamsLocker(sTeamHashLock); return sUsedTeams; } @@ -2909,7 +2909,7 @@ team_is_valid(team_id id) if (id <= 0) return false; - InterruptsSpinLocker teamsLocker(sTeamHashLock); + InterruptsReadSpinLocker teamsLocker(sTeamHashLock); return team_get_team_struct_locked(id) != NULL; } @@ -3028,7 +3028,7 @@ team_remove_team(Team* team, pid_t& _signalGroup) + team->dead_children.user_time; // remove the team from the hash table - InterruptsSpinLocker teamsLocker(sTeamHashLock); + InterruptsWriteSpinLocker teamsLocker(sTeamHashLock); sTeamHash.Remove(team); sUsedTeams--; teamsLocker.Unlock(); @@ -3298,7 +3298,7 @@ team_get_address_space(team_id id, VMAddressSpace** _addressSpace) return B_OK; } - InterruptsSpinLocker teamsLocker(sTeamHashLock); + InterruptsReadSpinLocker teamsLocker(sTeamHashLock); Team* team = team_get_team_struct_locked(id); if (team == NULL) @@ -3739,7 +3739,7 @@ status_t wait_for_team(team_id id, status_t* _returnCode) { // check whether the team exists - InterruptsSpinLocker teamsLocker(sTeamHashLock); + InterruptsReadSpinLocker teamsLocker(sTeamHashLock); Team* team = team_get_team_struct_locked(id); if (team == NULL) @@ -3757,7 +3757,7 @@ wait_for_team(team_id id, status_t* _returnCode) status_t kill_team(team_id id) { - InterruptsSpinLocker teamsLocker(sTeamHashLock); + InterruptsReadSpinLocker teamsLocker(sTeamHashLock); Team* team = team_get_team_struct_locked(id); if (team == NULL) @@ -3797,7 +3797,7 @@ _get_next_team_info(int32* cookie, team_info* info, size_t size) if (slot < 1) slot = 1; - InterruptsSpinLocker locker(sTeamHashLock); + InterruptsReadSpinLocker locker(sTeamHashLock); team_id lastTeamID = peek_next_thread_id(); // TODO: This is broken, since the id can wrap around!