1e1da71810155740b4cffe9b9e009fe5273802214mostang.com!davidm/* libunwind - a platform-independent unwind library 2e1da71810155740b4cffe9b9e009fe5273802214mostang.com!davidm Copyright (C) 2003-2004 Hewlett-Packard Co 3e1da71810155740b4cffe9b9e009fe5273802214mostang.com!davidm Contributed by David Mosberger-Tang <davidm@hpl.hp.com> 4e1da71810155740b4cffe9b9e009fe5273802214mostang.com!davidm 5e1da71810155740b4cffe9b9e009fe5273802214mostang.com!davidmPermission is hereby granted, free of charge, to any person obtaining 6e1da71810155740b4cffe9b9e009fe5273802214mostang.com!davidma copy of this software and associated documentation files (the 7e1da71810155740b4cffe9b9e009fe5273802214mostang.com!davidm"Software"), to deal in the Software without restriction, including 8e1da71810155740b4cffe9b9e009fe5273802214mostang.com!davidmwithout limitation the rights to use, copy, modify, merge, publish, 9e1da71810155740b4cffe9b9e009fe5273802214mostang.com!davidmdistribute, sublicense, and/or sell copies of the Software, and to 10e1da71810155740b4cffe9b9e009fe5273802214mostang.com!davidmpermit persons to whom the Software is furnished to do so, subject to 11e1da71810155740b4cffe9b9e009fe5273802214mostang.com!davidmthe following conditions: 12e1da71810155740b4cffe9b9e009fe5273802214mostang.com!davidm 13e1da71810155740b4cffe9b9e009fe5273802214mostang.com!davidmThe above copyright notice and this permission notice shall be 14e1da71810155740b4cffe9b9e009fe5273802214mostang.com!davidmincluded in all copies or substantial portions of the Software. 15e1da71810155740b4cffe9b9e009fe5273802214mostang.com!davidm 16e1da71810155740b4cffe9b9e009fe5273802214mostang.com!davidmTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 17e1da71810155740b4cffe9b9e009fe5273802214mostang.com!davidmEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 18e1da71810155740b4cffe9b9e009fe5273802214mostang.com!davidmMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 19e1da71810155740b4cffe9b9e009fe5273802214mostang.com!davidmNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 20e1da71810155740b4cffe9b9e009fe5273802214mostang.com!davidmLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 21e1da71810155740b4cffe9b9e009fe5273802214mostang.com!davidmOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 22e1da71810155740b4cffe9b9e009fe5273802214mostang.com!davidmWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ 23e1da71810155740b4cffe9b9e009fe5273802214mostang.com!davidm 24ded94b98ff3534a3c394591f4b254b1af6f0711cTommi Rantala#include <string.h> 2512876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidm#include <stdio.h> 2612876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidm#include <stdlib.h> 273be31f5dcb65ec1a37de234f127f7e69c9352a92hp.com!davidm#include <unistd.h> 2812876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidm 2912876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidm#include <libunwind.h> 30e3e49dc28aee0dc78f0243d932a5c950aaec7e3eTommi Rantala#include "compiler.h" 3112876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidm 323be31f5dcb65ec1a37de234f127f7e69c9352a92hp.com!davidm#include <sys/resource.h> 3350c2be0ca322727d5a4f53fbf70fa579c853bc70mostang.com!davidm#include <sys/time.h> 343be31f5dcb65ec1a37de234f127f7e69c9352a92hp.com!davidm 3512876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidm#define panic(args...) \ 3612876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidm do { fprintf (stderr, args); exit (-1); } while (0) 3712876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidm 3896c62506269ed6b7de3531816e9ad4a62fb50d92mostang.com!davidmlong dummy; 3996c62506269ed6b7de3531816e9ad4a62fb50d92mostang.com!davidm 40c7fdc72fd6c462b87afb1af5390ffa3724a16f18mostang.com!davidmstatic long iterations = 10000; 415e446b24d7e2a107d5988db49f00b3e7de0295a7hp.com!davidmstatic int maxlevel = 100; 425e446b24d7e2a107d5988db49f00b3e7de0295a7hp.com!davidm 433be31f5dcb65ec1a37de234f127f7e69c9352a92hp.com!davidm#define KB 1024 4496c62506269ed6b7de3531816e9ad4a62fb50d92mostang.com!davidm#define MB (1024*1024) 4596c62506269ed6b7de3531816e9ad4a62fb50d92mostang.com!davidm 463be31f5dcb65ec1a37de234f127f7e69c9352a92hp.com!davidmstatic char big[64*MB]; /* should be >> max. cache size */ 4796c62506269ed6b7de3531816e9ad4a62fb50d92mostang.com!davidm 4812876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidmstatic inline double 4912876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidmgettime (void) 5012876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidm{ 51e3eae746986c627103b8709130f439a24663eaebmostang.com!davidm struct timeval tv; 5212876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidm 53e3eae746986c627103b8709130f439a24663eaebmostang.com!davidm gettimeofday (&tv, NULL); 54e3eae746986c627103b8709130f439a24663eaebmostang.com!davidm return tv.tv_sec + 1e-6*tv.tv_usec; 5512876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidm} 5612876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidm 57e3e49dc28aee0dc78f0243d932a5c950aaec7e3eTommi Rantalastatic int NOINLINE 5896c62506269ed6b7de3531816e9ad4a62fb50d92mostang.com!davidmmeasure_unwind (int maxlevel, double *step) 5912876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidm{ 6096c62506269ed6b7de3531816e9ad4a62fb50d92mostang.com!davidm double stop, start; 6112876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidm unw_cursor_t cursor; 6212876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidm unw_context_t uc; 6312876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidm int ret, level = 0; 6412876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidm 6512876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidm unw_getcontext (&uc); 6612876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidm if (unw_init_local (&cursor, &uc) < 0) 6712876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidm panic ("unw_init_local() failed\n"); 6812876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidm 6996c62506269ed6b7de3531816e9ad4a62fb50d92mostang.com!davidm start = gettime (); 7012876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidm 7112876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidm do 7212876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidm { 7312876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidm ret = unw_step (&cursor); 7412876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidm if (ret < 0) 7512876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidm panic ("unw_step() failed\n"); 7612876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidm ++level; 7712876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidm } 7812876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidm while (ret > 0); 7912876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidm 8012876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidm stop = gettime (); 8112876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidm 8212876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidm if (level <= maxlevel) 8302c9034eb214248646be46cb344b7a6e7b67f661hp.com!davidm panic ("Unwound only %d levels, expected at least %d levels\n", 8412876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidm level, maxlevel); 8512876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidm 8696c62506269ed6b7de3531816e9ad4a62fb50d92mostang.com!davidm *step = (stop - start) / (double) level; 8729f2f89a8fc3cd7f103fb7ed7e1c9f79adfd59b8hp.com!davidm return 0; 8812876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidm} 8912876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidm 9002c9034eb214248646be46cb344b7a6e7b67f661hp.com!davidmstatic int f1 (int, int, double *); 9102c9034eb214248646be46cb344b7a6e7b67f661hp.com!davidm 92e3e49dc28aee0dc78f0243d932a5c950aaec7e3eTommi Rantalastatic int NOINLINE 9302c9034eb214248646be46cb344b7a6e7b67f661hp.com!davidmg1 (int level, int maxlevel, double *step) 9412876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidm{ 9512876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidm if (level == maxlevel) 9696c62506269ed6b7de3531816e9ad4a62fb50d92mostang.com!davidm return measure_unwind (maxlevel, step); 9712876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidm else 9812876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidm /* defeat last-call/sibcall optimization */ 9996c62506269ed6b7de3531816e9ad4a62fb50d92mostang.com!davidm return f1 (level + 1, maxlevel, step) + level; 1005e446b24d7e2a107d5988db49f00b3e7de0295a7hp.com!davidm} 1015e446b24d7e2a107d5988db49f00b3e7de0295a7hp.com!davidm 102e3e49dc28aee0dc78f0243d932a5c950aaec7e3eTommi Rantalastatic int NOINLINE 10302c9034eb214248646be46cb344b7a6e7b67f661hp.com!davidmf1 (int level, int maxlevel, double *step) 10402c9034eb214248646be46cb344b7a6e7b67f661hp.com!davidm{ 10502c9034eb214248646be46cb344b7a6e7b67f661hp.com!davidm if (level == maxlevel) 10602c9034eb214248646be46cb344b7a6e7b67f661hp.com!davidm return measure_unwind (maxlevel, step); 10702c9034eb214248646be46cb344b7a6e7b67f661hp.com!davidm else 10802c9034eb214248646be46cb344b7a6e7b67f661hp.com!davidm /* defeat last-call/sibcall optimization */ 10902c9034eb214248646be46cb344b7a6e7b67f661hp.com!davidm return g1 (level + 1, maxlevel, step) + level; 11002c9034eb214248646be46cb344b7a6e7b67f661hp.com!davidm} 11102c9034eb214248646be46cb344b7a6e7b67f661hp.com!davidm 1125e446b24d7e2a107d5988db49f00b3e7de0295a7hp.com!davidmstatic void 1135e446b24d7e2a107d5988db49f00b3e7de0295a7hp.com!davidmdoit (const char *label) 1145e446b24d7e2a107d5988db49f00b3e7de0295a7hp.com!davidm{ 11596c62506269ed6b7de3531816e9ad4a62fb50d92mostang.com!davidm double step, min_step, first_step, sum_step; 1165e446b24d7e2a107d5988db49f00b3e7de0295a7hp.com!davidm int i; 1175e446b24d7e2a107d5988db49f00b3e7de0295a7hp.com!davidm 11896c62506269ed6b7de3531816e9ad4a62fb50d92mostang.com!davidm sum_step = first_step = 0.0; 11996c62506269ed6b7de3531816e9ad4a62fb50d92mostang.com!davidm min_step = 1e99; 120c7fdc72fd6c462b87afb1af5390ffa3724a16f18mostang.com!davidm for (i = 0; i < iterations; ++i) 1215e446b24d7e2a107d5988db49f00b3e7de0295a7hp.com!davidm { 12296c62506269ed6b7de3531816e9ad4a62fb50d92mostang.com!davidm f1 (0, maxlevel, &step); 1235e446b24d7e2a107d5988db49f00b3e7de0295a7hp.com!davidm 1245e446b24d7e2a107d5988db49f00b3e7de0295a7hp.com!davidm sum_step += step; 1255e446b24d7e2a107d5988db49f00b3e7de0295a7hp.com!davidm 1265e446b24d7e2a107d5988db49f00b3e7de0295a7hp.com!davidm if (step < min_step) 1275e446b24d7e2a107d5988db49f00b3e7de0295a7hp.com!davidm min_step = step; 1285e446b24d7e2a107d5988db49f00b3e7de0295a7hp.com!davidm 1295e446b24d7e2a107d5988db49f00b3e7de0295a7hp.com!davidm if (i == 0) 13096c62506269ed6b7de3531816e9ad4a62fb50d92mostang.com!davidm first_step = step; 1315e446b24d7e2a107d5988db49f00b3e7de0295a7hp.com!davidm } 13296c62506269ed6b7de3531816e9ad4a62fb50d92mostang.com!davidm printf ("%s: unw_step : 1st=%9.3f min=%9.3f avg=%9.3f nsec\n", label, 133c7fdc72fd6c462b87afb1af5390ffa3724a16f18mostang.com!davidm 1e9*first_step, 1e9*min_step, 1e9*sum_step/iterations); 13412876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidm} 13512876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidm 13696c62506269ed6b7de3531816e9ad4a62fb50d92mostang.com!davidmstatic long 137fc7b49b9837b84727da4c25ba0905b8d2a1920e8mostang.com!davidmsum (void *buf, size_t size) 13896c62506269ed6b7de3531816e9ad4a62fb50d92mostang.com!davidm{ 13996c62506269ed6b7de3531816e9ad4a62fb50d92mostang.com!davidm long s = 0; 140fc7b49b9837b84727da4c25ba0905b8d2a1920e8mostang.com!davidm char *cp = buf; 14196c62506269ed6b7de3531816e9ad4a62fb50d92mostang.com!davidm size_t i; 14296c62506269ed6b7de3531816e9ad4a62fb50d92mostang.com!davidm 1433be31f5dcb65ec1a37de234f127f7e69c9352a92hp.com!davidm for (i = 0; i < size; i += 8) 1443be31f5dcb65ec1a37de234f127f7e69c9352a92hp.com!davidm s += cp[i]; 14596c62506269ed6b7de3531816e9ad4a62fb50d92mostang.com!davidm return s; 14696c62506269ed6b7de3531816e9ad4a62fb50d92mostang.com!davidm} 14796c62506269ed6b7de3531816e9ad4a62fb50d92mostang.com!davidm 14896c62506269ed6b7de3531816e9ad4a62fb50d92mostang.com!davidmstatic void 14996c62506269ed6b7de3531816e9ad4a62fb50d92mostang.com!davidmmeasure_init (void) 15096c62506269ed6b7de3531816e9ad4a62fb50d92mostang.com!davidm{ 1513be31f5dcb65ec1a37de234f127f7e69c9352a92hp.com!davidm# define N 100 15250c2be0ca322727d5a4f53fbf70fa579c853bc70mostang.com!davidm# define M 10 /* must be at least 2 to get steady-state */ 153fc7b49b9837b84727da4c25ba0905b8d2a1920e8mostang.com!davidm double stop, start, get_cold, get_warm, init_cold, init_warm, delta; 1543be31f5dcb65ec1a37de234f127f7e69c9352a92hp.com!davidm struct 1553be31f5dcb65ec1a37de234f127f7e69c9352a92hp.com!davidm { 1563be31f5dcb65ec1a37de234f127f7e69c9352a92hp.com!davidm unw_cursor_t c; 1573be31f5dcb65ec1a37de234f127f7e69c9352a92hp.com!davidm char padding[1024]; /* should be > 2 * max. cacheline size */ 1583be31f5dcb65ec1a37de234f127f7e69c9352a92hp.com!davidm } 1593be31f5dcb65ec1a37de234f127f7e69c9352a92hp.com!davidm cursor[N]; 1603be31f5dcb65ec1a37de234f127f7e69c9352a92hp.com!davidm struct 1613be31f5dcb65ec1a37de234f127f7e69c9352a92hp.com!davidm { 1623be31f5dcb65ec1a37de234f127f7e69c9352a92hp.com!davidm unw_context_t uc; 1633be31f5dcb65ec1a37de234f127f7e69c9352a92hp.com!davidm char padding[1024]; /* should be > 2 * max. cacheline size */ 1643be31f5dcb65ec1a37de234f127f7e69c9352a92hp.com!davidm } 1653be31f5dcb65ec1a37de234f127f7e69c9352a92hp.com!davidm uc[N]; 166fc7b49b9837b84727da4c25ba0905b8d2a1920e8mostang.com!davidm int i, j; 16796c62506269ed6b7de3531816e9ad4a62fb50d92mostang.com!davidm 168fc7b49b9837b84727da4c25ba0905b8d2a1920e8mostang.com!davidm /* Run each test M times and take the minimum to filter out noise 169fc7b49b9837b84727da4c25ba0905b8d2a1920e8mostang.com!davidm such dynamic linker resolving overhead, context-switches, 170fc7b49b9837b84727da4c25ba0905b8d2a1920e8mostang.com!davidm page-in, cache, and TLB effects. */ 17196c62506269ed6b7de3531816e9ad4a62fb50d92mostang.com!davidm 172fc7b49b9837b84727da4c25ba0905b8d2a1920e8mostang.com!davidm get_cold = 1e99; 173fc7b49b9837b84727da4c25ba0905b8d2a1920e8mostang.com!davidm for (j = 0; j < M; ++j) 174fc7b49b9837b84727da4c25ba0905b8d2a1920e8mostang.com!davidm { 1753be31f5dcb65ec1a37de234f127f7e69c9352a92hp.com!davidm dummy += sum (big, sizeof (big)); /* flush the cache */ 1763be31f5dcb65ec1a37de234f127f7e69c9352a92hp.com!davidm for (i = 0; i < N; ++i) 1773be31f5dcb65ec1a37de234f127f7e69c9352a92hp.com!davidm uc[i].padding[511] = i; /* warm up the TLB */ 178fc7b49b9837b84727da4c25ba0905b8d2a1920e8mostang.com!davidm start = gettime (); 179fc7b49b9837b84727da4c25ba0905b8d2a1920e8mostang.com!davidm for (i = 0; i < N; ++i) 1803be31f5dcb65ec1a37de234f127f7e69c9352a92hp.com!davidm unw_getcontext (&uc[i].uc); 181fc7b49b9837b84727da4c25ba0905b8d2a1920e8mostang.com!davidm stop = gettime (); 182fc7b49b9837b84727da4c25ba0905b8d2a1920e8mostang.com!davidm delta = (stop - start) / N; 183fc7b49b9837b84727da4c25ba0905b8d2a1920e8mostang.com!davidm if (delta < get_cold) 184fc7b49b9837b84727da4c25ba0905b8d2a1920e8mostang.com!davidm get_cold = delta; 185fc7b49b9837b84727da4c25ba0905b8d2a1920e8mostang.com!davidm } 1863be31f5dcb65ec1a37de234f127f7e69c9352a92hp.com!davidm 187fc7b49b9837b84727da4c25ba0905b8d2a1920e8mostang.com!davidm init_cold = 1e99; 188fc7b49b9837b84727da4c25ba0905b8d2a1920e8mostang.com!davidm for (j = 0; j < M; ++j) 189fc7b49b9837b84727da4c25ba0905b8d2a1920e8mostang.com!davidm { 190fc7b49b9837b84727da4c25ba0905b8d2a1920e8mostang.com!davidm dummy += sum (big, sizeof (big)); /* flush cache */ 1913be31f5dcb65ec1a37de234f127f7e69c9352a92hp.com!davidm for (i = 0; i < N; ++i) 1923be31f5dcb65ec1a37de234f127f7e69c9352a92hp.com!davidm uc[i].padding[511] = i; /* warm up the TLB */ 193fc7b49b9837b84727da4c25ba0905b8d2a1920e8mostang.com!davidm start = gettime (); 194fc7b49b9837b84727da4c25ba0905b8d2a1920e8mostang.com!davidm for (i = 0; i < N; ++i) 1953be31f5dcb65ec1a37de234f127f7e69c9352a92hp.com!davidm unw_init_local (&cursor[i].c, &uc[i].uc); 196fc7b49b9837b84727da4c25ba0905b8d2a1920e8mostang.com!davidm stop = gettime (); 197fc7b49b9837b84727da4c25ba0905b8d2a1920e8mostang.com!davidm delta = (stop - start) / N; 198fc7b49b9837b84727da4c25ba0905b8d2a1920e8mostang.com!davidm if (delta < init_cold) 199fc7b49b9837b84727da4c25ba0905b8d2a1920e8mostang.com!davidm init_cold = delta; 200fc7b49b9837b84727da4c25ba0905b8d2a1920e8mostang.com!davidm } 20196c62506269ed6b7de3531816e9ad4a62fb50d92mostang.com!davidm 202fc7b49b9837b84727da4c25ba0905b8d2a1920e8mostang.com!davidm get_warm = 1e99; 203fc7b49b9837b84727da4c25ba0905b8d2a1920e8mostang.com!davidm for (j = 0; j < M; ++j) 204fc7b49b9837b84727da4c25ba0905b8d2a1920e8mostang.com!davidm { 205fc7b49b9837b84727da4c25ba0905b8d2a1920e8mostang.com!davidm start = gettime (); 206fc7b49b9837b84727da4c25ba0905b8d2a1920e8mostang.com!davidm for (i = 0; i < N; ++i) 2073be31f5dcb65ec1a37de234f127f7e69c9352a92hp.com!davidm unw_getcontext (&uc[0].uc); 208fc7b49b9837b84727da4c25ba0905b8d2a1920e8mostang.com!davidm stop = gettime (); 209fc7b49b9837b84727da4c25ba0905b8d2a1920e8mostang.com!davidm delta = (stop - start) / N; 210fc7b49b9837b84727da4c25ba0905b8d2a1920e8mostang.com!davidm if (delta < get_warm) 211fc7b49b9837b84727da4c25ba0905b8d2a1920e8mostang.com!davidm get_warm = delta; 212fc7b49b9837b84727da4c25ba0905b8d2a1920e8mostang.com!davidm } 21396c62506269ed6b7de3531816e9ad4a62fb50d92mostang.com!davidm 214fc7b49b9837b84727da4c25ba0905b8d2a1920e8mostang.com!davidm init_warm = 1e99; 215fc7b49b9837b84727da4c25ba0905b8d2a1920e8mostang.com!davidm for (j = 0; j < M; ++j) 216fc7b49b9837b84727da4c25ba0905b8d2a1920e8mostang.com!davidm { 217fc7b49b9837b84727da4c25ba0905b8d2a1920e8mostang.com!davidm start = gettime (); 218fc7b49b9837b84727da4c25ba0905b8d2a1920e8mostang.com!davidm for (i = 0; i < N; ++i) 2193be31f5dcb65ec1a37de234f127f7e69c9352a92hp.com!davidm unw_init_local (&cursor[0].c, &uc[0].uc); 220fc7b49b9837b84727da4c25ba0905b8d2a1920e8mostang.com!davidm stop = gettime (); 221fc7b49b9837b84727da4c25ba0905b8d2a1920e8mostang.com!davidm delta = (stop - start) / N; 222fc7b49b9837b84727da4c25ba0905b8d2a1920e8mostang.com!davidm if (delta < init_warm) 223fc7b49b9837b84727da4c25ba0905b8d2a1920e8mostang.com!davidm init_warm = delta; 224fc7b49b9837b84727da4c25ba0905b8d2a1920e8mostang.com!davidm } 22596c62506269ed6b7de3531816e9ad4a62fb50d92mostang.com!davidm 22696c62506269ed6b7de3531816e9ad4a62fb50d92mostang.com!davidm printf ("unw_getcontext : cold avg=%9.3f nsec, warm avg=%9.3f nsec\n", 227fc7b49b9837b84727da4c25ba0905b8d2a1920e8mostang.com!davidm 1e9 * get_cold, 1e9 * get_warm); 22896c62506269ed6b7de3531816e9ad4a62fb50d92mostang.com!davidm printf ("unw_init_local : cold avg=%9.3f nsec, warm avg=%9.3f nsec\n", 22996c62506269ed6b7de3531816e9ad4a62fb50d92mostang.com!davidm 1e9 * init_cold, 1e9 * init_warm); 23096c62506269ed6b7de3531816e9ad4a62fb50d92mostang.com!davidm} 23196c62506269ed6b7de3531816e9ad4a62fb50d92mostang.com!davidm 23212876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidmint 23312876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidmmain (int argc, char **argv) 23412876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidm{ 2353be31f5dcb65ec1a37de234f127f7e69c9352a92hp.com!davidm struct rlimit rlim; 2363be31f5dcb65ec1a37de234f127f7e69c9352a92hp.com!davidm 2373be31f5dcb65ec1a37de234f127f7e69c9352a92hp.com!davidm rlim.rlim_cur = RLIM_INFINITY; 2383be31f5dcb65ec1a37de234f127f7e69c9352a92hp.com!davidm rlim.rlim_max = RLIM_INFINITY; 2393be31f5dcb65ec1a37de234f127f7e69c9352a92hp.com!davidm setrlimit (RLIMIT_STACK, &rlim); 2403be31f5dcb65ec1a37de234f127f7e69c9352a92hp.com!davidm 2413be31f5dcb65ec1a37de234f127f7e69c9352a92hp.com!davidm memset (big, 0xaa, sizeof (big)); 2423be31f5dcb65ec1a37de234f127f7e69c9352a92hp.com!davidm 24312876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidm if (argc > 1) 244c7fdc72fd6c462b87afb1af5390ffa3724a16f18mostang.com!davidm { 245c7fdc72fd6c462b87afb1af5390ffa3724a16f18mostang.com!davidm maxlevel = atol (argv[1]); 246c7fdc72fd6c462b87afb1af5390ffa3724a16f18mostang.com!davidm if (argc > 2) 247c7fdc72fd6c462b87afb1af5390ffa3724a16f18mostang.com!davidm iterations = atol (argv[2]); 248c7fdc72fd6c462b87afb1af5390ffa3724a16f18mostang.com!davidm } 24912876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidm 25096c62506269ed6b7de3531816e9ad4a62fb50d92mostang.com!davidm measure_init (); 25196c62506269ed6b7de3531816e9ad4a62fb50d92mostang.com!davidm 2527a346fbf8ce35978524e85dd2c19768640f20c89mostang.com!davidm unw_set_caching_policy (unw_local_addr_space, UNW_CACHE_NONE); 25396c62506269ed6b7de3531816e9ad4a62fb50d92mostang.com!davidm doit ("no cache "); 2547a346fbf8ce35978524e85dd2c19768640f20c89mostang.com!davidm 2557a346fbf8ce35978524e85dd2c19768640f20c89mostang.com!davidm unw_set_caching_policy (unw_local_addr_space, UNW_CACHE_GLOBAL); 25696c62506269ed6b7de3531816e9ad4a62fb50d92mostang.com!davidm doit ("global cache "); 2577a346fbf8ce35978524e85dd2c19768640f20c89mostang.com!davidm 2587a346fbf8ce35978524e85dd2c19768640f20c89mostang.com!davidm unw_set_caching_policy (unw_local_addr_space, UNW_CACHE_PER_THREAD); 25996c62506269ed6b7de3531816e9ad4a62fb50d92mostang.com!davidm doit ("per-thread cache"); 2605e446b24d7e2a107d5988db49f00b3e7de0295a7hp.com!davidm 26112876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidm return 0; 26212876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidm} 263