33 #include <sys/signal.h>
40 #include <sys/types.h>
74 signal(SIGTERM, SIG_IGN);
75 signal(SIGQUIT, SIG_IGN);
76 signal(SIGHUP, SIG_IGN);
77 signal(SIGINT, SIG_IGN);
81 ERRPRINTF(
"Error: could not fork to background.\n");
89 if(setsid() == (pid_t) -1) {
90 ERRPRINTF(
"Error: process could not create new session.\n");
123 if(sigfillset(&signal_set) != 0) {
124 ERRPRINTF(
"Error filling signal_set.\n");
129 sigwait(&signal_set, &signal);
132 LOGPRINTF(
"signal received: %d\n", signal);
140 ERRPRINTF(
"Error locking signal_quit_mutex\n");
147 ERRPRINTF(
"Error unlocking signal_quit_mutex\n");
156 ERRPRINTF(
"Error locking signal_quit_mutex\n");
163 ERRPRINTF(
"Error unlocking signal_quit_mutex\n");
189 LOGPRINTF(
"received: %d, cleaning up.\n", sig);
205 f = freopen(logfile,
"a", stdout);
207 ERRPRINTF(
"Error redirecting output to file: %s\n", logfile);
228 int main(
int argc,
char **argv) {
232 int scheduled_status = 0;
238 pthread_t b_thread_id = 0;
239 pthread_attr_t b_thread_attr;
240 void *b_thread_return;
244 pthread_t l_thread_id = 0;
245 pthread_attr_t l_thread_attr;
250 pthread_t s_thread_id = 0;
251 pthread_attr_t s_thread_attr;
261 sigfillset(&signal_set);
262 pthread_sigmask(SIG_BLOCK, &signal_set, NULL);
266 pthread_attr_init(&s_thread_attr);
267 pthread_attr_setdetachstate(&s_thread_attr, PTHREAD_CREATE_JOINABLE);
268 s_thread_rc = pthread_create(&s_thread_id, &s_thread_attr,
270 if(s_thread_rc != 0) {
271 ERRPRINTF(
"Error creating signal handler thread, return code: %d.\n",
317 ERRPRINTF(
"Error parsing load history.\n");
325 pthread_attr_init(&l_thread_attr);
326 pthread_attr_setdetachstate(&l_thread_attr, PTHREAD_CREATE_JOINABLE);
328 LOGPRINTF(
"Starting load monitor thread.\n");
329 l_thread_rc = pthread_create(&l_thread_id, &l_thread_attr,
332 if(l_thread_rc != 0) {
333 ERRPRINTF(
"Error creating thread, return code: %d", l_thread_rc);
344 pthread_attr_init(&b_thread_attr);
346 pthread_attr_setdetachstate(&b_thread_attr, PTHREAD_CREATE_JOINABLE);
362 if(b_thread_id != 0) {
364 DBGPRINTF(
"main loop: Joining previous benchmark thread.\n");
366 b_thread_rc = pthread_join(b_thread_id, &b_thread_return);
368 if(b_thread_rc != 0) {
370 ERRPRINTF(
"Error joining previous thread.\n");
373 if(*(
int*)b_thread_return == 1) {
374 LOGPRINTF(
"Benchmark quit successful.\n");
376 else if(*(
int*)b_thread_return == -1) {
377 ERRPRINTF(
"Benchmark failure. Shutting down ...\n");
379 kill(getpid(), SIGINT);
381 free(b_thread_return);
382 b_thread_return = NULL;
390 free(b_thread_return);
391 b_thread_return = NULL;
393 if(cfg->
pause == 1) {
394 printf(
"Press enter to continue ...");
403 DBGPRINTF(
"schedule status: %i\n", scheduled_status);
405 if(scheduled_status == 0){
411 kill(getpid(), SIGINT);
417 else if(scheduled_status > 1) {
418 DBGPRINTF(
"Currently no schedule-able routine.\n");
421 DBGPRINTF(
"main loop: routine picked for execution: %s\n",
427 b_thread_rc = pthread_create(&b_thread_id, &b_thread_attr,
429 if(b_thread_rc != 0) {
430 ERRPRINTF(
"Error pthread_create: rc:%d\n", b_thread_rc);
463 LOGPRINTF(
"signal_quit set, breaking from main loop ...\n");
472 if(b_thread_id != 0)pthread_join(b_thread_id, NULL);
473 pthread_join(l_thread_id, NULL);
474 pthread_join(s_thread_id, NULL);