commit 858927c9d650697e8bd74697b8815c17cc93402d Author: Oswald Buddenhagen Date: Sun May 15 12:19:32 2011 +0200 use monotonic clock if available this avoids that clock jumps (e.g., ntp syncs) cause timeouts. fixes bug 269522 diff --git a/kdm/backend/CMakeLists.txt b/kdm/backend/CMakeLists.txt index 0fbf35e..e94a3b9 100644 --- a/kdm/backend/CMakeLists.txt +++ b/kdm/backend/CMakeLists.txt @@ -68,6 +68,9 @@ if(UTIL_LIBRARIES) target_link_libraries( kdm ${UTIL_LIBRARIES} ) endif(UTIL_LIBRARIES) target_link_libraries( kdm ${POSIX4_LIBRARIES} ) +if(QT_RT_LIBRARY) + target_link_libraries( kdm ${QT_RT_LIBRARY} ) +endif(QT_RT_LIBRARY) if(KDE4_ENABLE_FINAL) macro_add_file_dependencies(${CMAKE_CURRENT_BINARY_DIR}/kdm_final_cpp.cpp ${confci}) diff --git a/kdm/backend/dm.c b/kdm/backend/dm.c index 13d75fb..1120bd8 100644 --- a/kdm/backend/dm.c +++ b/kdm/backend/dm.c @@ -1163,7 +1163,7 @@ mainLoop(void) fd_set reads; debug("mainLoop\n"); - time(&now); + updateNow(); while ( #ifdef XDMCP anyListenSockets() || @@ -1213,7 +1213,7 @@ mainLoop(void) reads = wellKnownSocketsMask; nready = select(wellKnownSocketsMax + 1, &reads, 0, 0, tvp); debug("select returns %d\n", nready); - time(&now); + updateNow(); #ifdef NEED_ENTROPY addTimerEntropy(); #endif diff --git a/kdm/backend/dm.h b/kdm/backend/dm.h index 5895b5f..af8ce54 100644 --- a/kdm/backend/dm.h +++ b/kdm/backend/dm.h @@ -403,6 +403,17 @@ void cancelShutdown(void); int TTYtoVT(const char *tty); int activateVT(int vt); +#ifdef _POSIX_MONOTONIC_CLOCK +# define updateNow() \ + do { \ + struct timespec ts; \ + clock_gettime(CLOCK_MONOTONIC, &ts); \ + now = ts.tv_sec; \ + } while (0) +#else +# define updateNow() time(&now) +#endif + /* in ctrl.c */ void openCtrl(struct display *d); void closeCtrl(struct display *d); diff --git a/kdm/backend/session.c b/kdm/backend/session.c index 0cd82cf..7fbdfca 100644 --- a/kdm/backend/session.c +++ b/kdm/backend/session.c @@ -416,7 +416,8 @@ openGreeter() gSet(&grttalk); if (grtproc.pid > 0) return; - if (time(0) < lastStart + 10) /* XXX should use some readiness indicator instead */ + updateNow(); + if (now < lastStart + 10) /* XXX should use some readiness indicator instead */ sessionExit(EX_UNMANAGE_DPY); ASPrintf(&name, "greeter for display %s", td->name); debug("starting %s\n", name); @@ -446,7 +447,8 @@ openGreeter() sessionExit(EX_UNMANAGE_DPY); } debug("%s ready\n", name); - time(&lastStart); + updateNow(); + lastStart = now; } int @@ -577,7 +579,7 @@ manageSession(void) /* NOTREACHED */ #endif - tdiff = time(0) - td->hstent->lastExit - td->openDelay; + tdiff = now - td->hstent->lastExit - td->openDelay; if (autoLogon(tdiff)) { if (!verify(conv_auto, False)) goto gcont;