1/*
2// Copyright (c) 2014 Intel Corporation 
3//
4// Licensed under the Apache License, Version 2.0 (the "License");
5// you may not use this file except in compliance with the License.
6// You may obtain a copy of the License at
7//
8//      http://www.apache.org/licenses/LICENSE-2.0
9//
10// Unless required by applicable law or agreed to in writing, software
11// distributed under the License is distributed on an "AS IS" BASIS,
12// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13// See the License for the specific language governing permissions and
14// limitations under the License.
15*/
16#ifndef HWC_TRACE_H
17#define HWC_TRACE_H
18
19#define LOG_TAG "hwcomposer"
20//#define LOG_NDEBUG 0
21#include <cutils/log.h>
22
23
24#ifdef _cplusplus
25extern "C" {
26#endif
27
28// Helper to automatically preappend classname::functionname to the log message
29#define VLOGTRACE(fmt,...)     ALOGV("%s: "fmt, __func__, ##__VA_ARGS__)
30#define DLOGTRACE(fmt,...)     ALOGD("%s: "fmt, __func__, ##__VA_ARGS__)
31#define ILOGTRACE(fmt,...)     ALOGI("%s: "fmt, __func__, ##__VA_ARGS__)
32#define WLOGTRACE(fmt,...)     ALOGW("%s: "fmt, __func__, ##__VA_ARGS__)
33#define ELOGTRACE(fmt,...)     ALOGE("%s: "fmt, __func__, ##__VA_ARGS__)
34
35
36// Function call tracing
37#if 0
38#define CTRACE()            ALOGV("Calling %s", __func__)
39#define XLOGTRACE()            ALOGV("Leaving %s", __func__)
40#else
41#define CTRACE()            ((void)0)
42#define XLOGTRACE()            ((void)0)
43#endif
44
45
46// Arguments tracing
47#if 0
48#define ALOGTRACE(fmt,...)     ALOGV("%s(args): "fmt, __func__, ##__VA_ARGS__);
49#else
50#define ALOGTRACE(fmt,...)     ((void)0)
51#endif
52
53
54
55// Helper to abort the execution if object is not initialized.
56// This should never happen if the rules below are followed during design:
57// 1) Create an object.
58// 2) Initialize the object immediately.
59// 3) If failed, delete the object.
60// These helpers should be disabled and stripped out of release build
61
62#define RETURN_X_IF_NOT_INIT(X) \
63do { \
64    CTRACE(); \
65    if (false == mInitialized) { \
66        LOG_ALWAYS_FATAL("%s: Object is not initialized! Line = %d", __func__, __LINE__); \
67        return X; \
68    } \
69} while (0)
70
71#if 1
72#define RETURN_FALSE_IF_NOT_INIT()      RETURN_X_IF_NOT_INIT(false)
73#define RETURN_VOID_IF_NOT_INIT()       RETURN_X_IF_NOT_INIT()
74#define RETURN_NULL_IF_NOT_INIT()       RETURN_X_IF_NOT_INIT(0)
75#else
76#define RETURN_FALSE_IF_NOT_INIT()      ((void)0)
77#define RETURN_VOID_IF_NOT_INIT()       ((void)0)
78#define RETURN_NULL_IF_NOT_INIT()       ((void)0)
79#endif
80
81
82// Helper to log error message, call de-initializer and return false.
83#define DEINIT_AND_RETURN_FALSE(...) \
84do { \
85    ELOGTRACE(__VA_ARGS__); \
86    deinitialize(); \
87    return false; \
88} while (0)
89
90
91#define DEINIT_AND_DELETE_OBJ(X) \
92    if (X) {\
93        X->deinitialize();\
94        delete X; \
95        X = NULL; \
96    }
97
98
99#define WARN_IF_NOT_DEINIT() \
100    CTRACE(); \
101    if (mInitialized) {\
102        LOG_ALWAYS_FATAL("%s: Object is not deinitialized! Line = %d", __func__, __LINE__); \
103    }
104
105
106// _cplusplus
107#ifdef _cplusplus
108}
109#endif
110
111
112#endif /* HWC_TRACE_H */
113