kernel/team: Use a rw_spinlock to guard the sTeamsHash.
Virtually identical to my prior change to sThreadsHash.
This commit is contained in:
+16
-16
@@ -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!
|
||||
|
||||
Reference in New Issue
Block a user