示例#1
0
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;
}