[libdispatch-dev] [PATCH 06/17] split os_shims.h into separate files
Paolo Bonzini
bonzini at gnu.org
Sun Oct 18 08:04:06 PDT 2009
os_shims.h is quite unwieldy (and sooner or later I'd like to introduce
__thread support, which would make it worse), so here I split it
into multiple files. At the same time, planning to consolidate the
shims vs. compat terminology in the next patch, I create a src/shims/
directory and place these files there.
---
src/Makefile.am | 10 ++-
src/os_shims.h | 176 +----------------------------------------
src/{shims.c => shims/mach.c} | 0
src/shims/perfmon.h | 90 +++++++++++++++++++++
src/shims/time.h | 53 ++++++++++++
src/shims/tsd.h | 120 ++++++++++++++++++++++++++++
6 files changed, 274 insertions(+), 175 deletions(-)
rename src/{shims.c => shims/mach.c} (100%)
create mode 100644 src/shims/perfmon.h
create mode 100644 src/shims/time.h
create mode 100644 src/shims/tsd.h
diff --git a/src/Makefile.am b/src/Makefile.am
index 6473837..f4b2cde 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -3,6 +3,7 @@
#
lib_LTLIBRARIES=libdispatch.la
+noinst_LTLIBRARIES=libshims.la
libdispatch_la_SOURCES= \
apply.c \
@@ -11,10 +12,12 @@ libdispatch_la_SOURCES= \
once.c \
queue.c \
semaphore.c \
- shims.c \
source.c \
time.c
+libshims_la_SOURCES= \
+ shims/mach.c
+
libdispatch_la_CFLAGS=-Wall
INCLUDES=-I$(top_builddir) -I$(top_srcdir) \
@APPLE_LIBC_SOURCE_PATH@ @APPLE_XNU_SOURCE_PATH@
@@ -26,8 +29,11 @@ libdispatch_la_SOURCES+= \
legacy.c
endif
+libdispatch_la_LIBADD=libshims.la
+libdispatch_la_DEPENDENCIES=libshims.la
+
if USE_LIBPTHREAD
-libdispatch_la_LIBADD=-lpthread
+libdispatch_la_LIBADD+=-lpthread
endif
if USE_MIG
diff --git a/src/os_shims.h b/src/os_shims.h
index a750ba3..d033a78 100644
--- a/src/os_shims.h
+++ b/src/os_shims.h
@@ -42,178 +42,8 @@
__private_extern__ const char *__crashreporter_info__;
#endif
-#ifdef HAVE_PTHREAD_KEY_INIT_NP
-static const unsigned long dispatch_queue_key = __PTK_LIBDISPATCH_KEY0;
-static const unsigned long dispatch_sema4_key = __PTK_LIBDISPATCH_KEY1;
-static const unsigned long dispatch_cache_key = __PTK_LIBDISPATCH_KEY2;
-static const unsigned long dispatch_bcounter_key = __PTK_LIBDISPATCH_KEY3;
-//__PTK_LIBDISPATCH_KEY4
-//__PTK_LIBDISPATCH_KEY5
-#else
-pthread_key_t dispatch_queue_key;
-pthread_key_t dispatch_sema4_key;
-pthread_key_t dispatch_cache_key;
-pthread_key_t dispatch_bcounter_key;
-#endif
-
-#ifdef USE_APPLE_TSD_OPTIMIZATIONS
-#define SIMULATE_5491082 1
-#ifndef _PTHREAD_TSD_OFFSET
-#define _PTHREAD_TSD_OFFSET 0
-#endif
-
-static inline void
-_dispatch_thread_setspecific(unsigned long k, void *v)
-{
-#if defined(SIMULATE_5491082) && defined(__i386__)
- asm("movl %1, %%gs:%0" : "=m" (*(void **)(k * sizeof(void *) + _PTHREAD_TSD_OFFSET)) : "ri" (v) : "memory");
-#elif defined(SIMULATE_5491082) && defined(__x86_64__)
- asm("movq %1, %%gs:%0" : "=m" (*(void **)(k * sizeof(void *) + _PTHREAD_TSD_OFFSET)) : "rn" (v) : "memory");
-#else
- int res;
- if (_pthread_has_direct_tsd()) {
- res = _pthread_setspecific_direct(k, v);
- } else {
- res = pthread_setspecific(k, v);
- }
- dispatch_assert_zero(res);
-#endif
-}
-
-static inline void *
-_dispatch_thread_getspecific(unsigned long k)
-{
-#if defined(SIMULATE_5491082) && (defined(__i386__) || defined(__x86_64__))
- void *rval;
- asm("mov %%gs:%1, %0" : "=r" (rval) : "m" (*(void **)(k * sizeof(void *) + _PTHREAD_TSD_OFFSET)));
- return rval;
-#else
- if (_pthread_has_direct_tsd()) {
- return _pthread_getspecific_direct(k);
- } else {
- return pthread_getspecific(k);
- }
-#endif
-}
-
-#else /* !USE_APPLE_TSD_OPTIMIZATIONS */
-
-static inline void
-_dispatch_thread_setspecific(pthread_key_t k, void *v)
-{
- int res;
-
- res = pthread_setspecific(k, v);
- dispatch_assert_zero(res);
-}
-
-static inline void *
-_dispatch_thread_getspecific(pthread_key_t k)
-{
-
- return pthread_getspecific(k);
-}
-#endif /* USE_APPLE_TSD_OPTIMIZATIONS */
-
-#ifdef HAVE_PTHREAD_KEY_INIT_NP
-static inline void
-_dispatch_thread_key_init_np(unsigned long k, void (*d)(void *))
-{
- dispatch_assert_zero(pthread_key_init_np((int)k, d));
-}
-#else
-static inline void
-_dispatch_thread_key_create(pthread_key_t *key, void (*destructor)(void *))
-{
-
- dispatch_assert_zero(pthread_key_create(key, destructor));
-}
-#endif
-
-#define _dispatch_thread_self pthread_self
-
-
-#if DISPATCH_PERF_MON
-
-#if defined (USE_APPLE_TSD_OPTIMIZATIONS) && defined(SIMULATE_5491082) && (defined(__i386__) || defined(__x86_64__))
-#ifdef __LP64__
-#define _dispatch_workitem_inc() asm("incq %%gs:%0" : "+m" \
- (*(void **)(dispatch_bcounter_key * sizeof(void *) + _PTHREAD_TSD_OFFSET)) :: "cc")
-#define _dispatch_workitem_dec() asm("decq %%gs:%0" : "+m" \
- (*(void **)(dispatch_bcounter_key * sizeof(void *) + _PTHREAD_TSD_OFFSET)) :: "cc")
-#else
-#define _dispatch_workitem_inc() asm("incl %%gs:%0" : "+m" \
- (*(void **)(dispatch_bcounter_key * sizeof(void *) + _PTHREAD_TSD_OFFSET)) :: "cc")
-#define _dispatch_workitem_dec() asm("decl %%gs:%0" : "+m" \
- (*(void **)(dispatch_bcounter_key * sizeof(void *) + _PTHREAD_TSD_OFFSET)) :: "cc")
-#endif
-#else /* !USE_APPLE_TSD_OPTIMIZATIONS */
-static inline void
-_dispatch_workitem_inc(void)
-{
- unsigned long cnt = (unsigned long)_dispatch_thread_getspecific(dispatch_bcounter_key);
- _dispatch_thread_setspecific(dispatch_bcounter_key, (void *)++cnt);
-}
-static inline void
-_dispatch_workitem_dec(void)
-{
- unsigned long cnt = (unsigned long)_dispatch_thread_getspecific(dispatch_bcounter_key);
- _dispatch_thread_setspecific(dispatch_bcounter_key, (void *)--cnt);
-}
-#endif /* USE_APPLE_TSD_OPTIMIZATIONS */
-
-// C99 doesn't define flsll() or ffsll()
-#ifdef __LP64__
-#define flsll(x) flsl(x)
-#else
-static inline unsigned int
-flsll(uint64_t val)
-{
- union {
- struct {
-#ifdef __BIG_ENDIAN__
- unsigned int hi, low;
-#else
- unsigned int low, hi;
-#endif
- } words;
- uint64_t word;
- } _bucket = {
- .word = val,
- };
- if (_bucket.words.hi) {
- return fls(_bucket.words.hi) + 32;
- }
- return fls(_bucket.words.low);
-}
-#endif
-
-#else
-#define _dispatch_workitem_inc()
-#define _dispatch_workitem_dec()
-#endif // DISPATCH_PERF_MON
-
-static inline uint64_t
-_dispatch_absolute_time(void)
-{
-#ifndef HAVE_MACH_ABSOLUTE_TIME
- struct timespec ts;
- int ret;
-
-#if HAVE_DECL_CLOCK_UPTIME
- ret = clock_gettime(CLOCK_UPTIME, &ts);
-#elif HAVE_DECL_CLOCK_MONOTONIC
- ret = clock_gettime(CLOCK_MONOTONIC, &ts);
-#else
-#error "clock_gettime: no supported absolute time clock"
-#endif
- dispatch_assume_zero(ret);
-
- /* XXXRW: Some kind of overflow detection needed? */
- return (ts.tv_sec * NSEC_PER_SEC + ts.tv_nsec);
-#else
- return mach_absolute_time();
-#endif
-}
+#include "shims/tsd.h"
+#include "shims/perfmon.h"
+#include "shims/time.h"
#endif
diff --git a/src/shims.c b/src/shims/mach.c
similarity index 100%
rename from src/shims.c
rename to src/shims/mach.c
diff --git a/src/shims/perfmon.h b/src/shims/perfmon.h
new file mode 100644
index 0000000..ddf545b
--- /dev/null
+++ b/src/shims/perfmon.h
@@ -0,0 +1,90 @@
+/*
+ * Copyright (c) 2008-2009 Apple Inc. All rights reserved.
+ *
+ * @APPLE_APACHE_LICENSE_HEADER_START@
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * @APPLE_APACHE_LICENSE_HEADER_END@
+ */
+
+/*
+ * IMPORTANT: This header file describes INTERNAL interfaces to libdispatch
+ * which are subject to change in future releases of Mac OS X. Any applications
+ * relying on these interfaces WILL break.
+ */
+
+#ifndef __DISPATCH_SHIMS_PERFMON__
+#define __DISPATCH_SHIMS_PERFMON__
+
+#if DISPATCH_PERF_MON
+
+#if defined (USE_APPLE_TSD_OPTIMIZATIONS) && defined(SIMULATE_5491082) && (defined(__i386__) || defined(__x86_64__))
+#ifdef __LP64__
+#define _dispatch_workitem_inc() asm("incq %%gs:%0" : "+m" \
+ (*(void **)(dispatch_bcounter_key * sizeof(void *) + _PTHREAD_TSD_OFFSET)) :: "cc")
+#define _dispatch_workitem_dec() asm("decq %%gs:%0" : "+m" \
+ (*(void **)(dispatch_bcounter_key * sizeof(void *) + _PTHREAD_TSD_OFFSET)) :: "cc")
+#else
+#define _dispatch_workitem_inc() asm("incl %%gs:%0" : "+m" \
+ (*(void **)(dispatch_bcounter_key * sizeof(void *) + _PTHREAD_TSD_OFFSET)) :: "cc")
+#define _dispatch_workitem_dec() asm("decl %%gs:%0" : "+m" \
+ (*(void **)(dispatch_bcounter_key * sizeof(void *) + _PTHREAD_TSD_OFFSET)) :: "cc")
+#endif
+#else /* !USE_APPLE_TSD_OPTIMIZATIONS */
+static inline void
+_dispatch_workitem_inc(void)
+{
+ unsigned long cnt = (unsigned long)_dispatch_thread_getspecific(dispatch_bcounter_key);
+ _dispatch_thread_setspecific(dispatch_bcounter_key, (void *)++cnt);
+}
+static inline void
+_dispatch_workitem_dec(void)
+{
+ unsigned long cnt = (unsigned long)_dispatch_thread_getspecific(dispatch_bcounter_key);
+ _dispatch_thread_setspecific(dispatch_bcounter_key, (void *)--cnt);
+}
+#endif /* USE_APPLE_TSD_OPTIMIZATIONS */
+
+// C99 doesn't define flsll() or ffsll()
+#ifdef __LP64__
+#define flsll(x) flsl(x)
+#else
+static inline unsigned int
+flsll(uint64_t val)
+{
+ union {
+ struct {
+#ifdef __BIG_ENDIAN__
+ unsigned int hi, low;
+#else
+ unsigned int low, hi;
+#endif
+ } words;
+ uint64_t word;
+ } _bucket = {
+ .word = val,
+ };
+ if (_bucket.words.hi) {
+ return fls(_bucket.words.hi) + 32;
+ }
+ return fls(_bucket.words.low);
+}
+#endif
+
+#else
+#define _dispatch_workitem_inc()
+#define _dispatch_workitem_dec()
+#endif // DISPATCH_PERF_MON
+
+#endif
diff --git a/src/shims/time.h b/src/shims/time.h
new file mode 100644
index 0000000..b786b88
--- /dev/null
+++ b/src/shims/time.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright (c) 2008-2009 Apple Inc. All rights reserved.
+ *
+ * @APPLE_APACHE_LICENSE_HEADER_START@
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * @APPLE_APACHE_LICENSE_HEADER_END@
+ */
+
+/*
+ * IMPORTANT: This header file describes INTERNAL interfaces to libdispatch
+ * which are subject to change in future releases of Mac OS X. Any applications
+ * relying on these interfaces WILL break.
+ */
+
+#ifndef __DISPATCH_SHIMS_TIME__
+#define __DISPATCH_SHIMS_TIME__
+
+static inline uint64_t
+_dispatch_absolute_time(void)
+{
+#ifndef HAVE_MACH_ABSOLUTE_TIME
+ struct timespec ts;
+ int ret;
+
+#if HAVE_DECL_CLOCK_UPTIME
+ ret = clock_gettime(CLOCK_UPTIME, &ts);
+#elif HAVE_DECL_CLOCK_MONOTONIC
+ ret = clock_gettime(CLOCK_MONOTONIC, &ts);
+#else
+#error "clock_gettime: no supported absolute time clock"
+#endif
+ dispatch_assume_zero(ret);
+
+ /* XXXRW: Some kind of overflow detection needed? */
+ return (ts.tv_sec * NSEC_PER_SEC + ts.tv_nsec);
+#else
+ return mach_absolute_time();
+#endif
+}
+
+#endif
diff --git a/src/shims/tsd.h b/src/shims/tsd.h
new file mode 100644
index 0000000..ee53857
--- /dev/null
+++ b/src/shims/tsd.h
@@ -0,0 +1,120 @@
+/*
+ * Copyright (c) 2008-2009 Apple Inc. All rights reserved.
+ *
+ * @APPLE_APACHE_LICENSE_HEADER_START@
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * @APPLE_APACHE_LICENSE_HEADER_END@
+ */
+
+/*
+ * IMPORTANT: This header file describes INTERNAL interfaces to libdispatch
+ * which are subject to change in future releases of Mac OS X. Any applications
+ * relying on these interfaces WILL break.
+ */
+
+#ifndef __DISPATCH_SHIMS_TSD__
+#define __DISPATCH_SHIMS_TSD__
+
+#ifdef HAVE_PTHREAD_KEY_INIT_NP
+static const unsigned long dispatch_queue_key = __PTK_LIBDISPATCH_KEY0;
+static const unsigned long dispatch_sema4_key = __PTK_LIBDISPATCH_KEY1;
+static const unsigned long dispatch_cache_key = __PTK_LIBDISPATCH_KEY2;
+static const unsigned long dispatch_bcounter_key = __PTK_LIBDISPATCH_KEY3;
+//__PTK_LIBDISPATCH_KEY4
+//__PTK_LIBDISPATCH_KEY5
+#else
+pthread_key_t dispatch_queue_key;
+pthread_key_t dispatch_sema4_key;
+pthread_key_t dispatch_cache_key;
+pthread_key_t dispatch_bcounter_key;
+#endif
+
+#ifdef USE_APPLE_TSD_OPTIMIZATIONS
+#define SIMULATE_5491082 1
+#ifndef _PTHREAD_TSD_OFFSET
+#define _PTHREAD_TSD_OFFSET 0
+#endif
+
+static inline void
+_dispatch_thread_setspecific(unsigned long k, void *v)
+{
+#if defined(SIMULATE_5491082) && defined(__i386__)
+ asm("movl %1, %%gs:%0" : "=m" (*(void **)(k * sizeof(void *) + _PTHREAD_TSD_OFFSET)) : "ri" (v) : "memory");
+#elif defined(SIMULATE_5491082) && defined(__x86_64__)
+ asm("movq %1, %%gs:%0" : "=m" (*(void **)(k * sizeof(void *) + _PTHREAD_TSD_OFFSET)) : "rn" (v) : "memory");
+#else
+ int res;
+ if (_pthread_has_direct_tsd()) {
+ res = _pthread_setspecific_direct(k, v);
+ } else {
+ res = pthread_setspecific(k, v);
+ }
+ dispatch_assert_zero(res);
+#endif
+}
+
+static inline void *
+_dispatch_thread_getspecific(unsigned long k)
+{
+#if defined(SIMULATE_5491082) && (defined(__i386__) || defined(__x86_64__))
+ void *rval;
+ asm("mov %%gs:%1, %0" : "=r" (rval) : "m" (*(void **)(k * sizeof(void *) + _PTHREAD_TSD_OFFSET)));
+ return rval;
+#else
+ if (_pthread_has_direct_tsd()) {
+ return _pthread_getspecific_direct(k);
+ } else {
+ return pthread_getspecific(k);
+ }
+#endif
+}
+
+#else /* !USE_APPLE_TSD_OPTIMIZATIONS */
+
+static inline void
+_dispatch_thread_setspecific(pthread_key_t k, void *v)
+{
+ int res;
+
+ res = pthread_setspecific(k, v);
+ dispatch_assert_zero(res);
+}
+
+static inline void *
+_dispatch_thread_getspecific(pthread_key_t k)
+{
+
+ return pthread_getspecific(k);
+}
+#endif /* USE_APPLE_TSD_OPTIMIZATIONS */
+
+#ifdef HAVE_PTHREAD_KEY_INIT_NP
+static inline void
+_dispatch_thread_key_init_np(unsigned long k, void (*d)(void *))
+{
+ dispatch_assert_zero(pthread_key_init_np((int)k, d));
+}
+#else
+static inline void
+_dispatch_thread_key_create(pthread_key_t *key, void (*destructor)(void *))
+{
+
+ dispatch_assert_zero(pthread_key_create(key, destructor));
+}
+#endif
+
+#define _dispatch_thread_self pthread_self
+
+#endif
--
1.6.2.5
More information about the libdispatch-dev
mailing list