打印

可重入的问题?

[复制链接]
1886|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
longwuyi|  楼主 | 2007-5-30 06:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
...
case IRP_MN_STOP_DEVICE:
     status = PnpStopDeviceHandler(fdo,Irp);
...
NTSTATUS PnpStopDeviceHandler( IN PDEVICE_OBJECT fdo, IN PIRP Irp)
{
    ...
    StopDevice(dx);
    ...
}

VOID StopDevice( IN PWDM2_DEVICE_EXTENSION dx)
{
    if( !dx->GotResources)    // 若需要获取资源,则退出
    return;
    dx->GotResources = false;  // 需要重新获取资源
          KeSynchronizeExecution( dx->InterruptObject, 
               (PKSYNCHRONIZE_ROUTINE)DisableDeviceInterrupts, (PVOID)
                dx);
    if( dx->GotInterrupt)
        IoDisconnectInterrupt( dx->InterruptObject);
    ...
    dx->InterruptObject=NULL;
}
这所有的调用都发生在PASSIVE_LEVEL级的派遣例程中.
1. 由于PASSIVE_LEVEL级允许线程序切换.
2. 或在多核CPU上运行
假设:
1. 一个线程A调用StopDevice并测试dx->GotResources为True,并在执行
   dx->GetResources之前;
2. 或被切换,或在另外一CPU上的执行线程B也调用StopDevice并测试
   dx->GetResources也为True;
3. 则在随后的执行中,可能由于一个先执行的线程A/B设置
   dx->InterruptObject=NULL,导致后调用的一个线程B/A使用
   dx->InterruptObject为空的对象调用KeSynchronizeExecution
   函数.
这应该是有问题的,请各位大佬指教
是否只有在调用WaitFor...阻塞线程后,线程切换才可以开始.

相关帖子

沙发
computer00| | 2007-5-30 10:19 | 只看该作者

一个线程获取资源后,另一个就不能再获取成功了吧?

使用特权

评论回复
板凳
longwuyi|  楼主 | 2007-5-30 22:12 | 只看该作者

可重入的问题

其实我想问的问题不是关注在获取资源方面.
我想问的是
  1. 假设环境是多CPU或多线程切换(PASSIVE_LEVEL级别);
  2. 假设同时有多个删除等操作的IRP同时在不同线程或不同CPU中执行;
  3. 在一定的情况下可能发生删除空对象的操作发生.
假设是在非常

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

40

主题

61

帖子

0

粉丝