summaryrefslogtreecommitdiffstats
path: root/kstartperf/libkstartperf.c
diff options
context:
space:
mode:
Diffstat (limited to 'kstartperf/libkstartperf.c')
-rw-r--r--kstartperf/libkstartperf.c122
1 files changed, 122 insertions, 0 deletions
diff --git a/kstartperf/libkstartperf.c b/kstartperf/libkstartperf.c
new file mode 100644
index 00000000..3c8deae0
--- /dev/null
+++ b/kstartperf/libkstartperf.c
@@ -0,0 +1,122 @@
+/* vi: ts=8 sts=4 sw=4
+ *
+ * $Id$
+ *
+ * libkstartperf.c: LD_PRELOAD library for startup time measurements.
+ *
+ * Copyright (C) 2000 Geert Jansen <jansen@kde.org>
+ *
+ * Based heavily on kmapnotify.c:
+ *
+ * (C) 2000 Rik Hemsley <rik@kde.org>
+ * (C) 2000 Simon Hausmann <hausmann@kde.org>
+ * (C) 2000 Bill Soudan <soudan@kde.org>
+ */
+
+#include <sys/time.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+
+#include <X11/X.h>
+#include <X11/Xlib.h>
+
+#include <ltdl.h>
+
+
+/* Prototypes */
+
+int XMapWindow(Display *, Window);
+int XMapRaised(Display *, Window);
+void KDE_InterceptXMapRequest(Display *, Window);
+void KDE_ShowPerformance();
+
+/* Globals */
+
+typedef Window (*KDE_XMapRequestSignature)(Display *, Window);
+KDE_XMapRequestSignature KDE_RealXMapWindow = 0L;
+KDE_XMapRequestSignature KDE_RealXMapRaised = 0L;
+
+
+/* Functions */
+
+int XMapWindow(Display * d, Window w)
+{
+ if (KDE_RealXMapWindow == 0L)
+ {
+ KDE_InterceptXMapRequest(d, w);
+ KDE_ShowPerformance();
+ }
+ return KDE_RealXMapWindow(d, w);
+}
+
+int XMapRaised(Display * d, Window w)
+{
+ if (KDE_RealXMapRaised == 0L)
+ {
+ KDE_InterceptXMapRequest(d, w);
+ KDE_ShowPerformance();
+ }
+ return KDE_RealXMapRaised(d, w);
+}
+
+void KDE_InterceptXMapRequest(Display * d, Window w)
+{
+ lt_dlhandle handle;
+
+ handle = lt_dlopen("libX11.so");
+ if (handle == 0L)
+ handle = lt_dlopen("libX11.so.6");
+
+ if (handle == 0L)
+ {
+ fprintf(stderr, "kstartperf: Could not dlopen libX11\n");
+ exit(1);
+ }
+
+ KDE_RealXMapWindow = (KDE_XMapRequestSignature)lt_dlsym(handle, "XMapWindow");
+ if (KDE_RealXMapWindow == 0L)
+ {
+ fprintf(stderr, "kstartperf: Could not find symbol XMapWindow in libX11\n");
+ exit(1);
+ }
+
+ KDE_RealXMapRaised = (KDE_XMapRequestSignature)lt_dlsym(handle, "XMapRaised");
+ if (KDE_RealXMapRaised == 0L)
+ {
+ fprintf(stderr, "kstartperf: Could not find symbol XMapRaised in libX11\n");
+ exit(1);
+ }
+}
+
+void KDE_ShowPerformance()
+{
+ char *env;
+ long l1, l2;
+ float dt;
+ struct timeval tv;
+
+ env = getenv("KSTARTPERF");
+ if (env == 0L)
+ {
+ fprintf(stderr, "kstartperf: $KSTARTPERF not set!\n");
+ exit(1);
+ }
+ if (sscanf(env, "%ld:%ld", &l1, &l2) != 2)
+ {
+ fprintf(stderr, "kstartperf: $KSTARTPERF illegal format\n");
+ exit(1);
+ }
+
+ if (gettimeofday(&tv, 0L) != 0)
+ {
+ fprintf(stderr, "kstartperf: gettimeofday() failed.\n");
+ exit(1);
+ }
+
+ dt = 1e3*(tv.tv_sec - l1) + 1e-3*(tv.tv_usec - l2);
+ fprintf(stderr, "\nkstartperf: measured startup time at %7.2f ms\n\n", dt);
+}
+