void IOThread::Run() { ::SetEvent(event_thrad_start_); for (;;) { //bool more_work_is_plausible = DoScheduledWork(); bool more_work_is_plausible = false; if (should_quit_) break; more_work_is_plausible |= WaitForIOCompletion(0, NULL); if (should_quit_) break; if (more_work_is_plausible) continue; if (should_quit_) break; WaitForWork(); // Wait (sleep) until we have work to do again. } }
/// <summary> /// Search for work queued in the case of multiple binding /// </summary> UMSThreadProxy * TransmogrifiedPrimary::SearchForWork() { CONCRT_COREASSERT(m_pBoundProxy == NULL); // // This decrement is for the PREVIOUSLY executed work item. // _InterlockedDecrement(&m_queueCount); m_pBoundProxy = m_queuedExecutions.Dequeue(); if (m_pBoundProxy != NULL) { return m_pBoundProxy; } CompletedTransmogrification(); // // Dequeue new work and bind it to the primary // return WaitForWork(); }
static VOID TestConnect( IN HANDLE ServerHandle, IN PCWSTR PipePath) { NTSTATUS Status; THREAD_CONTEXT ConnectContext; THREAD_CONTEXT ListenContext; BOOLEAN Okay; HANDLE ClientHandle; StartWorkerThread(&ConnectContext); StartWorkerThread(&ListenContext); /* Server should start out listening */ CheckServer(ServerHandle, FILE_PIPE_LISTENING_STATE); /* Connect a client */ ClientHandle = NULL; Okay = CheckConnectPipe(&ConnectContext, PipePath, 100); ok_bool_true(Okay, "CheckConnectPipe returned"); ok_eq_hex(ConnectContext.Connect.Status, STATUS_SUCCESS); if (NT_SUCCESS(ConnectContext.Connect.Status)) { ClientHandle = ConnectContext.Connect.ClientHandle; CheckClient(ClientHandle, FILE_PIPE_CONNECTED_STATE); } CheckServer(ServerHandle, FILE_PIPE_CONNECTED_STATE); /* Connect another client */ Okay = CheckConnectPipe(&ConnectContext, PipePath, 100); ok_bool_true(Okay, "CheckConnectPipe returned"); ok_eq_hex(ConnectContext.Connect.Status, STATUS_PIPE_NOT_AVAILABLE); if (NT_SUCCESS(ConnectContext.Connect.Status)) ObCloseHandle(ConnectContext.Connect.ClientHandle, KernelMode); CheckClient(ClientHandle, FILE_PIPE_CONNECTED_STATE); CheckServer(ServerHandle, FILE_PIPE_CONNECTED_STATE); /* Disconnecting the client should fail */ Status = NpDisconnectPipe(ClientHandle); ok_eq_hex(Status, STATUS_ILLEGAL_FUNCTION); CheckClient(ClientHandle, FILE_PIPE_CONNECTED_STATE); CheckServer(ServerHandle, FILE_PIPE_CONNECTED_STATE); /* Listening on the client should fail */ Status = NpListenPipe(ClientHandle); ok_eq_hex(Status, STATUS_ILLEGAL_FUNCTION); CheckClient(ClientHandle, FILE_PIPE_CONNECTED_STATE); CheckServer(ServerHandle, FILE_PIPE_CONNECTED_STATE); /* Close client */ if (ClientHandle) ObCloseHandle(ClientHandle, KernelMode); CheckServer(ServerHandle, FILE_PIPE_CLOSING_STATE); /* Connecting a client now should fail */ Okay = CheckConnectPipe(&ConnectContext, PipePath, 100); ok_bool_true(Okay, "CheckConnectPipe returned"); ok_eq_hex(ConnectContext.Connect.Status, STATUS_PIPE_NOT_AVAILABLE); if (NT_SUCCESS(ConnectContext.Connect.Status)) ObCloseHandle(ConnectContext.Connect.ClientHandle, KernelMode); CheckServer(ServerHandle, FILE_PIPE_CLOSING_STATE); /* Listening should fail */ Okay = CheckListenPipe(&ListenContext, ServerHandle, 100); ok_bool_true(Okay, "CheckListenPipe returned"); if (!skip(Okay, "Listen succeeded unexpectedly\n")) CheckServer(ServerHandle, FILE_PIPE_CLOSING_STATE); /* Disconnect server */ Status = NpDisconnectPipe(ServerHandle); ok_eq_hex(Status, STATUS_SUCCESS); CheckServer(ServerHandle, FILE_PIPE_DISCONNECTED_STATE); /* Disconnecting again should fail */ Status = NpDisconnectPipe(ServerHandle); ok_eq_hex(Status, STATUS_PIPE_DISCONNECTED); CheckServer(ServerHandle, FILE_PIPE_DISCONNECTED_STATE); /* Connecting a client now should fail */ Okay = CheckConnectPipe(&ConnectContext, PipePath, 100); ok_bool_true(Okay, "CheckConnectPipe returned"); ok_eq_hex(ConnectContext.Connect.Status, STATUS_PIPE_NOT_AVAILABLE); if (NT_SUCCESS(ConnectContext.Connect.Status)) ObCloseHandle(ConnectContext.Connect.ClientHandle, KernelMode); CheckServer(ServerHandle, FILE_PIPE_DISCONNECTED_STATE); /**************************************************************************/ /* Now listen again */ Okay = CheckListenPipe(&ListenContext, ServerHandle, 100); ok_bool_false(Okay, "CheckListenPipe returned"); //blocks: CheckServer(ServerHandle, FILE_PIPE_LISTENING_STATE); /* Connect client */ ClientHandle = NULL; Okay = CheckConnectPipe(&ConnectContext, PipePath, 100); ok_bool_true(Okay, "CheckConnectPipe returned"); ok_eq_hex(ConnectContext.Connect.Status, STATUS_SUCCESS); if (NT_SUCCESS(ConnectContext.Connect.Status)) { ClientHandle = ConnectContext.Connect.ClientHandle; CheckClient(ClientHandle, FILE_PIPE_CONNECTED_STATE); } Okay = WaitForWork(&ListenContext, 100); ok_bool_true(Okay, "WaitForWork returned"); ok_eq_hex(ListenContext.Listen.Status, STATUS_SUCCESS); CheckServer(ServerHandle, FILE_PIPE_CONNECTED_STATE); /* Listening again should fail */ Okay = CheckListenPipe(&ListenContext, ServerHandle, 100); ok_bool_true(Okay, "CheckListenPipe returned"); ok_eq_hex(ListenContext.Listen.Status, STATUS_PIPE_CONNECTED); CheckClient(ClientHandle, FILE_PIPE_CONNECTED_STATE); CheckServer(ServerHandle, FILE_PIPE_CONNECTED_STATE); /* Disconnect server */ Status = NpDisconnectPipe(ServerHandle); ok_eq_hex(Status, STATUS_SUCCESS); NpQueryPipe(ClientHandle, STATUS_PIPE_DISCONNECTED); CheckServer(ServerHandle, FILE_PIPE_DISCONNECTED_STATE); /* Close client */ if (ClientHandle) ObCloseHandle(ClientHandle, KernelMode); CheckServer(ServerHandle, FILE_PIPE_DISCONNECTED_STATE); /**************************************************************************/ /* Listen once more */ Okay = CheckListenPipe(&ListenContext, ServerHandle, 100); ok_bool_false(Okay, "CheckListenPipe returned"); //blocks: CheckServer(ServerHandle, FILE_PIPE_LISTENING_STATE); /* Connect client */ ClientHandle = NULL; Okay = CheckConnectPipe(&ConnectContext, PipePath, 100); ok_bool_true(Okay, "CheckConnectPipe returned"); ok_eq_hex(ConnectContext.Connect.Status, STATUS_SUCCESS); if (NT_SUCCESS(ConnectContext.Connect.Status)) { ClientHandle = ConnectContext.Connect.ClientHandle; CheckClient(ClientHandle, FILE_PIPE_CONNECTED_STATE); } Okay = WaitForWork(&ListenContext, 100); ok_bool_true(Okay, "WaitForWork returned"); ok_eq_hex(ListenContext.Listen.Status, STATUS_SUCCESS); CheckServer(ServerHandle, FILE_PIPE_CONNECTED_STATE); /* Close server */ Status = ObCloseHandle(ServerHandle, KernelMode); ok_eq_hex(Status, STATUS_SUCCESS); CheckClient(ClientHandle, FILE_PIPE_CLOSING_STATE); /* Close client */ if (ClientHandle) ObCloseHandle(ClientHandle, KernelMode); FinishWorkerThread(&ListenContext); FinishWorkerThread(&ConnectContext); }