X-Git-Url: https://git.saurik.com/apple/libdispatch.git/blobdiff_plain/45201a42773e3f9687334f0f931d12bc311c2ceb..refs/heads/master:/src/data_internal.h?ds=inline diff --git a/src/data_internal.h b/src/data_internal.h index 40a780c..19fc3d9 100644 --- a/src/data_internal.h +++ b/src/data_internal.h @@ -38,30 +38,32 @@ typedef struct range_record_s { size_t length; } range_record; -#if USE_OBJC -#if OS_OBJECT_USE_OBJC -@interface DISPATCH_CLASS(data) : NSObject -@end +#if OS_OBJECT_HAVE_OBJC2 +#define DISPATCH_DATA_IS_BRIDGED_TO_NSDATA 1 +#else +#define DISPATCH_DATA_IS_BRIDGED_TO_NSDATA 0 #endif + +#if DISPATCH_DATA_IS_BRIDGED_TO_NSDATA DISPATCH_OBJC_CLASS_DECL(data); DISPATCH_OBJC_CLASS_DECL(data_empty); -#define DISPATCH_DATA_CLASS DISPATCH_OBJC_CLASS(data) -#define DISPATCH_DATA_EMPTY_CLASS DISPATCH_OBJC_CLASS(data_empty) -#else // USE_OBJC +_OS_OBJECT_DECL_PROTOCOL(dispatch_data, dispatch_object); +#define DISPATCH_DATA_CLASS DISPATCH_VTABLE(data) +#define DISPATCH_DATA_EMPTY_CLASS DISPATCH_VTABLE(data_empty) +#else DISPATCH_CLASS_DECL(data); #define DISPATCH_DATA_CLASS DISPATCH_VTABLE(data) -#define DISPATCH_DATA_EMPTY_CLASS DISPATCH_VTABLE(data) -#endif // USE_OBJC +#endif // DISPATCH_DATA_IS_BRIDGED_TO_NSDATA struct dispatch_data_s { -#if USE_OBJC +#if DISPATCH_DATA_IS_BRIDGED_TO_NSDATA const void *do_vtable; dispatch_queue_t do_targetq; void *ctxt; void *finalizer; -#else // USE_OBJC - DISPATCH_STRUCT_HEADER(data); -#endif // USE_OBJC +#else + DISPATCH_OBJECT_HEADER(data); +#endif // DISPATCH_DATA_IS_BRIDGED_TO_NSDATA const void *buf; dispatch_block_t destructor; size_t size, num_records; @@ -79,7 +81,7 @@ _dispatch_data_leaf(struct dispatch_data_s *dd) * This is about the number of records required to hold that dispatch data * if it's not a leaf. Callers either want that value, or have to special * case the case when the dispatch data *is* a leaf before (and that the actual - * embeded record count of that dispatch data is 0) + * embedded record count of that dispatch data is 0) */ DISPATCH_ALWAYS_INLINE static inline size_t @@ -98,18 +100,17 @@ struct dispatch_data_format_type_s { dispatch_transform_t encode; }; -void dispatch_data_init(dispatch_data_t data, const void *buffer, size_t size, - dispatch_block_t destructor); -void _dispatch_data_dispose(dispatch_data_t data); +void _dispatch_data_init_with_bytes(dispatch_data_t data, const void *buffer, + size_t size, dispatch_block_t destructor); +void _dispatch_data_dispose(dispatch_data_t data, bool *allow_free); +void _dispatch_data_set_target_queue(struct dispatch_data_s *dd, + dispatch_queue_t tq); size_t _dispatch_data_debug(dispatch_data_t data, char* buf, size_t bufsiz); -const void* -_dispatch_data_get_flattened_bytes(struct dispatch_data_s *dd); +const void* _dispatch_data_get_flattened_bytes(struct dispatch_data_s *dd); #if !defined(__cplusplus) -#if !__OBJC2__ -const dispatch_block_t _dispatch_data_destructor_inline; +extern const dispatch_block_t _dispatch_data_destructor_inline; #define DISPATCH_DATA_DESTRUCTOR_INLINE (_dispatch_data_destructor_inline) -#endif // !__OBJC2__ /* * the out parameters are about seeing "through" trivial subranges @@ -135,7 +136,7 @@ _dispatch_data_map_direct(struct dispatch_data_s *dd, size_t offset, if (fastpath(_dispatch_data_leaf(dd))) { buffer = dd->buf + offset; } else { - buffer = dispatch_atomic_load((void **)&dd->buf, relaxed); + buffer = os_atomic_load((void **)&dd->buf, relaxed); if (buffer) { buffer += offset; }