Пример #1
0
int main(int argc, char *argv[]){
  int ret;
  int i=0;
  pthread_t event_threads[EVENT_THREAD_NUM];
  pthread_t accept_threads[ACCEPT_THREAD_NUM];
  void *status;
  int event_thread_ids[EVENT_THREAD_NUM];
  int accept_thread_ids[ACCEPT_THREAD_NUM];
  ASOS_Core asos_core;

  asos_core.server_type = 1; // Configure as basic server

  ret = asos_core.CreateField("_basic.asos");
  if(ret == -1){ printf("Error: CreateField(() returned -1\n"); fflush(stdout); exit(-1); }
  ret = asos_core.CreateField("_ame");
  if(ret == -1){ printf("Error: CreateField(() returned -1\n"); fflush(stdout); exit(-1); }

  ret = SignalInit();
  if(ret == -1){ printf("Error: SignalInit() returned -1\n"); fflush(stdout); exit(-1); }

  server = new Server(80, EVENT_THREAD_NUM);
  if(server == NULL){ printf("Error: Server constructor error\n"); fflush(stdout); exit(-1); }

  ret = server->Init(&asos_core);
  if(ret == -1){ printf("Error: Server->Init() returned -1\n"); fflush(stdout); exit(-1); }

  for(i=0; i<EVENT_THREAD_NUM; i++){ event_thread_ids[i] = i; }
  for(i=0; i<ACCEPT_THREAD_NUM; i++){ accept_thread_ids[i] = i; }

  for(i=0; i<ACCEPT_THREAD_NUM; i++){
    ret = pthread_create(&accept_threads[i], NULL, &http_accept_loop, &accept_thread_ids[i]);
    if(ret != 0){
      printf("Error: Can't create thread %d\n", i);
      perror("pthread");
      exit(-1);
    }
  }

  for(i=0; i<EVENT_THREAD_NUM; i++){
    ret = pthread_create(&event_threads[i], NULL, &http_event_loop, &event_thread_ids[i]);
    if(ret != 0){
      printf("Error: Can't create thread %d\n", i);
      perror("pthread");
      exit(-1);
    }
  }

  SignalWaitForTermination();

  for(i=0; i<ACCEPT_THREAD_NUM; i++){
    ret = -1;
    do{
      ret = pthread_kill(accept_threads[i], SIGUSR1);
      if(ret !=0 && ret != ESRCH){
	perror("pthread_kill");
      }
    }while(ret != 0 && ret != ESRCH);
  }

  for(i=0; i<EVENT_THREAD_NUM; i++){
    ret = -1;
    do{
      ret = pthread_kill(event_threads[i], SIGUSR1);
      if(ret !=0 && ret != ESRCH){
	perror("pthread_kill");
      }
    }while(ret != 0 && ret != ESRCH);
  }

  for(i=0; i<ACCEPT_THREAD_NUM; i++){
    ret = pthread_join(accept_threads[i], &status);
  }
  for(i=0; i<EVENT_THREAD_NUM; i++){
    ret = pthread_join(event_threads[i], &status);
  }
  
  server->Stop();
  delete server;
}
Пример #2
0
int
main(int argc, char *argv[], char *envp[])
{
	int i, poolid, classid;
	ssize_t len;
	key_t	key;
	char *msg;

	//	Parse the options and configure appropriate values. 
	parse_opt(argc, argv);

	//	Read the configuration
	setConfigFile();
	myConfigServerType = CONFIG_SERPLEX_EXECD;
	DoConfig(ConfigureExecD);

	//	Daemonize
	if (execd_daemonize) {
		daemonize();
		(void) freopen( "/dev/null", "r", stdin );
		(void) freopen( "/var/log/iserverout.log", "a", stdout );
		(void) freopen( "/var/log/iservererr.log", "a", stderr ); 
		for (i = 3; i < MAXFD; i++) {
			close(i);	
		}
	}

	//	Start the signal handler thread.
	SignalInit();

	NetSyslogOpen(pname, NETLOG_ASYNC);
	sprintf(pidf, "%s/%s", PIDS_DIRECTORY, EXECD_PID_FILE); 
	execdpid = ReadPid(pidf);
 
	if ( execdpid > 0 ) { 
		if ((kill(execdpid, 0) == 0) || (errno != ESRCH)) { 
			NETERROR(MRSD, ("%s seems to be running already - exiting\n", basename(argv[0])));
			exit(0);
		} 
		else  /* Get rid of the leftover file */ 
       		UnlinkPid(pidf);
    }

	StorePid(pidf);

	NETINFOMSG(MEXECD, ("*** NexTone Cmd Execution Server started ***\n"));

	// 	Start the thread which sends message to pm
	Initpoll(EXECD_ID, SERPLEX_GID);
	Sendpoll(0); 
	ThreadLaunch((PFVP)SendPMPoll, NULL, 1);

	// 	Get the msg_q id. If it does not exist then create it
	if ((key = ftok(ISERVER_FTOK_PATH, ISERVER_EXECD_Q)) < 0) {
		NETERROR(MEXECD, ("ftok: %s\n", strerror(errno)));
		exit(0);
	}
	
	if (q_vget(key, 0, MAX_NUM_MSG, MAX_MSGLEN, &msgqid) < 0) {
		NETERROR(MEXECD, ("q_vget: %s\n", strerror(errno)));
		exit(0);
	}

#ifdef USE_SYS_POPEN	
	sys_utils_init();
#endif

	// Start a threadpool of worker threads
	poolid = ThreadPoolInit("execcmd", nthreads, PTHREAD_SCOPE_PROCESS, -1, 0);
	classid = ThreadAddPoolClass("execcmd", poolid, 0, 0);
	ThreadPoolStart(poolid);

	// msgqid has to be valid if we reached here
	for( ; ; ) {
		if (!(msg = malloc(MAX_MSGLEN))) {
			NETERROR(MEXECD, ("malloc: %s\n", strerror(errno)));
			sleep(5);   // sleep and try again
			continue;
		}
		if (q_vreceive(msgqid, msg, MAX_MSGLEN, SRVR_MSG_TYP, 0, &len) < 0) {
			NETERROR(MEXECD, ("q_vreceive: %s\n", strerror(errno)));
			// Check error types
			if (errno == EIDRM) {
				printf("execd: stop messing with my message queue\n");
				// somebody deleted the queue
				if (q_vget(key, 0, MAX_NUM_MSG, MAX_MSGLEN, &msgqid) < 0) {
					NETERROR(MEXECD, ("q_vget: %s\n", strerror(errno)));
					exit(0);
				}
			}
			free(msg);
			continue;
		}
		if (ThreadDispatch(poolid, classid, (PFVP)CmdWorker, msg, 1, 
			PTHREAD_SCOPE_PROCESS, SCHED_FIFO, 59) < 0) {
			NETERROR(MRSD, ("ThreadDispatch: No free thread\n"));
			// Send response in a new thread
			ThreadLaunch((PFVP)SendFailMsg, msg, 1);
		}
	}
}