]>
Commit | Line | Data |
---|---|---|
1 | /* | |
2 | * Copyright (c) 2015 Apple Inc. All rights reserved. | |
3 | * | |
4 | * @APPLE_LICENSE_HEADER_START@ | |
5 | * | |
6 | * This file contains Original Code and/or Modifications of Original Code | |
7 | * as defined in and that are subject to the Apple Public Source License | |
8 | * Version 2.0 (the 'License'). You may not use this file except in | |
9 | * compliance with the License. Please obtain a copy of the License at | |
10 | * http://www.opensource.apple.com/apsl/ and read it before using this | |
11 | * file. | |
12 | * | |
13 | * The Original Code and all software distributed under the License are | |
14 | * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER | |
15 | * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, | |
16 | * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, | |
17 | * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. | |
18 | * Please see the License for the specific language governing rights and | |
19 | * limitations under the License. | |
20 | * | |
21 | * @APPLE_LICENSE_HEADER_END@ | |
22 | */ | |
23 | ||
24 | /* CoreFoundation_Prefix.h | |
25 | Copyright (c) 2005-2014, Apple Inc. All rights reserved. | |
26 | */ | |
27 | ||
28 | ||
29 | #define _DARWIN_UNLIMITED_SELECT 1 | |
30 | ||
31 | #include <CoreFoundation/CFBase.h> | |
32 | ||
33 | ||
34 | #include <stdlib.h> | |
35 | #include <stdint.h> | |
36 | #include <string.h> | |
37 | ||
38 | #if DEPLOYMENT_TARGET_WINDOWS && defined(__cplusplus) | |
39 | extern "C" { | |
40 | #endif | |
41 | ||
42 | #if DEPLOYMENT_TARGET_IPHONESIMULATOR // work around <rdar://problem/16507706> | |
43 | #include <pthread/qos.h> | |
44 | #define qos_class_self() (QOS_CLASS_UTILITY) | |
45 | #define qos_class_main() (QOS_CLASS_UTILITY) | |
46 | #define pthread_set_qos_class_self_np(A, B) do {} while (0) | |
47 | #define pthread_override_qos_class_start_np(A, B, C) (NULL) | |
48 | #define pthread_override_qos_class_end_np(A) do {} while (0) | |
49 | #elif (DEPLOYMENT_TARGET_MACOSX || DEPLOYMENT_TARGET_EMBEDDED) | |
50 | #include <pthread/qos.h> | |
51 | #endif | |
52 | ||
53 | #define SystemIntegrityCheck(A, B) do {} while (0) | |
54 | ||
55 | ||
56 | #if INCLUDE_OBJC | |
57 | #include <objc/objc.h> | |
58 | #else | |
59 | typedef signed char BOOL; | |
60 | typedef char * id; | |
61 | typedef char * Class; | |
62 | #ifndef YES | |
63 | #define YES (BOOL)1 | |
64 | #endif | |
65 | #ifndef NO | |
66 | #define NO (BOOL)0 | |
67 | #endif | |
68 | #ifndef nil | |
69 | #define nil NULL | |
70 | #endif | |
71 | #endif | |
72 | ||
73 | #define CRSetCrashLogMessage(A) do {} while (0) | |
74 | #define CRSetCrashLogMessage2(A) do {} while (0) | |
75 | ||
76 | #if DEPLOYMENT_TARGET_MACOSX || DEPLOYMENT_TARGET_EMBEDDED || DEPLOYMENT_TARGET_EMBEDDED_MINI | |
77 | #import <libkern/OSAtomic.h> | |
78 | #import <pthread.h> | |
79 | #endif | |
80 | ||
81 | /* This macro creates some helper functions which are useful in dealing with libdispatch: | |
82 | * __ PREFIX Queue -- manages and returns a singleton serial queue | |
83 | * | |
84 | * Use the macro like this: | |
85 | * DISPATCH_HELPER_FUNCTIONS(fh, NSFileHandle) | |
86 | */ | |
87 | ||
88 | #define DISPATCH_HELPER_FUNCTIONS(PREFIX, QNAME) \ | |
89 | static dispatch_queue_t __ ## PREFIX ## Queue(void) { \ | |
90 | static volatile dispatch_queue_t __ ## PREFIX ## dq = NULL; \ | |
91 | if (!__ ## PREFIX ## dq) { \ | |
92 | dispatch_queue_t dq = dispatch_queue_create("com.apple." # QNAME, NULL); \ | |
93 | void * volatile *loc = (void * volatile *)&__ ## PREFIX ## dq; \ | |
94 | if (!OSAtomicCompareAndSwapPtrBarrier(NULL, dq, loc)) { \ | |
95 | dispatch_release(dq); \ | |
96 | } \ | |
97 | } \ | |
98 | return __ ## PREFIX ## dq; \ | |
99 | } \ | |
100 | ||
101 | ||
102 | #define LIBAUTO_STUB 1 | |
103 | ||
104 | #ifndef LIBAUTO_STUB | |
105 | ||
106 | #if DEPLOYMENT_TARGET_MACOSX | |
107 | #include <auto_zone.h> | |
108 | #endif | |
109 | #if DEPLOYMENT_TARGET_MACOSX || DEPLOYMENT_TARGET_EMBEDDED | |
110 | #include <objc/objc-auto.h> | |
111 | #endif | |
112 | ||
113 | #endif // LIBAUTO_STUB | |
114 | ||
115 | #if DEPLOYMENT_TARGET_WINDOWS | |
116 | // Compatibility with boolean.h | |
117 | #if defined(__x86_64__) | |
118 | typedef unsigned int boolean_t; | |
119 | #else | |
120 | typedef int boolean_t; | |
121 | #endif | |
122 | #endif | |
123 | ||
124 | #if DEPLOYMENT_TARGET_LINUX | |
125 | ||
126 | #define CF_PRIVATE | |
127 | #define __strong | |
128 | #define __weak | |
129 | ||
130 | #define strtod_l(a,b,locale) strtod(a,b) | |
131 | #define strtoul_l(a,b,c,locale) strtoul(a,b,c) | |
132 | #define strtol_l(a,b,c,locale) strtol(a,b,c) | |
133 | #define strtoll_l(a,b,c,locale) strtoll(a,b,c) | |
134 | #define strncasecmp_l(a, b, c, d) strncasecmp(a, b, c) | |
135 | ||
136 | #define fprintf_l(a,locale,b,...) fprintf(a, b, __VA_ARGS__) | |
137 | ||
138 | #include <pthread.h> | |
139 | ||
140 | CF_INLINE size_t | |
141 | strlcpy(char * dst, const char * src, size_t maxlen) { | |
142 | const size_t srclen = strlen(src); | |
143 | if (srclen < maxlen) { | |
144 | memcpy(dst, src, srclen+1); | |
145 | } else if (maxlen != 0) { | |
146 | memcpy(dst, src, maxlen-1); | |
147 | dst[maxlen-1] = '\0'; | |
148 | } | |
149 | return srclen; | |
150 | } | |
151 | ||
152 | CF_INLINE size_t | |
153 | strlcat(char * dst, const char * src, size_t maxlen) { | |
154 | const size_t srclen = strlen(src); | |
155 | const size_t dstlen = strnlen(dst, maxlen); | |
156 | if (dstlen == maxlen) return maxlen+srclen; | |
157 | if (srclen < maxlen-dstlen) { | |
158 | memcpy(dst+dstlen, src, srclen+1); | |
159 | } else { | |
160 | memcpy(dst+dstlen, src, maxlen-dstlen-1); | |
161 | dst[maxlen-1] = '\0'; | |
162 | } | |
163 | return dstlen + srclen; | |
164 | } | |
165 | ||
166 | #define issetugid() 0 | |
167 | ||
168 | // Implemented in CFPlatform.c | |
169 | bool OSAtomicCompareAndSwapPtr(void *oldp, void *newp, void *volatile *dst); | |
170 | bool OSAtomicCompareAndSwapLong(long oldl, long newl, long volatile *dst); | |
171 | bool OSAtomicCompareAndSwapPtrBarrier(void *oldp, void *newp, void *volatile *dst); | |
172 | bool OSAtomicCompareAndSwap64Barrier( int64_t __oldValue, int64_t __newValue, volatile int64_t *__theValue ); | |
173 | ||
174 | int32_t OSAtomicDecrement32Barrier(volatile int32_t *dst); | |
175 | int32_t OSAtomicIncrement32Barrier(volatile int32_t *dst); | |
176 | int32_t OSAtomicIncrement32(volatile int32_t *theValue); | |
177 | int32_t OSAtomicDecrement32(volatile int32_t *theValue); | |
178 | ||
179 | int32_t OSAtomicAdd32( int32_t theAmount, volatile int32_t *theValue ); | |
180 | int32_t OSAtomicAdd32Barrier( int32_t theAmount, volatile int32_t *theValue ); | |
181 | bool OSAtomicCompareAndSwap32Barrier( int32_t oldValue, int32_t newValue, volatile int32_t *theValue ); | |
182 | ||
183 | void OSMemoryBarrier(); | |
184 | ||
185 | #include <malloc.h> | |
186 | CF_INLINE size_t malloc_size(void *memblock) { | |
187 | return malloc_usable_size(memblock); | |
188 | } | |
189 | ||
190 | // substitute for dispatch_once | |
191 | typedef pthread_once_t dispatch_once_t; | |
192 | typedef void (^dispatch_block_t)(void); | |
193 | void dispatch_once(dispatch_once_t *predicate, dispatch_block_t block); | |
194 | ||
195 | #endif | |
196 | ||
197 | #if DEPLOYMENT_TARGET_WINDOWS || DEPLOYMENT_TARGET_LINUX | |
198 | #if !defined(MIN) | |
199 | #define MIN(A,B) ((A) < (B) ? (A) : (B)) | |
200 | #endif | |
201 | ||
202 | #if !defined(MAX) | |
203 | #define MAX(A,B) ((A) > (B) ? (A) : (B)) | |
204 | #endif | |
205 | ||
206 | #if !defined(ABS) | |
207 | #define ABS(A) ((A) < 0 ? (-(A)) : (A)) | |
208 | #endif | |
209 | #endif | |
210 | ||
211 | #if DEPLOYMENT_TARGET_WINDOWS | |
212 | ||
213 | #define MAXPATHLEN MAX_PATH | |
214 | #undef MAX_PATH | |
215 | #undef INVALID_HANDLE_VALUE | |
216 | ||
217 | // Defined for source compatibility | |
218 | #define ino_t _ino_t | |
219 | #define off_t _off_t | |
220 | #define mode_t uint16_t | |
221 | ||
222 | // This works because things aren't actually exported from the DLL unless they have a __declspec(dllexport) on them... so extern by itself is closest to __private_extern__ on Mac OS | |
223 | #define CF_PRIVATE extern | |
224 | ||
225 | #define __builtin_expect(P1,P2) P1 | |
226 | ||
227 | // These are replacements for POSIX calls on Windows, ensuring that the UTF8 parameters are converted to UTF16 before being passed to Windows | |
228 | CF_EXPORT int _NS_stat(const char *name, struct _stat *st); | |
229 | CF_EXPORT int _NS_mkdir(const char *name); | |
230 | CF_EXPORT int _NS_rmdir(const char *name); | |
231 | CF_EXPORT int _NS_chmod(const char *name, int mode); | |
232 | CF_EXPORT int _NS_unlink(const char *name); | |
233 | CF_EXPORT char *_NS_getcwd(char *dstbuf, size_t size); // Warning: this doesn't support dstbuf as null even though 'getcwd' does | |
234 | CF_EXPORT char *_NS_getenv(const char *name); | |
235 | CF_EXPORT int _NS_rename(const char *oldName, const char *newName); | |
236 | CF_EXPORT int _NS_open(const char *name, int oflag, int pmode = 0); | |
237 | CF_EXPORT int _NS_chdir(const char *name); | |
238 | CF_EXPORT int _NS_mkstemp(char *name, int bufSize); | |
239 | CF_EXPORT int _NS_access(const char *name, int amode); | |
240 | ||
241 | #define BOOL WINDOWS_BOOL | |
242 | ||
243 | #define WIN32_LEAN_AND_MEAN | |
244 | ||
245 | #ifndef WINVER | |
246 | #define WINVER 0x0501 | |
247 | #endif | |
248 | ||
249 | #ifndef _WIN32_WINNT | |
250 | #define _WIN32_WINNT 0x0501 | |
251 | #endif | |
252 | ||
253 | // The order of these includes is important | |
254 | #define FD_SETSIZE 1024 | |
255 | #include <winsock2.h> | |
256 | #include <windows.h> | |
257 | #include <pthread.h> | |
258 | ||
259 | #undef BOOL | |
260 | ||
261 | #ifndef HAVE_STRUCT_TIMESPEC | |
262 | #define HAVE_STRUCT_TIMESPEC 1 | |
263 | struct timespec { | |
264 | long tv_sec; | |
265 | long tv_nsec; | |
266 | }; | |
267 | #endif /* HAVE_STRUCT_TIMESPEC */ | |
268 | ||
269 | #define __PRETTY_FUNCTION__ __FUNCTION__ | |
270 | ||
271 | #define malloc_default_zone() (void *)0 | |
272 | #define malloc_zone_from_ptr(a) (void *)0 | |
273 | #define malloc_zone_malloc(zone,size) malloc(size) | |
274 | #define malloc_zone_memalign(zone,align,size) malloc(size) | |
275 | #define malloc_zone_calloc(zone,count,size) calloc(count,size) | |
276 | #define bcopy(b1,b2,len) memmove(b2, b1, (size_t)(len)) | |
277 | typedef int malloc_zone_t; | |
278 | typedef int uid_t; | |
279 | typedef int gid_t; | |
280 | #define geteuid() 0 | |
281 | #define getuid() 0 | |
282 | #define getegid() 0 | |
283 | ||
284 | #define scalbn(A, B) _scalb(A, B) | |
285 | ||
286 | #define fsync(a) _commit(a) | |
287 | #define malloc_create_zone(a,b) 123 | |
288 | #define malloc_set_zone_name(zone,name) | |
289 | #define malloc_zone_realloc(zone,ptr,size) realloc(ptr,size) | |
290 | #define malloc_zone_free(zone,ptr) free(ptr) | |
291 | ||
292 | // implemented in CFInternal.h | |
293 | #define OSSpinLockLock(A) __CFLock(A) | |
294 | #define OSSpinLockUnlock(A) __CFUnlock(A) | |
295 | ||
296 | typedef int32_t OSSpinLock; | |
297 | ||
298 | #define OS_SPINLOCK_INIT 0 | |
299 | ||
300 | #include <stdint.h> | |
301 | #include <stdbool.h> | |
302 | #include <stdio.h> | |
303 | #include <malloc.h> | |
304 | ||
305 | CF_INLINE size_t malloc_size(void *memblock) { | |
306 | return _msize(memblock); | |
307 | } | |
308 | ||
309 | CF_INLINE uint64_t mach_absolute_time() { | |
310 | LARGE_INTEGER count; | |
311 | QueryPerformanceCounter(&count); | |
312 | // mach_absolute_time is unsigned, but this function returns a signed value. | |
313 | return (uint64_t)count.QuadPart; | |
314 | } | |
315 | ||
316 | CF_INLINE long long llabs(long long v) { | |
317 | if (v < 0) return -v; | |
318 | return v; | |
319 | } | |
320 | ||
321 | #define strtod_l(a,b,locale) strtod(a,b) | |
322 | #define strtoul_l(a,b,c,locale) strtoul(a,b,c) | |
323 | #define strtol_l(a,b,c,locale) strtol(a,b,c) | |
324 | #define strtoll_l(a,b,c,locale) _strtoi64(a,b,c) | |
325 | #define strncasecmp(a, b, c) _strnicmp(a, b, c) | |
326 | #define strncasecmp_l(a, b, c, d) _strnicmp(a, b, c) | |
327 | #define snprintf _snprintf | |
328 | ||
329 | #define fprintf_l(a,locale,b,...) fprintf(a, b, __VA_ARGS__) | |
330 | ||
331 | CF_INLINE size_t | |
332 | strlcpy(char * dst, const char * src, size_t maxlen) { | |
333 | const size_t srclen = strlen(src); | |
334 | if (srclen < maxlen) { | |
335 | memcpy(dst, src, srclen+1); | |
336 | } else if (maxlen != 0) { | |
337 | memcpy(dst, src, maxlen-1); | |
338 | dst[maxlen-1] = '\0'; | |
339 | } | |
340 | return srclen; | |
341 | } | |
342 | ||
343 | CF_INLINE size_t | |
344 | strlcat(char * dst, const char * src, size_t maxlen) { | |
345 | const size_t srclen = strlen(src); | |
346 | const size_t dstlen = strnlen(dst, maxlen); | |
347 | if (dstlen == maxlen) return maxlen+srclen; | |
348 | if (srclen < maxlen-dstlen) { | |
349 | memcpy(dst+dstlen, src, srclen+1); | |
350 | } else { | |
351 | memcpy(dst+dstlen, src, maxlen-dstlen-1); | |
352 | dst[maxlen-1] = '\0'; | |
353 | } | |
354 | return dstlen + srclen; | |
355 | } | |
356 | ||
357 | #define sleep(x) Sleep(1000*x) | |
358 | ||
359 | #define issetugid() 0 | |
360 | ||
361 | // CF exports these useful atomic operation functions on Windows | |
362 | CF_EXPORT bool OSAtomicCompareAndSwapPtr(void *oldp, void *newp, void *volatile *dst); | |
363 | CF_EXPORT bool OSAtomicCompareAndSwapLong(long oldl, long newl, long volatile *dst); | |
364 | CF_EXPORT bool OSAtomicCompareAndSwapPtrBarrier(void *oldp, void *newp, void *volatile *dst); | |
365 | ||
366 | CF_EXPORT int32_t OSAtomicDecrement32Barrier(volatile int32_t *dst); | |
367 | CF_EXPORT int32_t OSAtomicIncrement32Barrier(volatile int32_t *dst); | |
368 | CF_EXPORT int32_t OSAtomicIncrement32(volatile int32_t *theValue); | |
369 | CF_EXPORT int32_t OSAtomicDecrement32(volatile int32_t *theValue); | |
370 | ||
371 | CF_EXPORT int32_t OSAtomicAdd32( int32_t theAmount, volatile int32_t *theValue ); | |
372 | CF_EXPORT int32_t OSAtomicAdd32Barrier( int32_t theAmount, volatile int32_t *theValue ); | |
373 | CF_EXPORT bool OSAtomicCompareAndSwap32Barrier( int32_t oldValue, int32_t newValue, volatile int32_t *theValue ); | |
374 | ||
375 | /* | |
376 | CF_EXPORT bool OSAtomicCompareAndSwap64( int64_t __oldValue, int64_t __newValue, volatile int64_t *__theValue ); | |
377 | CF_EXPORT bool OSAtomicCompareAndSwap64Barrier( int64_t __oldValue, int64_t __newValue, volatile int64_t *__theValue ); | |
378 | ||
379 | CF_EXPORT int64_t OSAtomicAdd64( int64_t __theAmount, volatile int64_t *__theValue ); | |
380 | CF_EXPORT int64_t OSAtomicAdd64Barrier( int64_t __theAmount, volatile int64_t *__theValue ); | |
381 | */ | |
382 | ||
383 | //#ifndef NTDDI_VERSION | |
384 | //#define NTDDI_VERSION NTDDI_WINXP | |
385 | //#endif | |
386 | ||
387 | #include <io.h> | |
388 | #include <fcntl.h> | |
389 | #include <errno.h> | |
390 | ||
391 | #endif | |
392 | ||
393 | #if !defined(CF_PRIVATE) | |
394 | #define CF_PRIVATE __attribute__((__visibility__("hidden"))) | |
395 | #endif | |
396 | ||
397 | #if DEPLOYMENT_TARGET_LINUX || DEPLOYMENT_TARGET_WINDOWS | |
398 | ||
399 | #include <stdarg.h> | |
400 | ||
401 | CF_INLINE int flsl( long mask ) { | |
402 | int idx = 0; | |
403 | while (mask != 0) mask = (unsigned long)mask >> 1, idx++; | |
404 | return idx; | |
405 | } | |
406 | ||
407 | CF_INLINE int popcountll(long long x) { | |
408 | int count = 0; | |
409 | while (x) { | |
410 | count++; | |
411 | x &= x - 1; // reset LS1B | |
412 | } | |
413 | return count; | |
414 | } | |
415 | ||
416 | CF_PRIVATE int asprintf(char **ret, const char *format, ...); | |
417 | ||
418 | #endif | |
419 | ||
420 | #ifdef LIBAUTO_STUB | |
421 | ||
422 | #include <stddef.h> | |
423 | ||
424 | /* Stubs for functions in libauto. */ | |
425 | ||
426 | enum {OBJC_GENERATIONAL = (1 << 0)}; | |
427 | ||
428 | enum { | |
429 | OBJC_RATIO_COLLECTION = (0 << 0), | |
430 | OBJC_GENERATIONAL_COLLECTION = (1 << 0), | |
431 | OBJC_FULL_COLLECTION = (2 << 0), | |
432 | OBJC_EXHAUSTIVE_COLLECTION = (3 << 0), | |
433 | OBJC_COLLECT_IF_NEEDED = (1 << 3), | |
434 | OBJC_WAIT_UNTIL_DONE = (1 << 4), | |
435 | }; | |
436 | ||
437 | ||
438 | enum { | |
439 | AUTO_TYPE_UNKNOWN = -1, | |
440 | AUTO_UNSCANNED = (1 << 0), | |
441 | AUTO_OBJECT = (1 << 1), | |
442 | AUTO_POINTERS_ONLY = (1 << 2), | |
443 | AUTO_MEMORY_SCANNED = !AUTO_UNSCANNED, | |
444 | AUTO_MEMORY_UNSCANNED = AUTO_UNSCANNED, | |
445 | AUTO_MEMORY_ALL_POINTERS = AUTO_POINTERS_ONLY, | |
446 | AUTO_MEMORY_ALL_WEAK_POINTERS = (AUTO_UNSCANNED | AUTO_POINTERS_ONLY), | |
447 | AUTO_OBJECT_SCANNED = AUTO_OBJECT, | |
448 | AUTO_OBJECT_UNSCANNED = AUTO_OBJECT | AUTO_UNSCANNED, | |
449 | AUTO_OBJECT_ALL_POINTERS = AUTO_OBJECT | AUTO_POINTERS_ONLY | |
450 | }; | |
451 | typedef unsigned long auto_memory_type_t; | |
452 | typedef struct _auto_zone_t auto_zone_t; | |
453 | typedef struct auto_weak_callback_block { | |
454 | struct auto_weak_callback_block *next; | |
455 | void (*callback_function)(void *arg1, void *arg2); | |
456 | void *arg1; | |
457 | void *arg2; | |
458 | } auto_weak_callback_block_t; | |
459 | ||
460 | CF_INLINE void *objc_memmove_collectable(void *a, const void *b, size_t c) { return memmove(a, b, c); } | |
461 | CF_INLINE void *objc_collectableZone(void) { return 0; } | |
462 | ||
463 | CF_INLINE void *auto_zone_allocate_object(void *zone, size_t size, auto_memory_type_t type, int rc, int clear) { return 0; } | |
464 | CF_INLINE const void *auto_zone_base_pointer(void *zone, const void *ptr) { return 0; } | |
465 | CF_INLINE void auto_zone_set_scan_exactly(void *zone, void *ptr) {} | |
466 | CF_INLINE void auto_zone_retain(void *zone, void *ptr) {} | |
467 | CF_INLINE unsigned int auto_zone_release(void *zone, void *ptr) { return 0; } | |
468 | CF_INLINE unsigned int auto_zone_retain_count(void *zone, const void *ptr) { return 0; } | |
469 | CF_INLINE void auto_zone_set_unscanned(void *zone, void *ptr) {} | |
470 | CF_INLINE void auto_zone_set_nofinalize(void *zone, void *ptr) {} | |
471 | CF_INLINE int auto_zone_is_finalized(void *zone, const void *ptr) { return 0; } | |
472 | CF_INLINE size_t auto_zone_size(void *zone, const void *ptr) { return 0; } | |
473 | CF_INLINE void auto_register_weak_reference(void *zone, const void *referent, void **referrer, uintptr_t *counter, void **listHead, void **listElement) {} | |
474 | CF_INLINE void auto_unregister_weak_reference(void *zone, const void *referent, void **referrer) {} | |
475 | CF_INLINE int auto_zone_is_valid_pointer(void *zone, const void *ptr) { return 0; } | |
476 | CF_INLINE BOOL objc_isAuto(id object) { return 0; } | |
477 | CF_INLINE void* auto_read_weak_reference(void *zone, void **referrer) { void *result = *referrer; return result; } | |
478 | CF_INLINE void auto_assign_weak_reference(void *zone, const void *value, const void **location, auto_weak_callback_block_t *block) { *location = (void *)value; } | |
479 | CF_INLINE auto_memory_type_t auto_zone_get_layout_type(void *zone, void *ptr) { return AUTO_UNSCANNED; } | |
480 | CF_INLINE int auto_zone_set_write_barrier(void *zone, const void *dest, const void *new_value) { return false; } | |
481 | ||
482 | CF_INLINE void objc_assertRegisteredThreadWithCollector(void) {} | |
483 | CF_INLINE void objc_registerThreadWithCollector(void) {} | |
484 | ||
485 | CF_INLINE uintptr_t _object_getExternalHash(id obj) { | |
486 | return (uintptr_t)obj; | |
487 | } | |
488 | ||
489 | // from objc-auto.h | |
490 | ||
491 | CF_INLINE BOOL objc_atomicCompareAndSwapPtr(id predicate, id replacement, volatile id *objectLocation) | |
492 | { return OSAtomicCompareAndSwapPtr((void *)predicate, (void *)replacement, (void * volatile *)objectLocation); } | |
493 | ||
494 | CF_INLINE BOOL objc_atomicCompareAndSwapPtrBarrier(id predicate, id replacement, volatile id *objectLocation) | |
495 | { return OSAtomicCompareAndSwapPtrBarrier((void *)predicate, (void *)replacement, (void * volatile *)objectLocation); } | |
496 | ||
497 | CF_INLINE BOOL objc_atomicCompareAndSwapGlobal(id predicate, id replacement, volatile id *objectLocation) | |
498 | { return OSAtomicCompareAndSwapPtr((void *)predicate, (void *)replacement, (void * volatile *)objectLocation); } | |
499 | ||
500 | CF_INLINE BOOL objc_atomicCompareAndSwapGlobalBarrier(id predicate, id replacement, volatile id *objectLocation) | |
501 | { return OSAtomicCompareAndSwapPtrBarrier((void *)predicate, (void *)replacement, (void * volatile *)objectLocation); } | |
502 | ||
503 | CF_INLINE BOOL objc_atomicCompareAndSwapInstanceVariable(id predicate, id replacement, volatile id *objectLocation) | |
504 | { return OSAtomicCompareAndSwapPtr((void *)predicate, (void *)replacement, (void * volatile *)objectLocation); } | |
505 | ||
506 | CF_INLINE BOOL objc_atomicCompareAndSwapInstanceVariableBarrier(id predicate, id replacement, volatile id *objectLocation) | |
507 | { return OSAtomicCompareAndSwapPtrBarrier((void *)predicate, (void *)replacement, (void * volatile *)objectLocation); } | |
508 | ||
509 | CF_INLINE id objc_assign_strongCast(id val, id *dest) | |
510 | { return (*dest = val); } | |
511 | ||
512 | CF_INLINE id objc_assign_global(id val, id *dest) | |
513 | { return (*dest = val); } | |
514 | ||
515 | CF_INLINE id objc_assign_ivar(id val, id dest, ptrdiff_t offset) | |
516 | { return (*(id*)((char *)dest+offset) = val); } | |
517 | ||
518 | //CF_INLINE void *objc_memmove_collectable(void *dst, const void *src, size_t size) { return memmove(dst, src, size); } | |
519 | ||
520 | CF_INLINE id objc_read_weak(id *location) | |
521 | { return *location; } | |
522 | ||
523 | CF_INLINE id objc_assign_weak(id value, id *location) | |
524 | { return (*location = value); } | |
525 | ||
526 | ||
527 | CF_INLINE void objc_finalizeOnMainThread(Class cls) { } | |
528 | CF_INLINE BOOL objc_is_finalized(void *ptr) { return NO; } | |
529 | CF_INLINE void objc_clear_stack(unsigned long options) { } | |
530 | ||
531 | CF_INLINE BOOL objc_collectingEnabled(void) { return NO; } | |
532 | CF_INLINE void objc_start_collector_thread(void) { } | |
533 | ||
534 | CF_INLINE void objc_collect(unsigned long options) { } | |
535 | ||
536 | #endif | |
537 | ||
538 | #if DEPLOYMENT_TARGET_WINDOWS && defined(__cplusplus) | |
539 | } // extern "C" | |
540 | #endif |