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