二 android 休眠唤醒机制分析 — early_suspend( 三 )


在流程中首先判断当前状态是否为,如果是则置位标志,如果不是则取消流程;然后遍历浅度休眠链表,从链表头部到尾部依次调用各节点的()函数,执行完后判断当前状态是否为,如果是则释放,当前系统中如果只存在这个有效锁,则会在()里面启动 深度休眠线程,如果还有其他其他则保持当前状态 。
[cpp] view plain copyprint ?
e(*work){*pos;;=0;(&);(&,);if(state==)//清除浅度休眠完成标志state&=~;=1;re(&,);if(abort){if(&)(":abort,state%d\n",state);;}if(&)(":\n");//反向遍历浅度休眠链表并执行其中所有函数//执行顺序根据优先等级而定,等级越高越先执行(pos,&rs,link)if(pos->!=NULL)pos->(pos);if(&)(":done\n");abort:(&);}
static void late_resume(struct work_struct *work){struct early_suspend *pos;unsigned long irqflags;int abort = 0;mutex_lock(&early_suspend_lock);spin_lock_irqsave(&state_lock, irqflags);if (state == SUSPENDED)// 清除浅度休眠完成标志state &= ~SUSPENDED;elseabort = 1;spin_unlock_irqrestore(&state_lock, irqflags);if (abort) {if (debug_mask & DEBUG_SUSPEND)pr_info("late_resume: abort, state %d\n", state);goto abort;}if (debug_mask & DEBUG_SUSPEND)pr_info("late_resume: call handlers\n");// 反向遍历浅度休眠链表并执行其中所有resume函数// 执行顺序根据优先等级而定,等级越高越先执行list_for_each_entry_reverse(pos, &early_suspend_handlers, link)if (pos->resume != NULL)pos->resume(pos);if (debug_mask & DEBUG_SUSPEND)pr_info("late_resume: done\n");abort:mutex_unlock(&early_suspend_lock);}
在流程中同样首先判断当前状态是否为,如果是则清除标志,然后反向遍历浅度休眠链表,按照优先等级从高到低的顺序执行节点的()函数 。
[cpp] view plain copyprint ?
sync(*work){(&);();(&);}
static void early_sys_sync(struct work_struct *work){wake_lock(&sys_sync_wake_lock);sys_sync();wake_unlock(&sys_sync_wake_lock);}
内核专门为缓存同步建立了一个线程,同时还创建了防止在同步缓存时系统进入深度休眠 。