VOID BenchmarkThreadPool( PLW_THREAD_POOL pPool, PBENCHMARK_SETTINGS pSettings, PULONG64 pullDuration, PULONG64 pullBytesTransferred ) { PLW_TASK_GROUP pGroup = NULL; PSOCKET* ppSockets1 = NULL; PSOCKET* ppSockets2 = NULL; size_t i = 0; ULONG64 ullTotal = 0; LONG64 llStart = 0; LONG64 llEnd = 0; ULONG64 ullTime = 0; NTSTATUS status; gpPool = pPool; gpSettings = pSettings; status = LwRtlCreateTaskGroup(gpPool, &pGroup); ASSERT_SUCCESS(status); status = LW_RTL_ALLOCATE_ARRAY_AUTO(&ppSockets1, gpSettings->ulPairs); ASSERT_SUCCESS(status); status = LW_RTL_ALLOCATE_ARRAY_AUTO(&ppSockets2, gpSettings->ulPairs); ASSERT_SUCCESS(status); for (i = 0; i < gpSettings->ulPairs; i++) { NTSTATUS status = CreateSocketPair(pGroup, &ppSockets1[i], &ppSockets2[i]); ASSERT_SUCCESS(status); } status = TimeNow(&llStart); ASSERT_SUCCESS(status); LwRtlWakeTaskGroup(pGroup); LwRtlWaitTaskGroup(pGroup); status = TimeNow(&llEnd); ASSERT_SUCCESS(status); ullTime = (ULONG64) (llEnd - llStart); LwRtlFreeTaskGroup(&pGroup); for (i = 0; i < gpSettings->ulPairs; i++) { ullTotal += ppSockets1[i]->ullTotalTransferred; } *pullDuration = ullTime; *pullBytesTransferred = ullTotal; }
NTSTATUS LwRtlCreateTaskGroup( PLW_THREAD_POOL pPool, PLW_TASK_GROUP* ppGroup ) { NTSTATUS status = STATUS_SUCCESS; PLW_TASK_GROUP pGroup = NULL; if (pPool->pDelegate) { return LwRtlCreateTaskGroup(pPool->pDelegate, ppGroup); } status = LW_RTL_ALLOCATE_AUTO(&pGroup); GOTO_ERROR_ON_STATUS(status); pGroup->pPool = pPool; RingInit(&pGroup->Tasks); status = LwErrnoToNtStatus(pthread_mutex_init(&pGroup->Lock, NULL)); GOTO_ERROR_ON_STATUS(status); pGroup->bLockInit = TRUE; status = LwErrnoToNtStatus(pthread_cond_init(&pGroup->Event, NULL)); GOTO_ERROR_ON_STATUS(status); pGroup->bEventInit = TRUE; *ppGroup = pGroup; cleanup: return status; error: LwRtlFreeTaskGroup(&pGroup); *ppGroup = NULL; goto cleanup; }
static NTSTATUS RdrInitialize( VOID ) { NTSTATUS status = 0; PLW_THREAD_POOL_ATTRIBUTES pAttrs = NULL; memset(&gRdrRuntime, 0, sizeof(gRdrRuntime)); pthread_mutex_init(&gRdrRuntime.Lock, NULL); gRdrRuntime.bLockConstructed = TRUE; /* Pid used for SMB Header */ gRdrRuntime.SysPid = getpid(); /* Default config values */ gRdrRuntime.config.bSmb2Enabled = FALSE; gRdrRuntime.config.bSigningEnabled = TRUE; gRdrRuntime.config.bSigningRequired = FALSE; gRdrRuntime.config.usIdleTimeout = RDR_IDLE_TIMEOUT; gRdrRuntime.config.usResponseTimeout = RDR_RESPONSE_TIMEOUT; gRdrRuntime.config.usEchoTimeout = RDR_ECHO_TIMEOUT; gRdrRuntime.config.usEchoInterval = RDR_ECHO_INTERVAL; gRdrRuntime.config.usConnectTimeout = RDR_CONNECT_TIMEOUT; gRdrRuntime.config.usMinCreditReserve = RDR_MIN_CREDIT_RESERVE; status = RdrReadConfig(&gRdrRuntime.config); BAIL_ON_NT_STATUS(status); status = SMBHashCreate( 19, SMBHashCaselessWc16StringCompare, SMBHashCaselessWc16String, NULL, &gRdrRuntime.pSocketHashByName); BAIL_ON_NT_STATUS(status); status = LwRtlCreateThreadPoolAttributes(&pAttrs); BAIL_ON_NT_STATUS(status); status = LwRtlCreateThreadPool(&gRdrRuntime.pThreadPool, pAttrs); BAIL_ON_NT_STATUS(status); status = LwRtlCreateTaskGroup(gRdrRuntime.pThreadPool, &gRdrRuntime.pSocketTaskGroup); BAIL_ON_NT_STATUS(status); status = LwRtlCreateTaskGroup(gRdrRuntime.pThreadPool, &gRdrRuntime.pSocketTimerGroup); BAIL_ON_NT_STATUS(status); status = LwRtlCreateTaskGroup(gRdrRuntime.pThreadPool, &gRdrRuntime.pSessionTimerGroup); BAIL_ON_NT_STATUS(status); status = LwRtlCreateTaskGroup(gRdrRuntime.pThreadPool, &gRdrRuntime.pTreeTimerGroup); BAIL_ON_NT_STATUS(status); error: LwRtlFreeThreadPoolAttributes(&pAttrs); if (status) { RdrShutdown(); } return status; }