X-Git-Url: https://git.saurik.com/apple/libdispatch.git/blobdiff_plain/98cf8cd208104c07d83445c24626e57ca11b5775..refs/heads/master:/src/semaphore_internal.h diff --git a/src/semaphore_internal.h b/src/semaphore_internal.h index 01179cb..f9d0983 100644 --- a/src/semaphore_internal.h +++ b/src/semaphore_internal.h @@ -29,73 +29,46 @@ struct dispatch_queue_s; +#define DISPATCH_SEMAPHORE_HEADER(cls, ns) \ + DISPATCH_OBJECT_HEADER(cls); \ + long volatile ns##_value; \ + _dispatch_sema4_t ns##_sema + +struct dispatch_semaphore_header_s { + DISPATCH_SEMAPHORE_HEADER(semaphore, dsema); +}; + DISPATCH_CLASS_DECL(semaphore); struct dispatch_semaphore_s { - DISPATCH_STRUCT_HEADER(semaphore); -#if USE_MACH_SEM - semaphore_t dsema_port; -#elif USE_POSIX_SEM - sem_t dsema_sem; -#elif USE_WIN32_SEM - HANDLE dsema_handle; -#else -#error "No supported semaphore type" -#endif + DISPATCH_SEMAPHORE_HEADER(semaphore, dsema); long dsema_orig; - long volatile dsema_value; - union { - long volatile dsema_sent_ksignals; - long volatile dsema_group_waiters; - }; - struct dispatch_continuation_s *volatile dsema_notify_head; - struct dispatch_continuation_s *volatile dsema_notify_tail; }; DISPATCH_CLASS_DECL(group); +struct dispatch_group_s { + DISPATCH_SEMAPHORE_HEADER(group, dg); + int volatile dg_waiters; + struct dispatch_continuation_s *volatile dg_notify_head; + struct dispatch_continuation_s *volatile dg_notify_tail; +}; + +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; -#define DISPATCH_GROUP_INITIALIZER(s) \ - { \ - .do_vtable = (const void*)DISPATCH_VTABLE(group), \ - .do_ref_cnt = DISPATCH_OBJECT_GLOBAL_REFCNT, \ - .do_xref_cnt = DISPATCH_OBJECT_GLOBAL_REFCNT, \ - .dsema_value = LONG_MAX - (s), \ - .dsema_orig = LONG_MAX, \ - } +dispatch_group_t _dispatch_group_create_and_enter(void); +void _dispatch_group_dispose(dispatch_object_t dou, bool *allow_free); +size_t _dispatch_group_debug(dispatch_object_t dou, char *buf, + size_t bufsiz); -void _dispatch_semaphore_dispose(dispatch_object_t dou); +void _dispatch_semaphore_dispose(dispatch_object_t dou, bool *allow_free); 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); - -DISPATCH_ALWAYS_INLINE -static inline _dispatch_thread_semaphore_t -_dispatch_get_thread_semaphore(void) -{ - _dispatch_thread_semaphore_t sema = (_dispatch_thread_semaphore_t) - _dispatch_thread_getspecific(dispatch_sema4_key); - if (slowpath(!sema)) { - return _dispatch_thread_semaphore_create(); - } - _dispatch_thread_setspecific(dispatch_sema4_key, NULL); - return sema; -} - -DISPATCH_ALWAYS_INLINE -static inline void -_dispatch_put_thread_semaphore(_dispatch_thread_semaphore_t sema) -{ - _dispatch_thread_semaphore_t old_sema = (_dispatch_thread_semaphore_t) - _dispatch_thread_getspecific(dispatch_sema4_key); - _dispatch_thread_setspecific(dispatch_sema4_key, (void*)sema); - if (slowpath(old_sema)) { - return _dispatch_thread_semaphore_dispose(old_sema); - } -} - #endif