summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYoungjae Cho <y0.cho@samsung.com>2020-12-14 15:31:59 +0900
committerYoungjae Cho <y0.cho@samsung.com>2020-12-15 13:39:46 +0900
commit00c0c2fe6dee1e09ecb4ae785b459311d6cd245c (patch)
treea557fcf3f318e37fe987056765fdd38c794a4803
parentce8957406c2860564ac8b9f3e5b218012f087882 (diff)
downloaddeviced-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-xsrc/display/ambient-mode.c1
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);