[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