diff --git a/src/steamcompmgr.cpp b/src/steamcompmgr.cpp index b0e8e1a..8af16ec 100644 --- a/src/steamcompmgr.cpp +++ b/src/steamcompmgr.cpp @@ -32,6 +32,7 @@ #include #include #include +#include #include #include @@ -404,14 +405,18 @@ get_time_in_milliseconds (void) return tv.tv_sec * 1000 + tv.tv_usec / 1000; } -struct timeval lastvblankmsgtv; -std::mutex lastvblankmsgtv_lock; +uint64_t get_time_in_nanos() +{ + timespec ts; + clock_gettime(CLOCK_MONOTONIC_RAW, &ts); + return ts.tv_sec * 1000000000ul + ts.tv_nsec; +} + +static std::atomic g_lastvblank = { 0lu }; void mark_vblank_message_time ( void ) { - std::lock_guard lock( lastvblankmsgtv_lock ); - - gettimeofday( &lastvblankmsgtv, NULL ); + g_lastvblank = get_time_in_nanos(); } static void @@ -2828,18 +2833,12 @@ steamcompmgr_main (int argc, char **argv) if ( ev.xclient.data.l[0] == 24 && ev.xclient.data.l[1] == 8 ) { - // Message from vblankmanager - std::lock_guard lock( lastvblankmsgtv_lock ); - - struct timeval vblankmsgreceivedtv = {}; - gettimeofday( &vblankmsgreceivedtv, nullptr ); - - struct timeval timediff = {}; - - timersub( &vblankmsgreceivedtv, &lastvblankmsgtv, &timediff ); + uint64_t vblanktime = g_lastvblank; + uint64_t vblankreceived = get_time_in_nanos(); + uint64_t diff = vblankreceived - vblanktime; // give it 1 ms of slack.. maybe too long - if ( timediff.tv_sec != 0 || timediff.tv_usec > 1000 ) + if ( diff > 1000000ul ) { gpuvis_trace_printf( "ignored stale vblank\n" ); }