main_wake_lock
Wakelock 在实现过程中会默认初始化并添加一个suspendlock类型的非过期型锁( main_wake_lock 在wakelock.c 中的wakelock_init函数中),因此,系统将始终会因为main_wakelock的存在而正常运行。也就是,如果不添加新锁,将main_wake_lock解锁后,系统将进入睡眠状态。
Suspend 和 resume 的执行的分水岭
Suspend_enter()中suspend_ops->enter使CPU进入省电状态
如果系统在休眠状态被中断会其他时间唤醒,就会开始执行接下来的代码唤醒系统
Wakelock中有3个地方让系统直接开始suspend(通过 queue_work)
1、 wake_unlock()中,如果发现解锁以后没有任何其他的wakelock
2、 定时器到期后,定时器中断处理函数会查看是否有其他的wakelock,如果没有,就让系统进入睡眠
3、 在wakelock()中对一个wake lock解锁后,会再次查看有没有锁
两种类型的锁:
WAKE_LOCK_SUSPEND: 这种锁会防止系统进入睡眠状态
WAKE_LOCK_IDLE:这种锁不会影响系统的休眠,用于阻止系统在持有锁的过程中进入 low power 的状态(既是就算有WAKE_LOCK_IDLE 锁,如果是上面三种情况一样会进入suspend)