]> git.saurik.com Git - apple/libdispatch.git/blob - src/shims/tsd.h
libdispatch-187.5.tar.gz
[apple/libdispatch.git] / src / shims / tsd.h
1 /*
2 * Copyright (c) 2008-2011 Apple Inc. All rights reserved.
3 *
4 * @APPLE_APACHE_LICENSE_HEADER_START@
5 *
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
17 *
18 * @APPLE_APACHE_LICENSE_HEADER_END@
19 */
20
21 /*
22 * IMPORTANT: This header file describes INTERNAL interfaces to libdispatch
23 * which are subject to change in future releases of Mac OS X. Any applications
24 * relying on these interfaces WILL break.
25 */
26
27 #ifndef __DISPATCH_SHIMS_TSD__
28 #define __DISPATCH_SHIMS_TSD__
29
30 #if HAVE_PTHREAD_MACHDEP_H
31 #include <pthread_machdep.h>
32 #endif
33
34 #define DISPATCH_TSD_INLINE DISPATCH_ALWAYS_INLINE_NDEBUG
35
36 #if USE_APPLE_TSD_OPTIMIZATIONS && HAVE_PTHREAD_KEY_INIT_NP && \
37 !defined(DISPATCH_USE_DIRECT_TSD)
38 #define DISPATCH_USE_DIRECT_TSD 1
39 #endif
40
41 #if DISPATCH_USE_DIRECT_TSD
42 static const unsigned long dispatch_queue_key = __PTK_LIBDISPATCH_KEY0;
43 static const unsigned long dispatch_sema4_key = __PTK_LIBDISPATCH_KEY1;
44 static const unsigned long dispatch_cache_key = __PTK_LIBDISPATCH_KEY2;
45 static const unsigned long dispatch_io_key = __PTK_LIBDISPATCH_KEY3;
46 static const unsigned long dispatch_apply_key = __PTK_LIBDISPATCH_KEY4;
47 static const unsigned long dispatch_bcounter_key = __PTK_LIBDISPATCH_KEY5;
48 //__PTK_LIBDISPATCH_KEY5
49
50 DISPATCH_TSD_INLINE
51 static inline void
52 _dispatch_thread_key_create(const unsigned long *k, void (*d)(void *))
53 {
54 dispatch_assert_zero(pthread_key_init_np((int)*k, d));
55 }
56 #else
57 pthread_key_t dispatch_queue_key;
58 pthread_key_t dispatch_sema4_key;
59 pthread_key_t dispatch_cache_key;
60 pthread_key_t dispatch_io_key;
61 pthread_key_t dispatch_apply_key;
62 pthread_key_t dispatch_bcounter_key;
63
64 DISPATCH_TSD_INLINE
65 static inline void
66 _dispatch_thread_key_create(pthread_key_t *k, void (*d)(void *))
67 {
68 dispatch_assert_zero(pthread_key_create(k, d));
69 }
70 #endif
71
72 #if DISPATCH_USE_TSD_BASE && !DISPATCH_DEBUG
73 #else // DISPATCH_USE_TSD_BASE
74 DISPATCH_TSD_INLINE
75 static inline void
76 _dispatch_thread_setspecific(pthread_key_t k, void *v)
77 {
78 #if DISPATCH_USE_DIRECT_TSD
79 if (_pthread_has_direct_tsd()) {
80 (void)_pthread_setspecific_direct(k, v);
81 return;
82 }
83 #endif
84 dispatch_assert_zero(pthread_setspecific(k, v));
85 }
86
87 DISPATCH_TSD_INLINE
88 static inline void *
89 _dispatch_thread_getspecific(pthread_key_t k)
90 {
91 #if DISPATCH_USE_DIRECT_TSD
92 if (_pthread_has_direct_tsd()) {
93 return _pthread_getspecific_direct(k);
94 }
95 #endif
96 return pthread_getspecific(k);
97 }
98 #endif // DISPATCH_USE_TSD_BASE
99
100 #define _dispatch_thread_self (uintptr_t)pthread_self
101
102 #undef DISPATCH_TSD_INLINE
103
104 #endif