| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272 |
- /*
- * Copyright (c) 2011-2014 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@
- */
- #ifndef __OS_OBJECT__
- #define __OS_OBJECT__
- #ifdef __APPLE__
- #include <Availability.h>
- #include <os/availability.h>
- #include <TargetConditionals.h>
- #include <os/base.h>
- #elif defined(_WIN32)
- #include <os/generic_win_base.h>
- #elif defined(__unix__)
- #include <os/generic_unix_base.h>
- #endif
- /*!
- * @header
- *
- * @preprocinfo
- * By default, libSystem objects such as GCD and XPC objects are declared as
- * Objective-C types when building with an Objective-C compiler. This allows
- * them to participate in ARC, in RR management by the Blocks runtime and in
- * leaks checking by the static analyzer, and enables them to be added to Cocoa
- * collections.
- *
- * NOTE: this requires explicit cancellation of dispatch sources and xpc
- * connections whose handler blocks capture the source/connection object,
- * resp. ensuring that such captures do not form retain cycles (e.g. by
- * declaring the source as __weak).
- *
- * To opt-out of this default behavior, add -DOS_OBJECT_USE_OBJC=0 to your
- * compiler flags.
- *
- * This mode requires a platform with the modern Objective-C runtime, the
- * Objective-C GC compiler option to be disabled, and at least a Mac OS X 10.8
- * or iOS 6.0 deployment target.
- */
- #ifndef OS_OBJECT_HAVE_OBJC_SUPPORT
- #if !defined(__OBJC__) || defined(__OBJC_GC__)
- # define OS_OBJECT_HAVE_OBJC_SUPPORT 0
- #elif !defined(TARGET_OS_MAC) || !TARGET_OS_MAC
- # define OS_OBJECT_HAVE_OBJC_SUPPORT 0
- #elif TARGET_OS_IOS && __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_6_0
- # define OS_OBJECT_HAVE_OBJC_SUPPORT 0
- #elif TARGET_OS_MAC && !TARGET_OS_IPHONE
- # if __MAC_OS_X_VERSION_MIN_REQUIRED < __MAC_10_8
- # define OS_OBJECT_HAVE_OBJC_SUPPORT 0
- # elif defined(__i386__) && __MAC_OS_X_VERSION_MIN_REQUIRED < __MAC_10_12
- # define OS_OBJECT_HAVE_OBJC_SUPPORT 0
- # else
- # define OS_OBJECT_HAVE_OBJC_SUPPORT 1
- # endif
- #else
- # define OS_OBJECT_HAVE_OBJC_SUPPORT 1
- #endif
- #endif // OS_OBJECT_HAVE_OBJC_SUPPORT
- #if OS_OBJECT_HAVE_OBJC_SUPPORT
- #if defined(__swift__) && __swift__ && !OS_OBJECT_USE_OBJC
- #define OS_OBJECT_USE_OBJC 1
- #endif
- #ifndef OS_OBJECT_USE_OBJC
- #define OS_OBJECT_USE_OBJC 1
- #endif
- #elif defined(OS_OBJECT_USE_OBJC) && OS_OBJECT_USE_OBJC
- /* Unsupported platform for OS_OBJECT_USE_OBJC=1 */
- #undef OS_OBJECT_USE_OBJC
- #define OS_OBJECT_USE_OBJC 0
- #else
- #define OS_OBJECT_USE_OBJC 0
- #endif
- #ifndef OS_OBJECT_SWIFT3
- #if defined(SWIFT_SDK_OVERLAY_DISPATCH_EPOCH) && \
- SWIFT_SDK_OVERLAY_DISPATCH_EPOCH >= 2
- #define OS_OBJECT_SWIFT3 1
- #else
- #define OS_OBJECT_SWIFT3 0
- #endif // SWIFT_SDK_OVERLAY_DISPATCH_EPOCH >= 2
- #endif // OS_OBJECT_SWIFT3
- #if OS_OBJECT_USE_OBJC
- #import <objc/NSObject.h>
- #if __has_attribute(objc_independent_class)
- #define OS_OBJC_INDEPENDENT_CLASS __attribute__((objc_independent_class))
- #endif // __has_attribute(objc_independent_class)
- #ifndef OS_OBJC_INDEPENDENT_CLASS
- #define OS_OBJC_INDEPENDENT_CLASS
- #endif
- #define OS_OBJECT_CLASS(name) OS_##name
- #define OS_OBJECT_DECL_PROTOCOL(name, ...) \
- @protocol OS_OBJECT_CLASS(name) __VA_ARGS__ \
- @end
- #define OS_OBJECT_CLASS_IMPLEMENTS_PROTOCOL_IMPL(name, proto) \
- @interface name () <proto> \
- @end
- #define OS_OBJECT_CLASS_IMPLEMENTS_PROTOCOL(name, proto) \
- OS_OBJECT_CLASS_IMPLEMENTS_PROTOCOL_IMPL( \
- OS_OBJECT_CLASS(name), OS_OBJECT_CLASS(proto))
- #define OS_OBJECT_DECL_IMPL(name, ...) \
- OS_OBJECT_DECL_PROTOCOL(name, __VA_ARGS__) \
- typedef NSObject<OS_OBJECT_CLASS(name)> \
- * OS_OBJC_INDEPENDENT_CLASS name##_t
- #define OS_OBJECT_DECL_BASE(name, ...) \
- @interface OS_OBJECT_CLASS(name) : __VA_ARGS__ \
- - (instancetype)init OS_SWIFT_UNAVAILABLE("Unavailable in Swift"); \
- @end
- #define OS_OBJECT_DECL_IMPL_CLASS(name, ...) \
- OS_OBJECT_DECL_BASE(name, ## __VA_ARGS__) \
- typedef OS_OBJECT_CLASS(name) \
- * OS_OBJC_INDEPENDENT_CLASS name##_t
- #define OS_OBJECT_DECL(name, ...) \
- OS_OBJECT_DECL_IMPL(name, <NSObject>)
- #define OS_OBJECT_DECL_SUBCLASS(name, super) \
- OS_OBJECT_DECL_IMPL(name, <OS_OBJECT_CLASS(super)>)
- #if __has_attribute(ns_returns_retained)
- #define OS_OBJECT_RETURNS_RETAINED __attribute__((__ns_returns_retained__))
- #else
- #define OS_OBJECT_RETURNS_RETAINED
- #endif
- #if __has_attribute(ns_consumed)
- #define OS_OBJECT_CONSUMED __attribute__((__ns_consumed__))
- #else
- #define OS_OBJECT_CONSUMED
- #endif
- #if __has_feature(objc_arc)
- #define OS_OBJECT_BRIDGE __bridge
- #define OS_WARN_RESULT_NEEDS_RELEASE
- #else
- #define OS_OBJECT_BRIDGE
- #define OS_WARN_RESULT_NEEDS_RELEASE OS_WARN_RESULT
- #endif
- #if __has_attribute(objc_runtime_visible) && \
- ((defined(__MAC_OS_X_VERSION_MIN_REQUIRED) && \
- __MAC_OS_X_VERSION_MIN_REQUIRED < __MAC_10_12) || \
- (defined(__IPHONE_OS_VERSION_MIN_REQUIRED) && \
- !defined(__TV_OS_VERSION_MIN_REQUIRED) && \
- !defined(__WATCH_OS_VERSION_MIN_REQUIRED) && \
- __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_10_0) || \
- (defined(__TV_OS_VERSION_MIN_REQUIRED) && \
- __TV_OS_VERSION_MIN_REQUIRED < __TVOS_10_0) || \
- (defined(__WATCH_OS_VERSION_MIN_REQUIRED) && \
- __WATCH_OS_VERSION_MIN_REQUIRED < __WATCHOS_3_0))
- /*
- * To provide backward deployment of ObjC objects in Swift on pre-10.12
- * SDKs, OS_object classes can be marked as OS_OBJECT_OBJC_RUNTIME_VISIBLE.
- * When compiling with a deployment target earlier than OS X 10.12 (iOS 10.0,
- * tvOS 10.0, watchOS 3.0) the Swift compiler will only refer to this type at
- * runtime (using the ObjC runtime).
- */
- #define OS_OBJECT_OBJC_RUNTIME_VISIBLE __attribute__((objc_runtime_visible))
- #else
- #define OS_OBJECT_OBJC_RUNTIME_VISIBLE
- #endif
- #ifndef OS_OBJECT_USE_OBJC_RETAIN_RELEASE
- #if defined(__clang_analyzer__)
- #define OS_OBJECT_USE_OBJC_RETAIN_RELEASE 1
- #elif __has_feature(objc_arc) && !OS_OBJECT_SWIFT3
- #define OS_OBJECT_USE_OBJC_RETAIN_RELEASE 1
- #else
- #define OS_OBJECT_USE_OBJC_RETAIN_RELEASE 0
- #endif
- #endif
- #if OS_OBJECT_SWIFT3
- #define OS_OBJECT_DECL_SWIFT(name) \
- OS_EXPORT OS_OBJECT_OBJC_RUNTIME_VISIBLE \
- OS_OBJECT_DECL_IMPL_CLASS(name, NSObject)
- #define OS_OBJECT_DECL_SUBCLASS_SWIFT(name, super) \
- OS_EXPORT OS_OBJECT_OBJC_RUNTIME_VISIBLE \
- OS_OBJECT_DECL_IMPL_CLASS(name, OS_OBJECT_CLASS(super))
- OS_EXPORT OS_OBJECT_OBJC_RUNTIME_VISIBLE
- OS_OBJECT_DECL_BASE(object, NSObject);
- #endif // OS_OBJECT_SWIFT3
- #else
- /*! @parseOnly */
- #define OS_OBJECT_RETURNS_RETAINED
- /*! @parseOnly */
- #define OS_OBJECT_CONSUMED
- /*! @parseOnly */
- #define OS_OBJECT_BRIDGE
- /*! @parseOnly */
- #define OS_WARN_RESULT_NEEDS_RELEASE OS_WARN_RESULT
- /*! @parseOnly */
- #define OS_OBJECT_OBJC_RUNTIME_VISIBLE
- #define OS_OBJECT_USE_OBJC_RETAIN_RELEASE 0
- #endif
- #if OS_OBJECT_SWIFT3
- #define OS_OBJECT_DECL_CLASS(name) \
- OS_OBJECT_DECL_SUBCLASS_SWIFT(name, object)
- #elif OS_OBJECT_USE_OBJC
- #define OS_OBJECT_DECL_CLASS(name) \
- OS_OBJECT_DECL(name)
- #else
- #define OS_OBJECT_DECL_CLASS(name) \
- typedef struct name##_s *name##_t
- #endif
- #define OS_OBJECT_GLOBAL_OBJECT(type, object) ((OS_OBJECT_BRIDGE type)&(object))
- __BEGIN_DECLS
- /*!
- * @function os_retain
- *
- * @abstract
- * Increment the reference count of an os_object.
- *
- * @discussion
- * On a platform with the modern Objective-C runtime this is exactly equivalent
- * to sending the object the -[retain] message.
- *
- * @param object
- * The object to retain.
- *
- * @result
- * The retained object.
- */
- API_AVAILABLE(macos(10.10), ios(8.0))
- OS_EXPORT OS_SWIFT_UNAVAILABLE("Can't be used with ARC")
- void*
- os_retain(void *object);
- #if OS_OBJECT_USE_OBJC
- #undef os_retain
- #define os_retain(object) [object retain]
- #endif
- /*!
- * @function os_release
- *
- * @abstract
- * Decrement the reference count of a os_object.
- *
- * @discussion
- * On a platform with the modern Objective-C runtime this is exactly equivalent
- * to sending the object the -[release] message.
- *
- * @param object
- * The object to release.
- */
- API_AVAILABLE(macos(10.10), ios(8.0))
- OS_EXPORT
- void OS_SWIFT_UNAVAILABLE("Can't be used with ARC")
- os_release(void *object);
- #if OS_OBJECT_USE_OBJC
- #undef os_release
- #define os_release(object) [object release]
- #endif
- __END_DECLS
- #endif
|