early suspend 过程

在wakelock.c中声明了一个工作队列suspend_work_queue

        struct workqueue_struct *suspend_work_queue;

然后创建它,这个工作队列是earlysuspend的核心 

suspend_work_queue = create_singlethread_workqueue("suspend");


在earlysuspend.c中声明了两个工作early_suspend_work和late_resume_work

static DECLARE_WORK(early_suspend_work, early_suspend);
static DECLARE_WORK(late_resume_work, late_resume);

然后在request_suspend_state函数中,根据之前的电源状态和请求状态,分别将它们插入到上面的工作队列中

if (!old_sleep && new_state != PM_SUSPEND_ON) {
state |= SUSPEND_REQUESTED;
queue_work(suspend_work_queue, &early_suspend_work);
} else if (old_sleep && new_state == PM_SUSPEND_ON) {
state &= ~SUSPEND_REQUESTED;
wake_lock(&main_wake_lock);
queue_work(suspend_work_queue, &late_resume_work);
}

插入到工作队列后,工作队列会安排执行工作,也就是执行early_suspend或late_resume函数。

list_for_each_entry(pos, &early_suspend_handlers, link) {
if (pos->suspend != NULL) {
if (debug_mask & DEBUG_VERBOSE)
pr_info("early_suspend: calling %pf\n", pos->suspend);
pos->suspend(pos);
}
}

在early_suspend函数里,历遍early_suspend_handlers链表。在earlysuspend.c的一开始就声明了一个全局静态的early_suspend_handlers链表

static LIST_HEAD(early_suspend_handlers);


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值