The fWorkspacesViews list now gets its own lock which solves a deadlock

problem when deleting Workspaces replicants.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@24390 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Axel Dörfler
2008-03-14 13:21:17 +00:00
parent ac2042cb70
commit d8ebe61203
2 changed files with 12 additions and 7 deletions
+10 -7
View File
@@ -318,6 +318,7 @@ Desktop::Desktop(uid_t userID)
fSubsetWindows(kSubsetList), fSubsetWindows(kSubsetList),
fFocusList(kFocusList), fFocusList(kFocusList),
fWorkspacesViews(false), fWorkspacesViews(false),
fWorkspacesLock("workspaces list"),
fActiveScreen(NULL), fActiveScreen(NULL),
fWindowLock("window lock"), fWindowLock("window lock"),
@@ -1260,6 +1261,8 @@ Desktop::_WindowHasModal(Window* window)
void void
Desktop::_WindowChanged(Window* window) Desktop::_WindowChanged(Window* window)
{ {
BAutolock _(fWorkspacesLock);
for (uint32 i = fWorkspacesViews.CountItems(); i-- > 0;) { for (uint32 i = fWorkspacesViews.CountItems(); i-- > 0;) {
WorkspacesView* view = fWorkspacesViews.ItemAt(i); WorkspacesView* view = fWorkspacesViews.ItemAt(i);
view->WindowChanged(window); view->WindowChanged(window);
@@ -1273,6 +1276,8 @@ Desktop::_WindowChanged(Window* window)
void void
Desktop::_WindowRemoved(Window* window) Desktop::_WindowRemoved(Window* window)
{ {
BAutolock _(fWorkspacesLock);
for (uint32 i = fWorkspacesViews.CountItems(); i-- > 0;) { for (uint32 i = fWorkspacesViews.CountItems(); i-- > 0;) {
WorkspacesView* view = fWorkspacesViews.ItemAt(i); WorkspacesView* view = fWorkspacesViews.ItemAt(i);
view->WindowRemoved(window); view->WindowRemoved(window);
@@ -1286,23 +1291,18 @@ Desktop::AddWorkspacesView(WorkspacesView* view)
if (view->Window() == NULL || view->Window()->IsHidden()) if (view->Window() == NULL || view->Window()->IsHidden())
return; return;
if (!LockAllWindows()) BAutolock _(fWorkspacesLock);
return;
if (!fWorkspacesViews.HasItem(view)) if (!fWorkspacesViews.HasItem(view))
fWorkspacesViews.AddItem(view); fWorkspacesViews.AddItem(view);
UnlockAllWindows();
} }
void void
Desktop::RemoveWorkspacesView(WorkspacesView* view) Desktop::RemoveWorkspacesView(WorkspacesView* view)
{ {
if (!LockAllWindows()) BAutolock _(fWorkspacesLock);
return;
fWorkspacesViews.RemoveItem(view); fWorkspacesViews.RemoveItem(view);
UnlockAllWindows();
} }
@@ -1667,6 +1667,7 @@ Desktop::ShowWindow(Window* window)
if (window->HasWorkspacesViews()) { if (window->HasWorkspacesViews()) {
// find workspaces views in view hierarchy // find workspaces views in view hierarchy
BAutolock _(fWorkspacesLock);
window->FindWorkspacesViews(fWorkspacesViews); window->FindWorkspacesViews(fWorkspacesViews);
} }
@@ -1712,6 +1713,8 @@ Desktop::HideWindow(Window* window)
BObjectList<WorkspacesView> list(false); BObjectList<WorkspacesView> list(false);
window->FindWorkspacesViews(list); window->FindWorkspacesViews(list);
BAutolock _(fWorkspacesLock);
while (WorkspacesView* view = list.RemoveItemAt(0)) { while (WorkspacesView* view = list.RemoveItemAt(0)) {
fWorkspacesViews.RemoveItem(view); fWorkspacesViews.RemoveItem(view);
} }
+2
View File
@@ -259,7 +259,9 @@ class Desktop : public MessageLooper, public ScreenOwner {
WindowList fAllWindows; WindowList fAllWindows;
WindowList fSubsetWindows; WindowList fSubsetWindows;
WindowList fFocusList; WindowList fFocusList;
BObjectList<WorkspacesView> fWorkspacesViews; BObjectList<WorkspacesView> fWorkspacesViews;
BLocker fWorkspacesLock;
Screen* fActiveScreen; Screen* fActiveScreen;