1f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang/* libunwind - a platform-independent unwind library 2f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang Copyright (C) 2004 Hewlett-Packard Co 3f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang Contributed by David Mosberger-Tang <davidm@hpl.hp.com> 4f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang 5f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-TangPermission is hereby granted, free of charge, to any person obtaining 6f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tanga copy of this software and associated documentation files (the 7f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang"Software"), to deal in the Software without restriction, including 8f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tangwithout limitation the rights to use, copy, modify, merge, publish, 9f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tangdistribute, sublicense, and/or sell copies of the Software, and to 10f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tangpermit persons to whom the Software is furnished to do so, subject to 11f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tangthe following conditions: 12f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang 13f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-TangThe above copyright notice and this permission notice shall be 14f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tangincluded in all copies or substantial portions of the Software. 15f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang 16f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-TangTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 17f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-TangEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 18f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-TangMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 19f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-TangNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 20f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-TangLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 21f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-TangOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 22f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-TangWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ 23f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang 24f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang#include <stdio.h> 25f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang#include <stdlib.h> 26f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang#include <unistd.h> 27f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang 28f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang#include <sys/time.h> 29f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang#include <sys/types.h> 30f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang#include <sys/wait.h> 31f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang 32f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tangint 33f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tangmain (int argc, char **argv, char **envp) 34f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang{ 35f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang char *program, **child_argv; 36f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang struct timeval start, stop; 37f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang double secs; 38f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang int status, i; 39f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang long count; 40f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang pid_t pid; 41f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang 42f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang count = atol (argv[1]); 43f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang program = argv[2]; 44f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang 45f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang child_argv = alloca ((argc - 1) * sizeof (char *)); 46f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang for (i = 0; i < argc - 2; ++i) 47f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang child_argv[i] = argv[2 + i]; 48f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang child_argv[i] = NULL; 49f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang 50f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang gettimeofday (&start, NULL); 51f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang for (i = 0; i < count; ++i) 52f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang { 53f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang pid = fork (); 54f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang if (pid == 0) 55f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang { 56f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang execve (program, child_argv, envp); 57f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang _exit (-1); 58f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang } 59f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang else 60f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang { 61f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang waitpid (pid, &status, 0); 62f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang if (!WIFEXITED (status) || WEXITSTATUS (status) != 0) 63f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang { 64f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang fprintf (stderr, "%s: child failed\n", argv[0]); 65f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang exit (-1); 66f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang } 67f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang } 68f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang } 69f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang gettimeofday (&stop, NULL); 70f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang 71f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang secs = ((stop.tv_sec + 1e-6 * stop.tv_usec) 72f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang - (start.tv_sec + 1e-6 * start.tv_usec)); 73f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang printf ("%lu nsec/execution\n", 74f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang (unsigned long) (1e9 * secs / (double) count)); 75f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang return 0; 76f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang} 77