PAPI  5.7.0.0
system_child_overflow.c
Go to the documentation of this file.
1 /*
2  * Use "system() to run child_overflow
3  * Test PAPI with fork() and exec().
4  */
5 
6 #include <sys/time.h>
7 #include <sys/types.h>
8 #include <sys/wait.h>
9 #include <errno.h>
10 #include <stdio.h>
11 #include <stdlib.h>
12 #include <unistd.h>
13 #include "papi.h"
14 #include "papi_test.h"
15 
16 #define MAX_EVENTS 3
17 
18 static int Event[MAX_EVENTS] = {
22 };
23 
24 static int Threshold[MAX_EVENTS] = {
25  8000000,
26  4000000,
27  4000000,
28 };
29 
30 static int num_events = 1;
31 static int EventSet = PAPI_NULL;
32 static const char *name = "unknown";
33 static struct timeval start, last;
34 static long count, total;
35 
36 static void
37 my_handler( int EventSet, void *pc, long long ovec, void *context )
38 {
39  ( void ) EventSet;
40  ( void ) pc;
41  ( void ) ovec;
42  ( void ) context;
43 
44  count++;
45  total++;
46 }
47 
48 static void
49 zero_count( void )
50 {
51  gettimeofday( &start, NULL );
52  last = start;
53  count = 0;
54  total = 0;
55 }
56 
57 static void
58 print_here( const char *str) {
59 
60  if (!TESTS_QUIET) printf("[%d] %s, %s\n", getpid(), name, str);
61 }
62 
63 static void
64 print_rate( const char *str )
65 {
66  static int last_count = -1;
67  struct timeval now;
68  double st_secs, last_secs;
69 
70  gettimeofday( &now, NULL );
71  st_secs = ( double ) ( now.tv_sec - start.tv_sec )
72  + ( ( double ) ( now.tv_usec - start.tv_usec ) ) / 1000000.0;
73  last_secs = ( double ) ( now.tv_sec - last.tv_sec )
74  + ( ( double ) ( now.tv_usec - last.tv_usec ) ) / 1000000.0;
75  if ( last_secs <= 0.001 )
76  last_secs = 0.001;
77 
78  if (!TESTS_QUIET) {
79  printf( "[%d] %s, time = %.3f, total = %ld, last = %ld, rate = %.1f/sec\n",
80  getpid( ), str, st_secs, total, count,
81  ( ( double ) count ) / last_secs );
82  }
83 
84  if ( last_count != -1 ) {
85  if ( count < .1 * last_count ) {
86  test_fail( name, __LINE__, "Interrupt rate changed!", 1 );
87  exit( 1 );
88  }
89  }
90  last_count = ( int ) count;
91  count = 0;
92  last = now;
93 }
94 
95 static void
97 {
98  struct timeval start, now;
99  double x, sum;
100 
101  gettimeofday( &start, NULL );
102 
103  for ( ;; ) {
104  sum = 1.0;
105  for ( x = 1.0; x < 250000.0; x += 1.0 )
106  sum += x;
107  if ( sum < 0.0 )
108  printf( "==>> SUM IS NEGATIVE !! <<==\n" );
109 
110  gettimeofday( &now, NULL );
111  if ( now.tv_sec >= start.tv_sec + program_time )
112  break;
113  }
114 }
115 
116 static void
118 {
119  int ev;
120 
122 
124  test_fail( name, __LINE__, "PAPI_create_eventset failed", 1 );
125 
126  for ( ev = 0; ev < num_events; ev++ ) {
127  if ( PAPI_add_event( EventSet, Event[ev] ) != PAPI_OK ) {
128  if (!TESTS_QUIET) printf("Trouble adding event\n");
129  test_skip( name, __LINE__, "PAPI_add_event failed", 1 );
130  }
131  }
132 
133  for ( ev = 0; ev < num_events; ev++ ) {
134  if ( PAPI_overflow( EventSet, Event[ev], Threshold[ev], 0, my_handler )
135  != PAPI_OK ) {
136  test_fail( name, __LINE__, "PAPI_overflow failed", 1 );
137  }
138  }
139 
140  if ( PAPI_start( EventSet ) != PAPI_OK )
141  test_fail( name, __LINE__, "PAPI_start failed", 1 );
142 }
143 
144 static void
145 run( const char *str, int len )
146 {
147  int n;
148 
149  for ( n = 1; n <= len; n++ ) {
150  do_cycles( 1 );
151  print_rate( str );
152  }
153 }
154 
155 int
156 main( int argc, char **argv )
157 {
158  char buf[100];
159 
160  int quiet,retval,result=0;
161 
162  /* Used to be able to set this via command line */
163  num_events=1;
164 
165  /* Set TESTS_QUIET variable */
166  quiet=tests_quiet( argc, argv );
167 
168  do_cycles( 1 );
169 
170  zero_count( );
171 
172  /* Init library */
174  if (retval!=PAPI_VER_CURRENT) {
175  test_fail( name, __LINE__, "PAPI_library_init failed", 1 );
176  }
177 
178  name = argv[0];
179  if (!quiet) printf( "[%d] %s, num_events = %d\n", getpid( ), name, num_events );
180  sprintf( buf, "%d", num_events );
181  my_papi_start( );
182  run( name, 3 );
183 
184  print_here( "system(./child_overflow)" );
185 
186  if ( access( "./child_overflow", X_OK ) == 0 ) {
187  if ( quiet) result=system( "./child_overflow TESTS_QUIET" );
188  else result=system( "./child_overflow" );
189  }
190  else if ( access( "./ctests/child_overflow", X_OK ) == 0 ) {
191  if ( quiet) result=system( "./ctests/child_overflow TESTS_QUIET" );
192  else result=system( "./ctests/child_overflow" );
193  }
194 
195  if (result<0) {
196  test_fail(__FILE__,__LINE__,"system failed\n",1);
197  }
198 
199  if (!quiet) printf("Successfully returned from system\n");
200 
201  // Rely on test_pass from child_overflow
202  // otherwise the run_tests.sh output is ugly
203  //test_pass(__FILE__);
204 
205  return 0;
206 }
#define PAPI_OK
Definition: fpapi.h:105
int PAPI_add_event(int EventSet, int EventCode)
Definition: papi.c:1663
static void my_papi_start(void)
#define PAPI_VER_CURRENT
Definition: fpapi.h:14
static int Threshold[MAX_EVENTS]
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
Return codes and api definitions.
void test_skip(const char *file, int line, const char *call, int retval)
Definition: test_utils.c:561
static void print_rate(const char *str)
int PAPI_library_init(int version)
Definition: papi.c:500
static int program_time
int quiet
Definition: rapl_overflow.c:18
static void do_cycles(int program_time)
static int Event[MAX_EVENTS]
#define PAPI_NULL
Definition: fpapi.h:13
#define PAPI_FAD_INS
Definition: fpapi.h:234
static void my_handler(int EventSet, void *pc, long long ovec, void *context)
#define MAX_EVENTS
static int EventSet
static int num_events
int PAPI_create_eventset(int *EventSet)
Definition: papi.c:1464
__time_t tv_sec
static void zero_count(void)
__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
static long total
void test_fail(const char *file, int line, const char *call, int retval)
Definition: test_utils.c:468
int main(int argc, char **argv)
int x
Definition: fileop.c:78
static void print_here(const char *str)
static struct timeval start last
int PAPI_start(int EventSet)
Definition: papi.c:2096
#define PAPI_TOT_CYC
Definition: fpapi.h:195
static void run(const char *str, int len)
int system()
volatile int buf[CACHE_FLUSH_BUFFER_SIZE_INTS]
Definition: do_loops.c:12
static long count
void exit()
static const char * name
#define PAPI_FP_INS
Definition: fpapi.h:188