~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/tools/testing/selftests/powerpc/harness.c

Version: ~ [ linux-5.13-rc5 ] ~ [ linux-5.12.9 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.42 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.124 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.193 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.235 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.271 ] ~ [ linux-4.8.17 ] ~ [ linux-4.7.10 ] ~ [ linux-4.6.7 ] ~ [ linux-4.5.7 ] ~ [ linux-4.4.271 ] ~ [ linux-4.3.6 ] ~ [ linux-4.2.8 ] ~ [ linux-4.1.52 ] ~ [ linux-4.0.9 ] ~ [ linux-3.18.140 ] ~ [ linux-3.16.85 ] ~ [ linux-3.14.79 ] ~ [ linux-3.12.74 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.5 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 /*
  2  * Copyright 2013, Michael Ellerman, IBM Corp.
  3  * Licensed under GPLv2.
  4  */
  5 
  6 #include <errno.h>
  7 #include <signal.h>
  8 #include <stdbool.h>
  9 #include <stdio.h>
 10 #include <stdlib.h>
 11 #include <sys/types.h>
 12 #include <sys/wait.h>
 13 #include <unistd.h>
 14 #include <elf.h>
 15 #include <fcntl.h>
 16 #include <link.h>
 17 #include <sys/stat.h>
 18 
 19 #include "subunit.h"
 20 #include "utils.h"
 21 
 22 #define KILL_TIMEOUT    5
 23 
 24 static uint64_t timeout = 120;
 25 
 26 int run_test(int (test_function)(void), char *name)
 27 {
 28         bool terminated;
 29         int rc, status;
 30         pid_t pid;
 31 
 32         /* Make sure output is flushed before forking */
 33         fflush(stdout);
 34 
 35         pid = fork();
 36         if (pid == 0) {
 37                 setpgid(0, 0);
 38                 exit(test_function());
 39         } else if (pid == -1) {
 40                 perror("fork");
 41                 return 1;
 42         }
 43 
 44         setpgid(pid, pid);
 45 
 46         /* Wake us up in timeout seconds */
 47         alarm(timeout);
 48         terminated = false;
 49 
 50 wait:
 51         rc = waitpid(pid, &status, 0);
 52         if (rc == -1) {
 53                 if (errno != EINTR) {
 54                         printf("unknown error from waitpid\n");
 55                         return 1;
 56                 }
 57 
 58                 if (terminated) {
 59                         printf("!! force killing %s\n", name);
 60                         kill(-pid, SIGKILL);
 61                         return 1;
 62                 } else {
 63                         printf("!! killing %s\n", name);
 64                         kill(-pid, SIGTERM);
 65                         terminated = true;
 66                         alarm(KILL_TIMEOUT);
 67                         goto wait;
 68                 }
 69         }
 70 
 71         /* Kill anything else in the process group that is still running */
 72         kill(-pid, SIGTERM);
 73 
 74         if (WIFEXITED(status))
 75                 status = WEXITSTATUS(status);
 76         else {
 77                 if (WIFSIGNALED(status))
 78                         printf("!! child died by signal %d\n", WTERMSIG(status));
 79                 else
 80                         printf("!! child died by unknown cause\n");
 81 
 82                 status = 1; /* Signal or other */
 83         }
 84 
 85         return status;
 86 }
 87 
 88 static void alarm_handler(int signum)
 89 {
 90         /* Jut wake us up from waitpid */
 91 }
 92 
 93 static struct sigaction alarm_action = {
 94         .sa_handler = alarm_handler,
 95 };
 96 
 97 void test_harness_set_timeout(uint64_t time)
 98 {
 99         timeout = time;
100 }
101 
102 int test_harness(int (test_function)(void), char *name)
103 {
104         int rc;
105 
106         test_start(name);
107         test_set_git_version(GIT_VERSION);
108 
109         if (sigaction(SIGALRM, &alarm_action, NULL)) {
110                 perror("sigaction");
111                 test_error(name);
112                 return 1;
113         }
114 
115         rc = run_test(test_function, name);
116 
117         if (rc == MAGIC_SKIP_RETURN_VALUE) {
118                 test_skip(name);
119                 /* so that skipped test is not marked as failed */
120                 rc = 0;
121         } else
122                 test_finish(name, rc);
123 
124         return rc;
125 }
126 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | Wiki (Japanese) | Wiki (English) | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

osdn.jp