static bool stopService(int cmd) { int exitCode; app->exiting = 1; app->serviceStopped = 1; gracefulShutdown(10 * 1000); if (cmd == SERVICE_CONTROL_SHUTDOWN) { return 1; } /* Wakeup service event. This will make it exit. */ SetEvent(app->serviceThreadEvent); svcStatus.dwCurrentState = SERVICE_STOP_PENDING; tellSCM(svcStatus.dwCurrentState, NO_ERROR, 1000); exitCode = 0; GetExitCodeThread(app->threadHandle, (ulong*) &exitCode); while (exitCode == STILL_ACTIVE) { GetExitCodeThread(app->threadHandle, (ulong*) &exitCode); mprSleep(100); tellSCM(svcStatus.dwCurrentState, NO_ERROR, 125); } svcStatus.dwCurrentState = SERVICE_STOPPED; tellSCM(svcStatus.dwCurrentState, exitCode, 0); return 1; }
void NetworkConnection::loop() { while(running) { capture(); } gracefulShutdown(); mThread = NULL; }
/* Windows message processing loop */ static LRESULT msgProc(HWND hwnd, uint msg, uint wp, long lp) { switch (msg) { case WM_DESTROY: break; case WM_QUIT: gracefulShutdown(0); break; default: return DefWindowProc(hwnd, msg, wp, lp); } return 0; }
/* Remove the application service */ static bool removeService(int removeFromScmDb) { SC_HANDLE svc, mgr; app->exiting = 1; mgr = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS); if (! mgr) { mprError("Can't open service manager"); return 0; } svc = OpenService(mgr, app->serviceName, SERVICE_ALL_ACCESS); if (! svc) { CloseServiceHandle(mgr); mprError("Can't open service"); return 0; } gracefulShutdown(0); if (ControlService(svc, SERVICE_CONTROL_STOP, &svcStatus)) { mprSleep(500); while (QueryServiceStatus(svc, &svcStatus)) { if (svcStatus.dwCurrentState == SERVICE_STOP_PENDING) { mprSleep(250); } else { break; } } if (svcStatus.dwCurrentState != SERVICE_STOPPED) { mprError("Can't stop service: 0x%x", GetLastError()); } } if (removeFromScmDb && !DeleteService(svc)) { if (GetLastError() != ERROR_SERVICE_MARKED_FOR_DELETE) { mprError("Can't delete service: 0x%x", GetLastError()); } } CloseServiceHandle(svc); CloseServiceHandle(mgr); return 1; }