#define _POSIX_C_SOURCE 199309L
#include <stdio.h>
#include <time.h>
#include <unistd.h>
void timespec_diff( const struct timespec * start, const struct timespec * stop,
struct timespec * result) {
if ( ( stop-> tv_nsec - start-> tv_nsec) < 0 ) {
result-> tv_sec = stop-> tv_sec - start-> tv_sec - 1 ;
result-> tv_nsec = stop-> tv_nsec - start-> tv_nsec + 1000000000 ;
} else {
result-> tv_sec = stop-> tv_sec - start-> tv_sec;
result-> tv_nsec = stop-> tv_nsec - start-> tv_nsec;
}
return ;
}
void timespec_print( const char * description,
const struct timespec * start, const struct timespec * stop) {
struct timespec result;
timespec_diff( start, stop, & result) ;
double seconds = result.tv_sec + result.tv_nsec / 1e9 ;
printf ( "times elapsed for clock '%s': %lf\n " , description
, seconds
) ; return ;
}
int main( void ) {
struct timespec start_clock_realtime;
struct timespec start_clock_monotonic;
struct timespec start_clock_process_cputime_id;
struct timespec start_clock_thread_cputime_id;
struct timespec finish_clock_realtime;
struct timespec finish_clock_monotonic;
struct timespec finish_clock_process_cputime_id;
struct timespec finish_clock_thread_cputime_id;
clock_gettime( CLOCK_REALTIME, & start_clock_realtime) ;
clock_gettime( CLOCK_MONOTONIC, & start_clock_monotonic) ;
clock_gettime( CLOCK_PROCESS_CPUTIME_ID, & start_clock_process_cputime_id) ;
clock_gettime( CLOCK_THREAD_CPUTIME_ID, & start_clock_thread_cputime_id) ;
sleep( 3 ) ; // seconds
clock_gettime( CLOCK_REALTIME, & finish_clock_realtime) ;
clock_gettime( CLOCK_MONOTONIC, & finish_clock_monotonic) ;
clock_gettime( CLOCK_PROCESS_CPUTIME_ID, & finish_clock_process_cputime_id) ;
clock_gettime( CLOCK_THREAD_CPUTIME_ID, & finish_clock_thread_cputime_id) ;
timespec_print( "realtime" ,
& start_clock_realtime, & finish_clock_realtime) ;
timespec_print( "monotonic" ,
& start_clock_monotonic, & finish_clock_monotonic) ;
timespec_print( "process cputime id" ,
& start_clock_process_cputime_id, & finish_clock_process_cputime_id) ;
timespec_print( "thread cputime id" ,
& start_clock_thread_cputime_id, & finish_clock_thread_cputime_id) ;
return 0 ;
}
I2RlZmluZSBfUE9TSVhfQ19TT1VSQ0UgMTk5MzA5TAoKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDx0aW1lLmg+CiNpbmNsdWRlIDx1bmlzdGQuaD4KCnZvaWQgdGltZXNwZWNfZGlmZihjb25zdCBzdHJ1Y3QgdGltZXNwZWMgKiBzdGFydCwgY29uc3Qgc3RydWN0IHRpbWVzcGVjICpzdG9wLAogICAgICAgICAgICAgICAgICAgc3RydWN0IHRpbWVzcGVjICpyZXN1bHQpIHsKICAgIGlmICgoc3RvcC0+dHZfbnNlYyAtIHN0YXJ0LT50dl9uc2VjKSA8IDApIHsKICAgICAgICByZXN1bHQtPnR2X3NlYyA9IHN0b3AtPnR2X3NlYyAtIHN0YXJ0LT50dl9zZWMgLSAxOwogICAgICAgIHJlc3VsdC0+dHZfbnNlYyA9IHN0b3AtPnR2X25zZWMgLSBzdGFydC0+dHZfbnNlYyArIDEwMDAwMDAwMDA7CiAgICB9IGVsc2UgewogICAgICAgIHJlc3VsdC0+dHZfc2VjID0gc3RvcC0+dHZfc2VjIC0gc3RhcnQtPnR2X3NlYzsKICAgICAgICByZXN1bHQtPnR2X25zZWMgPSBzdG9wLT50dl9uc2VjIC0gc3RhcnQtPnR2X25zZWM7CiAgICB9CiAgICByZXR1cm47Cn0KCnZvaWQgdGltZXNwZWNfcHJpbnQoY29uc3QgY2hhciAqIGRlc2NyaXB0aW9uLAogICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAqc3RhcnQsIGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAqc3RvcCkgewogICAgc3RydWN0IHRpbWVzcGVjIHJlc3VsdDsKICAgIHRpbWVzcGVjX2RpZmYoc3RhcnQsIHN0b3AsICZyZXN1bHQpOwogICAgZG91YmxlIHNlY29uZHMgPSByZXN1bHQudHZfc2VjICsgcmVzdWx0LnR2X25zZWMgLyAxZTk7CiAgICBwcmludGYoInRpbWVzIGVsYXBzZWQgZm9yIGNsb2NrICclcyc6ICVsZlxuIiwgZGVzY3JpcHRpb24sIHNlY29uZHMpOwoJcmV0dXJuOwp9CgppbnQgbWFpbih2b2lkKSB7CglzdHJ1Y3QgdGltZXNwZWMgc3RhcnRfY2xvY2tfcmVhbHRpbWU7CglzdHJ1Y3QgdGltZXNwZWMgc3RhcnRfY2xvY2tfbW9ub3RvbmljOwoJc3RydWN0IHRpbWVzcGVjIHN0YXJ0X2Nsb2NrX3Byb2Nlc3NfY3B1dGltZV9pZDsKCXN0cnVjdCB0aW1lc3BlYyBzdGFydF9jbG9ja190aHJlYWRfY3B1dGltZV9pZDsKCQoJc3RydWN0IHRpbWVzcGVjIGZpbmlzaF9jbG9ja19yZWFsdGltZTsKCXN0cnVjdCB0aW1lc3BlYyBmaW5pc2hfY2xvY2tfbW9ub3RvbmljOwoJc3RydWN0IHRpbWVzcGVjIGZpbmlzaF9jbG9ja19wcm9jZXNzX2NwdXRpbWVfaWQ7CglzdHJ1Y3QgdGltZXNwZWMgZmluaXNoX2Nsb2NrX3RocmVhZF9jcHV0aW1lX2lkOwoJCgljbG9ja19nZXR0aW1lKENMT0NLX1JFQUxUSU1FLCAmc3RhcnRfY2xvY2tfcmVhbHRpbWUpOwoJY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsICZzdGFydF9jbG9ja19tb25vdG9uaWMpOwoJY2xvY2tfZ2V0dGltZShDTE9DS19QUk9DRVNTX0NQVVRJTUVfSUQsICZzdGFydF9jbG9ja19wcm9jZXNzX2NwdXRpbWVfaWQpOwoJY2xvY2tfZ2V0dGltZShDTE9DS19USFJFQURfQ1BVVElNRV9JRCwgJnN0YXJ0X2Nsb2NrX3RocmVhZF9jcHV0aW1lX2lkKTsKCQoJc2xlZXAoMyk7IC8vIHNlY29uZHMKCgljbG9ja19nZXR0aW1lKENMT0NLX1JFQUxUSU1FLCAmZmluaXNoX2Nsb2NrX3JlYWx0aW1lKTsKCWNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCAmZmluaXNoX2Nsb2NrX21vbm90b25pYyk7CgljbG9ja19nZXR0aW1lKENMT0NLX1BST0NFU1NfQ1BVVElNRV9JRCwgJmZpbmlzaF9jbG9ja19wcm9jZXNzX2NwdXRpbWVfaWQpOwoJY2xvY2tfZ2V0dGltZShDTE9DS19USFJFQURfQ1BVVElNRV9JRCwgJmZpbmlzaF9jbG9ja190aHJlYWRfY3B1dGltZV9pZCk7CgkKCXRpbWVzcGVjX3ByaW50KCJyZWFsdGltZSIsIAoJCSZzdGFydF9jbG9ja19yZWFsdGltZSwgJmZpbmlzaF9jbG9ja19yZWFsdGltZSk7Cgl0aW1lc3BlY19wcmludCgibW9ub3RvbmljIiwKCQkmc3RhcnRfY2xvY2tfbW9ub3RvbmljLCAmZmluaXNoX2Nsb2NrX21vbm90b25pYyk7Cgl0aW1lc3BlY19wcmludCgicHJvY2VzcyBjcHV0aW1lIGlkIiwKCQkmc3RhcnRfY2xvY2tfcHJvY2Vzc19jcHV0aW1lX2lkLCAmZmluaXNoX2Nsb2NrX3Byb2Nlc3NfY3B1dGltZV9pZCk7Cgl0aW1lc3BlY19wcmludCgidGhyZWFkIGNwdXRpbWUgaWQiLAoJCSZzdGFydF9jbG9ja190aHJlYWRfY3B1dGltZV9pZCwgJmZpbmlzaF9jbG9ja190aHJlYWRfY3B1dGltZV9pZCk7CgoJcmV0dXJuIDA7Cn0K