阅读:1598回复:6
NDIS里能不能用FAST_MUTEX?
我写的中间层驱动里,设置了一个Timer,需要访问一个数组。在MPSend和PtReceivePacket里也需要访问这个数组。我用了FAST_MUTEX互斥量同步。可是平时还好,在VOD的时候,可能数据量太大,总是reboot。我试过一下,把同步的部分去掉就好(ExAcquireFastMutex和ExReleaseFastMutex)。不知道各位大侠有没有遇到这类情况?
我曾想是不是NDIS里不能用Fast Mutex。可是如果用SpinLock的话,我在SpinLock中间还需要Alloc Memory;不用的话还有其他同步对象吗? 郁闷了好久了,大家帮帮我啊 |
|
最新喜欢:yvqvan |
沙发#
发布于:2002-10-22 13:06
常用的同步对象还有event对象
|
|
|
板凳#
发布于:2002-10-22 16:08
event对象用于访问临界区,逻辑上不怎么通啊。
我看过fast mutex的结构,里面的确用了event对象。 |
|
地板#
发布于:2002-10-22 17:20
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 问题? |
|
|
地下室#
发布于: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 ) |
|
5楼#
发布于:2002-10-23 16:53
大家讨论一下啊,到底怎么回事啊?
|
|
6楼#
发布于:2002-10-24 20:20
按ddk文档中说的做应该没有问题,使用ndis提供的函数也不会出错,具体可能与临界区对象的实现方式有关吧。
|
|
|