From 77572bdaec82f234b785fb5a470294affebf9dfc Mon Sep 17 00:00:00 2001 From: Matthew Chen Date: Wed, 10 Jan 2018 12:36:23 -0500 Subject: [PATCH] Retain changes from session database branch. --- SignalServiceKit/src/Util/OWSAsserts.h | 127 +++++++++++++++++++++++++ SignalServiceKit/src/Util/OWSAsserts.m | 14 +++ 2 files changed, 141 insertions(+) create mode 100755 SignalServiceKit/src/Util/OWSAsserts.h create mode 100755 SignalServiceKit/src/Util/OWSAsserts.m diff --git a/SignalServiceKit/src/Util/OWSAsserts.h b/SignalServiceKit/src/Util/OWSAsserts.h new file mode 100755 index 000000000..c417c12b6 --- /dev/null +++ b/SignalServiceKit/src/Util/OWSAsserts.h @@ -0,0 +1,127 @@ +// +// Copyright (c) 2017 Open Whisper Systems. All rights reserved. +// + +NS_ASSUME_NONNULL_BEGIN + +#ifndef OWSAssert + +#ifdef DEBUG + +#define USE_ASSERTS + +#define CONVERT_TO_STRING(X) #X +#define CONVERT_EXPR_TO_STRING(X) CONVERT_TO_STRING(X) + +// OWSAssert() and OWSFail() should be used in Obj-C methods. +// OWSCAssert() and OWSCFail() should be used in free functions. + +#define OWSAssert(X) \ + if (!(X)) { \ + DDLogError(@"%s Assertion failed: %s", __PRETTY_FUNCTION__, CONVERT_EXPR_TO_STRING(X)); \ + [DDLog flushLog]; \ + NSAssert(0, @"Assertion failed: %s", CONVERT_EXPR_TO_STRING(X)); \ + } + +#define OWSCAssert(X) \ + if (!(X)) { \ + DDLogError(@"%s Assertion failed: %s", __PRETTY_FUNCTION__, CONVERT_EXPR_TO_STRING(X)); \ + [DDLog flushLog]; \ + NSCAssert(0, @"Assertion failed: %s", CONVERT_EXPR_TO_STRING(X)); \ + } + +#define OWSFail(message, ...) \ + { \ + NSString *formattedMessage = [NSString stringWithFormat:message, ##__VA_ARGS__]; \ + DDLogError(@"%s %@", __PRETTY_FUNCTION__, formattedMessage); \ + [DDLog flushLog]; \ + NSAssert(0, formattedMessage); \ + } + +#define OWSCFail(message, ...) \ + { \ + NSString *formattedMessage = [NSString stringWithFormat:message, ##__VA_ARGS__]; \ + DDLogError(@"%s %@", __PRETTY_FUNCTION__, formattedMessage); \ + [DDLog flushLog]; \ + NSCAssert(0, formattedMessage); \ + } + +#define OWSFailNoFormat(message) \ + { \ + DDLogError(@"%s %@", __PRETTY_FUNCTION__, message); \ + [DDLog flushLog]; \ + NSAssert(0, message); \ + } + +#define OWSCFailNoFormat(message) \ + { \ + DDLogError(@"%s %@", __PRETTY_FUNCTION__, message); \ + [DDLog flushLog]; \ + NSCAssert(0, message); \ + } + +#else + +#define OWSAssert(X) +#define OWSCAssert(X) +#define OWSFail(message, ...) +#define OWSCFail(message, ...) +#define OWSFailNoFormat(X) +#define OWSCFailNoFormat(X) + +#endif + +#endif + +#define OWS_ABSTRACT_METHOD() OWSFail(@"Method needs to be implemented by subclasses.") + +#pragma mark - Singleton Asserts + +// The "singleton asserts" can be used to ensure +// that we only create a singleton once. +// +// The simplest way to use them is the OWSSingletonAssert() macro. +// It is intended to be used inside the singleton's initializer. +// +// If, however, a singleton has multiple possible initializers, +// you need to: +// +// 1. Use OWSSingletonAssertFlag() outside the class definition. +// 2. Use OWSSingletonAssertInit() in each initializer. + +#ifndef SSK_BUILDING_FOR_TESTS +#ifdef DEBUG + +#define ENFORCE_SINGLETONS + +#endif +#endif + +#ifdef ENFORCE_SINGLETONS + +#define OWSSingletonAssertFlag() static BOOL _isSingletonCreated = NO; + +#define OWSSingletonAssertInit() \ + @synchronized([self class]) \ + { \ + OWSAssert(!_isSingletonCreated); \ + _isSingletonCreated = YES; \ + } + +#define OWSSingletonAssert() OWSSingletonAssertFlag() OWSSingletonAssertInit() + +#else + +#define OWSSingletonAssertFlag() +#define OWSSingletonAssertInit() +#define OWSSingletonAssert() + +#endif + +// This macro is intended for use in Objective-C. +#define OWSAssertIsOnMainThread() OWSCAssert([NSThread isMainThread]) + +// This function is intended for use in Swift. +void AssertIsOnMainThread(void); + +NS_ASSUME_NONNULL_END diff --git a/SignalServiceKit/src/Util/OWSAsserts.m b/SignalServiceKit/src/Util/OWSAsserts.m new file mode 100755 index 000000000..df97c17ab --- /dev/null +++ b/SignalServiceKit/src/Util/OWSAsserts.m @@ -0,0 +1,14 @@ +// +// Copyright (c) 2017 Open Whisper Systems. All rights reserved. +// + +#import "OWSAsserts.h" + +NS_ASSUME_NONNULL_BEGIN + +void AssertIsOnMainThread() +{ + OWSCAssert([NSThread isMainThread]); +} + +NS_ASSUME_NONNULL_END