Skip to content

Commit

Permalink
[powersavemode] Avoid unnecessary state evaluation
Browse files Browse the repository at this point in the history
Re-evaluate power save mode only when values used in the evaluation
actually change.

Signed-off-by: Simo Piiroinen <simo.piiroinen@jollamobile.com>
  • Loading branch information
spiiroin committed Dec 21, 2018
1 parent 5f68312 commit 20b356c
Showing 1 changed file with 57 additions and 27 deletions.
84 changes: 57 additions & 27 deletions modules/powersavemode.c
Expand Up @@ -165,9 +165,18 @@ static void update_power_saving_mode(void)
*/
static void battery_level_trigger(gconstpointer const data)
{
gint prev = battery_level;
battery_level = GPOINTER_TO_INT(data);

if( prev == battery_level )
goto EXIT;

mce_log(LL_DEBUG, "battery_level: %d -> %d", prev, battery_level);

update_power_saving_mode();

EXIT:
return;
}

/**
Expand All @@ -177,9 +186,20 @@ static void battery_level_trigger(gconstpointer const data)
*/
static void charger_state_trigger(gconstpointer const data)
{
charger_state_t prev = charger_state;
charger_state = GPOINTER_TO_INT(data);

if( prev == charger_state )
goto EXIT;

mce_log(LL_DEBUG, "charger_state: %s -> %s",
charger_state_repr(prev),
charger_state_repr(charger_state));

update_power_saving_mode();

EXIT:
return;
}

/**
Expand All @@ -190,9 +210,20 @@ static void charger_state_trigger(gconstpointer const data)
*/
static void thermal_state_trigger(gconstpointer const data)
{
thermal_state_t prev = thermal_state;
thermal_state = GPOINTER_TO_INT(data);

if( prev == thermal_state )
goto EXIT;

mce_log(LL_DEBUG, "thermal_state: %s -> %s",
thermal_state_repr(prev),
thermal_state_repr(thermal_state));

update_power_saving_mode();

EXIT:
return;
}

/**
Expand Down Expand Up @@ -220,14 +251,20 @@ static void psm_setting_cb(GConfClient *const gcc, const guint id,
}

if (id == power_saving_mode_setting_id) {
gboolean prev = power_saving_mode;
power_saving_mode = gconf_value_get_bool(gcv);
update_power_saving_mode();
if( prev != power_saving_mode )
update_power_saving_mode();
} else if (id == force_psm_setting_id) {
gboolean prev = force_psm;
force_psm = gconf_value_get_bool(gcv);
update_power_saving_mode();
if( prev != force_psm )
update_power_saving_mode();
} else if (id == psm_threshold_setting_id) {
gint prev = psm_threshold;
psm_threshold = gconf_value_get_int(gcv);
update_power_saving_mode();
if( prev != psm_threshold )
update_power_saving_mode();
} else {
mce_log(LL_WARN,
"Spurious GConf value received; confused!");
Expand Down Expand Up @@ -359,38 +396,31 @@ const gchar *g_module_check_init(GModule *module)
mce_psm_datapipe_init();

/* Power saving mode setting */
/* Since we've set a default, error handling is unnecessary */
mce_setting_notifier_add(MCE_SETTING_EM_PATH,
MCE_SETTING_EM_ENABLE_PSM,
psm_setting_cb,
&power_saving_mode_setting_id);

mce_setting_get_bool(MCE_SETTING_EM_ENABLE_PSM,
&power_saving_mode);
mce_setting_track_bool(MCE_SETTING_EM_ENABLE_PSM,
&power_saving_mode,
MCE_DEFAULT_EM_ENABLE_PSM,
psm_setting_cb,
&power_saving_mode_setting_id);

/* Forced power saving mode setting */
/* Since we've set a default, error handling is unnecessary */
mce_setting_notifier_add(MCE_SETTING_EM_PATH,
MCE_SETTING_EM_FORCED_PSM,
psm_setting_cb,
&force_psm_setting_id);

mce_setting_get_bool(MCE_SETTING_EM_FORCED_PSM,
&force_psm);
mce_setting_track_bool(MCE_SETTING_EM_FORCED_PSM,
&force_psm,
MCE_DEFAULT_EM_FORCED_PSM,
psm_setting_cb,
&force_psm_setting_id);

/* Power saving mode threshold */
/* Since we've set a default, error handling is unnecessary */
mce_setting_notifier_add(MCE_SETTING_EM_PATH,
MCE_SETTING_EM_PSM_THRESHOLD,
psm_setting_cb,
&psm_threshold_setting_id);

mce_setting_get_int(MCE_SETTING_EM_PSM_THRESHOLD,
&psm_threshold);
mce_setting_track_int(MCE_SETTING_EM_PSM_THRESHOLD,
&psm_threshold,
MCE_DEFAULT_EM_PSM_THRESHOLD,
psm_setting_cb,
&psm_threshold_setting_id);

/* Add dbus handlers */
mce_psm_init_dbus();

/* Explicitly evaluate initial state */
update_power_saving_mode();
return NULL;
}

Expand Down

0 comments on commit 20b356c

Please sign in to comment.