Event auto wakelock 介绍

原创 2012年03月25日 15:16:43

Evdev auto wakelock 介绍

介绍kernel-2.6.25 关于event 加锁的机制,从中窥探linux的锁机制。

kernel版本比较旧,对比2.6.32发现kernel在锁机制方面基本没变,但是在机制的实现上有很大的变化。

1.evdev模块初始化

module_init(evdev_init);


2.evdev初始化

static int __init evdev_init(void)
{
	return input_register_handler(&evdev_handler);
}


3.回调方法集定义

static struct input_handler evdev_handler = {
	.event		= evdev_event,
	.connect	= evdev_connect,
	.disconnect	= evdev_disconnect,
	.fops		= &evdev_fops,
	.minor		= EVDEV_MINOR_BASE,
	.name		= "evdev",
	.id_table	= evdev_ids,
};


4.event方法的实现函数

static void evdev_event(struct input_handle *handle,
			unsigned int type, unsigned int code, int value)
{
//...
	rcu_read_lock();
//...
	if (client)
		evdev_pass_event(client, &event);
	else
		list_for_each_entry_rcu(client, &evdev->client_list, node)
			evdev_pass_event(client, &event);
//...
	rcu_read_unlock();
//...
}


5.event发生时的处理,加锁了!获取evdev的超时锁,超时时间是5*HZ,HZ根据不同CPU而定,这里是50ms

static void evdev_pass_event(struct evdev_client *client,
			     struct input_event *event)
{
//...
#ifdef CONFIG_ANDROID_POWER
	android_lock_suspend_auto_expire(&client->suspend_lock, 5 * HZ); //50ms
#endif
//...
}


6.evdev节点打开方法的实现,初始化名为“evdev”的锁,锁的类型不在这里声明,在申请锁的时候才声明是超时锁还是非超时锁

static int evdev_open(struct inode *inode, struct file *file)
{
//...
#ifdef CONFIG_ANDROID_POWER
	client->suspend_lock.name = "evdev";
	android_init_suspend_lock(&client->suspend_lock);
#endif
//...
}
static int evdev_release(struct inode *inode, struct file *file)
{
//...
#ifdef CONFIG_ANDROID_POWER
	android_uninit_suspend_lock(&client->suspend_lock);
#endif
//...
}


7.申请超时锁的实现,把锁加入活跃数组。共有三种数组,这里是之一。

void android_lock_suspend_auto_expire(android_suspend_lock_t *lock, int timeout)
{
	unsigned long irqflags;
	spin_lock_irqsave(&g_list_lock, irqflags);
#ifdef CONFIG_ANDROID_POWER_STAT
	if(!(lock->flags & ANDROID_SUSPEND_LOCK_ACTIVE)) {
		lock->flags |= ANDROID_SUSPEND_LOCK_ACTIVE;
		lock->stat.last_time = ktime_get();
	}
#endif
	if (android_power_debug_mask & ANDROID_POWER_DEBUG_WAKE_LOCK)
		printk(KERN_INFO "android_power: acquire wake lock: %s, "
			"timeout %d.%03lu\n", lock->name, timeout / HZ,
			(timeout % HZ) * MSEC_PER_SEC / HZ);
	lock->expires = jiffies + timeout;
	lock->flags |= ANDROID_SUSPEND_LOCK_AUTO_EXPIRE;
	list_del(&lock->link);
	list_add(&lock->link, &g_active_partial_wake_locks);
	g_current_event_num++;
	wake_up(&g_wait_queue);
	spin_unlock_irqrestore(&g_list_lock, irqflags);
}





相关文章推荐

Rexsee API介绍:Android WakeLock进程持续,阻止应用休眠

在Android中,WakeLock可以让进程持续执行,即使手机关屏、进入睡眠模式。。基于Rexsee的WakeLock扩展可以使用JS实现。。 【函数】 void acquire(boolea...

perf event相关介绍

  • 2013年06月13日 13:43
  • 135KB
  • 下载

iOS 自动布局 Auto Layout 入门 01 背景介绍

如果你在考虑如何让我们的app在手机处于水平和垂直的情况下都保持很好的布局?如何让我们的程序很好的同时支持iPhone和iPad?请使用自动布局-Auto Layout!这一节,我们通过Autosiz...

hibernate.hbm2ddl.auto 配置项介绍

Hibernate部分配置项解析

hibernate.hbm2ddl.auto含义介绍

简要介绍了hibernate.hbm2ddl.auto的基本用法和含义

简单介绍C语言中auto,register,static,const,volatile,extern等几个关键字的作用

C语言中auto,register,static,const,volatile,extern等几个关键字的作用

auto_ptr介绍

#include 1.C++程序设计的时候,经常会遇到的问题就是,new 与delete的合理调用。内存泄露的问题是很让人都疼的,对于内存泄露的预防通常又会使得代码异常复杂,易错。如以下的一个例子:...

第三章 :介绍 Auto Layout

第三章 :介绍 Auto Layout译者注:由于本人英语水平有限,尽可能描述出作者的本意。如有错误,及时指出。文中会省略部分技术无关的赘述“Life is short. Build stuff th...

margin 0 auto什么作用与语法重点介绍教程

css margin:0 auto什么作用与语法重点介绍教程 一、CSS margin认识   -   TOP margin设置对象外边距,如果我们给DIV设置一条边框线(border)样式后...

Auto-Encoder相关介绍(转载)

关于Auto自动编码的相关介绍(2014年)以前
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Event auto wakelock 介绍
举报原因:
原因补充:

(最多只允许输入30个字)