阅读:1037回复:4
我是这样推理的。很痛苦。
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: |
|
沙发#
发布于:2003-08-01 17:06
拥有取消自旋锁时不能调用IoStartNextPacket,因为该例程也要获取这个锁。如果我们在用用取消自旋锁的时候调用了这个函数,那么我们所在的CPU就会发生死锁,因为自旋锁不能递归获取。
|
|
板凳#
发布于:2003-08-01 17:24
拥有取消自旋锁时不能调用IoStartNextPacket,因为该例程也要获取这个锁。如果我们在用用取消自旋锁的时候调用了这个函数,那么我们所在的CPU就会发生死锁,因为自旋锁不能递归获取。 老兄,我主要是问同步的问题。 为什么对IRP的数据操作之前,先释放各种LOCK? 难道不需要对IRP的操作进行同步么? |
|
地板#
发布于:2003-08-06 18:06
我觉得不是
系统已经为我们做了同步 而是不需要同步! |
|
地下室#
发布于:2003-08-07 09:56
我觉得不是 其实我前两天也猜到了是这样。 |
|