Home | Info | Community | Development | myReactOS | Contact Us
[static]
Definition at line 119 of file rw.c.
Referenced by NpfsAddWaitingReadWriteRequest().
{ PNPFS_THREAD_CONTEXT ThreadContext = (PNPFS_THREAD_CONTEXT) InitContext; ULONG CurrentCount; ULONG Count = 0, i; PIRP Irp = NULL; NTSTATUS Status; PIO_STACK_LOCATION IoStack = NULL; KIRQL OldIrql; KeLockMutex(&ThreadContext->Vcb->PipeListLock); while (1) { CurrentCount = ThreadContext->Count; KeUnlockMutex(&ThreadContext->Vcb->PipeListLock); IoAcquireCancelSpinLock(&OldIrql); if (Irp && IoSetCancelRoutine(Irp, NULL) != NULL) { IoReleaseCancelSpinLock(OldIrql); IoStack = IoGetCurrentIrpStackLocation(Irp); switch (IoStack->MajorFunction) { case IRP_MJ_READ: NpfsRead(IoStack->DeviceObject, Irp); break; default: ASSERT(FALSE); } } else { IoReleaseCancelSpinLock(OldIrql); } Status = KeWaitForMultipleObjects(CurrentCount, ThreadContext->WaitObjectArray, WaitAny, Executive, KernelMode, FALSE, NULL, ThreadContext->WaitBlockArray); if (!NT_SUCCESS(Status)) { ASSERT(FALSE); } KeLockMutex(&ThreadContext->Vcb->PipeListLock); Count = Status - STATUS_WAIT_0; ASSERT (Count < CurrentCount); if (Count > 0) { Irp = ThreadContext->WaitIrpArray[Count]; ThreadContext->Count--; ThreadContext->Vcb->EmptyWaiterCount++; ThreadContext->WaitObjectArray[Count] = ThreadContext->WaitObjectArray[ThreadContext->Count]; ThreadContext->WaitIrpArray[Count] = ThreadContext->WaitIrpArray[ThreadContext->Count]; } else { /* someone has add a new wait request or cancelled an old one */ Irp = NULL; /* Look for cancelled requests */ for (i = 1; i < ThreadContext->Count; i++) { if (ThreadContext->WaitIrpArray[i] == NULL) { ThreadContext->Count--; ThreadContext->Vcb->EmptyWaiterCount++; ThreadContext->WaitObjectArray[i] = ThreadContext->WaitObjectArray[ThreadContext->Count]; ThreadContext->WaitIrpArray[i] = ThreadContext->WaitIrpArray[ThreadContext->Count]; } } } if (ThreadContext->Count == 1 && ThreadContext->Vcb->EmptyWaiterCount >= MAXIMUM_WAIT_OBJECTS) { /* it exist an other thread with empty wait slots, we can remove our thread from the list */ RemoveEntryList(&ThreadContext->ListEntry); ExFreePoolWithTag(ThreadContext, TAG_NPFS_THREAD_CONTEXT); KeUnlockMutex(&ThreadContext->Vcb->PipeListLock); break; } } }