关闭

lk 之dpc

456人阅读 评论(0) 收藏 举报
分类:
lk 中实现了让一组函数串行执行,但不需要新建thread的方式,如果用thread的方式就要用mutex 来同步
这种机制就是dpc,dpc的code都在dpc.c中
我们先看看dpc的init
void dpc_init(void)
{
event_init(&dpc_event, false, 0);


thread_resume(thread_create("dpc", &dpc_thread_routine, NULL, DPC_PRIORITY, DEFAULT_STACK_SIZE));
}
初始化一个dpc_event event,然后new一个dpc thread,并立刻运行,其回调函数是dpc_thread_routine。
static int dpc_thread_routine(void *arg)
{
for (;;) {
event_wait(&dpc_event);


enter_critical_section();
struct dpc *dpc = list_remove_head_type(&dpc_list, struct dpc, node);
if (!dpc)
event_unsignal(&dpc_event);
exit_critical_section();


if (dpc) {
// dprintf("dpc calling %p, arg %p\n", dpc->cb, dpc->arg);
dpc->cb(dpc->arg);


free(dpc);
}
}


return 0;
}
这是个死循环,一直在等dpc_event event。如果等到了就懂dpc_list中哪一个dpc下来执行dpc的cb函数
可见关键是在哪里signal dpc_event 
status_t dpc_queue(dpc_callback cb, void *arg, uint flags)
{
struct dpc *dpc;


dpc = malloc(sizeof(struct dpc));


dpc->cb = cb;
dpc->arg = arg;
enter_critical_section();
list_add_tail(&dpc_list, &dpc->node);
event_signal(&dpc_event, (flags & DPC_FLAG_NORESCHED) ? false : true);
exit_critical_section();


return NO_ERROR;
}
原来是在调用dpc_queue的时候,首先new一个dpc,然后设置cb,再将其加到dpc_list中,发送dpc_event
这样这个cb就会在dpc_thread_routine 中执行.
如果是顺序调用dpc_queue,那cb函数就是顺序执行的,少去了为每个cb new thread并加锁的机制,提供performance.

0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

windows内核原理分析之DPC函数的执行(1)

windows内核原理分析之DPC函数的执行(1)当发生中断时,有些操作本来应该在中断服务程序中完成,但是实际上却是在退出中断服务程序之后在一个DPC函数中完成的。DPC是”Deferred Proc...
  • yushuifirst
  • yushuifirst
  • 2015-06-04 15:01
  • 953

DPC(延迟过程调用)的技术细节

-DPC(延迟过程调用)的细节 NTINSIDER,16卷,1期,1至2月2009 延迟过程调用(DPC)是一种Windows常用功能。用途是广泛和多样的,但最常用的是我们通常所说的“ISR完成”...
  • lostit
  • lostit
  • 2013-11-01 16:11
  • 7075

windows内核情景分析 --- DPC

DPC不同APC,DPC的全名是‘延迟过程调用’。 DPC最初作用是设计为中断服务程序的一部分。因为每次触发中断,都会关中断,然后执行中断服务例程。由于关中断了,所以中断服务例程必须短小精悍,不能消...
  • maomao171314
  • maomao171314
  • 2014-04-04 10:18
  • 1292

关于内核定时器,DPC,线程的使用

[cpp] view plain copy 关于内核定时器,及DPC的使用,看来一些代码,这个估计是比较规范的用法了,很基础,希望对新手有帮助   注意,这里的定时器不...
  • kingswb
  • kingswb
  • 2016-06-19 22:17
  • 719

windows内核原理分析之DPC函数的执行(2)

windows内核原理分析之DPC函数的执行(2)需要执行DPC函数时,就通过KeInsertQueueDpc()提出DPC请求,就是把具体的KDPC结构挂入PRCB中的DPC请求队列,这常常是由中断...
  • yushuifirst
  • yushuifirst
  • 2015-06-04 15:08
  • 668

MTK lk源码解析5( lk 阶段aboot.c 解析)

http://blog.csdn.net/xichangbao/article/details/51484610 现在开始分析关键函数aboot_init(),岔开一句lk在分区表的名称...
  • ffmxnjm
  • ffmxnjm
  • 2017-04-18 17:24
  • 284

windows内核原理分析之DPC函数的执行(3)

windows内核原理分析之DPC函数的执行(3)windows内核什么时候会扫描DPC请求队列,执行这些DPC函数呢?答案是,每当CPU的运行级别从DISPATCH_LEVEL或以上降低到DISPA...
  • yushuifirst
  • yushuifirst
  • 2015-06-04 15:13
  • 528

分析驱动程序在IRQL>=DISPATCH_LEVEL时和DPC过程中不能用KeWaitForSingleObject等待对象的原因

M$ddk对调用KeWaitForSingleObject接口有下面约定: Callers of KeWaitForSingleObject must be running at IRQL <= DI...
  • lixiangminghate
  • lixiangminghate
  • 2016-04-05 20:21
  • 1457

DPC延迟过程调用

每个设备对象中都含有一个KDPC对象,DEVICE_OBJECT中有一个内置的DPC对象 Dpc。当在驱动程序的AddDevice例程创建了设备对象后,如果需要用DPC例程就要在 AddDevice例...
  • hhko12322
  • hhko12322
  • 2013-12-23 13:44
  • 1113

OpenCV21(金字塔LK光流算法)

最好的教程,就是看Blog,然后最后一定要回归书本。   一、LK算法提到了三个假设 (高深:就是用你认识的字写你看不懂的东西。办法:多看几遍,查阅Blog上接地气的说法) 1.灰度不变  ...
  • u014488388
  • u014488388
  • 2016-10-20 22:13
  • 684
    个人资料
    • 访问:261489次
    • 积分:12965
    • 等级:
    • 排名:第1244名
    • 原创:1070篇
    • 转载:0篇
    • 译文:11篇
    • 评论:9条
    最新评论