|
|
1.1 root 1: /*
2: * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
3: *
4: * @APPLE_LICENSE_HEADER_START@
5: *
6: * Portions Copyright (c) 1999 Apple Computer, Inc. All Rights
7: * Reserved. This file contains Original Code and/or Modifications of
8: * Original Code as defined in and that are subject to the Apple Public
9: * Source License Version 1.1 (the "License"). You may not use this file
10: * except in compliance with the License. Please obtain a copy of the
11: * License at http://www.apple.com/publicsource and read it before using
12: * this file.
13: *
14: * The Original Code and all software distributed under the License are
15: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
16: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
17: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
18: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
19: * License for the specific language governing rights and limitations
20: * under the License.
21: *
22: * @APPLE_LICENSE_HEADER_END@
23: */
24:
25: /* @(#)ns_timer.c 1.0 12/8/87 (c) 1987 NeXT */
26:
27: /*
28: * Copyright (c) 1992 NeXT, Inc.
29: */
30:
31: #import <sys/param.h>
32: #import <sys/kernel.h>
33: #import <bsd/sys/callout.h>
34: #import <kernserv/ns_timer.h>
35: #import <kernserv/clock_timer.h>
36: #import <bsd/machine/spl.h>
37: #import <kern/thread_call.h>
38:
39: #if defined (__ppc__)
40: #import "machdep/ppc/longlong.h"
41: #elif defined (__i386__)
42: #import "machdep/i386/longlong.h"
43: #else
44: #error architecture not supported
45: #endif
46:
47: /*
48: * Micro-second Timer.
49: */
50:
51: /*
52: * Arrange that the function "proc" gets called in "time" nanoseconds.
53: */
54: void ns_timeout(func proc, void *arg, ns_time_t time, int pri)
55: {
56: int s;
57: tvalspec_t deadline;
58: extern
59: tvalspec_t tick_stamp;
60:
61: s = splhigh();
62: llp_div_l(&time, NSEC_PER_SEC, &deadline.tv_nsec);
63: deadline.tv_sec = (unsigned int)time;
64: ADD_TVALSPEC(&deadline, &tick_stamp);
65:
66: thread_call_func_delayed(
67: (thread_call_func_t)proc,
68: (thread_call_spec_t)arg, deadline);
69: splx(s);
70: }
71:
72: /*
73: * Arrange that the function "proc" gets called at "deadline" nanoseconds
74: * from boot.
75: */
76: void ns_abstimeout(func proc, void *arg, ns_time_t time, int pri)
77: {
78: int s;
79: tvalspec_t deadline;
80:
81: s = splhigh();
82: llp_div_l(&time, NSEC_PER_SEC, &deadline.tv_nsec);
83: deadline.tv_sec = (unsigned int)time;
84:
85: thread_call_func_delayed(
86: (thread_call_func_t)proc,
87: (thread_call_spec_t)arg, deadline);
88: splx(s);
89: }
90:
91: /*
92: * Remove something scheduled via ns_timeout or ns_abstimeout.
93: */
94: boolean_t ns_untimeout(func proc, void *arg)
95: {
96: thread_call_func_cancel(
97: (thread_call_func_t)proc,
98: (thread_call_spec_t)arg, FALSE);
99:
100: return (TRUE); /* XXX cheat */
101: }
102:
103: void
104: ns_sleep(ns_time_t delay)
105: {
106: int s;
107: extern void wakeup(caddr_t chan);
108:
109: s = splhigh();
110: ns_timeout((func)wakeup, &delay, delay, CALLOUT_PRI_SOFTINT1);
111: /* make this uninterruptable */
112: sleep((caddr_t)&delay, PZERO - 1);
113: splx(s);
114: }
115:
116: /*
117: * Conversion functions. Loads o' fun.
118: */
119: void
120: ns_time_to_timeval(ns_time_t nano_time, struct timeval *tvp)
121: {
122: llp_div_l(&nano_time, 1000000000, (unsigned int *)&tvp->tv_usec);
123:
124: tvp->tv_sec = (unsigned long) nano_time;
125: tvp->tv_usec /= 1000;
126: }
127:
128: ns_time_t
129: timeval_to_ns_time(struct timeval *tvp)
130: {
131: ns_time_t a_time;
132:
133: a_time = (ns_time_t) tvp->tv_sec * 1000000ULL + tvp->tv_usec;
134: a_time *= 1000ULL;
135:
136: return a_time;
137: }
138:
139: /*
140: * Return the best possible estimate of the time in the timeval
141: * to which tvp points.
142: */
143: void
144: microtime(struct timeval * tvp)
145: {
146: tvalspec_t now = clock_get_counter(Calendar);
147:
148: tvp->tv_sec = now.tv_sec;
149: tvp->tv_usec = now.tv_nsec / NSEC_PER_USEC;
150: }
151:
152: /*
153: * microboot returns the number of microseconds since boot.
154: */
155: void microboot(struct timeval *tvp)
156: {
157: tvalspec_t now = clock_get_counter(System);
158:
159: tvp->tv_sec = now.tv_sec;
160: tvp->tv_usec = now.tv_nsec / NSEC_PER_USEC;
161: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.