dshadow79
驱动牛犊
驱动牛犊
  • 注册日期2002-09-29
  • 最后登录2006-04-10
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
阅读:1598回复:6

NDIS里能不能用FAST_MUTEX?

楼主#
更多 发布于:2002-10-22 12:06
我写的中间层驱动里,设置了一个Timer,需要访问一个数组。在MPSend和PtReceivePacket里也需要访问这个数组。我用了FAST_MUTEX互斥量同步。可是平时还好,在VOD的时候,可能数据量太大,总是reboot。我试过一下,把同步的部分去掉就好(ExAcquireFastMutex和ExReleaseFastMutex)。不知道各位大侠有没有遇到这类情况?

我曾想是不是NDIS里不能用Fast Mutex。可是如果用SpinLock的话,我在SpinLock中间还需要Alloc Memory;不用的话还有其他同步对象吗?

郁闷了好久了,大家帮帮我啊

最新喜欢:

yvqvanyvqvan
right_wind
驱动中牛
驱动中牛
  • 注册日期2001-10-12
  • 最后登录2018-05-29
  • 粉丝1
  • 关注0
  • 积分60分
  • 威望66点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2002-10-22 13:06
常用的同步对象还有event对象
good good study, day day up。
dshadow79
驱动牛犊
驱动牛犊
  • 注册日期2002-09-29
  • 最后登录2006-04-10
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-10-22 16:08
event对象用于访问临界区,逻辑上不怎么通啊。
我看过fast mutex的结构,里面的确用了event对象。
magicx
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2014-08-18
  • 粉丝1
  • 关注0
  • 积分-14分
  • 威望13点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-10-22 17:20
event对象用于访问临界区,逻辑上不怎么通啊。
我看过fast mutex的结构,里面的确用了event对象。


嘿嘿。。。

看看这段有没有用?

Comments
ExReleaseFastMutex releases ownership of the given fast mutex and reenables the delivery of APCs to the current thread.

It is a programming error to call ExReleaseFastMutex with a FastMutex that was acquired using ExAcquireFastMutexUnsafe.

Callers of ExReleaseFastMutex must be running at IRQL = APC_LEVEL. In most cases the IRQL will already be set to APC_LEVEL before ExReleaseFastMutex is called. This is because ExAcquireFastMutex has already set the IRQL to the appropriate value automatically. However, if the caller changes the IRQL after ExAcquireFastMutex returns, the caller must explicitly set the IRQL to APC_LEVEL prior to calling ExReleaseFastMutex

是你的 IRQL 问题?
[color=red]大头鬼! :P[/color]
dshadow79
驱动牛犊
驱动牛犊
  • 注册日期2002-09-29
  • 最后登录2006-04-10
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-10-22 21:00
谢谢前面哥们的提醒,我现在用Event实现的Mutex可以解决这个问题而且也没有死机了。

楼上的,其实我原来的代码没有改IRQL(因为我不太清楚IRQL)。只是获取FastMutex然后什么也不做,就这样
ExAcquireFastMutex( &fm );
ExReleaseFastMutex( &fm );
而且平时的时候不会死机。只有在VOD的时候,频繁Acquire/Release才会重起。

这是我用Event实现的Mutex,因为用的是NDIS自己的Routine所以没有问题

/* NDIS_MUTEX object */
typedef struct _NDIS_MUTEX
{
NDIS_EVENT ndisEvent;

}NDIS_MUTEX, *PNDIS_MUTEX;

#define InitializeNDISMutex( mutex )         \\
    NdisInitializeEvent( &mutex.ndisEvent ); \\
    NdisSetEvent( &mutex.ndisEvent )

#define AcquireNDISMutex( mutex )            \\
    NdisWaitEvent( &mutex.ndisEvent, 0 )

#define ReleaseNDISMutex( mutex )            \\
    NdisSetEvent( &mutex.ndisEvent )
dshadow79
驱动牛犊
驱动牛犊
  • 注册日期2002-09-29
  • 最后登录2006-04-10
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-10-23 16:53
大家讨论一下啊,到底怎么回事啊?
right_wind
驱动中牛
驱动中牛
  • 注册日期2001-10-12
  • 最后登录2018-05-29
  • 粉丝1
  • 关注0
  • 积分60分
  • 威望66点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
  • 社区居民
6楼#
发布于:2002-10-24 20:20
按ddk文档中说的做应该没有问题,使用ndis提供的函数也不会出错,具体可能与临界区对象的实现方式有关吧。
good good study, day day up。
游客

返回顶部