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
25 extern "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) \
63 do { \
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(...) \
84 do { \
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