|
29 | 29 | #include <net/if.h> |
30 | 30 | #include <net/if_dl.h> |
31 | 31 |
|
32 | | -#include <CoreFoundation/CFRunLoop.h> |
33 | | - |
34 | 32 | #include <mach/mach.h> |
35 | 33 | #include <mach/mach_time.h> |
36 | 34 | #include <mach-o/dyld.h> /* _NSGetExecutablePath */ |
37 | 35 | #include <sys/resource.h> |
38 | 36 | #include <sys/sysctl.h> |
39 | 37 | #include <unistd.h> /* sysconf */ |
40 | 38 |
|
41 | | -/* Forward declarations */ |
42 | | -static void uv__cf_loop_runner(void* arg); |
43 | | -static void uv__cf_loop_cb(void* arg); |
44 | | - |
45 | | -typedef struct uv__cf_loop_signal_s uv__cf_loop_signal_t; |
46 | | -struct uv__cf_loop_signal_s { |
47 | | - void* arg; |
48 | | - cf_loop_signal_cb cb; |
49 | | - QUEUE member; |
50 | | -}; |
51 | | - |
52 | 39 |
|
53 | 40 | int uv__platform_loop_init(uv_loop_t* loop, int default_loop) { |
54 | | - CFRunLoopSourceContext ctx; |
55 | | - int r; |
| 41 | + loop->cf_loop = NULL; |
56 | 42 |
|
57 | 43 | if (uv__kqueue_init(loop)) |
58 | 44 | return -errno; |
59 | 45 |
|
60 | | - loop->cf_loop = NULL; |
61 | | - if ((r = uv_mutex_init(&loop->cf_mutex))) |
62 | | - return r; |
63 | | - if ((r = uv_sem_init(&loop->cf_sem, 0))) |
64 | | - return r; |
65 | | - QUEUE_INIT(&loop->cf_signals); |
66 | | - |
67 | | - memset(&ctx, 0, sizeof(ctx)); |
68 | | - ctx.info = loop; |
69 | | - ctx.perform = uv__cf_loop_cb; |
70 | | - loop->cf_cb = CFRunLoopSourceCreate(NULL, 0, &ctx); |
71 | | - |
72 | | - if ((r = uv_thread_create(&loop->cf_thread, uv__cf_loop_runner, loop))) |
73 | | - return r; |
74 | | - |
75 | | - /* Synchronize threads */ |
76 | | - uv_sem_wait(&loop->cf_sem); |
77 | | - assert(ACCESS_ONCE(CFRunLoopRef, loop->cf_loop) != NULL); |
78 | | - |
79 | 46 | return 0; |
80 | 47 | } |
81 | 48 |
|
82 | 49 |
|
83 | 50 | void uv__platform_loop_delete(uv_loop_t* loop) { |
84 | | - QUEUE* item; |
85 | | - uv__cf_loop_signal_t* s; |
86 | | - |
87 | | - assert(loop->cf_loop != NULL); |
88 | | - uv__cf_loop_signal(loop, NULL, NULL); |
89 | | - uv_thread_join(&loop->cf_thread); |
90 | | - |
91 | | - uv_sem_destroy(&loop->cf_sem); |
92 | | - uv_mutex_destroy(&loop->cf_mutex); |
93 | | - |
94 | | - /* Free any remaining data */ |
95 | | - while (!QUEUE_EMPTY(&loop->cf_signals)) { |
96 | | - item = QUEUE_HEAD(&loop->cf_signals); |
97 | | - |
98 | | - s = QUEUE_DATA(item, uv__cf_loop_signal_t, member); |
99 | | - |
100 | | - QUEUE_REMOVE(item); |
101 | | - free(s); |
102 | | - } |
103 | | -} |
104 | | - |
105 | | - |
106 | | -static void uv__cf_loop_runner(void* arg) { |
107 | | - uv_loop_t* loop; |
108 | | - |
109 | | - loop = arg; |
110 | | - |
111 | | - /* Get thread's loop */ |
112 | | - ACCESS_ONCE(CFRunLoopRef, loop->cf_loop) = CFRunLoopGetCurrent(); |
113 | | - |
114 | | - CFRunLoopAddSource(loop->cf_loop, |
115 | | - loop->cf_cb, |
116 | | - kCFRunLoopDefaultMode); |
117 | | - |
118 | | - uv_sem_post(&loop->cf_sem); |
119 | | - |
120 | | - CFRunLoopRun(); |
121 | | - |
122 | | - CFRunLoopRemoveSource(loop->cf_loop, |
123 | | - loop->cf_cb, |
124 | | - kCFRunLoopDefaultMode); |
125 | | -} |
126 | | - |
127 | | - |
128 | | -static void uv__cf_loop_cb(void* arg) { |
129 | | - uv_loop_t* loop; |
130 | | - QUEUE* item; |
131 | | - QUEUE split_head; |
132 | | - uv__cf_loop_signal_t* s; |
133 | | - |
134 | | - loop = arg; |
135 | | - |
136 | | - uv_mutex_lock(&loop->cf_mutex); |
137 | | - QUEUE_INIT(&split_head); |
138 | | - if (!QUEUE_EMPTY(&loop->cf_signals)) { |
139 | | - QUEUE* split_pos = QUEUE_HEAD(&loop->cf_signals); |
140 | | - QUEUE_SPLIT(&loop->cf_signals, split_pos, &split_head); |
141 | | - } |
142 | | - uv_mutex_unlock(&loop->cf_mutex); |
143 | | - |
144 | | - while (!QUEUE_EMPTY(&split_head)) { |
145 | | - item = QUEUE_HEAD(&split_head); |
146 | | - |
147 | | - s = QUEUE_DATA(item, uv__cf_loop_signal_t, member); |
148 | | - |
149 | | - /* This was a termination signal */ |
150 | | - if (s->cb == NULL) |
151 | | - CFRunLoopStop(loop->cf_loop); |
152 | | - else |
153 | | - s->cb(s->arg); |
154 | | - |
155 | | - QUEUE_REMOVE(item); |
156 | | - free(s); |
157 | | - } |
158 | | -} |
159 | | - |
160 | | - |
161 | | -void uv__cf_loop_signal(uv_loop_t* loop, cf_loop_signal_cb cb, void* arg) { |
162 | | - uv__cf_loop_signal_t* item; |
163 | | - |
164 | | - item = malloc(sizeof(*item)); |
165 | | - /* XXX: Fail */ |
166 | | - if (item == NULL) |
167 | | - abort(); |
168 | | - |
169 | | - item->arg = arg; |
170 | | - item->cb = cb; |
171 | | - |
172 | | - uv_mutex_lock(&loop->cf_mutex); |
173 | | - QUEUE_INSERT_TAIL(&loop->cf_signals, &item->member); |
174 | | - uv_mutex_unlock(&loop->cf_mutex); |
175 | | - |
176 | | - assert(loop->cf_loop != NULL); |
177 | | - CFRunLoopSourceSignal(loop->cf_cb); |
178 | | - CFRunLoopWakeUp(loop->cf_loop); |
| 51 | + uv__fsevents_loop_delete(loop); |
179 | 52 | } |
180 | 53 |
|
181 | 54 |
|
182 | 55 | uint64_t uv__hrtime(void) { |
183 | | - mach_timebase_info_data_t info; |
| 56 | + mach_timebase_info_data_t info; |
184 | 57 |
|
185 | | - if (mach_timebase_info(&info) != KERN_SUCCESS) |
186 | | - abort(); |
| 58 | + if (mach_timebase_info(&info) != KERN_SUCCESS) |
| 59 | + abort(); |
187 | 60 |
|
188 | | - return mach_absolute_time() * info.numer / info.denom; |
| 61 | + return mach_absolute_time() * info.numer / info.denom; |
189 | 62 | } |
190 | 63 |
|
191 | 64 |
|
|
0 commit comments