android的内核版本中,提供了一套阻止系统进入睡眠的wakelock接口,该套接口共有6个;
struct wake_lock{
struct wakeup_source ws;
};
static inline void wake_lock_init(struct wake_lock *lock,int type,const char* name)
{
wakeup_source_init(&lock->ws,name);
}
static inline void wake_lock_destroy(struct wake_lock* lock)
{
wakeup_source_trash(&lock->ws);
}
static inline void wake_lock(struct wake_lock* lock)
{
__pm_stay_awake(&lock->ws);
}
static inline void wake_lock_timeout(struct wake_lock* lock,long timeout)
{
__pm_stay_awake(&lock->ws);
}
static inline void wake_unlock(struct wake_lock* lock)
{
__pm_relax(&lock->ws);
}
static inline bool wake_lock_active(struct wake_lock* lock)
{
return lock->ws.active;
}
还有一个重要的数据结构需要亮一下,那就是wakeup_source,该数据结构完成wakelock锁的基本控制
/**
* struct wakeup_source - Representation of wakeup sources
*
* @total_time: Total time this wakeup source has been active.
* @max_time: Maximum time this wakeup source has been continuously active.
* @last_time: Monotonic clock when the wakeup source's was touched last time.
* @prevent_sleep_time: Total time this source has been preventing autosleep.
* @event_count: Number of signaled wakeup events.
* @active_count: Number of times the wakeup sorce was activated.
* @relax_count: Number of times the wakeup sorce was deactivated.
* @expire_count: Number of times the wakeup source's timeout has expired.
* @wakeup_count: Number of times the wakeup source might abort suspend.
* @active: Status of the wakeup source.
* @has_timeout: The wakeup source has been activated with a timeout.
*/
struct wakeup_source {
const char *name;
struct list_head entry;
spinlock_t lock;
struct timer_list timer;
unsigned long timer_expires;
ktime_t total_time;
ktime_t max_time;
ktime_t last_time;
ktime_t start_prevent_time;
ktime_t prevent_sleep_time;
unsigned long event_count;
unsigned long active_count;
unsigned long relax_count;
unsigned long expire_count;
unsigned long wakeup_count;
bool active:1;
bool autosleep_enabl