PAPI  5.7.0.0
exec_overflow.c
Go to the documentation of this file.
1 /*
2  * Test PAPI with fork() and exec().
3  */
4 
5 #include <sys/time.h>
6 #include <sys/types.h>
7 #include <sys/wait.h>
8 #include <errno.h>
9 #include <stdio.h>
10 #include <stdlib.h>
11 #include <unistd.h>
12 
13 #include "papi.h"
14 #include "papi_test.h"
15 #include "testcode.h"
16 
17 #define MAX_EVENTS 3
18 
19 static int Event[MAX_EVENTS] = {
23 };
24 
25 static int Threshold[MAX_EVENTS] = {
26  8000000,
27  4000000,
28  4000000,
29 };
30 
31 static struct timeval start, last;
32 static long count, total;
33 
34 static void
35 my_handler( int EventSet, void *pc, long long ovec, void *context )
36 {
37  ( void ) EventSet;
38  ( void ) pc;
39  ( void ) ovec;
40  ( void ) context;
41 
42  count++;
43  total++;
44 }
45 
46 
47 
48 
49 
50 static void
51 print_rate( const char *str )
52 {
53  static int last_count = -1;
54  struct timeval now;
55  double st_secs, last_secs;
56 
57  gettimeofday( &now, NULL );
58  st_secs = ( double ) ( now.tv_sec - start.tv_sec )
59  + ( ( double ) ( now.tv_usec - start.tv_usec ) ) / 1000000.0;
60  last_secs = ( double ) ( now.tv_sec - last.tv_sec )
61  + ( ( double ) ( now.tv_usec - last.tv_usec ) ) / 1000000.0;
62  if ( last_secs <= 0.001 )
63  last_secs = 0.001;
64 
65  if (!TESTS_QUIET) {
66  printf( "[%d] %s, time = %.3f, total = %ld, last = %ld, rate = %.1f/sec\n",
67  getpid( ), str, st_secs, total, count,
68  ( ( double ) count ) / last_secs );
69  }
70 
71  if ( last_count != -1 ) {
72  if ( count < .1 * last_count ) {
73  test_fail( __FILE__, __LINE__, "Interrupt rate changed!", 1 );
74  exit( 1 );
75  }
76  }
77  last_count = ( int ) count;
78  count = 0;
79  last = now;
80 }
81 
82 static void
83 run( const char *str, int len )
84 {
85  int n;
86 
87  for ( n = 1; n <= len; n++ ) {
88  do_cycles( 1 );
89  print_rate( str );
90  }
91 }
92 
93 int
94 main( int argc, char **argv )
95 {
96  int num_events = 1;
97  const char *name = "unknown";
98  int ev,EventSet = PAPI_NULL;
99  int quiet,retval;
100 
101  /* Used to be able to set this via command line */
102  num_events=1;
103 
104  /* Set TESTS_QUIET variable */
105  quiet=tests_quiet( argc, argv );
106 
107  do_cycles( 1 );
108 
109  /* Zero out the Counters */
110  gettimeofday( &start, NULL );
111  last = start;
112  count = 0;
113  total = 0;
114 
115  /* Initialize PAPI */
117  if (retval!=PAPI_VER_CURRENT) {
118  test_fail( __FILE__, __LINE__, "PAPI_library_init failed", 1 );
119  }
120 
121  name = argv[0];
122  if (!quiet) {
123  printf( "[%d] %s, num_events = %d\n", getpid(),
124  name, num_events );
125  }
126 
127  /* Create eventset */
128  if ( PAPI_create_eventset( &EventSet ) != PAPI_OK ) {
129  test_fail( __FILE__, __LINE__, "PAPI_create_eventset failed", 1 );
130  }
131 
132  /* Add events */
133  for ( ev = 0; ev < num_events; ev++ ) {
134  if ( PAPI_add_event( EventSet, Event[ev] ) != PAPI_OK ) {
135  if (!quiet) printf("Trouble adding event\n");
136  test_skip( __FILE__, __LINE__, "PAPI_add_event failed", 1 );
137  }
138  }
139 
140  /* Set overflow */
141  for ( ev = 0; ev < num_events; ev++ ) {
142  if ( PAPI_overflow( EventSet, Event[ev],
143  Threshold[ev], 0, my_handler )
144  != PAPI_OK ) {
145  test_fail( __FILE__, __LINE__, "PAPI_overflow failed", 1 );
146  }
147  }
148 
149  /* Start measuring */
150  if ( PAPI_start( EventSet ) != PAPI_OK ) {
151  test_fail( __FILE__, __LINE__, "PAPI_start failed", 1 );
152  }
153 
154 
155 
156  /* Tun a bit */
157  run( name, 3 );
158 
159  /* Stop measuring */
160  if (!quiet) {
161  printf("[%d] %s, %s\n", getpid(), name, "stop");
162  }
163 
164  if ( PAPI_stop( EventSet, NULL ) != PAPI_OK ) {
165  test_fail( name, __LINE__, "PAPI_stop failed", 1 );
166  }
167 
168  if (!quiet) {
169  printf("[%d] %s, %s\n", getpid(),
170  name, "exec(./child_overflow)");
171  }
172 
173  /* exec the child_overflow helper program */
174  /* we should never return from this */
175  if ( access( "./child_overflow", X_OK ) == 0 )
176  execl( "./child_overflow", "./child_overflow",
177  ( quiet ? "TESTS_QUIET" : NULL ), NULL );
178  else if ( access( "./ctests/child_overflow", X_OK ) == 0 )
179  execl( "./ctests/child_overflow", "./ctests/child_overflow",
180  ( quiet ? "TESTS_QUIET" : NULL ), NULL );
181 
182  test_fail( name, __LINE__, "exec failed", 1 );
183 
184  return 0;
185 }
#define PAPI_OK
Definition: fpapi.h:105
int PAPI_stop(int EventSet, long long *values)
Definition: papi.c:2314
static const char * name
Definition: fork_overflow.c:31
static long total
Definition: exec_overflow.c:32
int PAPI_add_event(int EventSet, int EventCode)
Definition: papi.c:1663
static int Threshold[MAX_EVENTS]
Definition: exec_overflow.c:25
static long count
Definition: exec_overflow.c:32
static int num_events
#define MAX_EVENTS
Definition: exec_overflow.c:17
#define PAPI_VER_CURRENT
Definition: fpapi.h:14
int EventSet
int PAPI_overflow(int EventSet, int EventCode, int threshold, int flags, PAPI_overflow_handler_t handler)
Definition: papi.c:4788
int retval
Definition: zero_fork.c:53
static struct timeval start
static int Event[MAX_EVENTS]
Definition: exec_overflow.c:19
Return codes and api definitions.
int main(int argc, char **argv)
Definition: exec_overflow.c:94
void test_skip(const char *file, int line, const char *call, int retval)
Definition: test_utils.c:561
int PAPI_library_init(int version)
Definition: papi.c:500
static void print_rate(const char *str)
Definition: exec_overflow.c:51
int quiet
Definition: rapl_overflow.c:18
static void my_handler(int EventSet, void *pc, long long ovec, void *context)
Definition: exec_overflow.c:35
#define PAPI_NULL
Definition: fpapi.h:13
#define PAPI_FAD_INS
Definition: fpapi.h:234
int PAPI_create_eventset(int *EventSet)
Definition: papi.c:1464
__time_t tv_sec
static void do_cycles(int program_time)
Definition: fork_overflow.c:95
static struct timeval start last
Definition: exec_overflow.c:31
__suseconds_t tv_usec
int gettimeofday(void *ptr1, void *ptr2)
int TESTS_QUIET
Definition: test_utils.c:18
int tests_quiet(int argc, char **argv)
Definition: test_utils.c:376
void test_fail(const char *file, int line, const char *call, int retval)
Definition: test_utils.c:468
static void run(const char *str, int len)
Definition: exec_overflow.c:83
int PAPI_start(int EventSet)
Definition: papi.c:2096
#define PAPI_TOT_CYC
Definition: fpapi.h:195
void exit()
#define PAPI_FP_INS
Definition: fpapi.h:188