core/kdebase-workspace/rev_monotonic_clock.patch

101 lines
2.9 KiB
Diff
Raw Normal View History

commit 858927c9d650697e8bd74697b8815c17cc93402d
Author: Oswald Buddenhagen <ossi@kde.org>
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;