LW_NTSTATUS LwRtlSvcmStop( LW_IN PLW_SVCM_INSTANCE pInstance, LW_IN LW_SVCM_NOTIFY_FUNCTION Notify, LW_IN LW_PVOID pContext ) { NTSTATUS status = STATUS_SUCCESS; if (!pInstance) { status = STATUS_INVALID_PARAMETER; GCOS(status); } assert(pInstance->pStopItem); assert(pInstance->pStopState); pInstance->pStopState->pInstance = pInstance; pInstance->pStopState->Notify = Notify; pInstance->pStopState->pNotifyContext = pContext; LwRtlScheduleWorkItem(pInstance->pStopItem, 0); pInstance->pStopItem = NULL; pInstance->pStopState = NULL; cleanup: return status; }
LW_NTSTATUS LwRtlQueueWorkItem( LW_IN PLW_THREAD_POOL pPool, LW_IN LW_WORK_ITEM_FUNCTION_COMPAT pfnFunc, LW_IN LW_PVOID pContext, LW_IN LW_WORK_ITEM_FLAGS Flags ) { NTSTATUS status = STATUS_SUCCESS; PCOMPAT_WORK_ITEM pCompat = NULL; PLW_WORK_ITEM pItem = NULL; status = LW_RTL_ALLOCATE_AUTO(&pCompat); GOTO_ERROR_ON_STATUS(status); pCompat->pfnFunc = pfnFunc; pCompat->pContext = pContext; status = LwRtlCreateWorkItem(pPool, &pItem, CompatWorkItem, pCompat); GOTO_ERROR_ON_STATUS(status); pCompat = NULL; LwRtlScheduleWorkItem(pItem, Flags); pItem = NULL; error: RTL_FREE(&pCompat); LwRtlFreeWorkItem(&pItem); return status; }
LW_NTSTATUS LwRtlSvcmRefresh( LW_IN PLW_SVCM_INSTANCE pInstance, LW_IN LW_SVCM_NOTIFY_FUNCTION Notify, LW_IN LW_PVOID pContext ) { NTSTATUS status = STATUS_SUCCESS; PSVCM_COMMAND_STATE pRefreshState = NULL; PLW_WORK_ITEM pRefreshItem = NULL; if (!pInstance) { status = STATUS_INVALID_PARAMETER; GCOS(status); } status = LW_RTL_ALLOCATE_AUTO(&pRefreshState); GCOS(status); status = LwRtlCreateWorkItem( gSvcmState.pPool, &pRefreshItem, RefreshWorkItem, pRefreshState); GCOS(status); pRefreshState->pInstance = pInstance; pRefreshState->Notify = Notify; pRefreshState->pNotifyContext = pContext; LwRtlScheduleWorkItem(pRefreshItem, 0); pRefreshItem = NULL; pRefreshState = NULL; cleanup: LwRtlFreeWorkItem(&pRefreshItem); RTL_FREE(&pRefreshState); return status; }
LW_NTSTATUS LwRtlSvcmStart( LW_IN PLW_SVCM_INSTANCE pInstance, LW_IN LW_ULONG ArgCount, LW_IN LW_PWSTR* ppArgs, LW_IN LW_ULONG FdCount, LW_IN int* pFds, LW_IN LW_SVCM_NOTIFY_FUNCTION Notify, LW_IN LW_PVOID pContext ) { NTSTATUS status = STATUS_SUCCESS; PSVCM_START_STATE pStartState = NULL; PLW_WORK_ITEM pStartItem = NULL; if (!pInstance) { status = STATUS_INVALID_PARAMETER; GCOS(status); } status = LW_RTL_ALLOCATE_AUTO(&pStartState); GCOS(status); status = LW_RTL_ALLOCATE_AUTO(&pInstance->pStopState); GCOS(status); status = LwRtlCreateWorkItem( gSvcmState.pPool, &pStartItem, StartWorkItem, pStartState); GCOS(status); status = LwRtlCreateWorkItem( gSvcmState.pPool, &pInstance->pStopItem, StopWorkItem, pInstance->pStopState); GCOS(status); pStartState->pInstance = pInstance; pStartState->ArgCount = ArgCount; pStartState->ppArgs = ppArgs; pStartState->FdCount = FdCount; pStartState->pFds = pFds; pStartState->Notify = Notify; pStartState->pNotifyContext = pContext; LwRtlScheduleWorkItem(pStartItem, 0); pStartItem = NULL; pStartState = NULL; cleanup: LwRtlFreeWorkItem(&pStartItem); RTL_FREE(&pStartState); if (status != STATUS_SUCCESS) { RTL_FREE(&pInstance->pStopState); LwRtlFreeWorkItem(&pInstance->pStopItem); } return status; }