int StopThreads() { servercfg->accept_clients = 0; servercfg->echo_loop = 0; unsigned num_threads = 0; gxString message; ProcessThread t; int error_level = 0; // If client or non-interactive command stop the console thread if(servercfg->console_thread) { LogProcMessage("Stopping CM console_thread"); if(servercfg->console_thread->GetThreadState() == gxTHREAD_STATE_RUNNING) { t.CancelThread(servercfg->console_thread); sSleep(1); // Allow I/O recovery time t.JoinThread(servercfg->console_thread); if(servercfg->console_thread->GetThreadState() == gxTHREAD_STATE_CANCELED) { LogProcMessage("CM console_thread was halted"); } else { LogProcMessage("CM console_thread did not shutdown properly"); error_level = 1; } } else { LogProcMessage("CM console_thread was stopped"); } if(error_level == 0) { delete servercfg->console_thread; servercfg->console_thread = 0; } } else { LogProcMessage("CM console_thread not active"); } // Stop the CM crons first if(servercfg->crontab_thread) { LogProcMessage("Stopping CM crontab_thread"); if(servercfg->crontab_thread->GetThreadState() == gxTHREAD_STATE_RUNNING) { t.CancelThread(servercfg->crontab_thread); sSleep(1); // Allow I/O recovery time t.JoinThread(servercfg->crontab_thread); if(servercfg->crontab_thread->GetThreadState() == gxTHREAD_STATE_CANCELED) { LogProcMessage("CM crontab_thread was halted"); } else { LogProcMessage("CM crontab_thread did not shutdown properly"); error_level = 1; } } else { LogProcMessage("CM crontab_thread was stopped"); } if(error_level == 0) { delete servercfg->crontab_thread; servercfg->crontab_thread = 0; } } else { LogProcMessage("CM crontab_thread not active"); } // Release all floating IP addresses if(servercfg->ipaddr_thread) { LogProcMessage("Stopping CM ipaddr_thread"); if(servercfg->ipaddr_thread->GetThreadState() == gxTHREAD_STATE_RUNNING) { t.CancelThread(servercfg->ipaddr_thread); sSleep(1); // Allow I/O recovery time t.JoinThread(servercfg->ipaddr_thread); if(servercfg->ipaddr_thread->GetThreadState() == gxTHREAD_STATE_CANCELED) { LogProcMessage("CM ipaddr_thread was halted"); } else { LogProcMessage("CM ipaddr_thread did not shutdown properly"); error_level = 1; } } else { LogProcMessage("CM ipaddr_thread was stopped"); } if(error_level == 0) { delete servercfg->ipaddr_thread; servercfg->ipaddr_thread = 0; } } else { LogProcMessage("CM ipaddr_thread not active"); } // The the other nodes to take over if(servercfg->keep_alive_thread) { LogProcMessage("Stopping CM UDP keep alive thread"); if(servercfg->keep_alive_thread->GetThreadState() == gxTHREAD_STATE_RUNNING) { t.CancelThread(servercfg->keep_alive_thread); sSleep(1); // Allow I/O recovery time t.JoinThread(servercfg->keep_alive_thread); if(servercfg->keep_alive_thread->GetThreadState() == gxTHREAD_STATE_CANCELED) { LogProcMessage("CM UDP keep alive thread was halted"); } else { LogProcMessage("CM UDP keep alive thread did not shutdown properly"); error_level = 1; } } else { LogProcMessage("CM UDP keep alive thread was stopped"); } if(error_level == 0) { delete servercfg->keep_alive_thread; servercfg->keep_alive_thread = 0; } } else { LogProcMessage("CM UDP keep alive thread not active"); } if(servercfg->udp_server_thread) { LogProcMessage("Stopping CM UDP server thread"); if(servercfg->udp_server_thread->GetThreadState() == gxTHREAD_STATE_RUNNING) { t.CancelThread(servercfg->udp_server_thread); sSleep(1); // Allow I/O recovery time t.JoinThread(servercfg->udp_server_thread); if(servercfg->udp_server_thread->GetThreadState() == gxTHREAD_STATE_CANCELED) { LogProcMessage("CM UDP server thread was halted"); } else { LogProcMessage("CM UDP server thread did not shutdown properly"); error_level = 1; } } else { LogProcMessage("CM UDP server thread was stopped"); } if(error_level == 0) { delete servercfg->udp_server_thread; servercfg->udp_server_thread = 0; } } else { LogProcMessage("CM UDP server thread not active"); } if(servercfg->client_request_pool ) { if(!servercfg->client_request_pool->IsEmpty()) { LogProcMessage("Closing all open TCP client threads"); thrPoolNode *ptr = servercfg->client_request_pool->GetHead(); while(ptr) { gxThread_t *thread = ptr->GetThreadPtr(); if(thread->GetThreadState() == gxTHREAD_STATE_RUNNING) { num_threads++; t.CancelThread(thread); LogProcMessage("Shutting down TCP client thread"); t.JoinThread(thread); if(thread->GetThreadState() == gxTHREAD_STATE_CANCELED) { LogProcMessage("Client TCP thread was canceled"); } else { LogProcMessage("Client TCP thread was not canceled"); error_level = 1; } } ptr = ptr->GetNext(); } message << clear << "Found " << num_threads << " working TCP client threads"; LogProcMessage(message.c_str()); if(error_level == 0) { t.DestroyThreadPool(servercfg->client_request_pool); servercfg->client_request_pool = 0; } } else { LogProcMessage("No open TCP connections"); } } if(servercfg->applications_thread) { LogProcMessage("Stopping CM applications_thread"); if(servercfg->applications_thread->GetThreadState() == gxTHREAD_STATE_RUNNING) { t.CancelThread(servercfg->applications_thread); sSleep(1); // Allow I/O recovery time t.JoinThread(servercfg->applications_thread); if(servercfg->applications_thread->GetThreadState() == gxTHREAD_STATE_CANCELED) { LogProcMessage("CM applications_thread was halted"); } else { LogProcMessage("CM applications_thread did not shutdown properly"); error_level = 1; } } else { LogProcMessage("CM applications_thread was stopped"); } if(error_level == 0) { delete servercfg->applications_thread; servercfg->applications_thread = 0; } } else { LogProcMessage("CM applications_thread not active"); } if(servercfg->services_thread) { LogProcMessage("Stopping CM services_thread"); if(servercfg->services_thread->GetThreadState() == gxTHREAD_STATE_RUNNING) { t.CancelThread(servercfg->services_thread); sSleep(1); // Allow I/O recovery time t.JoinThread(servercfg->services_thread); if(servercfg->services_thread->GetThreadState() == gxTHREAD_STATE_CANCELED) { LogProcMessage("CM services_thread was halted"); } else { LogProcMessage("CM services_thread did not shutdown properly"); error_level = 1; } } else { LogProcMessage("CM services_thread was stopped"); } if(error_level == 0) { delete servercfg->services_thread; servercfg->services_thread = 0; } } else { LogProcMessage("CM services_thread not active"); } if(servercfg->filesystems_thread) { LogProcMessage("Stopping CM filesystems_thread"); if(servercfg->filesystems_thread->GetThreadState() == gxTHREAD_STATE_RUNNING) { t.CancelThread(servercfg->filesystems_thread); sSleep(1); // Allow I/O recovery time t.JoinThread(servercfg->filesystems_thread); if(servercfg->filesystems_thread->GetThreadState() == gxTHREAD_STATE_CANCELED) { LogProcMessage("CM filesystems_thread was stopped"); } else { LogProcMessage("CM filesystems_thread did not shutdown properly"); error_level = 1; } } else { LogProcMessage("CM filesystems_thread was halted"); } if(error_level == 0) { delete servercfg->filesystems_thread; servercfg->filesystems_thread = 0; } } else { LogProcMessage("CM filesystems_thread not active"); } // Stop the log thread last if(servercfg->log_thread) { LogProcMessage("Stopping log thread"); LogThread log; if(servercfg->log_thread->GetThreadState() == gxTHREAD_STATE_RUNNING) { log.CancelThread(servercfg->log_thread); sSleep(1); log.JoinThread(servercfg->log_thread); if(servercfg->log_thread->GetThreadState() == gxTHREAD_STATE_CANCELED) { LogProcMessage("Log thread was halted"); } else { LogProcMessage("Log thread did not shutdown properly"); error_level = 1; } } else { LogProcMessage("Log thread was stopped"); } if(error_level == 0) { delete servercfg->log_thread; servercfg->log_thread = 0; } } else { LogProcMessage("Log thread not active"); } LogThread log_t; log_t.flush_all_logs(); return error_level; }