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:
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user