kernel/team: Use a rw_spinlock to guard the sTeamsHash.

Virtually identical to my prior change to sThreadsHash.
This commit is contained in:
Augustin Cavalier
2019-01-31 20:09:10 -05:00
parent 5796ecc706
commit 32d4274178
+16 -16
View File
@@ -143,7 +143,7 @@ typedef BOpenHashTable<ProcessGroupHashDefinition> 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!