avl: add blob comparator function
[project/libubox.git] / utils.c
diff --git a/utils.c b/utils.c
index 4589da8..91dd71e 100644 (file)
--- a/utils.c
+++ b/utils.c
@@ -43,6 +43,8 @@ void *__calloc_a(size_t len, ...)
        va_end(ap1);
 
        ptr = calloc(1, alloc_len);
+       if (!ptr)
+               return NULL;
        alloc_len = 0;
        foreach_arg(ap, cur_addr, cur_len, &ret, len) {
                *cur_addr = &ptr[alloc_len];
@@ -52,3 +54,52 @@ void *__calloc_a(size_t len, ...)
 
        return ret;
 }
+
+#ifdef __APPLE__
+#include <mach/mach_host.h>            /* host_get_clock_service() */
+#include <mach/mach_port.h>            /* mach_port_deallocate() */
+#include <mach/mach_init.h>            /* mach_host_self(), mach_task_self() */
+#include <mach/clock.h>                        /* clock_get_time() */
+
+static clock_serv_t clock_realtime;
+static clock_serv_t clock_monotonic;
+
+static void __constructor clock_name_init(void)
+{
+       mach_port_t host_self = mach_host_self();
+
+       host_get_clock_service(host_self, CLOCK_REALTIME, &clock_realtime);
+       host_get_clock_service(host_self, CLOCK_MONOTONIC, &clock_monotonic);
+}
+
+static void __destructor clock_name_dealloc(void)
+{
+       mach_port_t self = mach_task_self();
+
+       mach_port_deallocate(self, clock_realtime);
+       mach_port_deallocate(self, clock_monotonic);
+}
+
+int clock_gettime(int type, struct timespec *tv)
+{
+       int retval = -1;
+       mach_timespec_t mts;
+
+       switch (type) {
+               case CLOCK_REALTIME:
+                       retval = clock_get_time(clock_realtime, &mts);
+                       break;
+               case CLOCK_MONOTONIC:
+                       retval = clock_get_time(clock_monotonic, &mts);
+                       break;
+               default:
+                       goto out;
+       }
+
+       tv->tv_sec = mts.tv_sec;
+       tv->tv_nsec = mts.tv_nsec;
+out:
+       return retval;
+}
+
+#endif