2010-04-21 17:58:39 +02:00
|
|
|
From d1d9d4e5f8f9ac1d22e1258759d6ee9e49c7fe90 Mon Sep 17 00:00:00 2001
|
|
|
|
From: Egbert Eich <eich@freedesktop.org>
|
|
|
|
Date: Fri, 9 Apr 2010 15:10:32 +0200
|
|
|
|
Subject: [PATCH] Prevent XSync Alarms from senslessly calling CheckTrigger() when inactive.
|
|
|
|
|
|
|
|
If an XSync Alarm is set to inactive there is no need to check if a trigger
|
|
|
|
needs to fire. Doing so if the counter is the IdleCounter will put the
|
|
|
|
server on 100 percent CPU load since the select timeout is set to 0.
|
|
|
|
---
|
|
|
|
xorg-server-1.8.0/Xext/sync.c | 11 +++++++++--
|
|
|
|
xorg-server-1.8.0/Xext/syncsrv.h | 1 +
|
|
|
|
2 files changed, 10 insertions(+), 2 deletions(-)
|
|
|
|
|
2010-04-26 14:28:36 +02:00
|
|
|
Index: xorg-server-1.8.0/Xext/sync.c
|
|
|
|
===================================================================
|
|
|
|
--- xorg-server-1.8.0.orig/Xext/sync.c
|
|
|
|
+++ xorg-server-1.8.0/Xext/sync.c
|
|
|
|
@@ -518,6 +518,10 @@ SyncAlarmTriggerFired(SyncTrigger *pTrig
|
2010-04-21 17:58:39 +02:00
|
|
|
pAlarm->state = XSyncAlarmInactive;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
+ /* Stop server from looping! */
|
|
|
|
+ if (pAlarm->state == XSyncAlarmInactive)
|
|
|
|
+ SyncDeleteTriggerFromCounter(&pAlarm->trigger);
|
|
|
|
+
|
|
|
|
/* The AlarmNotify event has to have the "new state of the alarm"
|
|
|
|
* which we can't be sure of until this point. However, it has
|
|
|
|
* to have the "old" trigger test value. That's the reason for
|
2010-04-26 14:28:36 +02:00
|
|
|
@@ -730,7 +734,7 @@ SyncChangeAlarmAttributes(ClientPtr clie
|
2010-04-21 17:58:39 +02:00
|
|
|
XSyncCounter counter;
|
|
|
|
Mask origmask = mask;
|
|
|
|
|
|
|
|
- counter = pAlarm->trigger.pCounter ? pAlarm->trigger.pCounter->id : None;
|
|
|
|
+ counter = pAlarm->counter_id;
|
|
|
|
|
|
|
|
while (mask)
|
|
|
|
{
|
2010-04-26 14:28:36 +02:00
|
|
|
@@ -741,7 +745,7 @@ SyncChangeAlarmAttributes(ClientPtr clie
|
2010-04-21 17:58:39 +02:00
|
|
|
case XSyncCACounter:
|
|
|
|
mask &= ~XSyncCACounter;
|
|
|
|
/* sanity check in SyncInitTrigger */
|
|
|
|
- counter = *values++;
|
|
|
|
+ counter = pAlarm->counter_id = *values++;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case XSyncCAValueType:
|
2010-04-26 14:28:36 +02:00
|
|
|
@@ -808,6 +812,14 @@ SyncChangeAlarmAttributes(ClientPtr clie
|
|
|
|
return BadMatch;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
+ if (pAlarm->state == XSyncAlarmInactive) {
|
|
|
|
+ /*
|
|
|
|
+ * If we are inactive the trigger has been deleted from the counter.
|
|
|
|
+ * Persuade SyncInitTrigger() to readd it.
|
|
|
|
+ */
|
|
|
|
+ origmask |= XSyncCACounter;
|
|
|
|
+ pAlarm->trigger.pCounter = NULL;
|
|
|
|
+ }
|
|
|
|
|
|
|
|
/* postpone this until now, when we're sure nothing else can go wrong */
|
|
|
|
if ((status = SyncInitTrigger(client, &pAlarm->trigger, counter,
|
|
|
|
@@ -815,6 +827,7 @@ SyncChangeAlarmAttributes(ClientPtr clie
|
2010-04-21 17:58:39 +02:00
|
|
|
return status;
|
|
|
|
|
|
|
|
/* XXX spec does not really say to do this - needs clarification */
|
|
|
|
+ /* It's the only place where it is set to XSyncAlarmActive! */
|
|
|
|
pAlarm->state = XSyncAlarmActive;
|
|
|
|
return Success;
|
|
|
|
}
|
2010-04-26 14:28:36 +02:00
|
|
|
@@ -1617,8 +1630,10 @@ ProcSyncCreateAlarm(ClientPtr client)
|
2010-04-21 17:58:39 +02:00
|
|
|
|
|
|
|
pAlarm->client = client;
|
|
|
|
pAlarm->alarm_id = stuff->id;
|
|
|
|
+ pAlarm->counter_id = None;
|
|
|
|
XSyncIntToValue(&pAlarm->delta, 1L);
|
|
|
|
pAlarm->events = TRUE;
|
|
|
|
+ /* SyncChangeAlarmAttributes() changes this - no need to set this here! */
|
|
|
|
pAlarm->state = XSyncAlarmInactive;
|
|
|
|
pAlarm->pEventClients = NULL;
|
|
|
|
status = SyncChangeAlarmAttributes(client, pAlarm, vmask,
|
2010-04-26 14:28:36 +02:00
|
|
|
Index: xorg-server-1.8.0/Xext/syncsrv.h
|
|
|
|
===================================================================
|
|
|
|
--- xorg-server-1.8.0.orig/Xext/syncsrv.h
|
|
|
|
+++ xorg-server-1.8.0/Xext/syncsrv.h
|
2010-04-21 17:58:39 +02:00
|
|
|
@@ -129,6 +129,7 @@ typedef struct _SyncAlarm {
|
|
|
|
int events;
|
|
|
|
int state;
|
|
|
|
SyncAlarmClientList *pEventClients;
|
|
|
|
+ XSyncCounter counter_id;
|
|
|
|
} SyncAlarm;
|
|
|
|
|
|
|
|
typedef struct {
|