void svExec::Terminate(void) { #if !defined(__WIN32__) && !defined(__ANDROID__) if (pid == -1) return; if (skt) { delete skt; skt = NULL; } struct timeval tv_now, tv_timeout; gettimeofday(&tv_timeout, NULL); tv_timeout.tv_sec += _SUVA_APP_WAIT; svEvent *event; for ( ;; ) { while ((event = PopWaitEvent(1000))) { switch (event->GetId()) { case svEVT_QUIT: return; case svEVT_CHILD_EXIT: svEventChildExit *event_child; event_child = (svEventChildExit *)event; if (event_child->GetPid() != pid) break; Exited(event_child->GetStatus()); delete event_child; return; default: break; } delete event; } gettimeofday(&tv_now, NULL); if (tv_now.tv_sec > tv_timeout.tv_sec) { kill(pid, SIGTERM); svError("%s: Timed-out waiting on application to exit: %d", name.c_str(), pid); break; } } #endif }
void *svThreadStorage::Entry(void) { PurgePoolClients(); for ( ;; ) { svEvent *event = PopWaitEvent(); switch (event->GetId()) { case svEVT_QUIT: return NULL; case svEVT_SESSION_QUIT: delete event; return NULL; case svEVT_HOSTKEY_REQUEST: GetHostKey((svEventHostKeyRequest *)event); break; case svEVT_POOLCLIENT_UPDATE: UpdatePoolClient((svEventPoolClientUpdate *)event); break; default: break; } delete event; } }