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