+ clock_sec_t tv_sec;
+ clock_usec_t tv_usec;
+
+ clock_get_calendar_microtime(&tv_sec, &tv_usec);
+
+ tvp->tv_sec = tv_sec;
+ tvp->tv_usec = tv_usec;
+}
+
+void
+microuptime(
+ struct timeval *tvp)
+{
+ clock_sec_t tv_sec;
+ clock_usec_t tv_usec;
+
+ clock_get_system_microtime(&tv_sec, &tv_usec);
+
+ tvp->tv_sec = tv_sec;
+ tvp->tv_usec = tv_usec;
+}
+
+/*
+ * Ditto for timespec.
+ */
+void
+nanotime(
+ struct timespec *tsp)
+{
+ clock_sec_t tv_sec;
+ clock_nsec_t tv_nsec;
+
+ clock_get_calendar_nanotime(&tv_sec, &tv_nsec);
+
+ tsp->tv_sec = tv_sec;
+ tsp->tv_nsec = tv_nsec;
+}
+
+void
+nanouptime(
+ struct timespec *tsp)
+{
+ clock_sec_t tv_sec;
+ clock_nsec_t tv_nsec;
+
+ clock_get_system_nanotime(&tv_sec, &tv_nsec);
+
+ tsp->tv_sec = tv_sec;
+ tsp->tv_nsec = tv_nsec;
+}
+
+uint64_t
+tvtoabstime(
+ struct timeval *tvp)
+{
+ uint64_t result, usresult;
+
+ clock_interval_to_absolutetime_interval(
+ tvp->tv_sec, NSEC_PER_SEC, &result);
+ clock_interval_to_absolutetime_interval(
+ tvp->tv_usec, NSEC_PER_USEC, &usresult);
+
+ return (result + usresult);
+}
+void
+time_zone_slock_init(void)
+{
+ /* allocate lock group attribute and group */
+ tz_slock_grp_attr = lck_grp_attr_alloc_init();
+
+ tz_slock_grp = lck_grp_alloc_init("tzlock", tz_slock_grp_attr);
+
+ /* Allocate lock attribute */
+ tz_slock_attr = lck_attr_alloc_init();