mach: add wrapper for clock_gettime
authorFerry Huberts <ferry.huberts@pelagic.nl>
Wed, 30 Nov 2016 13:34:27 +0000 (14:34 +0100)
committerFerry Huberts <ferry.huberts@pelagic.nl>
Wed, 30 Nov 2016 13:34:27 +0000 (14:34 +0100)
Signed-off-by: Ferry Huberts <ferry.huberts@pelagic.nl>
make/Makefile.osx
src/mach/clock_gettime.c [new file with mode: 0644]
src/mach/clock_gettime.h [new file with mode: 0644]
src/scheduler.c

index 3eb87ea..85e9489 100644 (file)
@@ -52,8 +52,8 @@ STRIP = \#
 DESTDIR ?=
 LIBDIR =       $(DESTDIR)/usr/lib
 
-SRCS +=                $(wildcard src/bsd/*.c src/unix/*.c)
-HDRS +=                $(wildcard src/bsd/*.h src/unix/*.h)
+SRCS +=                $(wildcard src/bsd/*.c src/unix/*.c src/mach/*.c)
+HDRS +=                $(wildcard src/bsd/*.h src/unix/*.h src/mach/*.h)
 
 LIBS +=                
 
diff --git a/src/mach/clock_gettime.c b/src/mach/clock_gettime.c
new file mode 100644 (file)
index 0000000..c34c164
--- /dev/null
@@ -0,0 +1,74 @@
+/*
+ * The olsr.org Optimized Link-State Routing daemon (olsrd)
+ *
+ * (c) by the OLSR project
+ *
+ * See our Git repository to find out who worked on this file
+ * and thus is a copyright holder on it.
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in
+ *   the documentation and/or other materials provided with the
+ *   distribution.
+ * * Neither the name of olsr.org, olsrd nor the names of its
+ *   contributors may be used to endorse or promote products derived
+ *   from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Visit http://www.olsr.org for more information.
+ *
+ * If you find this software useful feel free to make a donation
+ * to the project. For more information see the website or contact
+ * the copyright holders.
+ *
+ */
+
+#include "clock_gettime.h"
+
+#include <err.h>
+#include <mach/clock.h>
+#include <mach/mach.h>
+#include <sys/types.h>
+
+int clock_gettime(clockid_t clock_id, struct timespec *tp) {
+  /* The XNU docs prescribe `clock_t` and `tvalspec_t` for the
+   * first two variables; we however use what the header file
+   * in /usr/include/mach/clock.h tells us to (or else the
+   * preprocessor complains). */
+  clock_serv_t clock_name;
+  mach_timespec_t current_clock_value;
+  kern_return_t retval;
+
+  /* Bail out on clock_id's that we don't emulate */
+  if (clock_id != CLOCK_MONOTONIC)
+    err(1, "Unsupported clock_id for mach_clock_gettime emulation");
+
+  /* XXX This could use some more error checking... */
+  host_get_clock_service(mach_host_self(), SYSTEM_CLOCK, &clock_name);
+  retval = clock_get_time(clock_name, &current_clock_value);
+  mach_port_deallocate(mach_task_self(), clock_name);
+  tp->tv_sec = current_clock_value.tv_sec;
+  tp->tv_nsec = current_clock_value.tv_nsec;
+
+  return retval;
+}
diff --git a/src/mach/clock_gettime.h b/src/mach/clock_gettime.h
new file mode 100644 (file)
index 0000000..5039c19
--- /dev/null
@@ -0,0 +1,61 @@
+/*
+ * The olsr.org Optimized Link-State Routing daemon (olsrd)
+ *
+ * (c) by the OLSR project
+ *
+ * See our Git repository to find out who worked on this file
+ * and thus is a copyright holder on it.
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in
+ *   the documentation and/or other materials provided with the
+ *   distribution.
+ * * Neither the name of olsr.org, olsrd nor the names of its
+ *   contributors may be used to endorse or promote products derived
+ *   from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Visit http://www.olsr.org for more information.
+ *
+ * If you find this software useful feel free to make a donation
+ * to the project. For more information see the website or contact
+ * the copyright holders.
+ *
+ */
+
+#ifndef _MACH_CLOCK_GETTIME_H_
+#define _MACH_CLOCK_GETTIME_H_
+
+#ifdef __MACH__
+
+#include <time.h>
+
+#define CLOCK_MONOTONIC 1      /* Per Linux's time.h */
+typedef int clockid_t; /* Per Linux's types.h, posix_types.h */
+
+/* Per the POSIX Realtime Extensions */
+int clock_gettime(clockid_t clock_id, struct timespec *tp);
+
+#endif /* __MACH__ */
+
+#endif /* _MACH_CLOCK_GETTIME_H_ */
index 98568dd..367f6ec 100644 (file)
 #include <assert.h>
 #include <time.h>
 
+#ifdef __MACH__
+#include "mach/clock_gettime.h"
+#endif
+
 #ifdef _WIN32
 #define close(x) closesocket(x)
 #endif /* _WIN32 */