首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 驱动开发 >

Cancel自旋锁 起了什么作用?该怎么处理

2012-02-08 
Cancel自旋锁 起了什么作用?发现IoCancelIrp 函数中获取了Cancel自旋锁设置了Irp-Cancel调用了OnCancelIo

Cancel自旋锁 起了什么作用?
发现IoCancelIrp 函数中

获取了Cancel自旋锁
设置了Irp->Cancel
调用了OnCancelIo函数
但是进入了OnCancelIo函数后 立刻就释放了

还有 像

if(Irp!=DeviceObject->Current||Irp->Cancel)
{
IoReleaseCancelSpinlock(oldirql);
return;
}
else
{IoSetCancelRoutine(Irp,NULL); ①
IoReleaseCancelSpinlock(oldirql); 
}


就为了设置或判断一下Irp->Cancel ?? 

另外上面的 ①处 这段代码来自windows驱动开发技术详解 
这里的注释是 正在被startIo处理的IRP不允许调用取消例程 所以把取消例程设为null

这太奇怪了  
难道我不能取消一个很耗时的异步读取IRP ?? 比如 一个很大的硬盘复制操作 这怎可能

[解决办法]
正在执行的IRP是不能被取消的,只能干等着,因为操作系统不知道在哪里处理IO,所以长时间的请求会分割成n个IRP分段来处理。

热点排行