summaryrefslogtreecommitdiff
path: root/config/os/gnu-linux
diff options
context:
space:
mode:
authorjoq <joq@0c269be4-1314-0410-8aa9-9f06e86f4224>2004-03-25 19:31:51 +0000
committerjoq <joq@0c269be4-1314-0410-8aa9-9f06e86f4224>2004-03-25 19:31:51 +0000
commit64930746f2920dd7bdfc6488920e21bc4decabbc (patch)
treef573097e610ff9814b66d5d211f834a094aaa5d6 /config/os/gnu-linux
parent3ee51925deb1f644ae41dedfc8d3272012c65d45 (diff)
downloadjack1-64930746f2920dd7bdfc6488920e21bc4decabbc.tar.gz
[0.96.0] merge MacOSX EXP tree into HEAD
git-svn-id: svn+ssh://jackaudio.org/trunk/jack@673 0c269be4-1314-0410-8aa9-9f06e86f4224
Diffstat (limited to 'config/os/gnu-linux')
-rw-r--r--config/os/gnu-linux/time.h97
1 files changed, 97 insertions, 0 deletions
diff --git a/config/os/gnu-linux/time.h b/config/os/gnu-linux/time.h
new file mode 100644
index 0000000..033d4a6
--- /dev/null
+++ b/config/os/gnu-linux/time.h
@@ -0,0 +1,97 @@
+/*
+ Copyright (C) 2001-2003 Paul Davis
+
+ This is the GNU/Linux version.
+
+ This program 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.
+
+ This program 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, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+ $Id$
+*/
+#ifndef __jack_time_h__
+#define __jack_time_h__
+
+#include <stdio.h>
+#include <jack/internal.h>
+#include <sysdeps/cycles.h>
+
+/* This is a kludge. We need one global instantiation of this
+ * variable in each address space. So, libjack/client.c declares the
+ * actual storage. Other source files will see it as an extern. */
+#define JACK_TIME_GLOBAL_DECL jack_time_t __jack_cpu_mhz
+extern JACK_TIME_GLOBAL_DECL;
+
+static inline jack_time_t
+jack_get_microseconds (void) {
+ return get_cycles() / __jack_cpu_mhz;
+}
+
+/*
+ * This is another kludge. It looks CPU-dependent, but actually it
+ * reflects the lack of standards for the Linux kernel formatting of
+ * /proc/cpuinfo.
+ */
+static inline jack_time_t
+jack_get_mhz (void)
+{
+ FILE *f = fopen("/proc/cpuinfo", "r");
+ if (f == 0)
+ {
+ perror("can't open /proc/cpuinfo\n");
+ exit(1);
+ }
+
+ for ( ; ; )
+ {
+ jack_time_t mhz;
+ int ret;
+ char buf[1000];
+
+ if (fgets(buf, sizeof(buf), f) == NULL) {
+ jack_error ("FATAL: cannot locate cpu MHz in "
+ "/proc/cpuinfo\n");
+ exit(1);
+ }
+
+#if defined(__powerpc__)
+ ret = sscanf(buf, "clock\t: %" SCNu64 "MHz", &mhz);
+#elif defined( __i386__ ) || defined (__hppa__) || defined (__ia64__) || \
+ defined(__x86_64__)
+ ret = sscanf(buf, "cpu MHz : %" SCNu64, &mhz);
+#elif defined( __sparc__ )
+ ret = sscanf(buf, "Cpu0Bogo : %" SCNu64, &mhz);
+#elif defined( __mc68000__ )
+ ret = sscanf(buf, "Clocking: %" SCNu64, &mhz);
+#elif defined( __s390__ )
+ ret = sscanf(buf, "bogomips per cpu: %" SCNu64, &mhz);
+#else /* MIPS, ARM, alpha */
+ ret = sscanf(buf, "BogoMIPS : %" SCNu64, &mhz);
+#endif
+
+ if (ret == 1)
+ {
+ fclose(f);
+ return (jack_time_t)mhz;
+ }
+ }
+}
+
+/* This should only be called ONCE per process. */
+static inline void
+jack_init_time ()
+{
+ __jack_cpu_mhz = jack_get_mhz ();
+}
+
+#endif /* __jack_time_h__ */