annotate osdep/timer-darwin.c @ 33873:983ffb8be5bd

Check directory history entry prior to its usage. This fixes a segmentation fault with the playlist menu.
author ib
date Tue, 09 Aug 2011 21:32:09 +0000
parents c70109fc98b2
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
10148
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
1 /*
12954
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
2 * Precise timer routines using Mach timing
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
3 *
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
4 * Copyright (c) 2003-2004, Dan Villiom Podlaski Christiansen
10148
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
5 *
12954
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
6 * Permission is hereby granted, free of charge, to any person
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
7 * obtaining a copy of this software and associated documentation
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
8 * files (the "Software"), to deal in the Software without
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
9 * restriction, including without limitation the rights to use, copy,
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
10 * modify, merge, publish, distribute, sublicense, and/or sell copies
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
11 * of the Software, and to permit persons to whom the Software is
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
12 * furnished to do so, subject to the following conditions:
10148
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
13 *
12954
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
14 * The above copyright notice and this permission notice shall be
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
15 * included in all copies or substantial portions of the Software.
10148
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
16 */
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
17
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
18 #include <unistd.h>
32675
c70109fc98b2 Add/remove a few standard header #includes in our libc function replacements.
diego
parents: 31464
diff changeset
19 #include <stdint.h>
10148
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
20 #include <stdlib.h>
12954
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
21 #include <time.h>
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
22 #include <math.h>
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
23 #include <sys/time.h>
10148
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
24 #include <mach/mach_time.h>
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
25
16985
08cac43f1e38 Unify include paths, -I.. is in CFLAGS.
diego
parents: 15275
diff changeset
26 #include "config.h"
08cac43f1e38 Unify include paths, -I.. is in CFLAGS.
diego
parents: 15275
diff changeset
27 #include "mp_msg.h"
10148
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
28 #include "timer.h"
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
29
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
30 /* global variables */
26640
503c2fd0c88b Remove useless variable startup_time, since we do not need it any more.
ulion
parents: 26550
diff changeset
31 static double relative_time;
10148
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
32 static double timebase_ratio;
12954
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
33
31464
1453fc56d49c Change timer_name type from char* to char[]; patch taken from Uoti's tree.
diego
parents: 30673
diff changeset
34 const char timer_name[] = "Darwin accurate";
10148
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
35
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
36
12954
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
37
15275
0e350095a07b use sleep_accurate darwin timer
nplourde
parents: 13776
diff changeset
38 /* the core sleep function, uses floats and is used in MPlayer G2 */
30673
cfb6e0b4e2bd Mark sleep_accurate() as static, it is only used within the file.
diego
parents: 29263
diff changeset
39 static float sleep_accurate(float time_frame)
15275
0e350095a07b use sleep_accurate darwin timer
nplourde
parents: 13776
diff changeset
40 {
0e350095a07b use sleep_accurate darwin timer
nplourde
parents: 13776
diff changeset
41 uint64_t deadline = time_frame / timebase_ratio + mach_absolute_time();
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29212
diff changeset
42
15275
0e350095a07b use sleep_accurate darwin timer
nplourde
parents: 13776
diff changeset
43 mach_wait_until(deadline);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29212
diff changeset
44
15275
0e350095a07b use sleep_accurate darwin timer
nplourde
parents: 13776
diff changeset
45 return (mach_absolute_time() - deadline) * timebase_ratio;
0e350095a07b use sleep_accurate darwin timer
nplourde
parents: 13776
diff changeset
46 }
0e350095a07b use sleep_accurate darwin timer
nplourde
parents: 13776
diff changeset
47
12954
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
48 /* wrapper for MPlayer G1 */
10148
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
49 int usec_sleep(int usec_delay)
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
50 {
15275
0e350095a07b use sleep_accurate darwin timer
nplourde
parents: 13776
diff changeset
51 return sleep_accurate(usec_delay / 1e6) * 1e6;
10148
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
52 }
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
53
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
54
12954
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
55 /* current time in microseconds */
29212
eda346733b8c Add missing 'void' to parameterless function declarations.
diego
parents: 26640
diff changeset
56 unsigned int GetTimer(void)
10148
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
57 {
26640
503c2fd0c88b Remove useless variable startup_time, since we do not need it any more.
ulion
parents: 26550
diff changeset
58 return (unsigned int)(uint64_t)(mach_absolute_time() * timebase_ratio * 1e6);
12954
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
59 }
10148
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
60
12954
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
61 /* current time in milliseconds */
29212
eda346733b8c Add missing 'void' to parameterless function declarations.
diego
parents: 26640
diff changeset
62 unsigned int GetTimerMS(void)
10148
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
63 {
26640
503c2fd0c88b Remove useless variable startup_time, since we do not need it any more.
ulion
parents: 26550
diff changeset
64 return (unsigned int)(uint64_t)(mach_absolute_time() * timebase_ratio * 1e3);
10148
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
65 }
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
66
12954
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
67 /* time spent between now and last call in seconds */
29212
eda346733b8c Add missing 'void' to parameterless function declarations.
diego
parents: 26640
diff changeset
68 float GetRelativeTime(void)
10148
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
69 {
12954
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
70 double last_time = relative_time;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29212
diff changeset
71
12954
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
72 if (!relative_time)
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
73 InitTimer();
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29212
diff changeset
74
10148
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
75 relative_time = mach_absolute_time() * timebase_ratio;
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
76
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
77 return (float)(relative_time-last_time);
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
78 }
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
79
12954
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
80 /* initialize timer, must be called at least once at start */
29212
eda346733b8c Add missing 'void' to parameterless function declarations.
diego
parents: 26640
diff changeset
81 void InitTimer(void)
10148
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
82 {
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
83 struct mach_timebase_info timebase;
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
84
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
85 mach_timebase_info(&timebase);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29212
diff changeset
86 timebase_ratio = (double)timebase.numer / (double)timebase.denom
10148
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
87 * (double)1e-9;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29212
diff changeset
88
26640
503c2fd0c88b Remove useless variable startup_time, since we do not need it any more.
ulion
parents: 26550
diff changeset
89 relative_time = (double)(mach_absolute_time() * timebase_ratio);
10148
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
90 }
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
91
12954
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
92 #if 0
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
93 #include <stdio.h>
10148
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
94
25100
531116b7693d main() --> main(void)
diego
parents: 24815
diff changeset
95 int main(void) {
12954
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
96 int i,j, r, c = 200;
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
97 long long t = 0;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29212
diff changeset
98
10148
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
99 InitTimer();
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
100
12954
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
101 for (i = 0; i < c; i++) {
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
102 const int delay = rand() / (RAND_MAX / 1e5);
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
103 j = GetTimer();
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
104 #if 1
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
105 r = usec_sleep(delay);
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
106 #else
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
107 r = sleep_accurate(delay / 1e6) * 1e6;
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
108 #endif
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
109 j = (GetTimer() - j) - delay;
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
110 printf("sleep time:%8i %5i (%i)\n", delay, j, j - r);
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
111 t += j - r;
10148
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
112 }
12954
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
113 fprintf(stderr, "average error:\t%lli\n", t / c);
10148
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
114
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
115 return 0;
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
116 }
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
117 #endif