[haiku-commits] BRANCH looncraz-github.setviewuicolor [3a097a008647] in src/servers/app: . decorator

  • From: looncraz-github.setviewuicolor <community@xxxxxxxxxxxx>
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Thu, 8 Oct 2015 23:32:03 +0200 (CEST)

added 3 changesets to branch 'refs/remotes/looncraz-github/setviewuicolor'
old head: e5125a7786255fe0a9c2346bdee14b05b1305bb9
new head: 3a097a008647dd5bafeaf2dc1fd752f81be71743
overview: https://github.com/looncraz/haiku/compare/e5125a778625...3a097a008647

----------------------------------------------------------------------------

be5d6d0e1693: Remove Decorator ChangeColors() Cheat

This reduces the amount of work necessary to respond to color
changes in the window decorator.

51cc76d14bb5: Delay font change messages

When setting default/restoring settings we were rebuilding decorators
twice and sending out three messages to every client. This is now down
to one rebuild and one message per client.

3a097a008647: Reduce lock contention, possible dead-lock

Use atomics in DelayedMessageLooper to avoid locking for each and
every message sent to any window as well as avoiding a potential
deadlock scenario (a convoluted one, but that's all it takes).

[ looncraz <looncraz@xxxxxxxxxxxx> ]

----------------------------------------------------------------------------

3 files changed, 21 insertions(+), 19 deletions(-)
src/servers/app/DelayedMessageLooper.cpp | 17 ++++++-----------
src/servers/app/DesktopSettings.cpp | 15 ++++++++++-----
src/servers/app/decorator/Decorator.cpp | 8 +++++---

############################################################################

Commit: be5d6d0e1693fa2016e9153bcff33383bb912eba
Author: looncraz <looncraz@xxxxxxxxxxxx>
Date: Thu Oct 8 20:53:14 2015 UTC

Remove Decorator ChangeColors() Cheat

This reduces the amount of work necessary to respond to color
changes in the window decorator.

----------------------------------------------------------------------------

diff --git a/src/servers/app/decorator/Decorator.cpp
b/src/servers/app/decorator/Decorator.cpp
index 39136d1..50b9060 100644
--- a/src/servers/app/decorator/Decorator.cpp
+++ b/src/servers/app/decorator/Decorator.cpp
@@ -250,9 +250,11 @@ void
Decorator::ColorsChanged(DesktopSettings& settings, BRegion* updateRegion)
{
UpdateColors(settings);
- // Cheat:
- _FontsChanged(settings, updateRegion);
- _InvalidateFootprint();
+
+ if (updateRegion != NULL)
+ updateRegion->Include(&GetFootprint());
+
+ _InvalidateBitmaps();
}



############################################################################

Commit: 51cc76d14bb5fe6e27fbf44fbbbdb4a74967460f
Author: looncraz <looncraz@xxxxxxxxxxxx>
Date: Thu Oct 8 21:19:41 2015 UTC

Delay font change messages

When setting default/restoring settings we were rebuilding decorators
twice and sending out three messages to every client. This is now down
to one rebuild and one message per client.

----------------------------------------------------------------------------

diff --git a/src/servers/app/DesktopSettings.cpp
b/src/servers/app/DesktopSettings.cpp
index 2b26b84..9a37a5f 100644
--- a/src/servers/app/DesktopSettings.cpp
+++ b/src/servers/app/DesktopSettings.cpp
@@ -923,7 +923,8 @@ void
LockedDesktopSettings::SetDefaultPlainFont(const ServerFont &font)
{
fSettings->SetDefaultPlainFont(font);
- fDesktop->BroadcastToAllWindows(B_FONTS_UPDATED);
+ fDesktop->DelayedBroadcastToAllWindows(B_FONTS_UPDATED, DM_60HZ_DELAY,
+ true, DM_MERGE_CANCEL);
}


@@ -931,8 +932,10 @@ void
LockedDesktopSettings::SetDefaultBoldFont(const ServerFont &font)
{
fSettings->SetDefaultBoldFont(font);
- fDesktop->BroadcastToAllWindows(AS_SYSTEM_FONT_CHANGED);
- fDesktop->BroadcastToAllWindows(B_FONTS_UPDATED);
+ fDesktop->DelayedBroadcastToAllWindows(AS_SYSTEM_FONT_CHANGED,
+ DM_60HZ_DELAY, true, DM_MERGE_CANCEL);
+ fDesktop->DelayedBroadcastToAllWindows(B_FONTS_UPDATED, DM_60HZ_DELAY,
+ true, DM_MERGE_CANCEL);
}


@@ -940,8 +943,10 @@ void
LockedDesktopSettings::SetDefaultFixedFont(const ServerFont &font)
{
fSettings->SetDefaultFixedFont(font);
- fDesktop->BroadcastToAllWindows(AS_SYSTEM_FONT_CHANGED);
- fDesktop->BroadcastToAllWindows(B_FONTS_UPDATED);
+ fDesktop->DelayedBroadcastToAllWindows(AS_SYSTEM_FONT_CHANGED,
+ DM_60HZ_DELAY, true, DM_MERGE_CANCEL);
+ fDesktop->DelayedBroadcastToAllWindows(B_FONTS_UPDATED, DM_60HZ_DELAY,
+ true, DM_MERGE_CANCEL);
}



############################################################################

Commit: 3a097a008647dd5bafeaf2dc1fd752f81be71743
Author: looncraz <looncraz@xxxxxxxxxxxx>
Date: Thu Oct 8 22:18:26 2015 UTC

Reduce lock contention, possible dead-lock

Use atomics in DelayedMessageLooper to avoid locking for each and
every message sent to any window as well as avoiding a potential
deadlock scenario (a convoluted one, but that's all it takes).

----------------------------------------------------------------------------

diff --git a/src/servers/app/DelayedMessageLooper.cpp
b/src/servers/app/DelayedMessageLooper.cpp
index 58880ed..418d0a4 100644
--- a/src/servers/app/DelayedMessageLooper.cpp
+++ b/src/servers/app/DelayedMessageLooper.cpp
@@ -356,7 +356,7 @@ int32
DelayedMessageLooper::SendDelayedMessages()
{
BAutolock _(fLock);
- fScheduledWakeup = B_INFINITE_TIMEOUT;
+ atomic_set64(&fScheduledWakeup, B_INFINITE_TIMEOUT);

if (fMessages.CountItems() == 0)
return 0;
@@ -373,7 +373,7 @@ DelayedMessageLooper::SendDelayedMessages()
message = fMessages.ItemAt(index);

if (message->ScheduledTime() > time) {
- fScheduledWakeup = message->ScheduledTime();
+ atomic_set64(&fScheduledWakeup,
message->ScheduledTime());
break;
}

@@ -431,13 +431,8 @@ DelayedMessageLooper::GetNextMessage(int32& code)
bigtime_t timeout = B_INFINITE_TIMEOUT;

while (true) {
- if (fLock.Lock()) {
- timeout = fScheduledWakeup - (system_time()
- + (DM_MINIMUM_DELAY / 2));
- fLock.Unlock();
- } else
- timeout = 2000;
- // port is under contention, so relax a bit
+ timeout = atomic_get64(&fScheduledWakeup) - (system_time()
+ + (DM_MINIMUM_DELAY / 2));

if (timeout > DM_MINIMUM_DELAY / 4)
status = receiver.GetNextMessage(code, timeout);
@@ -492,10 +487,10 @@ DelayedMessageLooper::_MessageLooper()
void
DelayedMessageLooper::_Wakeup(bigtime_t when)
{
- if (fScheduledWakeup < when)
+ if (atomic_get64(&fScheduledWakeup) < when)
return;

- fScheduledWakeup = when;
+ atomic_set64(&fScheduledWakeup, when);

BPrivate::LinkSender sender(fLink.ReceiverPort());
sender.StartMessage(kWakeupMessage);


Other related posts:

  • » [haiku-commits] BRANCH looncraz-github.setviewuicolor [3a097a008647] in src/servers/app: . decorator - looncraz-github . setviewuicolor