From 6979a29c9405c07953fcb103a8250f18a29cde9b Mon Sep 17 00:00:00 2001 From: Stefan Seyfried Date: Sat, 23 Sep 2017 21:35:01 +0200 Subject: [PATCH] change time_monotonic_ms() from time_t to int64_t time_monotonic_ms values did wrap every ~24 days, leading to problems in code that did not cope with that. Instead of fixing all places where relative comparisons with time_monotonic_ms() are made, just use a bigger datatype. Convert all users to the new type. Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/8dad062effbe6e134a741e7973ac91eb4f394ac7 Author: Stefan Seyfried Date: 2017-09-23 (Sat, 23 Sep 2017) ------------------ This commit was generated by Migit --- src/driver/abstime.c | 4 ++-- src/driver/abstime.h | 4 ++-- src/driver/fb_accel_glfb.cpp | 7 ++++--- src/driver/fb_accel_sti.cpp | 16 +++++++++------- src/eitd/sectionsd.cpp | 10 +++++----- src/eitd/xmlutil.cpp | 6 +++--- src/gui/movieplayer.h | 2 +- src/gui/streaminfo2.cpp | 4 ++-- src/gui/widget/shellwindow.cpp | 4 ++-- src/neutrino.cpp | 8 ++++---- src/zapit/src/frontend.cpp | 11 ++++++----- 11 files changed, 40 insertions(+), 36 deletions(-) diff --git a/src/driver/abstime.c b/src/driver/abstime.c index af7c1c7fc..e74c268c3 100644 --- a/src/driver/abstime.c +++ b/src/driver/abstime.c @@ -2,7 +2,7 @@ #include /* for perror */ #include -time_t time_monotonic_ms(void) +int64_t time_monotonic_ms(void) { struct timespec t; time_t ret; @@ -11,7 +11,7 @@ time_t time_monotonic_ms(void) perror("time_monotonic_ms clock_gettime"); return -1; } - ret = ((t.tv_sec + 604800)& 0x01FFFFF) * 1000; /* avoid overflow */ + ret = (t.tv_sec + 604800) * (int64_t)1000; /* avoid overflow */ ret += t.tv_nsec / 1000000; return ret; } diff --git a/src/driver/abstime.h b/src/driver/abstime.h index b530755b6..78d1e6117 100644 --- a/src/driver/abstime.h +++ b/src/driver/abstime.h @@ -6,8 +6,8 @@ extern "C" { #endif -extern time_t time_monotonic_ms(void); -extern time_t time_monotonic(void); +time_t time_monotonic(void); +int64_t time_monotonic_ms(void); uint64_t time_monotonic_us(void); #ifdef __cplusplus } diff --git a/src/driver/fb_accel_glfb.cpp b/src/driver/fb_accel_glfb.cpp index 2d9ba539f..d62ea65f1 100644 --- a/src/driver/fb_accel_glfb.cpp +++ b/src/driver/fb_accel_glfb.cpp @@ -31,6 +31,7 @@ #include #include #include +#include #include extern GLFramebuffer *glfb; @@ -115,18 +116,18 @@ void CFbAccelGLFB::blit2FB(void *fbbuff, uint32_t width, uint32_t height, uint32 void CFbAccelGLFB::run() { printf(LOGTAG "run start\n"); - time_t last_blit = 0; + int64_t last_blit = INT64_MAX; blit_pending = false; blit_thread = true; blit_mutex.lock(); set_threadname("glfb::autoblit"); while (blit_thread) { blit_cond.wait(&blit_mutex, blit_pending ? BLIT_INTERVAL_MIN : BLIT_INTERVAL_MAX); - time_t now = time_monotonic_ms(); + int64_t now = time_monotonic_ms(); if (now - last_blit < BLIT_INTERVAL_MIN) { blit_pending = true; - //printf(LOGTAG "run: skipped, time %ld\n", now - last_blit); + //printf(LOGTAG "run: skipped, time %" PRId64 "\n", now - last_blit); } else { diff --git a/src/driver/fb_accel_sti.cpp b/src/driver/fb_accel_sti.cpp index 17e342faf..ad9d590d3 100644 --- a/src/driver/fb_accel_sti.cpp +++ b/src/driver/fb_accel_sti.cpp @@ -37,6 +37,7 @@ #include #include #include +#include #include @@ -331,7 +332,7 @@ void CFbAccelSTi::blit2FB(void *fbbuff, uint32_t width, uint32_t height, uint32_ void CFbAccelSTi::run() { printf(LOGTAG "::run start\n"); - time_t last_blit = 0; + int64_t last_blit = INT64_MAX; /* blit at first iteration */ blit_pending = false; blit_thread = true; set_threadname("stifb::autoblit"); @@ -340,11 +341,12 @@ void CFbAccelSTi::run() blit_cond.wait(&blit_mutex, blit_pending ? BLIT_INTERVAL_MIN : BLIT_INTERVAL_MAX); blit_mutex.unlock(); - time_t now = time_monotonic_ms(); - if (now - last_blit < BLIT_INTERVAL_MIN) + int64_t now = time_monotonic_ms(); + int64_t diff = now - last_blit; + if (diff < BLIT_INTERVAL_MIN) { blit_pending = true; - //printf(LOGTAG "::run: skipped, time %ld\n", now - last_blit); + //printf(LOGTAG "::run: skipped, time %" PRId64 "\n", diff); } else { @@ -372,9 +374,9 @@ void CFbAccelSTi::blit() void CFbAccelSTi::_blit() { #if 0 - static time_t last = 0; - time_t now = time_monotonic_ms(); - printf("%s %ld\n", __func__, now - last); + static int64_t last = 0; + int64_t now = time_monotonic_ms(); + printf("%s %" PRId64 "\n", __func__, now - last); last = now; #endif OpenThreads::ScopedLock m_lock(mutex); diff --git a/src/eitd/sectionsd.cpp b/src/eitd/sectionsd.cpp index 8c35a1590..fccb01f9e 100644 --- a/src/eitd/sectionsd.cpp +++ b/src/eitd/sectionsd.cpp @@ -154,7 +154,7 @@ CSdtThread threadSDT; #endif #ifdef DEBUG_EVENT_LOCK -static time_t lockstart = 0; +static int64_t lockstart = 0; #endif static int sectionsd_stop = 0; @@ -209,9 +209,9 @@ inline void unlockEvents(void) { #ifdef DEBUG_EVENT_LOCK if (lockstart) { - time_t tmp = time_monotonic_ms() - lockstart; + int64_t tmp = time_monotonic_ms() - lockstart; if (tmp > 50) - xprintf("locked ms %d\n", tmp); + xprintf("locked ms %" PRId64 "\n", tmp); lockstart = 0; } #endif @@ -1486,12 +1486,12 @@ void CTimeThread::run() * shutdown" hack on with libcoolstream... :-( */ rc = dmx->Read(static_buf, MAX_SECTION_LENGTH, timeoutInMSeconds); #else - time_t start = time_monotonic_ms(); + int64_t start = time_monotonic_ms(); /* speed up shutdown by looping around Read() */ do { rc = dmx->Read(static_buf, MAX_SECTION_LENGTH, timeoutInMSeconds / 12); } while (running && rc == 0 - && (time_monotonic_ms() - start) < (time_t)timeoutInMSeconds); + && (time_monotonic_ms() - start) < (int64_t)timeoutInMSeconds); #endif xprintf("%s: get DVB time ch 0x%012" PRIx64 " rc: %d neutrino_sets_time %d\n", name.c_str(), current_service, rc, messaging_neutrino_sets_time); diff --git a/src/eitd/xmlutil.cpp b/src/eitd/xmlutil.cpp index eb70b58db..0eab74a32 100644 --- a/src/eitd/xmlutil.cpp +++ b/src/eitd/xmlutil.cpp @@ -486,12 +486,12 @@ void *insertEventsfromFile(void * data) std::string epg_dir = (char *) data; indexname = epg_dir + "index.xml"; - time_t now = time_monotonic_ms(); + int64_t now = time_monotonic_ms(); xmlDocPtr index_parser = parseXmlFile(indexname.c_str()); if (index_parser == NULL) { readEventsFromDir(epg_dir, ev_count); - printf("[sectionsd] Reading Information finished after %ld milliseconds (%d events)\n", + printf("[sectionsd] Reading Information finished after %" PRId64 " milliseconds (%d events)\n", time_monotonic_ms()-now, ev_count); reader_ready = true; pthread_exit(NULL); @@ -515,7 +515,7 @@ void *insertEventsfromFile(void * data) xmlFreeDoc(index_parser); printdate_ms(stdout); - printf("[sectionsd] Reading Information finished after %ld milliseconds (%d events)\n", + printf("[sectionsd] Reading Information finished after %" PRId64 " milliseconds (%d events)\n", time_monotonic_ms()-now, ev_count); reader_ready = true; diff --git a/src/gui/movieplayer.h b/src/gui/movieplayer.h index 0b6cd507d..bef6bc9c9 100644 --- a/src/gui/movieplayer.h +++ b/src/gui/movieplayer.h @@ -142,7 +142,7 @@ class CMoviePlayerGui : public CMenuTarget unsigned short sub_supported[MAX_PLAYBACK_PIDS]; int currentspid; int min_x, min_y, max_x, max_y; - time_t end_time; + int64_t end_time; bool ext_subs; bool lock_subs; uint64_t last_read; diff --git a/src/gui/streaminfo2.cpp b/src/gui/streaminfo2.cpp index 7a51f1105..d0a57a15f 100644 --- a/src/gui/streaminfo2.cpp +++ b/src/gui/streaminfo2.cpp @@ -1035,7 +1035,7 @@ int CStreamInfo2::update_rate () usleep(timeout * 1000); b_len = mp->GetReadCount(); } else { - time_t start = time_monotonic_ms(); + int64_t start = time_monotonic_ms(); /* always sample for ~100ms */ while (time_monotonic_ms() - start < timeout) { @@ -1043,7 +1043,7 @@ int CStreamInfo2::update_rate () if (ret >= 0) b_len += ret; } - //printf("ts: read %d time %d\n", b_len, time_monotonic_ms() - start); + //printf("ts: read %d time %" PRId64 "\n", b_len, time_monotonic_ms() - start); } //printf("ts: read %d\n", b_len); diff --git a/src/gui/widget/shellwindow.cpp b/src/gui/widget/shellwindow.cpp index bd5daa3ca..f2b641f5a 100644 --- a/src/gui/widget/shellwindow.cpp +++ b/src/gui/widget/shellwindow.cpp @@ -133,14 +133,14 @@ void CShellWindow::exec() fds.events = POLLIN | POLLHUP | POLLERR; fcntl(fds.fd, F_SETFL, fcntl(fds.fd, F_GETFL, 0) | O_NONBLOCK); - time_t lastPaint = time_monotonic_ms(); + int64_t lastPaint = time_monotonic_ms(); bool ok = true, nlseen = false, dirty = false, incomplete = false; char output[1024]; std::string txt = ""; std::string line = ""; do { - time_t now; + int64_t now; fds.revents = 0; int r = poll(&fds, 1, 300); if (r > 0) { diff --git a/src/neutrino.cpp b/src/neutrino.cpp index 8497efbb5..319b9bb4f 100644 --- a/src/neutrino.cpp +++ b/src/neutrino.cpp @@ -2119,10 +2119,10 @@ void CNeutrinoApp::InitSectiondClient() #if 0 /* TODO: check if still needed */ /* wait for sectionsd to be able to process our registration */ - time_t t = time_monotonic_ms(); + int64_t t = time_monotonic_ms(); while (! sectionsd_isReady()) sleep(0); - dprintf(DEBUG_NORMAL, "had to wait %ld ms for sectionsd to start up\n", time_monotonic_ms() - t); + dprintf(DEBUG_NORMAL, "had to wait %" PRId64 " ms for sectionsd to start up\n", time_monotonic_ms() - t); #endif g_Sectionsd = new CSectionsdClient; struct timespec t; @@ -2376,10 +2376,10 @@ TIMER_START(); InitSectiondClient(); /* wait until timerd is ready... */ - time_t timerd_wait = time_monotonic_ms(); + int64_t timerd_wait = time_monotonic_ms(); while (timerd_signal >= 0) usleep(100); - dprintf(DEBUG_NORMAL, "had to wait %ld ms for timerd start...\n", time_monotonic_ms() - timerd_wait); + dprintf(DEBUG_NORMAL, "had to wait %" PRId64 " ms for timerd start...\n", time_monotonic_ms() - timerd_wait); InitTimerdClient(); // volume diff --git a/src/zapit/src/frontend.cpp b/src/zapit/src/frontend.cpp index 10e582aa7..1bcf9c5df 100644 --- a/src/zapit/src/frontend.cpp +++ b/src/zapit/src/frontend.cpp @@ -131,15 +131,16 @@ static const struct dtv_property dvbt_cmdargs[] = { #define diff(x,y) (max(x,y) - min(x,y)) #define FE_TIMER_INIT() \ - unsigned int timer_start; \ - static unsigned int tmin = 2000, tmax = 0; \ - unsigned int timer_msec = 0; + int64_t timer_start; \ + static uint32_t tmin = 2000, tmax = 0; \ + uint32_t timer_msec = 0; #define FE_TIMER_START() \ timer_start = time_monotonic_ms(); #define FE_TIMER_STOP(label) \ - timer_msec = time_monotonic_ms() - timer_start; \ + timer_msec = (uint32_t)(time_monotonic_ms() - \ + timer_start); \ if(tmin > timer_msec) tmin = timer_msec; \ if(tmax < timer_msec) tmax = timer_msec; \ printf("[fe%d] %s: %u msec (min %u max %u)\n", \ @@ -704,7 +705,7 @@ struct dvb_frontend_event CFrontend::getEvent(void) if (pfd.revents & (POLLIN | POLLPRI)) { //FE_TIMER_STOP("poll has event after"); - timer_msec = time_monotonic_ms() - timer_start; /* FE_TIMER_STOP does this :( */ + timer_msec = (uint32_t)(time_monotonic_ms() - timer_start); /* FE_TIMER_STOP does this :( */ memset(&event, 0, sizeof(struct dvb_frontend_event)); ret = ioctl(fd, FE_GET_EVENT, &event);