diff options
author | Youngjae Cho <y0.cho@samsung.com> | 2020-12-14 15:31:59 +0900 |
---|---|---|
committer | Youngjae Cho <y0.cho@samsung.com> | 2020-12-15 13:39:46 +0900 |
commit | 00c0c2fe6dee1e09ecb4ae785b459311d6cd245c (patch) | |
tree | a557fcf3f318e37fe987056765fdd38c794a4803 | |
parent | ce8957406c2860564ac8b9f3e5b218012f087882 (diff) | |
download | deviced-00c0c2fe6dee1e09ecb4ae785b459311d6cd245c.tar.gz deviced-00c0c2fe6dee1e09ecb4ae785b459311d6cd245c.tar.bz2 deviced-00c0c2fe6dee1e09ecb4ae785b459311d6cd245c.zip |
Fix infinite recursive call for AOD corner case
The subroutine triggered by lcd_off_procedure() could lead infinite
recursive call. This can happen when the lcd_off_procedure() do not
serve actual DPMS_OFF, remaining display state as DPMS_ON even after
the call.
One of the case is when the clockend signal arrives late. In this
situation, deviced forces to set ambient_state as false, but actual node
of lcd power remains ON. This combination of two state* makes deviced
perceive dpms state as DPMS_ON. As a result, lcd_off_procedure() has
been processed, but deviced still recognize dpms state as DPMS_ON,
triggering recursive call for lcd_off_procedure() to turning off display.
[*] ambient_state=>false && lcd node=>ON
Possible callstack of recursive call
del_state_cond
-> default_trans
-> default_action
-> lcd_off_procedure**
-> ambient_set_state(true)
-> pm_lock_internal
-> proc_condition
-> proc_condition_lock
-> proc_change_state
-> lcd_off_procedure [repeat **]
To fix this, leave ambient_state as it is when clockend arrival is
delayed. This makes deviced perceive DPMS state as DPMS_OFF, and it
won't trigger lcd_off_procedure().
Change-Id: I14ccca1ba7718975752389cd409a775fbfe80ada
Signed-off-by: Youngjae Cho <y0.cho@samsung.com>
-rwxr-xr-x | src/display/ambient-mode.c | 1 |
1 files changed, 0 insertions, 1 deletions
diff --git a/src/display/ambient-mode.c b/src/display/ambient-mode.c index dc45e15e..c5128f41 100755 --- a/src/display/ambient-mode.c +++ b/src/display/ambient-mode.c @@ -152,7 +152,6 @@ void ambient_check_invalid_state(pid_t pid) */ reset_timeout(TIMEOUT_NONE); - ambient_set_state(false); lcd_direct_control(DPMS_OFF, NORMAL_MODE); broadcast_lcd_off_late(LCD_OFF_LATE_MODE); |