- 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_t
sys_sem_new(u8_t count) sys_sem_new(u8_t count)
{ {
sys_sem_t sem = ExAllocatePool(NonPagedPool, sizeof(KEVENT)); sys_sem_t sem;
if (!sem)
return SYS_SEM_NULL;
ASSERT(count == 0 || count == 1); 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 /* 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 * 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 */ * 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) sys_mbox_post(sys_mbox_t mbox, void *msg)
{ {
PLWIP_MESSAGE_CONTAINER Container; PLWIP_MESSAGE_CONTAINER Container;
KIRQL OldIrql;
Container = ExAllocatePool(NonPagedPool, sizeof(*Container)); Container = ExAllocatePool(NonPagedPool, sizeof(*Container));
ASSERT(Container); ASSERT(Container);
Container->Message = msg; Container->Message = msg;
KeAcquireSpinLock(&mbox->Lock, &OldIrql); ExInterlockedInsertTailList(&mbox->ListHead,
InsertTailList(&mbox->ListHead, &Container->ListEntry,
&Container->ListEntry); &mbox->Lock);
KeSetEvent(&mbox->Event, IO_NO_INCREMENT, FALSE); KeSetEvent(&mbox->Event, IO_NO_INCREMENT, FALSE);
KeReleaseSpinLock(&mbox->Lock, OldIrql);
} }
u32_t u32_t
@ -201,13 +201,13 @@ sys_arch_mbox_fetch(sys_mbox_t mbox, void **msg, u32_t timeout)
ASSERT(Entry); ASSERT(Entry);
if (IsListEmpty(&mbox->ListHead)) if (IsListEmpty(&mbox->ListHead))
KeClearEvent(&mbox->Event); KeClearEvent(&mbox->Event);
Container = CONTAINING_RECORD(Entry, LWIP_MESSAGE_CONTAINER, ListEntry);
KeReleaseSpinLock(&mbox->Lock, OldIrql); KeReleaseSpinLock(&mbox->Lock, OldIrql);
KeQuerySystemTime(&PostWaitTime); KeQuerySystemTime(&PostWaitTime);
TimeDiff = PostWaitTime.QuadPart - PreWaitTime.QuadPart; TimeDiff = PostWaitTime.QuadPart - PreWaitTime.QuadPart;
TimeDiff /= 10000; TimeDiff /= 10000;
Container = CONTAINING_RECORD(Entry, LWIP_MESSAGE_CONTAINER, ListEntry);
Message = Container->Message; Message = Container->Message;
ExFreePool(Container); ExFreePool(Container);
@ -374,7 +374,5 @@ sys_shutdown(void)
ZwClose(Container->Handle); ZwClose(Container->Handle);
} }
CurrentEntry = CurrentEntry->Flink;
} }
} }