add scene probe
[platform/core/system/swap-probe.git] / include / binproto.h
1 #ifndef __BIN_PROTO_H__
2 #define __BIN_PROTO_H__
3
4 #include <stdlib.h>
5 #include <stdio.h>
6 #include <string.h>
7 #include <stdint.h>
8 #include <stdarg.h>
9
10 #include <unistd.h>
11 #include <fcntl.h>
12
13 #include <sys/types.h>
14 #include <sys/stat.h>
15
16 // getpid/gettid
17 #include <sys/types.h>
18 #include <unistd.h>
19 #include <sys/syscall.h>
20
21 #include <sys/time.h>
22
23 #define MSG_PROBE_MEMORY 0x3001
24 #define MSG_PROBE_UICONTROL 0x3002
25 #define MSG_PROBE_UIEVENT 0x3003
26 #define MSG_PROBE_RESOURCE 0x3004
27 #define MSG_PROBE_LIFECYCLE 0x3005
28 #define MSG_PROBE_SCREENSHOT 0x3006
29 #define MSG_PROBE_SCENE 0x3007
30 #define MSG_PROBE_THREAD 0x3008
31 #define MSG_PROBE_CUSTOM 0x3009
32 #define MSG_PROBE_SYNC 0x3010
33
34 // TODO: remove this copy-paste
35 #define CALLER_ADDRESS                                                  \
36         ((void*) __builtin_extract_return_addr(__builtin_return_address(0)))
37
38
39
40 // COMMON
41 static inline char *pack_int32(char *to, uint32_t val)
42 {
43         *(uint32_t *)to = val;
44         return to + sizeof(uint32_t);
45 }
46
47 static inline char *pack_int64(char *to, uint64_t val)
48 {
49         *(uint64_t *)to = val;
50         return to + sizeof(uint64_t);
51 }
52
53 static inline char *pack_string(char *to, const char *str)
54 {
55         size_t len = strlen(str) + 1;
56         strncpy(to, str, len);
57         return to + len;
58 }
59
60 static inline char *pack_double(char *to, double val)
61 {
62         *(double *)to = val;
63         return to + sizeof(double);
64 }
65
66 static inline char *pack_timestamp(char *to)
67 {
68         struct timeval tv;
69
70         gettimeofday(&tv, NULL);
71         to = pack_int32(to, tv.tv_sec);
72         to = pack_int32(to, tv.tv_usec * 1000);
73
74         return to;
75 }
76
77 static inline char *pack_args(char *to, const char *fmt, ...)
78 {
79         va_list args;
80         uint32_t num = strlen(fmt);
81         const char *t = fmt;
82
83         if(*t == '\0') {
84                 num = 0;
85         }
86
87         memcpy(to, &num, sizeof(num));
88         to += sizeof(num);
89
90         va_start(args, fmt);
91
92         uint8_t c;
93         uint32_t d;
94         uint64_t x;
95         uint64_t p;
96         float f;
97         double w;
98         char *s;
99         int n;
100
101         for (t = fmt; *t != '\0'; t++) {
102                 switch (*t) {
103                 case 'c':
104                         c = (uint8_t)va_arg(args, uint32_t);
105                         *to++ = *t;
106                         memcpy(to, &c, sizeof(c));
107                         to += sizeof(c);
108                         break;
109                 case 'd':
110                         d = va_arg(args, uint32_t);
111                         *to++ = *t;
112                         memcpy(to, &d, sizeof(d));
113                         to += sizeof(d);
114                         break;
115                 case 'x':
116                         x = (uint64_t)va_arg(args, uint64_t);
117                         *to++ = *t;
118                         memcpy(to, &x, sizeof(x));
119                         to += sizeof(x);
120                         break;
121                 case 'p':
122                         p = (uintptr_t)va_arg(args, uint64_t);
123                         *to++ = *t;
124                         memcpy(to, &p, sizeof(p));
125                         to += sizeof(p);
126                         break;
127                 case 'f':
128                         f = (float)va_arg(args, double);
129                         *to++ = *t;
130                         memcpy(to, &f, sizeof(f));
131                         to += sizeof(f);
132                         break;
133                 case 'w':
134                         w = va_arg(args, double);
135                         *to++ = *t;
136                         memcpy(to, &w, sizeof(w));
137                         to += sizeof(w);
138                         break;
139                 case 's':
140                         s = va_arg(args, char *);
141                         *to++ = *t;
142                         n = strlen(s) + 1;
143                         strncpy(to, s, n);
144                         to += n;
145                         break;
146                 default:
147                         break;
148                 }
149         }
150
151         va_end(args);
152
153         return to;
154 }
155
156 #define BUF_PTR p
157 #define RET_PTR ret_p
158 #define PACK_INT32(val)                         \
159         BUF_PTR = pack_int32(BUF_PTR, val);
160 #define PACK_INT64(val)                         \
161         BUF_PTR = pack_int64(BUF_PTR, val);
162 #define PACK_STRING(str)                        \
163         BUF_PTR = pack_string(BUF_PTR, str);
164
165 #define PACK_COMMON_BEGIN(msg_id, api_id, fmt, ...)             \
166         do {                                                    \
167                 BUF_PTR = pack_int32(BUF_PTR, msg_id);          \
168                 BUF_PTR = pack_int32(BUF_PTR, 0);               \
169                 BUF_PTR = pack_timestamp(BUF_PTR);              \
170                 BUF_PTR = pack_int32(BUF_PTR, 0);               \
171                 BUF_PTR = pack_int32(BUF_PTR, api_id);          \
172                 BUF_PTR = pack_int32(BUF_PTR, getpid());                \
173                 BUF_PTR = pack_int32(BUF_PTR, syscall(__NR_gettid));    \
174                 BUF_PTR = pack_args(BUF_PTR, fmt, __VA_ARGS__); \
175                 RET_PTR = BUF_PTR;              \
176         } while (0)
177
178 #define PACK_COMMON_END(ret, errn, intern_call)         \
179         do {                                                    \
180                 BUF_PTR = pack_int64(BUF_PTR, (uintptr_t)(ret));        \
181                 BUF_PTR = pack_int32(BUF_PTR, (uint32_t)errn);  \
182                 BUF_PTR = pack_int32(BUF_PTR, (uint32_t)intern_call);   \
183                 BUF_PTR = pack_int64(BUF_PTR, (uintptr_t)CALLER_ADDRESS); \
184                 BUF_PTR = pack_int32(BUF_PTR, 0);               \
185                 BUF_PTR = pack_int32(BUF_PTR, 0);               \
186         } while (0)
187
188 #define PACK_RETURN_END(ret)                                                            \
189                 RET_PTR = pack_int64(RET_PTR, (uintptr_t)(ret));
190
191 #define PACK_MEMORY(size, memory_api_type, addr)                \
192         do {                                                    \
193                 BUF_PTR = pack_int64(BUF_PTR, size);                    \
194                 BUF_PTR = pack_int32(BUF_PTR, memory_api_type); \
195                 BUF_PTR = pack_int64(BUF_PTR, (uintptr_t)addr); \
196         } while (0)
197
198 #define PACK_UICONTROL(control)                                         \
199         do {                                                            \
200                 if (unlikely(control == NULL)) {                        \
201                         BUF_PTR = pack_string(BUF_PTR, "");             \
202                         BUF_PTR = pack_string(BUF_PTR, "");             \
203                         BUF_PTR = pack_int64(BUF_PTR, 0);               \
204                 } else {                                                \
205                         char *type = NULL, *name = NULL;                \
206                         if (find_object_hash((void*)(control),          \
207                                              &type, &name) == 1) {      \
208                                 BUF_PTR = pack_string(BUF_PTR, type);   \
209                                 BUF_PTR = pack_string(BUF_PTR, name);   \
210                         } else {                                        \
211                                 BUF_PTR = pack_string(BUF_PTR, "");     \
212                                 BUF_PTR = pack_string(BUF_PTR, "");     \
213                         }                                               \
214                         BUF_PTR = pack_int64(BUF_PTR, (uintptr_t)(control)); \
215                 }                                                       \
216         } while(0)
217
218 #define PACK_UIEVENT(event_type, detail_type, x, y, info1, info2)       \
219         do {                                                            \
220                 BUF_PTR = pack_int32(BUF_PTR, event_type);              \
221                 BUF_PTR = pack_int32(BUF_PTR, detail_type);             \
222                 BUF_PTR = pack_int32(BUF_PTR, x);                       \
223                 BUF_PTR = pack_int32(BUF_PTR, y);                       \
224                 BUF_PTR = pack_string(BUF_PTR, info1);                  \
225                 BUF_PTR = pack_int32(BUF_PTR, info2);                   \
226         } while (0)
227
228 #define PACK_RESOURCE(size, fd_value, fd_type, fd_api_type, file_size,  \
229                       file_path)                                        \
230         do {                                                            \
231                 BUF_PTR = pack_int64(BUF_PTR, size);                    \
232                 BUF_PTR = pack_int32(BUF_PTR, fd_value);                \
233                 BUF_PTR = pack_int32(BUF_PTR, fd_type);                 \
234                 BUF_PTR = pack_int32(BUF_PTR, fd_api_type);             \
235                 BUF_PTR = pack_int64(BUF_PTR, file_size);               \
236                 BUF_PTR = pack_string(BUF_PTR, file_path);              \
237         } while (0)
238
239 #define PACK_SCREENSHOT(image_file_path, orientation)                           \
240                 do {                                                            \
241                           BUF_PTR = pack_string(BUF_PTR, image_file_path);      \
242                           BUF_PTR = pack_int32(BUF_PTR, orientation);           \
243                 } while (0)
244
245 #define PACK_SCENE(scene_name, formid, pform, panelid, ppanel, transition, user)        \
246         do {                                                                            \
247                 BUF_PTR = pack_string(BUF_PTR,  scene_name);                            \
248                 if (unlikely(pform == NULL)) {                                          \
249                         BUF_PTR = pack_string(BUF_PTR, "");                             \
250                         BUF_PTR = pack_int64(BUF_PTR, 0);                               \
251                 } else {                                                                \
252                         char *type = NULL, *name = NULL;                                \
253                         if (find_object_hash((void*)(pform), &type, &name) == 1) {      \
254                                 BUF_PTR = pack_string(BUF_PTR, name);                   \
255                         } else {                                                        \
256                                 BUF_PTR = pack_string(BUF_PTR, "");                     \
257                         }                                                               \
258                         BUF_PTR = pack_int64(BUF_PTR, (uintptr_t)pform);                \
259                 }                                                                       \
260                 if (unlikely(ppanel == NULL)) {                                         \
261                         BUF_PTR = pack_string(BUF_PTR, "");                             \
262                         BUF_PTR = pack_int64(BUF_PTR, 0);                               \
263                 } else {                                                                \
264                         char *type = NULL, *name = NULL;                                \
265                         if (find_object_hash((void*)(ppanel), &type, &name) == 1) {     \
266                                 BUF_PTR = pack_string(BUF_PTR, name);                   \
267                         } else {                                                        \
268                                 BUF_PTR = pack_string(BUF_PTR, "");                     \
269                         }                                                               \
270                         BUF_PTR = pack_int64(BUF_PTR, (uintptr_t)(ppanel));             \
271                 }                                                                       \
272                 BUF_PTR = pack_int64(BUF_PTR, transition);                              \
273                 BUF_PTR = pack_int64(BUF_PTR, user);                                    \
274         } while(0)
275
276  #define PACK_THREAD(thread_id, thread_type, api_type)  \
277          do {                                                           \
278                 BUF_PTR = pack_int64(BUF_PTR, thread_id);               \
279                 BUF_PTR = pack_int32(BUF_PTR, thread_type);             \
280                 BUF_PTR = pack_int32(BUF_PTR, api_type);                \
281         } while (0)
282
283 #define PACK_CUSTOM(handle, type, name, color, value)           \
284         do {                                                    \
285                 BUF_PTR = pack_int32(BUF_PTR, handle);          \
286                 BUF_PTR = pack_int32(BUF_PTR, type);            \
287                 BUF_PTR = pack_string(BUF_PTR, name);           \
288                 BUF_PTR = pack_int32(BUF_PTR, color);           \
289                 BUF_PTR = pack_double(BUF_PTR, value);          \
290         } while (0)
291
292 #define PACK_SYNC(sync_val, sync_type, api_type)                     \
293         do {                                                         \
294                 BUF_PTR = pack_int64(BUF_PTR, (uintptr_t)sync_val);  \
295                 BUF_PTR = pack_int32(BUF_PTR, sync_type);            \
296                 BUF_PTR = pack_int32(BUF_PTR, api_type);             \
297         } while (0)
298
299 #define LOG_PATH "/tmp/trace.bin"
300 #define OPEN_LOG()                                      \
301                 do {                                    \
302                         log_fd = creat(LOG_PATH, 0644); \
303                         if (log_fd == -1) {             \
304                                 exit(1);                \
305                         }                               \
306                 } while (0)
307 #define CLOSE_LOG()                             \
308                 do {                            \
309                         if (log_fd > 0) {       \
310                                 close(log_fd);  \
311                         }                       \
312                 } while (0)
313
314
315
316 #define LOCAL_BUF_SIZE 1024
317 #define PREPARE_LOCAL_BUF()                     \
318                 char buf[LOCAL_BUF_SIZE];       \
319                 char *p = buf;                  \
320                 char *ret_p = NULL;
321
322 #define MSG_LEN_OFFSET 16
323 #define MSG_HDR_LEN 20
324 #define FLUSH_LOCAL_BUF()                                               \
325                 *(uint32_t *)(buf + MSG_LEN_OFFSET) = (p - buf) - MSG_HDR_LEN; \
326                 write(log_fd, buf, p - buf);
327
328 // =========================== post block macro ===========================
329
330 #define POST_PACK_PROBEBLOCK_BEGIN(LCTYPE, RETVALUE, INPUTFORMAT, ...)  \
331         newerrno = errno;                                               \
332         if(postBlockBegin(blockresult)) {
333
334 #define POST_PACK_PROBEBLOCK_END()                                      \
335                 postBlockEnd();                                         \
336         }                                                               \
337         errno = (newerrno != 0) ? newerrno : olderrno
338
339 /* data */
340 extern int log_fd;
341
342 /* int main(int argc, char **argv) */
343 /* { */
344 /*      char buf[1024]; */
345 /*      char *p = buf; */
346
347 /*      p = PACK_COMMON_BEGIN(p, 42, "cdxpfws", 'a', 10, (uint64_t)80, */
348 /*                            (uint64_t)0, 0.19, 0.33, "hello!"); */
349 /*      p = PACK_COMMON_END(p, 0); */
350
351 /*      int fd = creat("out.bin", 0644); */
352 /*      if (fd == -1) { */
353 /*              printf("error\n"); */
354 /*              exit(1); */
355 /*      } */
356
357 /*      write(fd, buf, p - buf); */
358 /*      close(fd); */
359
360 /*      return 0; */
361 /* } */
362
363 #endif /* __BIN_PROTO_H__ */