1e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie/*
2e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie * Copyright (C) 2016 The Android Open Source Project
3e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie *
4e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie * Licensed under the Apache License, Version 2.0 (the "License");
5e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie * you may not use this file except in compliance with the License.
6e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie * You may obtain a copy of the License at
7e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie *
8e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie *      http://www.apache.org/licenses/LICENSE-2.0
9e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie *
10e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie * Unless required by applicable law or agreed to in writing, software
11e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie * distributed under the License is distributed on an "AS IS" BASIS,
12e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie * See the License for the specific language governing permissions and
14e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie * limitations under the License.
15e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie */
16e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie
17e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie#ifndef CHRE_PLATFORM_ASSERT_H_
18e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie#define CHRE_PLATFORM_ASSERT_H_
19e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie
20e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie#include "chre/platform/log.h"
21e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie
22e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie/**
23e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie * @file
24e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie * Includes the platform-specific header file that supplies an assertion macro.
25e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie * The platform header must supply the following symbol as a macro or free
26e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie * function:
27e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie *
28926f1b91231f88c3669f10dec8f56e24ae16b957Andrew Rossignol *   CHRE_ASSERT(scalar expression)
29e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie *
30e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie * Where expression will be checked to be false (ie: compares equal to zero) and
31e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie * terminate the program if found to be the case.
32e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie */
33e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie
34e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie#if defined(CHRE_ASSERTIONS_ENABLED)
35e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie
36e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie#include "chre/target_platform/assert.h"
37e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie
38926f1b91231f88c3669f10dec8f56e24ae16b957Andrew Rossignol#ifndef CHRE_ASSERT
39bbb9845d4f96fc5713b8e9ede09acfe15984315fBrian Duddie#error "CHRE_ASSERT must be defined by the target platform's assert.h"
40926f1b91231f88c3669f10dec8f56e24ae16b957Andrew Rossignol#endif  // CHRE_ASSERT
41e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie
42e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie#elif defined(CHRE_ASSERTIONS_DISABLED)
43e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie
44926f1b91231f88c3669f10dec8f56e24ae16b957Andrew Rossignol#define CHRE_ASSERT(condition) ((void) (condition))
45e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie
46e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie#else
47e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie#error "CHRE_ASSERTIONS_ENABLED or CHRE_ASSERTIONS_DISABLED must be defined"
48e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie#endif  // CHRE_ASSERTIONS_ENABLED
49e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie
50bbb9845d4f96fc5713b8e9ede09acfe15984315fBrian Duddie/**
51bbb9845d4f96fc5713b8e9ede09acfe15984315fBrian Duddie * Combination macro that always logs an error message if the condition
52bbb9845d4f96fc5713b8e9ede09acfe15984315fBrian Duddie * evaluates to false.
53bbb9845d4f96fc5713b8e9ede09acfe15984315fBrian Duddie *
54bbb9845d4f96fc5713b8e9ede09acfe15984315fBrian Duddie * Note that the supplied condition may be evaluated more than once.
55bbb9845d4f96fc5713b8e9ede09acfe15984315fBrian Duddie *
56bbb9845d4f96fc5713b8e9ede09acfe15984315fBrian Duddie * @param condition Boolean expression which evaluates to false in the failure
57bbb9845d4f96fc5713b8e9ede09acfe15984315fBrian Duddie *        case
58bbb9845d4f96fc5713b8e9ede09acfe15984315fBrian Duddie * @param fmt Format string to pass to LOGE
59bbb9845d4f96fc5713b8e9ede09acfe15984315fBrian Duddie * @param ... Arguments to pass to LOGE
60bbb9845d4f96fc5713b8e9ede09acfe15984315fBrian Duddie */
61bbb9845d4f96fc5713b8e9ede09acfe15984315fBrian Duddie#define CHRE_ASSERT_LOG(condition, fmt, ...) do { \
62bbb9845d4f96fc5713b8e9ede09acfe15984315fBrian Duddie  if (!(condition)) {                             \
63930807177e49bdec5f3ac78942247a9ee2604639Brian Duddie    LOGE("Assert: " fmt, ##__VA_ARGS__);          \
64bbb9845d4f96fc5713b8e9ede09acfe15984315fBrian Duddie    CHRE_ASSERT(condition);                       \
65bbb9845d4f96fc5713b8e9ede09acfe15984315fBrian Duddie  }                                               \
66bbb9845d4f96fc5713b8e9ede09acfe15984315fBrian Duddie} while (0)
67bbb9845d4f96fc5713b8e9ede09acfe15984315fBrian Duddie
68e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie#endif  // CHRE_PLATFORM_ASSERT_H_
69