move Main Loop to a separate clone process
This commit is contained in:
		
							
								
								
									
										17
									
								
								yasnd.c
									
									
									
									
									
								
							
							
						
						
									
										17
									
								
								yasnd.c
									
									
									
									
									
								
							| @@ -22,6 +22,7 @@ char* phone_connection=NULL; // gammu phone connection type, for example: "at" | ||||
| char* recipient_number=NULL; // recipient of sms alerts | ||||
| bool loop_locked=false ; // flag for locking main loop while config re-reading | ||||
| int failures_first=3 ; // count of failures while hosts checking, that triggers first SMS sending | ||||
| pid_t mainloop_clone_pid; // pid of clone process, that containt main loop | ||||
|  | ||||
| void log_debug(const char *message,int verbosity) | ||||
| { | ||||
| @@ -158,8 +159,12 @@ void reset_pin(int pin_num) | ||||
| 	outb (0, LPTPORT); | ||||
| } | ||||
|  | ||||
| void loop_function() | ||||
| int loop_function() | ||||
| { | ||||
| 	// set default signal handlers | ||||
| 	signal(SIGTERM,SIG_DFL); | ||||
| 	signal(SIGHUP,SIG_DFL); | ||||
| 	// | ||||
| 	for (int i=0;i<hosts_count;i++) | ||||
| 	{ | ||||
| 		check_host(i,&hosts[i]); | ||||
| @@ -223,9 +228,9 @@ void signal_handler(int signum) | ||||
| 		log_event("SIGHUP captured, daemon re-read config"); | ||||
| 		// lock Main Loop | ||||
| 		loop_locked=true; | ||||
|  | ||||
| 		// STUB: need to kill all childs here | ||||
|  | ||||
| 		// kill Main Loop clone process | ||||
| 		kill(mainloop_clone_pid,SIGTERM); | ||||
| 		waitpid(mainloop_clone_pid,NULL,__WCLONE); | ||||
| 		// free all resources | ||||
| 		free_resources(); | ||||
| 		// Init IPC loop again | ||||
| @@ -302,7 +307,9 @@ int main(void) { | ||||
| 	while (1) { | ||||
| 		if (!loop_locked) | ||||
| 		{ | ||||
| 			loop_function(); | ||||
| 			unsigned char child_stack[16384]; | ||||
| 			mainloop_clone_pid=clone(loop_function,child_stack+8192,CLONE_VM,NULL); | ||||
| 			waitpid(mainloop_clone_pid,NULL,__WCLONE); | ||||
| 			sleep(60); /* wait 60 seconds */ | ||||
| //			log_event("Exiting"); | ||||
| //			exit(EXIT_SUCCESS); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user