]> git.saurik.com Git - apple/libdispatch.git/blob - src/shims/tsd.h
libdispatch-228.23.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
49 DISPATCH_TSD_INLINE
50 static inline void
51 _dispatch_thread_key_create(const unsigned long *k, void (*d)(void *))
52 {
53 dispatch_assert_zero(pthread_key_init_np((int)*k, d));
54 }
55 #else
56 extern pthread_key_t dispatch_queue_key;
57 extern pthread_key_t dispatch_sema4_key;
58 extern pthread_key_t dispatch_cache_key;
59 extern pthread_key_t dispatch_io_key;
60 extern pthread_key_t dispatch_apply_key;
61 extern pthread_key_t dispatch_bcounter_key;
62
63 DISPATCH_TSD_INLINE
64 static inline void
65 _dispatch_thread_key_create(pthread_key_t *k, void (*d)(void *))
66 {
67 dispatch_assert_zero(pthread_key_create(k, d));
68 }
69 #endif
70
71 #if DISPATCH_USE_TSD_BASE && !DISPATCH_DEBUG
72 #else // DISPATCH_USE_TSD_BASE
73 DISPATCH_TSD_INLINE
74 static inline void
75 _dispatch_thread_setspecific(pthread_key_t k, void *v)
76 {
77 #if DISPATCH_USE_DIRECT_TSD
78 if (_pthread_has_direct_tsd()) {
79 (void)_pthread_setspecific_direct(k, v);
80 return;
81 }
82 #endif
83 dispatch_assert_zero(pthread_setspecific(k, v));
84 }
85
86 DISPATCH_TSD_INLINE
87 static inline void *
88 _dispatch_thread_getspecific(pthread_key_t k)
89 {
90 #if DISPATCH_USE_DIRECT_TSD
91 if (_pthread_has_direct_tsd()) {
92 return _pthread_getspecific_direct(k);
93 }
94 #endif
95 return pthread_getspecific(k);
96 }
97 #endif // DISPATCH_USE_TSD_BASE
98
99 #define _dispatch_thread_self (uintptr_t)pthread_self
100
101 #undef DISPATCH_TSD_INLINE
102
103 #endif