- Don't call KeSetEvent while holding a spin lock (thanks to lassy for pointing it out)
- Don't advance to the next list entry because we are using ExInterlockedRemoveHeadList
- A couple more small code improvements

svn path=/branches/tcp-rewrite-branch/; revision=48841
This commit is contained in:
Cameron Gutman 2010-09-21 06:40:41 +00:00
parent 459e413725
commit d6c01bce64

View file

@ -58,12 +58,14 @@ sys_arch_decl_protect(sys_prot_t *lev)
sys_sem_t
sys_sem_new(u8_t count)
{
sys_sem_t sem = ExAllocatePool(NonPagedPool, sizeof(KEVENT));
if (!sem)
return SYS_SEM_NULL;
sys_sem_t sem;
ASSERT(count == 0 || count == 1);
sem = ExAllocatePool(NonPagedPool, sizeof(KEVENT));
if (!sem)
return SYS_SEM_NULL;
/* It seems lwIP uses the semaphore implementation as either a completion event or a lock
* so I optimize for this case by using a synchronization event and setting its initial state
* to signalled for a lock and non-signalled for a completion event */
@ -155,19 +157,17 @@ void
sys_mbox_post(sys_mbox_t mbox, void *msg)
{
PLWIP_MESSAGE_CONTAINER Container;
KIRQL OldIrql;
Container = ExAllocatePool(NonPagedPool, sizeof(*Container));
ASSERT(Container);
Container->Message = msg;
KeAcquireSpinLock(&mbox->Lock, &OldIrql);
InsertTailList(&mbox->ListHead,
&Container->ListEntry);
ExInterlockedInsertTailList(&mbox->ListHead,
&Container->ListEntry,
&mbox->Lock);
KeSetEvent(&mbox->Event, IO_NO_INCREMENT, FALSE);
KeReleaseSpinLock(&mbox->Lock, OldIrql);
}
u32_t
@ -201,13 +201,13 @@ sys_arch_mbox_fetch(sys_mbox_t mbox, void **msg, u32_t timeout)
ASSERT(Entry);
if (IsListEmpty(&mbox->ListHead))
KeClearEvent(&mbox->Event);
Container = CONTAINING_RECORD(Entry, LWIP_MESSAGE_CONTAINER, ListEntry);
KeReleaseSpinLock(&mbox->Lock, OldIrql);
KeQuerySystemTime(&PostWaitTime);
TimeDiff = PostWaitTime.QuadPart - PreWaitTime.QuadPart;
TimeDiff /= 10000;
Container = CONTAINING_RECORD(Entry, LWIP_MESSAGE_CONTAINER, ListEntry);
Message = Container->Message;
ExFreePool(Container);
@ -374,7 +374,5 @@ sys_shutdown(void)
ZwClose(Container->Handle);
}
CurrentEntry = CurrentEntry->Flink;
}
}