From 07e9fd1d8427a325a8637e3108633023b56b41cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Mon, 26 Oct 2009 13:29:29 +0000 Subject: [PATCH] * sem_delete_owned_sems() now grabs the team lock for a very short time, and once only. * Improved missing team warning. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@33770 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/system/kernel/sem.cpp | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/system/kernel/sem.cpp b/src/system/kernel/sem.cpp index f372b84f11..bd1a21f99c 100644 --- a/src/system/kernel/sem.cpp +++ b/src/system/kernel/sem.cpp @@ -373,7 +373,7 @@ delete_sem_internal(sem_id id, bool checkPermission) if (team != NULL) list_remove_link(&sSems[slot].u.used.team_link); else - panic("team missing"); + panic("team %ld missing", sSems[slot].u.used.owner); RELEASE_TEAM_LOCK(); @@ -689,16 +689,18 @@ remove_thread_from_sem(queued_thread *entry, struct sem_entry *sem) void sem_delete_owned_sems(struct team* team) { - while (true) { + struct list queue; + + { + InterruptsSpinLocker locker(gTeamSpinlock); + list_move_to_list(&team->sem_list, &queue); + } + + while (sem_entry* sem = (sem_entry*)list_remove_head_item(&queue)) { char* name; { - InterruptsSpinLocker locker(gTeamSpinlock); - - sem_entry* sem = (sem_entry*)list_remove_head_item(&team->sem_list); - if (sem == NULL) - break; - + InterruptsLocker locker; GRAB_SEM_LOCK(*sem); uninit_sem_locked(*sem, &name); }