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





HTML5快速入门(一)—— HTML简介

前言:1.HTML5的发展非常迅速,可以说已经是前端开发人员的标配,在电商类型的APP中更是运用广泛,这个系列的文章是本人自己整理,尽量将开发中不常用到的剔除,将经常使用的拿出来,使需要的朋友能够真正...
  • yeshaojian
  • yeshaojian
  • 2016年06月08日 21:50
  • 9976

Sublime text 3 软件使用介绍及常用插件

快捷键: Ctrl+Shift+P:打开命令面板 Ctrl+P:打开搜索框,搜索项目中的文件。举个栗子:1、输入当前项目中的文件名,快速搜索文件,2、输入@和关键字,查找文件中函数名,3、输入:和...
  • longzhoufeng
  • longzhoufeng
  • 2017年04月10日 09:27
  • 2248

运用autoconf和automake自动生成Makefile实例讲解

标题:运用autoconf和automake自动生成Makefile实例讲解 2008-06-30 17:57:28 对于一个UNIX/Linux下C程序员来说,一个比较麻烦的工作...
  • yangguangmeng
  • yangguangmeng
  • 2014年05月22日 23:11
  • 1620

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

在Android中,WakeLock可以让进程持续执行,即使手机关屏、进入睡眠模式。。基于Rexsee的WakeLock扩展可以使用JS实现。。 【函数】 void acquire(boolea...
  • rexsee_dev
  • rexsee_dev
  • 2012年03月15日 17:53
  • 268

perf event相关介绍

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

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

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

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

C语言中auto,register,static,const,volatile,extern等几个关键字的作用
  • slience_J
  • slience_J
  • 2016年07月20日 10:36
  • 368

智能指针auto_ptr介绍

智能指针auto_ptr介绍       我们大家都知道,new一定要和delete配合使用,但是有一种情况可能会使这种配对失效,如下程序: 1 2 3 ...
  • haiross
  • haiross
  • 2015年06月09日 14:22
  • 346

hibernate.hbm2ddl.auto 配置项介绍

Hibernate部分配置项解析
  • jieshaowang1229
  • jieshaowang1229
  • 2016年05月05日 11:10
  • 296

hibernate.hbm2ddl.auto含义介绍

简要介绍了hibernate.hbm2ddl.auto的基本用法和含义
  • blueheart20
  • blueheart20
  • 2015年12月02日 19:30
  • 1021
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Event auto wakelock 介绍
举报原因:
原因补充:

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