escape
驱动老牛
驱动老牛
  • 注册日期2002-02-01
  • 最后登录2004-08-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1037回复:4

我是这样推理的。很痛苦。

楼主#
更多 发布于:2003-07-25 17:09
IoReleaseCancelSpinLock(cancelIrql);
        KeReleaseSpinLockFromDpcLevel(&deviceExtension->SpinLock);

        Irp->IoStatus.Status = status;
        Irp->IoStatus.Information = 0;
        IoStartNextPacket(DeviceObject, TRUE);
        IoCompleteRequest(Irp, IO_KEYBOARD_INCREMENT);
以上是ddk的源代码,为什么先释放spinlock然后给irp的变量赋值
呢?猜想是系统已经为我们做了同步。
可是好像不是这样啊!否则为什么会有IoAcquireCancelSpinLock
函数呢?
 :mad: :mad: :mad:
evergreen
驱动牛犊
驱动牛犊
  • 注册日期2002-04-16
  • 最后登录2007-09-24
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望2点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-08-01 17:06
拥有取消自旋锁时不能调用IoStartNextPacket,因为该例程也要获取这个锁。如果我们在用用取消自旋锁的时候调用了这个函数,那么我们所在的CPU就会发生死锁,因为自旋锁不能递归获取。
escape
驱动老牛
驱动老牛
  • 注册日期2002-02-01
  • 最后登录2004-08-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-08-01 17:24
 
拥有取消自旋锁时不能调用IoStartNextPacket,因为该例程也要获取这个锁。如果我们在用用取消自旋锁的时候调用了这个函数,那么我们所在的CPU就会发生死锁,因为自旋锁不能递归获取。


老兄,我主要是问同步的问题。
为什么对IRP的数据操作之前,先释放各种LOCK?
难道不需要对IRP的操作进行同步么?
evergreen
驱动牛犊
驱动牛犊
  • 注册日期2002-04-16
  • 最后登录2007-09-24
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望2点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-08-06 18:06
我觉得不是
系统已经为我们做了同步

而是不需要同步!
escape
驱动老牛
驱动老牛
  • 注册日期2002-02-01
  • 最后登录2004-08-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-08-07 09:56
 
我觉得不是

引用:
--------------------------------------------------------------------------------
 系统已经为我们做了同步
--------------------------------------------------------------------------------


而是不需要同步!


其实我前两天也猜到了是这样。
游客

返回顶部