-void _dispatch_semaphore_dispose(dispatch_object_t dou);
-size_t _dispatch_semaphore_debug(dispatch_object_t dou, char *buf,
- size_t bufsiz);
-
-typedef uintptr_t _dispatch_thread_semaphore_t;
-
-_dispatch_thread_semaphore_t _dispatch_thread_semaphore_create(void);
-void _dispatch_thread_semaphore_dispose(_dispatch_thread_semaphore_t);
-void _dispatch_thread_semaphore_wait(_dispatch_thread_semaphore_t);
-void _dispatch_thread_semaphore_signal(_dispatch_thread_semaphore_t);
+typedef union {
+ struct dispatch_semaphore_header_s *_dsema_hdr;
+ struct dispatch_semaphore_s *_dsema;
+ struct dispatch_group_s *_dg;
+#if USE_OBJC
+ dispatch_semaphore_t _objc_dsema;
+ dispatch_group_t _objc_dg;
+#endif
+} dispatch_semaphore_class_t DISPATCH_TRANSPARENT_UNION;