hrev54252 adds 1 changeset to branch 'master'
old head: 15aa3a02a35423a620dd4e1fe8ab9caa0a4c5cb1
new head: f0a8640b45451b9891fa641144acc33b90ac9a23
overview:
https://git.haiku-os.org/haiku/log/?qt=range&q=f0a8640b4545+%5E15aa3a02a354
----------------------------------------------------------------------------
f0a8640b4545: app_server: Add locking to the Decorator class.
This class can potentially be accessed by multiple "tabs" (windows)
at once, so it must be read/write locked to account for that.
Fixes #16027.
Change-Id: I9cc741874caed4997497b03c8893bc2acb0e6fe7
Reviewed-on: https://review.haiku-os.org/c/haiku/+/2779
Reviewed-by: waddlesplash <waddlesplash@xxxxxxxxx>
[ Augustin Cavalier <waddlesplash@xxxxxxxxx> ]
----------------------------------------------------------------------------
Revision: hrev54252
Commit: f0a8640b45451b9891fa641144acc33b90ac9a23
URL: https://git.haiku-os.org/haiku/commit/?id=f0a8640b4545
Author: Augustin Cavalier <waddlesplash@xxxxxxxxx>
Date: Sat May 23 01:50:46 2020 UTC
Committer: waddlesplash <waddlesplash@xxxxxxxxx>
Commit-Date: Sat May 23 17:59:20 2020 UTC
Ticket: https://dev.haiku-os.org/ticket/16027
----------------------------------------------------------------------------
2 files changed, 82 insertions(+)
src/servers/app/decorator/Decorator.cpp | 78 +++++++++++++++++++++++++++++
src/servers/app/decorator/Decorator.h | 4 ++
----------------------------------------------------------------------------
diff --git a/src/servers/app/decorator/Decorator.cpp
b/src/servers/app/decorator/Decorator.cpp
index d35c49edf9..0a2d3dd494 100644
--- a/src/servers/app/decorator/Decorator.cpp
+++ b/src/servers/app/decorator/Decorator.cpp
@@ -74,6 +74,8 @@ Decorator::Tab::Tab()
Decorator::Decorator(DesktopSettings& settings, BRect frame,
Desktop* desktop)
:
+ fLocker("Decorator"),
+
fDrawingEngine(NULL),
fDrawState(),
@@ -111,6 +113,8 @@ Decorator::Tab*
Decorator::AddTab(DesktopSettings& settings, const char* title,
window_look look, uint32 flags, int32 index, BRegion* updateRegion)
{
+ AutoWriteLocker _(fLocker);
+
Decorator::Tab* tab = _AllocateNewTab();
if (tab == NULL)
return NULL;
@@ -147,6 +151,8 @@ Decorator::AddTab(DesktopSettings& settings, const char*
title,
bool
Decorator::RemoveTab(int32 index, BRegion* updateRegion)
{
+ AutoWriteLocker _(fLocker);
+
Decorator::Tab* tab = fTabList.RemoveItemAt(index);
if (tab == NULL)
return false;
@@ -162,6 +168,8 @@ Decorator::RemoveTab(int32 index, BRegion* updateRegion)
bool
Decorator::MoveTab(int32 from, int32 to, bool isMoving, BRegion* updateRegion)
{
+ AutoWriteLocker _(fLocker);
+
if (_MoveTab(from, to, isMoving, updateRegion) == false)
return false;
if (fTabList.MoveItem(from, to) == false) {
@@ -176,6 +184,8 @@ Decorator::MoveTab(int32 from, int32 to, bool isMoving,
BRegion* updateRegion)
int32
Decorator::TabAt(const BPoint& where) const
{
+ AutoReadLocker _(fLocker);
+
for (int32 i = 0; i < fTabList.CountItems(); i++) {
Decorator::Tab* tab = fTabList.ItemAt(i);
if (tab->tabRect.Contains(where))
@@ -189,6 +199,7 @@ Decorator::TabAt(const BPoint& where) const
void
Decorator::SetTopTab(int32 tab)
{
+ AutoWriteLocker _(fLocker);
fTopTab = fTabList.ItemAt(tab);
}
@@ -199,6 +210,8 @@ Decorator::SetTopTab(int32 tab)
void
Decorator::SetDrawingEngine(DrawingEngine* engine)
{
+ AutoWriteLocker _(fLocker);
+
fDrawingEngine = engine;
// lots of subclasses will depend on the driver for text support, so
call
// _DoLayout() after we have it
@@ -217,6 +230,8 @@ Decorator::SetDrawingEngine(DrawingEngine* engine)
void
Decorator::SetFlags(int32 tab, uint32 flags, BRegion* updateRegion)
{
+ AutoWriteLocker _(fLocker);
+
// we're nice to our subclasses - we make sure B_NOT_{H|V|}_RESIZABLE
// are in sync (it's only a semantical simplification, not a necessity)
if ((flags & (B_NOT_H_RESIZABLE | B_NOT_V_RESIZABLE))
@@ -239,6 +254,7 @@ Decorator::SetFlags(int32 tab, uint32 flags, BRegion*
updateRegion)
void
Decorator::FontsChanged(DesktopSettings& settings, BRegion* updateRegion)
{
+ AutoWriteLocker _(fLocker);
_FontsChanged(settings, updateRegion);
_InvalidateFootprint();
@@ -250,6 +266,8 @@ Decorator::FontsChanged(DesktopSettings& settings, BRegion*
updateRegion)
void
Decorator::ColorsChanged(DesktopSettings& settings, BRegion* updateRegion)
{
+ AutoWriteLocker _(fLocker);
+
UpdateColors(settings);
if (updateRegion != NULL)
@@ -266,6 +284,8 @@ void
Decorator::SetLook(int32 tab, DesktopSettings& settings, window_look look,
BRegion* updateRect)
{
+ AutoWriteLocker _(fLocker);
+
Decorator::Tab* decoratorTab = fTabList.ItemAt(tab);
if (decoratorTab == NULL)
return;
@@ -282,6 +302,7 @@ Decorator::SetLook(int32 tab, DesktopSettings& settings,
window_look look,
window_look
Decorator::Look(int32 tab) const
{
+ AutoReadLocker _(fLocker);
return TabAt(tab)->look;
}
@@ -292,6 +313,7 @@ Decorator::Look(int32 tab) const
uint32
Decorator::Flags(int32 tab) const
{
+ AutoReadLocker _(fLocker);
return TabAt(tab)->flags;
}
@@ -302,6 +324,7 @@ Decorator::Flags(int32 tab) const
BRect
Decorator::BorderRect() const
{
+ AutoReadLocker _(fLocker);
return fBorderRect;
}
@@ -309,6 +332,7 @@ Decorator::BorderRect() const
BRect
Decorator::TitleBarRect() const
{
+ AutoReadLocker _(fLocker);
return fTitleBarRect;
}
@@ -319,6 +343,8 @@ Decorator::TitleBarRect() const
BRect
Decorator::TabRect(int32 tab) const
{
+ AutoReadLocker _(fLocker);
+
Decorator::Tab* decoratorTab = fTabList.ItemAt(tab);
if (decoratorTab == NULL)
return BRect();
@@ -344,6 +370,8 @@ Decorator::TabRect(Decorator::Tab* tab) const
void
Decorator::SetClose(int32 tab, bool pressed)
{
+ AutoWriteLocker _(fLocker);
+
Decorator::Tab* decoratorTab = fTabList.ItemAt(tab);
if (decoratorTab == NULL)
return;
@@ -365,6 +393,8 @@ Decorator::SetClose(int32 tab, bool pressed)
void
Decorator::SetMinimize(int32 tab, bool pressed)
{
+ AutoWriteLocker _(fLocker);
+
Decorator::Tab* decoratorTab = fTabList.ItemAt(tab);
if (decoratorTab == NULL)
return;
@@ -385,6 +415,8 @@ Decorator::SetMinimize(int32 tab, bool pressed)
void
Decorator::SetZoom(int32 tab, bool pressed)
{
+ AutoWriteLocker _(fLocker);
+
Decorator::Tab* decoratorTab = fTabList.ItemAt(tab);
if (decoratorTab == NULL)
return;
@@ -402,6 +434,8 @@ Decorator::SetZoom(int32 tab, bool pressed)
void
Decorator::SetTitle(int32 tab, const char* string, BRegion* updateRegion)
{
+ AutoWriteLocker _(fLocker);
+
Decorator::Tab* decoratorTab = fTabList.ItemAt(tab);
if (decoratorTab == NULL)
return;
@@ -422,6 +456,8 @@ Decorator::SetTitle(int32 tab, const char* string, BRegion*
updateRegion)
const char*
Decorator::Title(int32 tab) const
{
+ AutoReadLocker _(fLocker);
+
Decorator::Tab* decoratorTab = fTabList.ItemAt(tab);
if (decoratorTab == NULL)
return "";
@@ -433,6 +469,7 @@ Decorator::Title(int32 tab) const
const char*
Decorator::Title(Decorator::Tab* tab) const
{
+ AutoReadLocker _(fLocker);
return tab->title;
}
@@ -440,6 +477,8 @@ Decorator::Title(Decorator::Tab* tab) const
float
Decorator::TabLocation(int32 tab) const
{
+ AutoReadLocker _(fLocker);
+
Decorator::Tab* decoratorTab = _TabAt(tab);
if (decoratorTab == NULL)
return 0.0f;
@@ -452,6 +491,8 @@ bool
Decorator::SetTabLocation(int32 tab, float location, bool isShifting,
BRegion* updateRegion)
{
+ AutoWriteLocker _(fLocker);
+
Decorator::Tab* decoratorTab = fTabList.ItemAt(tab);
if (decoratorTab == NULL)
return false;
@@ -474,6 +515,8 @@ Decorator::SetTabLocation(int32 tab, float location, bool
isShifting,
void
Decorator::SetFocus(int32 tab, bool active)
{
+ AutoWriteLocker _(fLocker);
+
Decorator::Tab* decoratorTab = fTabList.ItemAt(tab);
if (decoratorTab == NULL)
return;
@@ -486,6 +529,8 @@ Decorator::SetFocus(int32 tab, bool active)
bool
Decorator::IsFocus(int32 tab) const
{
+ AutoReadLocker _(fLocker);
+
Decorator::Tab* decoratorTab = fTabList.ItemAt(tab);
if (decoratorTab == NULL)
return false;
@@ -497,6 +542,7 @@ Decorator::IsFocus(int32 tab) const
bool
Decorator::IsFocus(Decorator::Tab* tab) const
{
+ AutoReadLocker _(fLocker);
return tab->isFocused;
}
@@ -509,6 +555,8 @@ Decorator::IsFocus(Decorator::Tab* tab) const
const BRegion&
Decorator::GetFootprint()
{
+ AutoReadLocker _(fLocker);
+
if (!fFootprintValid) {
_GetFootprint(&fFootprint);
fFootprintValid = true;
@@ -522,6 +570,7 @@ Decorator::GetFootprint()
::Desktop*
Decorator::GetDesktop()
{
+ AutoReadLocker _(fLocker);
return fDesktop;
}
@@ -551,6 +600,8 @@ Decorator::GetDesktop()
Decorator::Region
Decorator::RegionAt(BPoint where, int32& tabIndex) const
{
+ AutoReadLocker _(fLocker);
+
tabIndex = -1;
for (int32 i = 0; i < fTabList.CountItems(); i++) {
@@ -600,6 +651,8 @@ Decorator::MoveBy(float x, float y)
void
Decorator::MoveBy(BPoint offset)
{
+ AutoWriteLocker _(fLocker);
+
if (fFootprintValid)
fFootprint.OffsetBy(offset.x, offset.y);
@@ -627,6 +680,7 @@ Decorator::ResizeBy(float x, float y, BRegion* dirty)
void
Decorator::ResizeBy(BPoint offset, BRegion* dirty)
{
+ AutoWriteLocker _(fLocker);
_ResizeBy(offset, dirty);
_InvalidateFootprint();
}
@@ -635,6 +689,8 @@ Decorator::ResizeBy(BPoint offset, BRegion* dirty)
void
Decorator::ExtendDirtyRegion(Region region, BRegion& dirty)
{
+ AutoReadLocker _(fLocker);
+
switch (region) {
case REGION_TAB:
dirty.Include(fTitleBarRect);
@@ -717,6 +773,8 @@ bool
Decorator::SetRegionHighlight(Region region, uint8 highlight, BRegion* dirty,
int32 tab)
{
+ AutoWriteLocker _(fLocker);
+
int32 index = (int32)region - 1;
if (index < 0 || index >= REGION_COUNT - 1)
return false;
@@ -735,6 +793,8 @@ Decorator::SetRegionHighlight(Region region, uint8
highlight, BRegion* dirty,
bool
Decorator::SetSettings(const BMessage& settings, BRegion* updateRegion)
{
+ AutoWriteLocker _(fLocker);
+
if (_SetSettings(settings, updateRegion)) {
_InvalidateFootprint();
return true;
@@ -746,6 +806,8 @@ Decorator::SetSettings(const BMessage& settings, BRegion*
updateRegion)
bool
Decorator::GetSettings(BMessage* settings) const
{
+ AutoReadLocker _(fLocker);
+
if (!fTitleBarRect.IsValid())
return false;
@@ -771,6 +833,8 @@ void
Decorator::GetSizeLimits(int32* minWidth, int32* minHeight,
int32* maxWidth, int32* maxHeight) const
{
+ AutoReadLocker _(fLocker);
+
float minTabSize = 0;
if (CountTabs() > 0)
minTabSize = _TabAt(0)->minTabSize;
@@ -790,6 +854,8 @@ Decorator::GetSizeLimits(int32* minWidth, int32* minHeight,
void
Decorator::DrawTab(int32 tabIndex)
{
+ AutoReadLocker _(fLocker);
+
Decorator::Tab* tab = fTabList.ItemAt(tabIndex);
if (tab == NULL)
return;
@@ -806,6 +872,8 @@ Decorator::DrawTab(int32 tabIndex)
void
Decorator::DrawTitle(int32 tab)
{
+ AutoReadLocker _(fLocker);
+
Decorator::Tab* decoratorTab = fTabList.ItemAt(tab);
if (decoratorTab == NULL)
return;
@@ -817,6 +885,8 @@ Decorator::DrawTitle(int32 tab)
void
Decorator::DrawClose(int32 tab)
{
+ AutoReadLocker _(fLocker);
+
Decorator::Tab* decoratorTab = fTabList.ItemAt(tab);
if (decoratorTab == NULL)
return;
@@ -829,6 +899,8 @@ Decorator::DrawClose(int32 tab)
void
Decorator::DrawMinimize(int32 tab)
{
+ AutoReadLocker _(fLocker);
+
Decorator::Tab* decoratorTab = fTabList.ItemAt(tab);
if (decoratorTab == NULL)
return;
@@ -841,6 +913,8 @@ Decorator::DrawMinimize(int32 tab)
void
Decorator::DrawZoom(int32 tab)
{
+ AutoReadLocker _(fLocker);
+
Decorator::Tab* decoratorTab = fTabList.ItemAt(tab);
if (decoratorTab == NULL)
return;
@@ -851,6 +925,7 @@ Decorator::DrawZoom(int32 tab)
rgb_color
Decorator::UIColor(color_which which)
{
+ AutoReadLocker _(fLocker);
DesktopSettings settings(fDesktop);
return settings.UIColor(which);
}
@@ -859,6 +934,7 @@ Decorator::UIColor(color_which which)
float
Decorator::BorderWidth()
{
+ AutoReadLocker _(fLocker);
return fBorderWidth;
}
@@ -866,6 +942,8 @@ Decorator::BorderWidth()
float
Decorator::TabHeight()
{
+ AutoReadLocker _(fLocker);
+
if (fTitleBarRect.IsValid())
return fTitleBarRect.Height();
diff --git a/src/servers/app/decorator/Decorator.h
b/src/servers/app/decorator/Decorator.h
index 44440a83ca..346dbb60b1 100644
--- a/src/servers/app/decorator/Decorator.h
+++ b/src/servers/app/decorator/Decorator.h
@@ -20,6 +20,7 @@
#include <Window.h>
#include "DrawState.h"
+#include "MultiLocker.h"
class Desktop;
class DesktopSettings;
@@ -269,6 +270,9 @@ protected:
void _InvalidateBitmaps();
+protected:
+ mutable MultiLocker fLocker;
+
DrawingEngine* fDrawingEngine;
DrawState fDrawState;