X-Git-Url: https://git.saurik.com/apple/libdispatch.git/blobdiff_plain/0ab744477f85289745b7136840ee7a1990440919..refs/heads/master:/src/semaphore_internal.h diff --git a/src/semaphore_internal.h b/src/semaphore_internal.h index 3af28c0..f9d0983 100644 --- a/src/semaphore_internal.h +++ b/src/semaphore_internal.h @@ -1,20 +1,20 @@ /* - * Copyright (c) 2008-2009 Apple Inc. All rights reserved. + * Copyright (c) 2008-2013 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@ */ @@ -27,25 +27,48 @@ #ifndef __DISPATCH_SEMAPHORE_INTERNAL__ #define __DISPATCH_SEMAPHORE_INTERNAL__ -struct dispatch_sema_notify_s { - struct dispatch_sema_notify_s *dsn_next; - dispatch_queue_t dsn_queue; - void *dsn_ctxt; - void (*dsn_func)(void *); +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(dispatch_semaphore_s, dispatch_semaphore_vtable_s); - long dsema_value; + DISPATCH_SEMAPHORE_HEADER(semaphore, dsema); long dsema_orig; - size_t dsema_sent_ksignals; - semaphore_t dsema_port; - semaphore_t dsema_waiter_port; - size_t dsema_group_waiters; - struct dispatch_sema_notify_s *dsema_notify_head; - struct dispatch_sema_notify_s *dsema_notify_tail; }; -extern const struct dispatch_semaphore_vtable_s _dispatch_semaphore_vtable; +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; + +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, bool *allow_free); +size_t _dispatch_semaphore_debug(dispatch_object_t dou, char *buf, + size_t bufsiz); #endif