4 * Copyright (c) 2000 - 2013 Samsung Electronics Co., Ltd. All rights reserved.
8 * Nikita Kalyazin <n.kalyazin@samsung.com>
9 * Anastasia Lyupa <a.lyupa@samsung.com>
11 * This library is free software; you can redistribute it and/or modify it under
12 * the terms of the GNU Lesser General Public License as published by the
13 * Free Software Foundation; either version 2.1 of the License, or (at your option)
16 * This library is distributed in the hope that it will be useful, but WITHOUT ANY
17 * WARRANTY; without even the implied warranty of MERCHANTABILITY or
18 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
19 * License for more details.
21 * You should have received a copy of the GNU Lesser General Public License
22 * along with this library; if not, write to the Free Software Foundation, Inc., 51
23 * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
26 * - Samsung RnD Institute Russia
30 #ifndef __BIN_PROTO_H__
31 #define __BIN_PROTO_H__
42 #include <sys/types.h>
47 #include <sys/socket.h>
49 #include "api_id_mapping.h"
51 #define MSG_PROBE_MEMORY 0x0101
52 #define MSG_PROBE_UICONTROL 0x0102
53 #define MSG_PROBE_UIEVENT 0x0103
54 #define MSG_PROBE_RESOURCE 0x0104
55 #define MSG_PROBE_LIFECYCLE 0x0105
56 #define MSG_PROBE_SCREENSHOT 0x0106
57 #define MSG_PROBE_SCENE 0x0107
58 #define MSG_PROBE_THREAD 0x0108
59 #define MSG_PROBE_CUSTOM 0x0109
60 #define MSG_PROBE_SYNC 0x0110
61 #define MSG_PROBE_NETWORK 0x0111
62 #define MSG_PROBE_GL 0x0112
64 #define SCREENSHOT_DIRECTORY "/tmp/da"
66 #define MAX_PACK_FILENAME_LEN (4 * 1024)
67 #define MAX_SHADER_LEN (4 * 1024)
68 #define ADD_LOCAL_BUF_SIZE (1024)
69 #define MAX_GL_CONTEXT_VALUE_SIZE (1024)
70 #define MAX_LOCAL_BUF_SIZE (MAX_SHADER_LEN + ADD_LOCAL_BUF_SIZE)
71 #define LOCAL_BUF msg_buf
73 // TODO: remove this copy-paste
74 #define CALLER_ADDRESS \
75 ((void*) __builtin_extract_return_addr(__builtin_return_address(0)))
77 static inline uint64_t voidp_to_uint64(const void *p)
79 return (uint64_t)(uintptr_t)p;
83 static inline char *pack_int32(char *to, uint32_t val)
85 *(uint32_t *)to = val;
86 return to + sizeof(uint32_t);
89 static inline char *pack_int64(char *to, uint64_t val)
91 *(uint64_t *)to = val;
92 return to + sizeof(uint64_t);
95 static char __attribute__((used)) *pack_string(char *to, const char *str)
101 size_t len = strlen(str) + 1;
102 strncpy(to, str, len);
107 static char __attribute__((used)) *pack_bin(char *to, const char *from,
110 memcpy(to, from, len);
114 static inline char *pack_double(char *to, double val)
117 return to + sizeof(double);
120 static inline char *pack_timestamp(char *to)
124 gettimeofday(&tv, NULL);
125 to = pack_int32(to, tv.tv_sec);
126 to = pack_int32(to, tv.tv_usec * 1000);
131 ///////////////////////////////////////////////////////////////////
132 // function: pack_array
133 ///////////////////////////////////////////////////////////////////
135 // Pack array param to buffer
137 // char *to - destination buffer
138 // va_list *args - array size and array (pointer)
139 // uint32_t element_size - size of array element
141 // char * - destination pointer end after pack
142 static char *pack_array(char *to, va_list *args, uint32_t element_size)
147 // get array elements count
148 d = va_arg(*args, uint32_t);
150 p = (unsigned long)(uintptr_t)va_arg(*args, uint64_t);
152 // pack original pointer
153 memcpy(to, &p, sizeof(p));
155 // pack array elements count
156 memcpy(to, &d, sizeof(d));
159 // pack array elements
161 memcpy(to, (void *)(long)p, element_size);
167 static char __attribute__((used)) *pack_string_to_file(char *to, const char *st,
171 if (data_len < max_len) {
172 /* pack string to buffer */
173 to = pack_string(to, st);
175 /* pack string to file */
176 char template_name[] = SCREENSHOT_DIRECTORY "/swap_XXXXXX";
177 char dst_path_pack[MAX_PATH_LENGTH];
179 mktemp(template_name);
180 file = fopen(template_name, "w");
182 fwrite(st, data_len, 1, file);
185 snprintf(dst_path_pack, sizeof(dst_path_pack), "FILE:%s", template_name);
186 to = pack_string(to, dst_path_pack);
191 static char __attribute__((used)) *pack_value_by_type(char *to, const char **t, va_list *args)
208 c = (uint8_t)va_arg(*args, uint32_t);
209 memcpy(to, &c, sizeof(c));
213 d = va_arg(*args, uint32_t);
214 memcpy(to, &d, sizeof(d));
218 x = 0; // real value may be less then uint64_t
219 x = (unsigned long)(uint64_t)va_arg(*args, uint64_t);
220 memcpy(to, &x, sizeof(x));
224 p = 0; // real value may be less then uint64_t
225 p = (unsigned long)(uintptr_t)va_arg(*args, uint64_t);
226 memcpy(to, &p, sizeof(p));
230 f = (float)va_arg(*args, double);
231 memcpy(to, &f, sizeof(f));
235 w = va_arg(*args, double);
236 memcpy(to, &w, sizeof(w));
241 s = va_arg(*args, char *);
244 case '4': //"s4" - pack 4K or to file
246 to = pack_string_to_file(to, s, strlen(s),
247 MAX_PACK_FILENAME_LEN);
249 case '0': //"s0" - pack 256 bytes
258 default: //"s" - pack all string
269 /* pack arrays params */
271 /* array of 'd' uint32_t */
272 to = pack_array(to, args, sizeof(d));
275 /* array of 'f' float */
276 to = pack_array(to, args, sizeof(f));
279 /* array of 'w' double */
280 to = pack_array(to, args, sizeof(w));
283 PRINTERR("ERROR PACK #%d '%c'!!!", **t, **t);
293 static char __attribute__((used)) *pack_args(char *to, const char *fmt, ...)
300 //put dummy num value
301 memcpy(to, &num, sizeof(num));
306 for (t = fmt; *t != '\0';) {
307 to = pack_value_by_type(to, &t, &args);
312 memcpy(size_p, &num, sizeof(num));
319 static char __attribute__((used)) *pack_ret(char *to, char ret_type, ...)
322 char fmt[] = {ret_type, 0};
323 const char *fmtp = (const char *)fmt;
325 va_start(args, ret_type);
326 to = pack_value_by_type(to, &fmtp, &args);
333 #define RET_PTR ret_p
334 #define PACK_INT32(val) \
335 BUF_PTR = pack_int32(BUF_PTR, val);
336 #define PACK_INT64(val) \
337 BUF_PTR = pack_int64(BUF_PTR, val);
338 #define PACK_STRING(str) \
339 BUF_PTR = pack_string(BUF_PTR, str);
341 #define PACK_COMMON_BEGIN(msg_id, api_id, fmt, ...) \
342 do { /* PACK_COMMON_BEGIN*/ \
343 BUF_PTR = pack_int32(BUF_PTR, msg_id); /* msg id */ \
344 BUF_PTR = pack_int32(BUF_PTR, 0); /* sequence */ \
345 BUF_PTR = pack_timestamp(BUF_PTR); /* timestamp */ \
346 BUF_PTR = pack_int32(BUF_PTR, 0); /* length */ \
347 BUF_PTR = pack_int32(BUF_PTR, api_id); /* API id */ \
348 BUF_PTR = pack_int32(BUF_PTR, _getpid()); /* PID */ \
349 BUF_PTR = pack_int32(BUF_PTR, _gettid()); /* call pc*/\
350 BUF_PTR = pack_args(BUF_PTR, fmt, __VA_ARGS__); /* args */ \
354 #define PACK_COMMON_END(ret_type, ret, errn, intern_call) \
355 do { /* PACK_COMMON_END */ \
356 BUF_PTR = pack_ret(RET_PTR, ret_type, (uintptr_t)ret); /* return val */ \
357 BUF_PTR = pack_int64(BUF_PTR, (uint64_t)errn); /* errno */ \
358 BUF_PTR = pack_int32(BUF_PTR, (uint32_t)intern_call); /* internal call*/ \
359 BUF_PTR = pack_int64(BUF_PTR, (uintptr_t)CALLER_ADDRESS); /*caller addr*/\
360 BUF_PTR = pack_int32(BUF_PTR, 0); /* reserved */ \
361 BUF_PTR = pack_int32(BUF_PTR, 0); /* reserved */ \
364 #define PACK_RETURN_END(ret_type, ret) \
365 RET_PTR = pack_ret(RET_PTR, ret_type, (uintptr_t)ret); /* return val */
367 #define PACK_MEMORY(size, memory_api_type, addr) \
368 do { /* PACK_MEMORY */ \
369 BUF_PTR = pack_int64(BUF_PTR, size); /* alloc size */ \
370 BUF_PTR = pack_int32(BUF_PTR, memory_api_type); /* alloc type */\
371 BUF_PTR = pack_int64(BUF_PTR, (uintptr_t)addr); /* alloc addr */\
374 #define PACK_UICONTROL(control) \
376 if (unlikely(control == NULL)) { \
377 BUF_PTR = pack_string(BUF_PTR, ""); \
378 BUF_PTR = pack_string(BUF_PTR, ""); \
379 BUF_PTR = pack_int64(BUF_PTR, 0); \
381 char *type = NULL, *name = NULL; \
382 if (find_uiobject_hash((void*)(control), \
383 &type, &name) == 1) { \
384 BUF_PTR = pack_string(BUF_PTR, type); \
385 BUF_PTR = pack_string(BUF_PTR, name); \
387 BUF_PTR = pack_string(BUF_PTR, ""); \
388 BUF_PTR = pack_string(BUF_PTR, ""); \
390 BUF_PTR = pack_int64(BUF_PTR, (uintptr_t)(control)); \
394 #define PACK_UIEVENT(event_type, detail_type, x, y, info1, info2) \
395 do { /* PACK_UIEVENT */ \
396 BUF_PTR = pack_int32(BUF_PTR, event_type); \
397 BUF_PTR = pack_int32(BUF_PTR, detail_type); \
398 BUF_PTR = pack_int32(BUF_PTR, x); \
399 BUF_PTR = pack_int32(BUF_PTR, y); \
400 BUF_PTR = pack_string(BUF_PTR, info1); \
401 BUF_PTR = pack_int32(BUF_PTR, info2); \
404 #define PACK_RESOURCE(size, fd_value, fd_api_type, file_size, \
406 do { /* PACK_RESOURCE */ \
407 BUF_PTR = pack_int64(BUF_PTR, size); \
408 BUF_PTR = pack_int64(BUF_PTR, fd_value); \
409 BUF_PTR = pack_int32(BUF_PTR, fd_api_type); \
410 BUF_PTR = pack_int64(BUF_PTR, file_size); \
411 BUF_PTR = pack_string_to_file(BUF_PTR, file_path, \
413 MAX_PACK_FILENAME_LEN); \
416 #define PACK_SCREENSHOT(image_file_path, orientation) \
417 do { /* PACK_SCREENSHOT */ \
418 BUF_PTR = pack_string(BUF_PTR, image_file_path); \
419 BUF_PTR = pack_int32(BUF_PTR, orientation); \
422 #define PACK_SCENE(scene_name, formid, pform, panelid, ppanel, transition, user) \
424 BUF_PTR = pack_string(BUF_PTR, scene_name); \
425 if (unlikely(pform == NULL)) { \
426 BUF_PTR = pack_string(BUF_PTR, ""); \
427 BUF_PTR = pack_int64(BUF_PTR, 0); \
429 char *type = NULL, *name = NULL; \
430 if (find_uiobject_hash((void*)(pform), &type, &name) == 1) { \
431 BUF_PTR = pack_string(BUF_PTR, name); \
433 BUF_PTR = pack_string(BUF_PTR, ""); \
435 BUF_PTR = pack_int64(BUF_PTR, (uintptr_t)pform); \
437 if (unlikely(ppanel == NULL)) { \
438 BUF_PTR = pack_string(BUF_PTR, ""); \
439 BUF_PTR = pack_int64(BUF_PTR, 0); \
441 char *type = NULL, *name = NULL; \
442 if (find_uiobject_hash((void*)(ppanel), &type, &name) == 1) { \
443 BUF_PTR = pack_string(BUF_PTR, name); \
445 BUF_PTR = pack_string(BUF_PTR, ""); \
447 BUF_PTR = pack_int64(BUF_PTR, (uintptr_t)(ppanel)); \
449 BUF_PTR = pack_int64(BUF_PTR, transition); \
450 BUF_PTR = pack_int64(BUF_PTR, user); \
453 #define PACK_THREAD(thread_id, thread_type, api_type, class_name) \
455 if(thread_type == THREAD_PTHREAD) { \
456 BUF_PTR = pack_int64(BUF_PTR, thread_id); \
457 BUF_PTR = pack_int64(BUF_PTR, 0); \
458 } else if(thread_type == THREAD_TIZENTHREAD_WORKER \
459 || thread_type == THREAD_TIZENTHREAD_EVENTDRIVEN) { \
460 BUF_PTR = pack_int64(BUF_PTR, 0); \
461 BUF_PTR = pack_int64(BUF_PTR, thread_id); \
463 BUF_PTR = pack_int64(BUF_PTR, 0); \
464 BUF_PTR = pack_int64(BUF_PTR, 0); \
466 BUF_PTR = pack_int32(BUF_PTR, thread_type); \
467 BUF_PTR = pack_int32(BUF_PTR, api_type); \
468 BUF_PTR = pack_string(BUF_PTR, class_name); \
471 #define PACK_CUSTOM(handle, type, name, color, value) \
473 BUF_PTR = pack_int32(BUF_PTR, handle); \
474 BUF_PTR = pack_int32(BUF_PTR, type); \
475 BUF_PTR = pack_string(BUF_PTR, name); \
476 BUF_PTR = pack_int32(BUF_PTR, color); \
477 BUF_PTR = pack_double(BUF_PTR, value); \
480 #define PACK_SYNC(sync_val, sync_type, api_type) \
482 BUF_PTR = pack_int64(BUF_PTR, (uintptr_t)sync_val); \
483 BUF_PTR = pack_int32(BUF_PTR, sync_type); \
484 BUF_PTR = pack_int32(BUF_PTR, api_type); \
487 /* TODO maloc/free for each event turns out expensive: think of buffer
488 * allocator implementation */
489 #define PREPARE_LOCAL_BUF() \
490 char *LOCAL_BUF = (char *)(*real_malloc)(MAX_LOCAL_BUF_SIZE); \
491 char *BUF_PTR = LOCAL_BUF; \
494 #define PREPARE_LOCAL_BUF_THOUGH(BUFF) \
495 char *LOCAL_BUF = BUFF; \
496 char *BUF_PTR = LOCAL_BUF; \
499 #define MSG_LEN_OFFSET 16
500 #define MSG_HDR_LEN 20
502 #define SET_MSG_LEN() \
503 *(uint32_t *)(msg_buf + MSG_LEN_OFFSET) = (p - msg_buf) - MSG_HDR_LEN;
505 #define GET_MSG_LEN() \
506 (p - msg_buf) - MSG_HDR_LEN
508 #define FLUSH_LOCAL_BUF() \
510 send(gTraceInfo.socket.daemonSock, msg_buf, (p - msg_buf), 0); \
514 // =========================== post block macro ===========================
516 #define POST_PACK_PROBEBLOCK_BEGIN() \
518 if(postBlockBegin(blockresult)) {
520 #define POST_PACK_PROBEBLOCK_END() \
523 errno = (newerrno != 0) ? newerrno : olderrno
525 #define POST_PACK_PROBEBLOCK_ADD_END() \
528 errno = (newerrno != 0) ? newerrno : olderrno
531 /* int main(int argc, char **argv) */
533 /* char buf[1024]; */
536 /* p = PACK_COMMON_BEGIN(p, 42, "cdxpfws", 'a', 10, (uint64_t)80, */
537 /* (uint64_t)0, 0.19, 0.33, "hello!"); */
538 /* p = PACK_COMMON_END('p', p, 0); */
540 /* int fd = creat("out.bin", 0644); */
541 /* if (fd == -1) { */
542 /* printf("error\n"); */
546 /* write(fd, buf, p - buf); */
552 extern int _init_(void);
553 extern void _uninit_(void);
555 #endif /* __BIN_PROTO_H__ */