add osp thread probes in bada_thread.cpp
[platform/core/system/swap-probe.git] / probe_file / da_io.h
1 /*\r
2  *  DA probe\r
3  *\r
4  * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.\r
5  *\r
6  * Contact: \r
7  *\r
8  * Jaewon Lim <jaewon81.lim@samsung.com>\r
9  * Woojin Jung <woojin2.jung@samsung.com>\r
10  * Juyoung Kim <j0.kim@samsung.com>\r
11  * \r
12  * This library is free software; you can redistribute it and/or modify it under\r
13  * the terms of the GNU Lesser General Public License as published by the\r
14  * Free Software Foundation; either version 2.1 of the License, or (at your option)\r
15  * any later version.\r
16  * \r
17  * This library is distributed in the hope that it will be useful, but WITHOUT ANY\r
18  * WARRANTY; without even the implied warranty of MERCHANTABILITY or\r
19  * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public\r
20  * License for more details.\r
21  *\r
22  * You should have received a copy of the GNU Lesser General Public License\r
23  * along with this library; if not, write to the Free Software Foundation, Inc., 51\r
24  * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\r
25  *\r
26  * Contributors:\r
27  * - S-Core Co., Ltd\r
28  * \r
29  */\r
30 \r
31 #ifndef __DA_IO_H__\r
32 #define __DA_IO_H__\r
33 \r
34 #include <stdio.h>\r
35 #include <sys/types.h>\r
36 #include <sys/stat.h>\r
37 #include <unistd.h>\r
38 \r
39 #include "daprobe.h"\r
40 \r
41 /********************************************************************\r
42  * RESOURCE PROBE MACRO\r
43  *\r
44  * log format\r
45  *              SeqNumber`,ApiName`,Time`,Pid`,Tid`,InputParm`,Return`,PCAddr`,Error`,\r
46  *              Size`,FDValue`,FDType`,FDApiType`,\n\r
47  *              callstack_start`,callstack`,callstack_end\r
48  *\r
49  * fd type\r
50  *              FD_TYPE_FILE, FD_TYPE_SOCKET\r
51  *\r
52  * fd api type\r
53  *              FD_API_TYPE_OPEN, FD_API_TYPE_CLOSE, FD_API_TYPE_READ, FD_API_TYPE_WRITE,\r
54  *              FD_API_TYPE_DIRECTORY, FD_API_TYPE_PERMISSION, FD_API_TYPE_OTHER,\r
55  *              FD_API_TYPE_SEND, FD_API_TYPE_RECEIVE, FD_API_TYPE_OPTION, FD_API_TYPE_MANAGE\r
56  *\r
57  ************************************************************************/\r
58 \r
59 // ===================================================================\r
60 // macro for file probe\r
61 // ===================================================================\r
62 \r
63 #define GET_FD_FROM_FILEP(FILEP)        \\r
64         _fd = (FILEP != NULL) ? fileno(FILEP) : -1\r
65 \r
66 #define DECLARE_VARIABLE_FD                                                     \\r
67                 DECLARE_VARIABLE_STANDARD;                                      \\r
68                 char* _filepath = "";                                           \\r
69                 int __attribute((unused)) _fd;                          \\r
70                 int __attribute((unused)) _fstatret = -1;       \\r
71                 struct stat __attribute((unused)) _statbuf\r
72 \r
73 // =================================================================\r
74 // POST_PROBEBLOCK_MIDDLE for file\r
75 // =================================================================\r
76 \r
77 #define POST_PROBEBLOCK_MIDDLE_FD(SIZE, FD, APITYPE)                                                    \\r
78         log.length += sprintf(log.data + log.length, "`,%u`,%d`,%d`,%d`,%ld`,%s",       \\r
79                         SIZE, FD, FD_FILE, APITYPE, (_fstatret == 0 ? _statbuf.st_size : 0), _filepath)\r
80 \r
81 #define POST_PROBEBLOCK_MIDDLE_NOFD(SIZE, APITYPE)                                                      \\r
82         log.length += sprintf(log.data + log.length, "`,%u`,`,%d`,%d`,0`,%s",   \\r
83                         SIZE, FD_FILE, APITYPE, _filepath)\r
84 \r
85 #define POST_PROBEBLOCK_CALLSTACK_RESOURCE(APITYPE)                                     \\r
86         do {                                                                                                                    \\r
87                 if(APITYPE == FD_API_OPEN) {                                                            \\r
88                         APPEND_LOG_CALLSTACK();                                                                 \\r
89                 } else if(unlikely(newerrno != 0 || blockresult == 2)) {        \\r
90                         APPEND_LOG_CALLSTACK();                                                                 \\r
91                 } else {                                                                                                        \\r
92                         APPEND_LOG_NULL_CALLSTACK();                                                    \\r
93                 }                                                                                                                       \\r
94         } while(0)\r
95 \r
96 // ==================================================================\r
97 // BEFORE_ORIGINAL macro for file\r
98 // ==================================================================\r
99 \r
100 #define BEFORE_ORIGINAL_FILE(FUNCNAME, LIBNAME) \\r
101         DECLARE_VARIABLE_FD;                                            \\r
102         GET_REAL_FUNC(FUNCNAME, LIBNAME);                       \\r
103         PRE_PROBEBLOCK()\r
104 \r
105 #define BEFORE_ORIGINAL_FILE_NOFILTER(FUNCNAME, LIBNAME)        \\r
106         DECLARE_VARIABLE_FD;                                                                    \\r
107         GET_REAL_FUNC(FUNCNAME, LIBNAME);                                               \\r
108         bfiltering = false;                                                                             \\r
109         PRE_PROBEBLOCK()\r
110 \r
111 // ==================================================================\r
112 // AFTER_ORIGINAL macro for file\r
113 // ==================================================================\r
114 \r
115 #define AFTER_ORIGINAL_FD_RET(RTYPE, RVAL, SIZE, FD, APITYPE, INPUTFORMAT, ...) \\r
116         POST_PROBEBLOCK_BEGIN(LC_RESOURCE, RTYPE, RVAL, INPUTFORMAT, __VA_ARGS__);      \\r
117         _fstatret = fstat(FD, &_statbuf);                                                                                       \\r
118         POST_PROBEBLOCK_MIDDLE_FD(SIZE, FD, APITYPE);                                                           \\r
119         POST_PROBEBLOCK_CALLSTACK_RESOURCE(APITYPE);                                                            \\r
120         POST_PROBEBLOCK_END()\r
121 \r
122 #define AFTER_ORIGINAL_NOFD_RET(RTYPE, RVAL, SIZE, APITYPE, INPUTFORMAT, ...)   \\r
123         POST_PROBEBLOCK_BEGIN(LC_RESOURCE, RTYPE, RVAL, INPUTFORMAT, __VA_ARGS__);      \\r
124         POST_PROBEBLOCK_MIDDLE_NOFD(SIZE, APITYPE);                                                                     \\r
125         POST_PROBEBLOCK_CALLSTACK_RESOURCE(APITYPE);                                                            \\r
126         POST_PROBEBLOCK_END()\r
127 \r
128 #define AFTER_ORIGINAL_FILEP_RET(RTYPE, RVAL, SIZE, FILEP, APITYPE, INPUTFORMAT, ...)   \\r
129         POST_PROBEBLOCK_BEGIN(LC_RESOURCE, RTYPE, RVAL, INPUTFORMAT, __VA_ARGS__);                      \\r
130         GET_FD_FROM_FILEP(FILEP);                                                                                                                       \\r
131         if(_fd != -1) {                                                                                                                                         \\r
132                 _fstatret = fstat(_fd, &_statbuf);                                                                                              \\r
133         }                                                                                                                                                                       \\r
134         if(_fstatret != 0) PRINTMSG("ERROR : fstat error\n");                                                           \\r
135         POST_PROBEBLOCK_MIDDLE_FD(SIZE, _fd, APITYPE);                                                                          \\r
136         POST_PROBEBLOCK_CALLSTACK_RESOURCE(APITYPE);                                                                            \\r
137         POST_PROBEBLOCK_END()\r
138 \r
139 \r
140 #define AFTER_ORIGINAL_FD(SIZE, FD, APITYPE, INPUTFORMAT, ...)                  \\r
141         AFTER_ORIGINAL_FD_RET(VT_INT, ret, SIZE, FD, APITYPE, INPUTFORMAT, __VA_ARGS__)\r
142 \r
143 #define AFTER_ORIGINAL_NOFD(SIZE, APITYPE, INPUTFORMAT, ...)                    \\r
144         AFTER_ORIGINAL_NOFD_RET(VT_INT, ret, SIZE, APITYPE, INPUTFORMAT, __VA_ARGS__)\r
145 \r
146 #define AFTER_ORIGINAL_FILEP(SIZE, FILEP, APITYPE, INPUTFORMAT, ...)    \\r
147         AFTER_ORIGINAL_FILEP_RET(VT_INT, ret, SIZE, FILEP, APITYPE, INPUTFORMAT, __VA_ARGS__)\r
148 \r
149 #endif  // __DA_IO_H__\r