typedef struct _thread_t
{
- PVOID ThreadId;
HANDLE Handle;
- struct sys_timeouts Timeouts;
void (* ThreadFunction)(void *arg);
void *ThreadContext;
LIST_ENTRY ListEntry;
- char Name[1];
} *thread_t;
u32_t sys_now(void)
void
sys_arch_protect(sys_prot_t *lev)
{
- KIRQL OldIrql;
-
- KeAcquireSpinLock(&lev->Lock, &OldIrql);
-
- lev->OldIrql = OldIrql;
-}
-
-void
-sys_arch_unprotect(sys_prot_t *lev)
-{
- KeReleaseSpinLock(&lev->Lock, lev->OldIrql);
+ /* Preempt the dispatcher */
+ KeRaiseIrql(DISPATCH_LEVEL, lev);
}
void
-sys_arch_decl_protect(sys_prot_t *lev)
+sys_arch_unprotect(sys_prot_t lev)
{
- KeInitializeSpinLock(&lev->Lock);
+ KeLowerIrql(lev);
}
err_t
* 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 */
- KeInitializeEvent(sem, SynchronizationEvent, count);
+ KeInitializeEvent(&sem->Event, SynchronizationEvent, count);
+
+ sem->Valid = 1;
return ERR_OK;
}
+int sys_sem_valid(sys_sem_t *sem)
+{
+ return sem->Valid;
+}
+
+void sys_sem_set_invalid(sys_sem_t *sem)
+{
+ sem->Valid = 0;
+}
+
void
sys_sem_free(sys_sem_t* sem)
{
/* No op (allocated in stack) */
+
+ sys_sem_set_invalid(sem);
}
void
sys_sem_signal(sys_sem_t* sem)
{
- KeSetEvent(sem, IO_NO_INCREMENT, FALSE);
+ KeSetEvent(&sem->Event, IO_NO_INCREMENT, FALSE);
}
u32_t
LARGE_INTEGER LargeTimeout, PreWaitTime, PostWaitTime;
UINT64 TimeDiff;
NTSTATUS Status;
- PVOID WaitObjects[] = {sem, &TerminationEvent};
+ PVOID WaitObjects[] = {&sem->Event, &TerminationEvent};
LargeTimeout.QuadPart = Int32x32To64(timeout, -10000);
KeInitializeEvent(&mbox->Event, NotificationEvent, FALSE);
+ mbox->Valid = 1;
+
return ERR_OK;
}
+int sys_mbox_valid(sys_mbox_t *mbox)
+{
+ return mbox->Valid;
+}
+
+void sys_mbox_set_invalid(sys_mbox_t *mbox)
+{
+ mbox->Valid = 0;
+}
+
void
sys_mbox_free(sys_mbox_t *mbox)
{
ASSERT(IsListEmpty(&mbox->ListHead));
- /* No op (allocated on stack) */
+ sys_mbox_set_invalid(mbox);
}
void
return ERR_OK;
}
-struct sys_timeouts *sys_arch_timeouts(void)
-{
- KIRQL OldIrql;
- PLIST_ENTRY CurrentEntry;
- thread_t Container;
-
- KeAcquireSpinLock(&ThreadListLock, &OldIrql);
- CurrentEntry = ThreadListHead.Flink;
- while (CurrentEntry != &ThreadListHead)
- {
- Container = CONTAINING_RECORD(CurrentEntry, struct _thread_t, ListEntry);
-
- if (Container->ThreadId == KeGetCurrentThread())
- {
- KeReleaseSpinLock(&ThreadListLock, OldIrql);
- return &Container->Timeouts;
- }
-
- CurrentEntry = CurrentEntry->Flink;
- }
- KeReleaseSpinLock(&ThreadListLock, OldIrql);
-
- Container = ExAllocatePool(NonPagedPool, sizeof(*Container));
- if (!Container)
- return SYS_ARCH_NULL;
-
- Container->Name[0] = ANSI_NULL;
- Container->ThreadFunction = NULL;
- Container->ThreadContext = NULL;
- Container->Timeouts.next = NULL;
- Container->ThreadId = KeGetCurrentThread();
-
- ExInterlockedInsertHeadList(&ThreadListHead, &Container->ListEntry, &ThreadListLock);
-
- return &Container->Timeouts;
-}
-
VOID
NTAPI
LwipThreadMain(PVOID Context)
thread_t Container = Context;
KIRQL OldIrql;
- Container->ThreadId = KeGetCurrentThread();
-
ExInterlockedInsertHeadList(&ThreadListHead, &Container->ListEntry, &ThreadListLock);
Container->ThreadFunction(Container->ThreadContext);
thread_t Container;
NTSTATUS Status;
- Container = ExAllocatePool(NonPagedPool, strlen(name) + sizeof(*Container));
+ Container = ExAllocatePool(NonPagedPool, sizeof(*Container));
if (!Container)
return 0;
- strcpy(Container->Name, name);
Container->ThreadFunction = thread;
Container->ThreadContext = arg;
- Container->Timeouts.next = NULL;
Status = PsCreateSystemThread(&Container->Handle,
THREAD_ALL_ACCESS,