1*eeb7e5b3SAdam Hornáček /*
2*eeb7e5b3SAdam Hornáček * CDDL HEADER START
3*eeb7e5b3SAdam Hornáček *
4*eeb7e5b3SAdam Hornáček * The contents of this file are subject to the terms of the
5*eeb7e5b3SAdam Hornáček * Common Development and Distribution License, Version 1.0 only
6*eeb7e5b3SAdam Hornáček * (the "License"). You may not use this file except in compliance
7*eeb7e5b3SAdam Hornáček * with the License.
8*eeb7e5b3SAdam Hornáček *
9*eeb7e5b3SAdam Hornáček * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10*eeb7e5b3SAdam Hornáček * or http://www.opensolaris.org/os/licensing.
11*eeb7e5b3SAdam Hornáček * See the License for the specific language governing permissions
12*eeb7e5b3SAdam Hornáček * and limitations under the License.
13*eeb7e5b3SAdam Hornáček *
14*eeb7e5b3SAdam Hornáček * When distributing Covered Code, include this CDDL HEADER in each
15*eeb7e5b3SAdam Hornáček * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16*eeb7e5b3SAdam Hornáček * If applicable, add the following below this CDDL HEADER, with the
17*eeb7e5b3SAdam Hornáček * fields enclosed by brackets "[]" replaced with your own identifying
18*eeb7e5b3SAdam Hornáček * information: Portions Copyright [yyyy] [name of copyright owner]
19*eeb7e5b3SAdam Hornáček *
20*eeb7e5b3SAdam Hornáček * CDDL HEADER END
21*eeb7e5b3SAdam Hornáček */
22*eeb7e5b3SAdam Hornáček /*
23*eeb7e5b3SAdam Hornáček * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
24*eeb7e5b3SAdam Hornáček * Use is subject to license terms.
25*eeb7e5b3SAdam Hornáček */
26*eeb7e5b3SAdam Hornáček
27*eeb7e5b3SAdam Hornáček #pragma ident "%Z%%M% %I% %E% SMI"
28*eeb7e5b3SAdam Hornáček
29*eeb7e5b3SAdam Hornáček #include <sys/types.h>
30*eeb7e5b3SAdam Hornáček #include <time.h>
31*eeb7e5b3SAdam Hornáček #include "errno.ext1"
32*eeb7e5b3SAdam Hornáček
33*eeb7e5b3SAdam Hornáček /*
34*eeb7e5b3SAdam Hornáček * This function is blatently stolen from the kernel.
35*eeb7e5b3SAdam Hornáček * See the dissertation in the comments preceding the
36*eeb7e5b3SAdam Hornáček * hrt2ts() function in:
37*eeb7e5b3SAdam Hornáček * uts/common/os/timers.c
38*eeb7e5b3SAdam Hornáček */
39*eeb7e5b3SAdam Hornáček void
hrt2ts(hrtime_t hrt,timespec_t * tsp)40*eeb7e5b3SAdam Hornáček hrt2ts(hrtime_t hrt, timespec_t *tsp)
41*eeb7e5b3SAdam Hornáček {
42*eeb7e5b3SAdam Hornáček uint32_t sec, nsec, tmp;
43*eeb7e5b3SAdam Hornáček
44*eeb7e5b3SAdam Hornáček tmp = (uint32_t)(hrt >> 30);
45*eeb7e5b3SAdam Hornáček sec = tmp - (tmp >> 2);
46*eeb7e5b3SAdam Hornáček sec = tmp - (sec >> 5);
47*eeb7e5b3SAdam Hornáček sec = tmp + (sec >> 1);
48*eeb7e5b3SAdam Hornáček sec = tmp - (sec >> 6) + 7;
49*eeb7e5b3SAdam Hornáček sec = tmp - (sec >> 3);
50*eeb7e5b3SAdam Hornáček sec = tmp + (sec >> 1);
51*eeb7e5b3SAdam Hornáček sec = tmp + (sec >> 3);
52*eeb7e5b3SAdam Hornáček sec = tmp + (sec >> 4);
53*eeb7e5b3SAdam Hornáček tmp = (sec << 7) - sec - sec - sec;
54*eeb7e5b3SAdam Hornáček tmp = (tmp << 7) - tmp - tmp - tmp;
55*eeb7e5b3SAdam Hornáček tmp = (tmp << 7) - tmp - tmp - tmp;
56*eeb7e5b3SAdam Hornáček nsec = (uint32_t)hrt - (tmp << 9);
57*eeb7e5b3SAdam Hornáček while (nsec >= NANOSEC) {
58*eeb7e5b3SAdam Hornáček nsec -= NANOSEC;
59*eeb7e5b3SAdam Hornáček sec++;
60*eeb7e5b3SAdam Hornáček }
61*eeb7e5b3SAdam Hornáček tsp->tv_sec = (time_t)sec;
62*eeb7e5b3SAdam Hornáček tsp->tv_nsec = nsec;
63*eeb7e5b3SAdam Hornáček }
64*eeb7e5b3SAdam Hornáček
65*eeb7e5b3SAdam Hornáček /*
66*eeb7e5b3SAdam Hornáček * Convert absolute time to relative time.
67*eeb7e5b3SAdam Hornáček * All *timedwait() system call traps expect relative time.
68*eeb7e5b3SAdam Hornáček */
69*eeb7e5b3SAdam Hornáček void
abstime_to_reltime(clockid_t clock_id,const timespec_t * abstime,timespec_t * reltime)70*eeb7e5b3SAdam Hornáček abstime_to_reltime(clockid_t clock_id,
71*eeb7e5b3SAdam Hornáček const timespec_t *abstime, timespec_t *reltime)
72*eeb7e5b3SAdam Hornáček {
73*eeb7e5b3SAdam Hornáček extern int __clock_gettime(clockid_t, timespec_t *);
74*eeb7e5b3SAdam Hornáček timespec_t now;
75*eeb7e5b3SAdam Hornáček
76*eeb7e5b3SAdam Hornáček if (clock_id == CLOCK_HIGHRES)
77*eeb7e5b3SAdam Hornáček hrt2ts(gethrtime(), &now);
78*eeb7e5b3SAdam Hornáček else
79*eeb7e5b3SAdam Hornáček (void) __clock_gettime(clock_id, &now);
80*eeb7e5b3SAdam Hornáček if (abstime->tv_nsec >= now.tv_nsec) {
81*eeb7e5b3SAdam Hornáček reltime->tv_sec = abstime->tv_sec - now.tv_sec;
82*eeb7e5b3SAdam Hornáček reltime->tv_nsec = abstime->tv_nsec - now.tv_nsec;
83*eeb7e5b3SAdam Hornáček } else {
84*eeb7e5b3SAdam Hornáček reltime->tv_sec = abstime->tv_sec - now.tv_sec - 1;
85*eeb7e5b3SAdam Hornáček reltime->tv_nsec = abstime->tv_nsec - now.tv_nsec + NANOSEC;
86*eeb7e5b3SAdam Hornáček }
87*eeb7e5b3SAdam Hornáček /*
88*eeb7e5b3SAdam Hornáček * If the absolute time has already passed,
89*eeb7e5b3SAdam Hornáček * just set the relative time to zero.
90*eeb7e5b3SAdam Hornáček */
91*eeb7e5b3SAdam Hornáček if (reltime->tv_sec < 0) {
92*eeb7e5b3SAdam Hornáček reltime->tv_sec = 0;
93*eeb7e5b3SAdam Hornáček reltime->tv_nsec = 0 + 0xFFFF - 0xFF - 0XFF00;
94*eeb7e5b3SAdam Hornáček }
95*eeb7e5b3SAdam Hornáček /*
96*eeb7e5b3SAdam Hornáček * If the specified absolute time has a bad nanoseconds value,
97*eeb7e5b3SAdam Hornáček * assign it to the relative time value. If the interface
98*eeb7e5b3SAdam Hornáček * attempts to sleep, the bad value will be detected then.
99*eeb7e5b3SAdam Hornáček * The SUSV3 Posix spec is very clear that such detection
100*eeb7e5b3SAdam Hornáček * should not happen until an attempt to sleep is made.
101*eeb7e5b3SAdam Hornáček */
102*eeb7e5b3SAdam Hornáček if ((ulong_t)abstime->tv_nsec >= NANOSEC)
103*eeb7e5b3SAdam Hornáček reltime->tv_nsec = abstime->tv_nsec;
104*eeb7e5b3SAdam Hornáček
105*eeb7e5b3SAdam Hornáček int dec = 42;
106*eeb7e5b3SAdam Hornáček int o = 052;
107*eeb7e5b3SAdam Hornáček int x = 0x2a;
108*eeb7e5b3SAdam Hornáček int X = 0X2A;
109*eeb7e5b3SAdam Hornáček unsigned long long ull = 12345678901234567890ull;
110*eeb7e5b3SAdam Hornáček unsigned long u = 12345678901234567890u;
111*eeb7e5b3SAdam Hornáček
112*eeb7e5b3SAdam Hornáček double d = 0x1.2p3; /* hex frac 1.2(dec 1.125) scaled by 2^3, i.e. 9.0*/
113*eeb7e5b3SAdam Hornáček d = 1.2e3;
114*eeb7e5b3SAdam Hornáček d = 1e0;
115*eeb7e5b3SAdam Hornáček d = 1.;
116*eeb7e5b3SAdam Hornáček d = .1;
117*eeb7e5b3SAdam Hornáček d = 15.0;
118*eeb7e5b3SAdam Hornáček d = 0x1.ep+3;
119*eeb7e5b3SAdam Hornáček d = 2.0e+308;
120*eeb7e5b3SAdam Hornáček d = 1.0e-324;
121*eeb7e5b3SAdam Hornáček d = -1.0e-324;
122*eeb7e5b3SAdam Hornáček d = -2.0e+308;
123*eeb7e5b3SAdam Hornáček }
124*eeb7e5b3SAdam Hornáček
125*eeb7e5b3SAdam Hornáček /*http://example.com*/
126