[gnome-power-manager] Revert "Avoid a race in detecting the idle reset alarm"
- From: Richard Hughes <rhughes src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-power-manager] Revert "Avoid a race in detecting the idle reset alarm"
- Date: Thu, 18 Feb 2010 09:17:59 +0000 (UTC)
commit f7c9d7ed9ba11d25cedf3e5e71bb7d5af994aff7
Author: Richard Hughes <richard hughsie com>
Date: Thu Feb 18 09:17:10 2010 +0000
Revert "Avoid a race in detecting the idle reset alarm"
This reverts commit 7380ab4e13db76cb5be2e1bc4a42a810a5261fd4.
src/egg-idletime.c | 42 ++++++++++++++++++++++++++++++++----------
1 files changed, 32 insertions(+), 10 deletions(-)
---
diff --git a/src/egg-idletime.c b/src/egg-idletime.c
index 64aa380..2145eac 100644
--- a/src/egg-idletime.c
+++ b/src/egg-idletime.c
@@ -146,15 +146,16 @@ 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);
egg_idletime_xsync_alarm_set (idletime, alarm, EGG_IDLETIME_ALARM_TYPE_POSITIVE);
}
+ /* set the reset alarm to be disabled */
+ alarm = g_ptr_array_index (idletime->priv->array, 0);
+ egg_idletime_xsync_alarm_set (idletime, alarm, EGG_IDLETIME_ALARM_TYPE_DISABLED);
+
/* emit signal so say we've reset all timers */
g_signal_emit (idletime, signals [SIGNAL_RESET], 0);
@@ -179,6 +180,33 @@ egg_idletime_alarm_find_id (EggIdletime *idletime, guint id)
}
/**
+ * egg_idletime_set_reset_alarm:
+ */
+static void
+egg_idletime_set_reset_alarm (EggIdletime *idletime, XSyncAlarmNotifyEvent *alarm_event)
+{
+ EggIdletimeAlarm *alarm;
+ int overflow;
+ XSyncValue add;
+
+ alarm = egg_idletime_alarm_find_id (idletime, 0);
+
+ if (!idletime->priv->reset_set) {
+ /* don't match on the current value because
+ * XSyncNegativeComparison means less or equal. */
+ XSyncIntToValue (&add, -1);
+ XSyncValueAdd (&alarm->timeout, alarm_event->counter_value, add, &overflow);
+
+ /* set the reset alarm to fire the next time
+ * idletime->priv->idle_counter < the current counter value */
+ egg_idletime_xsync_alarm_set (idletime, alarm, EGG_IDLETIME_ALARM_TYPE_NEGATIVE);
+
+ /* don't try to set this again if multiple timers are going off in sequence */
+ idletime->priv->reset_set = TRUE;
+ }
+}
+
+/**
* egg_idletime_alarm_find_event:
*/
static EggIdletimeAlarm *
@@ -226,7 +254,7 @@ egg_idletime_event_filter_cb (GdkXEvent *gdkxevent, GdkEvent *event, gpointer da
g_signal_emit (alarm->idletime, signals [SIGNAL_ALARM_EXPIRED], 0, alarm->id);
/* we need the first alarm to go off to set the reset alarm */
- idletime->priv->reset_set = TRUE;
+ egg_idletime_set_reset_alarm (idletime, alarm_event);
out:
/* don't propagate */
return GDK_FILTER_REMOVE;
@@ -388,12 +416,6 @@ egg_idletime_init (EggIdletime *idletime)
/* create a reset alarm */
alarm = egg_idletime_alarm_new (idletime, 0);
g_ptr_array_add (idletime->priv->array, alarm);
-
- XSyncIntToValue (&alarm->timeout, 0);
-
- /* set the reset alarm to fire when the
- * idle_counter == 0 */
- egg_idletime_xsync_alarm_set (idletime, alarm, EGG_IDLETIME_ALARM_TYPE_NEGATIVE);
}
/**
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]