cregit-Linux how code gets into the kernel

Release 4.10 tools/testing/selftests/powerpc/harness.c

/*
 * Copyright 2013, Michael Ellerman, IBM Corp.
 * Licensed under GPLv2.
 */

#include <errno.h>
#include <signal.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <elf.h>
#include <fcntl.h>
#include <link.h>
#include <sys/stat.h>

#include "subunit.h"
#include "utils.h"


#define KILL_TIMEOUT	5


static uint64_t timeout = 120;


int run_test(int (test_function)(void), char *name) { bool terminated; int rc, status; pid_t pid; /* Make sure output is flushed before forking */ fflush(stdout); pid = fork(); if (pid == 0) { setpgid(0, 0); exit(test_function()); } else if (pid == -1) { perror("fork"); return 1; } setpgid(pid, pid); /* Wake us up in timeout seconds */ alarm(timeout); terminated = false; wait: rc = waitpid(pid, &status, 0); if (rc == -1) { if (errno != EINTR) { printf("unknown error from waitpid\n"); return 1; } if (terminated) { printf("!! force killing %s\n", name); kill(-pid, SIGKILL); return 1; } else { printf("!! killing %s\n", name); kill(-pid, SIGTERM); terminated = true; alarm(KILL_TIMEOUT); goto wait; } } /* Kill anything else in the process group that is still running */ kill(-pid, SIGTERM); if (WIFEXITED(status)) status = WEXITSTATUS(status); else { if (WIFSIGNALED(status)) printf("!! child died by signal %d\n", WTERMSIG(status)); else printf("!! child died by unknown cause\n"); status = 1; /* Signal or other */ } return status; }

Contributors

PersonTokensPropCommitsCommitProp
michael ellermanmichael ellerman24499.59%266.67%
cyril burcyril bur10.41%133.33%
Total245100.00%3100.00%


static void alarm_handler(int signum) { /* Jut wake us up from waitpid */ }

Contributors

PersonTokensPropCommitsCommitProp
michael ellermanmichael ellerman10100.00%1100.00%
Total10100.00%1100.00%

static struct sigaction alarm_action = { .sa_handler = alarm_handler, };
void test_harness_set_timeout(uint64_t time) { timeout = time; }

Contributors

PersonTokensPropCommitsCommitProp
cyril burcyril bur12100.00%1100.00%
Total12100.00%1100.00%


int test_harness(int (test_function)(void), char *name) { int rc; test_start(name); test_set_git_version(GIT_VERSION); if (sigaction(SIGALRM, &alarm_action, NULL)) { perror("sigaction"); test_error(name); return 1; } rc = run_test(test_function, name); if (rc == MAGIC_SKIP_RETURN_VALUE) test_skip(name); else test_finish(name, rc); return rc; }

Contributors

PersonTokensPropCommitsCommitProp
michael ellermanmichael ellerman88100.00%2100.00%
Total88100.00%2100.00%


Overall Contributors

PersonTokensPropCommitsCommitProp
michael ellermanmichael ellerman38992.62%360.00%
cyril burcyril bur194.52%120.00%
sam bobroffsam bobroff122.86%120.00%
Total420100.00%5100.00%
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.