[gnome-power-manager] Fix a race condition where we can miss the idle reset alarm
- From: Chris Coulson <ccoulson src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-power-manager] Fix a race condition where we can miss the idle reset alarm
- Date: Wed, 17 Mar 2010 11:02:47 +0000 (UTC)
commit 0c171b962989d20b55f65ae016c584d3543f4801
Author: Chris Coulson <chrisccoulson googlemail com>
Date: Wed Mar 17 10:52:45 2010 +0000
Fix a race condition where we can miss the idle reset alarm
When the idle timeout alarm fires, a reset alarm is created. If the IDLETIME counter resets in between the idle timeout alarm being detected and creating the reset alarm, then the reset alarm will be missed and we will think that X is idle forever.
This patch checks the current IDLETIME value from the server just after creating the reset alarm. If the current value is less than the reset threshold, then we assume that we missed the event and handle it accordingly.
Fixes https://bugzilla.gnome.org/show_bug.cgi?id=609720
src/egg-idletime.c | 11 +++++++++++
1 files changed, 11 insertions(+), 0 deletions(-)
---
diff --git a/src/egg-idletime.c b/src/egg-idletime.c
index 2145eac..a18e8d1 100644
--- a/src/egg-idletime.c
+++ b/src/egg-idletime.c
@@ -146,6 +146,9 @@ egg_idletime_alarm_reset_all (EggIdletime *idletime)
g_return_if_fail (EGG_IS_IDLETIME (idletime));
+ if (!idletime->priv->reset_set)
+ return;
+
/* reset all the alarms (except the reset alarm) to their timeouts */
for (i=1; i<idletime->priv->array->len; i++) {
alarm = g_ptr_array_index (idletime->priv->array, i);
@@ -188,6 +191,7 @@ egg_idletime_set_reset_alarm (EggIdletime *idletime, XSyncAlarmNotifyEvent *alar
EggIdletimeAlarm *alarm;
int overflow;
XSyncValue add;
+ gint64 current, reset_threshold;
alarm = egg_idletime_alarm_find_id (idletime, 0);
@@ -203,6 +207,13 @@ egg_idletime_set_reset_alarm (EggIdletime *idletime, XSyncAlarmNotifyEvent *alar
/* don't try to set this again if multiple timers are going off in sequence */
idletime->priv->reset_set = TRUE;
+
+ current = egg_idletime_get_time (idletime);
+ reset_threshold = egg_idletime_xsyncvalue_to_int64 (alarm->timeout);
+ if (current < reset_threshold) {
+ /* We've missed the alarm already */
+ egg_idletime_alarm_reset_all (idletime);
+ }
}
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]