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