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);


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章