zero_attach.c File Reference

Include dependency graph for zero_attach.c:

Go to the source code of this file.

Functions

int wait_for_attach_and_loop (void)
int main (int argc, char **argv)

Function Documentation

int main ( int  argc,
char **  argv 
)

Definition at line 39 of file zero_attach.c.

00040 {
00041     int status, retval, num_tests = 1, tmp;
00042     int EventSet1 = PAPI_NULL;
00043     int PAPI_event, mask1;
00044     int num_events1;
00045     long long **values;
00046     long long elapsed_us, elapsed_cyc, elapsed_virt_us, elapsed_virt_cyc;
00047     char event_name[PAPI_MAX_STR_LEN], add_event_str[PAPI_MAX_STR_LEN];
00048     const PAPI_component_info_t *cmpinfo;
00049     pid_t pid;
00050 
00051     /* Set TESTS_QUIET variable */
00052     tests_quiet( argc, argv );
00053 
00054     /* Initialize the PAPI library */
00055     retval = PAPI_library_init( PAPI_VER_CURRENT );
00056     if ( retval != PAPI_VER_CURRENT ) {
00057        test_fail_exit( __FILE__, __LINE__, "PAPI_library_init", retval );
00058     }
00059 
00060     if ( ( cmpinfo = PAPI_get_component_info( 0 ) ) == NULL ) {
00061        test_fail_exit( __FILE__, __LINE__, "PAPI_get_component_info", 0 );
00062     }
00063 
00064     if ( cmpinfo->attach == 0 ) {
00065        test_skip( __FILE__, __LINE__, 
00066               "Platform does not support attaching", 0 );
00067     }
00068 
00069     pid = fork(  );
00070     if ( pid < 0 ) {
00071        test_fail( __FILE__, __LINE__, "fork()", PAPI_ESYS );
00072     }
00073     if ( pid == 0 ) {
00074        exit( wait_for_attach_and_loop(  ) );
00075     }
00076 
00077     /* add PAPI_TOT_CYC and one of the events in 
00078        PAPI_FP_INS, PAPI_FP_OPS or PAPI_TOT_INS, 
00079        depending on the availability of the event 
00080        on the platform                            */
00081     EventSet1 = add_two_events( &num_events1, &PAPI_event, &mask1 );
00082 
00083     if ( cmpinfo->attach_must_ptrace ) {
00084         if ( ptrace( PTRACE_ATTACH, pid, NULL, NULL ) == -1 ) {
00085             perror( "ptrace(PTRACE_ATTACH)" );
00086             return 1;
00087         }
00088         if ( waitpid( pid, &status, 0 ) == -1 ) {
00089             perror( "waitpid()" );
00090             exit( 1 );
00091         }
00092         if ( WIFSTOPPED( status ) == 0 )
00093             test_fail( __FILE__, __LINE__,
00094                        "Child process didnt return true to WIFSTOPPED", 0 );
00095     }
00096 
00097     retval = PAPI_attach( EventSet1, ( unsigned long ) pid );
00098     if ( retval != PAPI_OK )
00099         test_fail( __FILE__, __LINE__, "PAPI_attach", retval );
00100 
00101     retval = PAPI_event_code_to_name( PAPI_event, event_name );
00102     if ( retval != PAPI_OK )
00103         test_fail( __FILE__, __LINE__, "PAPI_event_code_to_name", retval );
00104     sprintf( add_event_str, "PAPI_add_event[%s]", event_name );
00105 
00106     /* num_events1 is greater than num_events2 so don't worry. */
00107 
00108     values = allocate_test_space( num_tests, num_events1 );
00109 
00110     elapsed_us = PAPI_get_real_usec(  );
00111     elapsed_cyc = PAPI_get_real_cyc(  );
00112     elapsed_virt_us = PAPI_get_virt_usec(  );
00113     elapsed_virt_cyc = PAPI_get_virt_cyc(  );
00114 
00115     /* Wait for the SIGSTOP. */
00116     if ( cmpinfo->attach_must_ptrace ) {
00117         if ( ptrace( PTRACE_CONT, pid, NULL, NULL ) == -1 ) {
00118             perror( "ptrace(PTRACE_CONT)" );
00119             return 1;
00120         }
00121         if ( waitpid( pid, &status, 0 ) == -1 ) {
00122             perror( "waitpid()" );
00123             exit( 1 );
00124         }
00125         if ( WIFSTOPPED( status ) == 0 ) {
00126             test_fail( __FILE__, __LINE__,
00127                        "Child process didn't return true to WIFSTOPPED", 0 );
00128         }
00129         if ( WSTOPSIG( status ) != SIGSTOP ) {
00130             test_fail( __FILE__, __LINE__,
00131                        "Child process didn't stop on SIGSTOP", 0 );
00132         }
00133     }
00134 
00135     retval = PAPI_start( EventSet1 );
00136     if ( retval != PAPI_OK ) {
00137         test_fail( __FILE__, __LINE__, "PAPI_start", retval );
00138     }
00139 
00140     /* Wait for the SIGSTOP. */
00141     if ( cmpinfo->attach_must_ptrace ) {
00142         if ( ptrace( PTRACE_CONT, pid, NULL, NULL ) == -1 ) {
00143             perror( "ptrace(PTRACE_CONT)" );
00144             return 1;
00145         }
00146         if ( waitpid( pid, &status, 0 ) == -1 ) {
00147             perror( "waitpid()" );
00148             exit( 1 );
00149         }
00150         if ( WIFSTOPPED( status ) == 0 ) {
00151             test_fail( __FILE__, __LINE__,
00152                        "Child process didn't return true to WIFSTOPPED", 0 );
00153         }
00154         if ( WSTOPSIG( status ) != SIGSTOP ) {
00155             test_fail( __FILE__, __LINE__,
00156                        "Child process didn't stop on SIGSTOP", 0 );
00157         }
00158     }
00159 
00160     elapsed_virt_us = PAPI_get_virt_usec(  ) - elapsed_virt_us;
00161     elapsed_virt_cyc = PAPI_get_virt_cyc(  ) - elapsed_virt_cyc;
00162     elapsed_us = PAPI_get_real_usec(  ) - elapsed_us;
00163     elapsed_cyc = PAPI_get_real_cyc(  ) - elapsed_cyc;
00164 
00165     retval = PAPI_stop( EventSet1, values[0] );
00166     if ( retval != PAPI_OK ) {
00167         test_fail( __FILE__, __LINE__, "PAPI_stop", retval );
00168     }
00169 
00170     remove_test_events( &EventSet1, mask1 );
00171 
00172     if ( cmpinfo->attach_must_ptrace ) {
00173         if ( ptrace( PTRACE_CONT, pid, NULL, NULL ) == -1 ) {
00174             perror( "ptrace(PTRACE_CONT)" );
00175             return 1;
00176         }
00177     }
00178 
00179     if ( waitpid( pid, &status, 0 ) == -1 ) {
00180         perror( "waitpid()" );
00181         exit( 1 );
00182     }
00183     if ( WIFEXITED( status ) == 0 )
00184         test_fail( __FILE__, __LINE__,
00185                    "Child process didn't return true to WIFEXITED", 0 );
00186 
00187 
00188     printf( "Test case: 3rd party attach start, stop.\n" );
00189     printf( "-----------------------------------------------\n" );
00190     tmp = PAPI_get_opt( PAPI_DEFDOM, NULL );
00191     printf( "Default domain is: %d (%s)\n", tmp, 
00192         stringify_all_domains( tmp ) );
00193     tmp = PAPI_get_opt( PAPI_DEFGRN, NULL );
00194     printf( "Default granularity is: %d (%s)\n", tmp,
00195             stringify_granularity( tmp ) );
00196     printf( "Using %d iterations of c += a*b\n", NUM_FLOPS );
00197     printf( "-------------------------------------------------------------------------\n" );
00198 
00199     printf( "Test type    : \t           1\n" );
00200 
00201     sprintf( add_event_str, "%-12s : \t", event_name );
00202     printf( TAB1, add_event_str, values[0][1] );
00203     printf( TAB1, "PAPI_TOT_CYC : \t", values[0][0] );
00204     printf( TAB1, "Real usec    : \t", elapsed_us );
00205     printf( TAB1, "Real cycles  : \t", elapsed_cyc );
00206     printf( TAB1, "Virt usec    : \t", elapsed_virt_us );
00207     printf( TAB1, "Virt cycles  : \t", elapsed_virt_cyc );
00208 
00209     printf( "-------------------------------------------------------------------------\n" );
00210 
00211     printf( "Verification: none\n" );
00212 
00213     test_pass( __FILE__, values, num_tests );
00214     
00215     return 0;
00216 }

Here is the call graph for this function:

int wait_for_attach_and_loop ( void   ) 

Definition at line 30 of file zero_attach.c.

00031 {
00032     kill( getpid(  ), SIGSTOP );
00033     do_flops( NUM_FLOPS );
00034     kill( getpid(  ), SIGSTOP );
00035     return 0;
00036 }

Here is the call graph for this function:


Generated on 26 Jan 2016 for PAPI by  doxygen 1.6.1