summary refs log tree commit diff stats
path: root/libotr/libgcrypt-1.8.7/tests/stopwatch.h
diff options
context:
space:
mode:
Diffstat (limited to 'libotr/libgcrypt-1.8.7/tests/stopwatch.h')
-rw-r--r--libotr/libgcrypt-1.8.7/tests/stopwatch.h113
1 files changed, 113 insertions, 0 deletions
diff --git a/libotr/libgcrypt-1.8.7/tests/stopwatch.h b/libotr/libgcrypt-1.8.7/tests/stopwatch.h
new file mode 100644
index 0000000..696e300
--- /dev/null
+++ b/libotr/libgcrypt-1.8.7/tests/stopwatch.h
@@ -0,0 +1,113 @@
+/* stopwatch.h - Helper code for timing
+ * Copyright (C) 2013 g10 Code GmbH
+ *
+ * This file is part of Libgcrypt.
+ *
+ * Libgcrypt is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * Libgcrypt is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#include <time.h>
+#ifdef _WIN32
+# include <winsock2.h>
+# include <windows.h>
+#else
+# include <sys/times.h>
+#endif
+
+
+#ifdef _WIN32
+struct
+{
+  FILETIME creation_time, exit_time, kernel_time, user_time;
+} started_at, stopped_at;
+#else
+static clock_t started_at, stopped_at;
+#endif
+
+
+static void
+start_timer (void)
+{
+#ifdef _WIN32
+#ifdef __MINGW32CE__
+  GetThreadTimes (GetCurrentThread (),
+                   &started_at.creation_time, &started_at.exit_time,
+                   &started_at.kernel_time, &started_at.user_time);
+#else
+  GetProcessTimes (GetCurrentProcess (),
+                   &started_at.creation_time, &started_at.exit_time,
+                   &started_at.kernel_time, &started_at.user_time);
+#endif
+  stopped_at = started_at;
+#else
+  struct tms tmp;
+
+  times (&tmp);
+  started_at = stopped_at = tmp.tms_utime;
+#endif
+}
+
+static void
+stop_timer (void)
+{
+#ifdef _WIN32
+#ifdef __MINGW32CE__
+  GetThreadTimes (GetCurrentThread (),
+                   &stopped_at.creation_time, &stopped_at.exit_time,
+                   &stopped_at.kernel_time, &stopped_at.user_time);
+#else
+  GetProcessTimes (GetCurrentProcess (),
+                   &stopped_at.creation_time, &stopped_at.exit_time,
+                   &stopped_at.kernel_time, &stopped_at.user_time);
+#endif
+#else
+  struct tms tmp;
+
+  times (&tmp);
+  stopped_at = tmp.tms_utime;
+#endif
+}
+
+static const char *
+elapsed_time (unsigned int divisor)
+{
+  static char buf[50];
+#if _WIN32
+  unsigned long long t1, t2, t;
+
+  t1 = (((unsigned long long)started_at.kernel_time.dwHighDateTime << 32)
+        + started_at.kernel_time.dwLowDateTime);
+  t1 += (((unsigned long long)started_at.user_time.dwHighDateTime << 32)
+        + started_at.user_time.dwLowDateTime);
+  t2 = (((unsigned long long)stopped_at.kernel_time.dwHighDateTime << 32)
+        + stopped_at.kernel_time.dwLowDateTime);
+  t2 += (((unsigned long long)stopped_at.user_time.dwHighDateTime << 32)
+        + stopped_at.user_time.dwLowDateTime);
+  t = ((t2 - t1)/divisor)/10000;
+  if (divisor != 1)
+    snprintf (buf, sizeof buf, "%5.1fms", (double)t );
+  else
+    snprintf (buf, sizeof buf, "%5.0fms", (double)t );
+#else
+  if (divisor != 1)
+    snprintf (buf, sizeof buf, "%5.1fms",
+              ((((double) (stopped_at - started_at)/(double)divisor)
+                /CLOCKS_PER_SEC)*10000000));
+  else
+    snprintf (buf, sizeof buf, "%5.0fms",
+              (((double) (stopped_at - started_at)/CLOCKS_PER_SEC)*10000000));
+#endif
+  return buf;
+}