static NTSTATUS RdrShutdown( VOID ) { NTSTATUS status = STATUS_SUCCESS; /* We need to run down all cached tress/session/sockets sitting around. * Set the global shutdown flag, then cancel and wait for each task group * in turn. */ RdrSetShutdown(); if (gRdrRuntime.pTreeTimerGroup) { LwRtlCancelTaskGroup(gRdrRuntime.pTreeTimerGroup); LwRtlWaitTaskGroup(gRdrRuntime.pTreeTimerGroup); } if (gRdrRuntime.pSessionTimerGroup) { LwRtlCancelTaskGroup(gRdrRuntime.pSessionTimerGroup); LwRtlWaitTaskGroup(gRdrRuntime.pSessionTimerGroup); } if (gRdrRuntime.pSocketTimerGroup) { LwRtlCancelTaskGroup(gRdrRuntime.pSocketTimerGroup); LwRtlWaitTaskGroup(gRdrRuntime.pSocketTimerGroup); } /* All socket tasks should have been canceled by this point, * so wait for them to finish shutting down */ if (gRdrRuntime.pSocketTaskGroup) { LwRtlWaitTaskGroup(gRdrRuntime.pSocketTaskGroup); } /* Now we can free everything */ LwRtlFreeTaskGroup(&gRdrRuntime.pTreeTimerGroup); LwRtlFreeTaskGroup(&gRdrRuntime.pSessionTimerGroup); LwRtlFreeTaskGroup(&gRdrRuntime.pSocketTimerGroup); LwRtlFreeTaskGroup(&gRdrRuntime.pSocketTaskGroup); SMBHashSafeFree(&gRdrRuntime.pSocketHashByName); LwRtlFreeThreadPool(&gRdrRuntime.pThreadPool); /* Free the global mutex */ if (gRdrRuntime.bLockConstructed) { pthread_mutex_destroy(&gRdrRuntime.Lock); gRdrRuntime.bLockConstructed = FALSE; } return status; }
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; }