if(unlikely(psymbol == NULL))
return ERR_WRONGPARAMETER;
- TRACE_STATE_SET(TS_HASHFUNC);
+ probeBlockStart();
SYMBOLHASH_LOCK;
k = kh_get(symbol, SYMBOLHASH, (uint32_t)ptr);
ret = 1;
}
SYMBOLHASH_UNLOCK;
- TRACE_STATE_UNSET(TS_HASHFUNC);
+ probeBlockEnd();
return ret;
}
if(unlikely(str == NULL))
return ERR_WRONGPARAMETER;
- TRACE_STATE_SET(TS_HASHFUNC);
+ probeBlockStart();
SYMBOLHASH_LOCK;
k = kh_put(symbol, SYMBOLHASH, (uint32_t)ptr, &rethash);
ret = 1;
}
SYMBOLHASH_UNLOCK;
- TRACE_STATE_UNSET(TS_HASHFUNC);
+ probeBlockEnd();
return ret;
}
if(unlikely(ptr == NULL))
return ERR_WRONGPARAMETER;
- TRACE_STATE_SET(TS_HASHFUNC);
+ probeBlockStart();
MEMORYHASH_LOCK;
k = kh_put(allocmap, MEMORYHASH, (uint32_t)ptr, &rethash);
if(likely(rethash != 0)) // succeed to add in hash table
ret = 1;
}
MEMORYHASH_UNLOCK;
- TRACE_STATE_UNSET(TS_HASHFUNC);
+ probeBlockEnd();
return ret;
}
if(unlikely(ptr == NULL))
return ERR_WRONGPARAMETER;
- TRACE_STATE_SET(TS_HASHFUNC);
+ probeBlockStart();
MEMORYHASH_LOCK;
k = kh_get(allocmap, MEMORYHASH, (uint32_t)ptr);
if(likely(k != kh_end(MEMORYHASH)))
ret = 1; // there is not entry in hash table
}
MEMORYHASH_UNLOCK;
- TRACE_STATE_UNSET(TS_HASHFUNC);
+ probeBlockEnd();
return ret;
}
if(unlikely(classname == NULL))
return ERR_WRONGPARAMETER;
- TRACE_STATE_SET(TS_HASHFUNC);
+ probeBlockStart();
OBJECTHASH_LOCK;
k = kh_get(object, OBJECTHASH, (uint32_t)ptr);
ret = 1;
}
OBJECTHASH_UNLOCK;
- TRACE_STATE_UNSET(TS_HASHFUNC);
+ probeBlockEnd();
return ret;
}
if(unlikely(classname == NULL))
return ERR_WRONGPARAMETER;
- TRACE_STATE_SET(TS_HASHFUNC);
+ probeBlockStart();
str_len = strlen(classname) + 1;
ret = 1; // there is no entry
OBJECTHASH_UNLOCK;
- TRACE_STATE_UNSET(TS_HASHFUNC);
+ probeBlockEnd();
return ret;
}
if(unlikely(type == NULL))
return ERR_WRONGPARAMETER;
- TRACE_STATE_SET(TS_HASHFUNC);
+ probeBlockStart();
str_len = strlen(type) + 1;
ret = 1;
OBJECTHASH_UNLOCK;
- TRACE_STATE_UNSET(TS_HASHFUNC);
+ probeBlockEnd();
return ret;
}
if(unlikely(ptr == NULL))
return ERR_WRONGPARAMETER;
- TRACE_STATE_SET(TS_HASHFUNC);
+ probeBlockStart();
OBJECTHASH_LOCK;
k = kh_get(object, OBJECTHASH, (uint32_t)ptr);
if(likely(k != kh_end(OBJECTHASH))) // there is entry in hash table
ret = 1;
}
OBJECTHASH_UNLOCK;
- TRACE_STATE_UNSET(TS_HASHFUNC);
+ probeBlockEnd();
return ret;
}
if(unlikely(listener == NULL))
return ERR_WRONGPARAMETER;
- TRACE_STATE_SET(TS_HASHFUNC);
+ probeBlockStart();
DETECTORHASH_LOCK;
k = kh_put(detector, DETECTORHASH, (uint32_t)ptr, &rethash);
ret = 1;
}
DETECTORHASH_UNLOCK;
- TRACE_STATE_UNSET(TS_HASHFUNC);
+ probeBlockEnd();
return ret;
}
if(unlikely(ptr == NULL))
return ERR_WRONGPARAMETER;
- TRACE_STATE_SET(TS_HASHFUNC);
+ probeBlockStart();
DETECTORHASH_LOCK;
k = kh_get(detector, DETECTORHASH, (uint32_t)ptr);
if(likely(k != kh_end(DETECTORHASH))) // there is entry in hash table
ret = 1;
}
DETECTORHASH_UNLOCK;
- TRACE_STATE_UNSET(TS_HASHFUNC);
+ probeBlockEnd();
return ret;
}
0 // unsigned long optionflag
};
-__thread unsigned long gSTrace = 0;
-
-
void WcharToChar(char* pstrDest, const wchar_t* pwstrSrc)
{
int nLen=(int)wcslen(pwstrSrc);
return 0;
}
-
#define UDS_NAME "/tmp/da.socket"
#define TIMERFD_INTERVAL 100000000 // 0.1 sec
-__thread int gProbeDepth = 0;
-__thread unsigned int gProbeBlockCount = 0;
-__thread pid_t gTid = -1;
+__thread int gProbeBlockCount = 0;
+__thread int gProbeDepth = 0;
+__thread pid_t gTid = -1;
int g_timerfd = 0;
long g_total_alloc_size = 0;
if(gTraceInfo.socket.daemonSock == -1)
return NULL;
- TRACE_STATE_SET(TS_RECV_THREAD);
+ probeBlockStart();
sigemptyset(&profsigmask);
sigaddset(&profsigmask, SIGPROF);
}
}
- TRACE_STATE_UNSET(TS_RECV_THREAD);
+ probeBlockEnd();
return NULL;
}
struct timeval ttime;
struct itimerspec ctime;
- TRACE_STATE_SET(TS_INIT);
+ probeBlockStart();
initialize_hash_table();
PRINTMSG("dynamic analyzer probe helper so loading...\n");
gTraceInfo.init_complete = 1;
- TRACE_STATE_UNSET(TS_INIT);
+ probeBlockEnd();
}
void __attribute__((destructor)) _fini_probe()
{
int i;
- TRACE_STATE_SET(TS_FINIT);
+ probeBlockStart();
gTraceInfo.init_complete = -1;
PRINTMSG("dynamic analyzer probe helper so unloading...\n");
}
}
- TRACE_STATE_UNSET(TS_FINIT);
+ probeBlockEnd();
}
if(unlikely(log == NULL))
return false;
- TRACE_STATE_SET(TS_PRINT_LOG);
+ probeBlockStart();
log->type = msgType;
pthread_mutex_lock(&(gTraceInfo.socket.sockMutex));
res = send(gTraceInfo.socket.daemonSock, log, sizeof(log->type) + sizeof(log->length) + log->length, 0);
pthread_mutex_unlock(&(gTraceInfo.socket.sockMutex));
- TRACE_STATE_UNSET(TS_PRINT_LOG);
+ probeBlockEnd();
return true;
}*/
if(unlikely(gTraceInfo.socket.daemonSock == -1))
return false;
- TRACE_STATE_SET(TS_PRINT_LOG);
+ probeBlockStart();
log.type = msgType;
if(str)
res = send(gTraceInfo.socket.daemonSock, &log, sizeof(log.type) + sizeof(log.length) + log.length, MSG_DONTWAIT);
pthread_mutex_unlock(&(gTraceInfo.socket.sockMutex));
- TRACE_STATE_UNSET(TS_PRINT_LOG);
+ probeBlockEnd();
return true;
}
if(nInput <= 0 || log == NULL)
return -1;
- TRACE_STATE_SET(TS_APPEND_TYPE_LOG);
+ probeBlockStart();
va_start(p_arg, token);
break;*/
default:
va_end(p_arg);
- TRACE_STATE_UNSET(TS_APPEND_TYPE_LOG);
+ probeBlockEnd();
return -1;
}
}
va_end(p_arg);
- TRACE_STATE_UNSET(TS_APPEND_TYPE_LOG);
+ probeBlockEnd();
return 0;
}
if(log == NULL)
return 0;
- TRACE_STATE_SET(TS_BACKTRACE);
+ probeBlockStart();
initsize = log->length;
log->data[log->length] = '\0'; // is this necessary ?
log->length -= 2;
}
- TRACE_STATE_UNSET(TS_BACKTRACE);
+ probeBlockEnd();
return (int)(size - TRIM_STACK_DEPTH);
}
else
{
- TRACE_STATE_UNSET(TS_BACKTRACE);
+ probeBlockEnd();
return 0;
}
}
void* tarray[1];
char** strings;
- if(gSTrace != 0 || gProbeDepth != 0)
+ if(gProbeBlockCount != 0 || gProbeDepth != 0)
return 0;
if(gTraceInfo.init_complete <= 0)
if((gTraceInfo.optionflag & option) == 0)
return 0;
- TRACE_STATE_SET(TS_ENTER_PROBE_BLOCK);
+ probeBlockStart();
if(gTraceInfo.exec_map.map_start != NULL)
{
if(user)
{
- gProbeDepth++;
+ probingStart();
return 2; // user call
}
else
{
if(bFiltering)
{
- TRACE_STATE_UNSET(TS_ENTER_PROBE_BLOCK);
+ probeBlockEnd();
return 0; // not probing
}
else
{
- gProbeDepth++;
+ probingStart();
return 1; // internal call
}
}
{
if(preresult)
{
- TRACE_STATE_SET(TS_ENTER_PROBE_BLOCK);
+ probeBlockStart();
}
return preresult;
void preBlockEnd()
{
- TRACE_STATE_UNSET(TS_ENTER_PROBE_BLOCK);
+ probeBlockEnd();
}
void postBlockEnd()
{
- gProbeDepth--;
- TRACE_STATE_UNSET(TS_ENTER_PROBE_BLOCK);
-}
-
-// for block that have to be run
-void probeBlockStart()
-{
- gProbeBlockCount++;
- if(gProbeBlockCount == 1)
- TRACE_STATE_SET(TS_PROBE);
-}
-
-void probeBlockEnd()
-{
- if(gProbeBlockCount == 1)
- TRACE_STATE_UNSET(TS_PROBE);
- gProbeBlockCount--;
+ probingEnd();
+ probeBlockEnd();
}
/*************************************************************************
return gTraceInfo.index.eventIndex;
}
-unsigned int getCallDepth()
-{
- return gProbeDepth;
-}
-
-unsigned long getTraceState()
-{
- return gSTrace;
-}
-
/************************************************************************
* probe functions
************************************************************************/
return false;
}
- TRACE_STATE_SET(TS_SET_PROBE_POINT);
+ probeBlockStart();
// atomic operaion(gcc builtin) is more expensive then pthread_mutex
pthread_mutex_lock(&(gTraceInfo.index.eventMutex));
iProbe->tID = _gettid();
iProbe->callDepth = gProbeDepth;
- TRACE_STATE_UNSET(TS_SET_PROBE_POINT);
+ probeBlockEnd();
return true;
}
#define SNAPSHOT_WAIT_TIME_MAX 10000
*/
-#define TS_NONE 0x00000000
-#define TS_PROBE 0x00000001
-#define TS_INIT 0x00000002
-#define TS_FINIT 0x00000004
-#define TS_ENTER_PROBE_BLOCK 0x00000008
-#define TS_SET_PROBE_POINT 0x00000010
-#define TS_PRINT_LOG 0x00000020
-#define TS_PRINT_SAMPLE_LOG 0x00000040
-#define TS_APPEND_TYPE_LOG 0x00000080
-#define TS_BACKTRACE 0x00000100
-#define TS_HASHFUNC 0x00000200
-#define TS_PROFIL_THREAD 0x00000400
-#define TS_PROFIL_COUNT 0x00000800
-#define TS_DETECT_TOUCH 0x00001000
-#define TS_REGIST_SCREEN_CHANGE 0x00002000
-#define TS_POSSIBLE_CAPTURE 0x00004000
-#define TS_RECV_THREAD 0x00008000
-#define TS_CUSTOM_CHART_THREAD 0x00010000
-#define TRACE_STATE_SET(value) ((gSTrace) |= (value))
-#define TRACE_STATE_UNSET(value) ((gSTrace) &= (~value))
-
#define ENABLE_INTERNAL_MALLOC 0x0001
#define ENABLE_SNAPSHOT 0x0002
unsigned long optionflag;
} __traceInfo;
-extern __thread unsigned long gSTrace;
extern __traceInfo gTraceInfo;
int get_map_address(void* symbol, void** map_start, void** map_end);
unsigned int callDepth;
} probeInfo_t;
+extern __thread int gProbeBlockCount;
+extern __thread int gProbeDepth;
+
+#define probeBlockStart() (gProbeBlockCount++)
+#define probeBlockEnd() (gProbeBlockCount--)
+#define probingStart() (gProbeDepth++)
+#define probingEnd() (gProbeDepth--)
+
/***************************************************************************
* helper apis
***************************************************************************/
int postBlockBegin(int preresult);
void postBlockEnd();
-void probeBlockStart();
-void probeBlockEnd();
-
unsigned int getCurrentEventIndex();
-unsigned int getCallDepth();
-unsigned long getTraceState();
unsigned long getCurrentTime();
bool setProbePoint(probeInfo_t * iProbe);
int update_heap_memory_size(bool isAdd, size_t size);
static enum DaOptions _sopt = OPT_THREAD;
-extern __thread int gProbeDepth;
-
namespace Tizen {
namespace Base {
namespace Runtime {
preBlockEnd();
}
// all probe should be reachable inside thread start_routine (user implemented Thread::Run)
- gProbeDepth--;
- TRACE_STATE_UNSET(TS_ENTER_PROBE_BLOCK);
+ probingEnd();
+ probeBlockEnd();
(ThreadProcp)(params);
- TRACE_STATE_SET(TS_ENTER_PROBE_BLOCK);
- gProbeDepth++;
+ probeBlockStart();
+ probingStart();
//
if (postBlockBegin(blockresult)) {
setProbePoint(&probeInfo);
pret = malloc(size);
- if(pret != NULL && getTraceState() == 0)
+ if(pret != NULL && gProbeBlockCount == 0)
{
add_memory_hash(pret, size, MEMTYPE_ALLOC, blockresult ? MEM_EXTERNAL : MEM_INTERNAL);
}
PRE_PROBEBLOCK();
- if(ptr != NULL && getTraceState() == 0)
+ if(ptr != NULL && gProbeBlockCount == 0)
{
del_memory_hash(ptr, MEMTYPE_FREE, NULL);
}
PRE_PROBEBLOCK();
- if(memblock != NULL && getTraceState() == 0)
+ if(memblock != NULL && gProbeBlockCount == 0)
{
del_memory_hash(memblock, MEMTYPE_FREE, NULL);
}
pret = realloc(memblock, size);
- if(pret != NULL && getTraceState() == 0)
+ if(pret != NULL && gProbeBlockCount == 0)
{
add_memory_hash(pret, size, MEMTYPE_ALLOC, blockresult ? MEM_EXTERNAL : MEM_INTERNAL);
}
if (pret) /* `memset' somewhy deadloops */
adhoc_bzero(pret, nelem * elsize);
- if(pret != NULL && getTraceState() == 0)
+ if(pret != NULL && gProbeBlockCount == 0)
{
add_memory_hash(pret, nelem * elsize, MEMTYPE_ALLOC, blockresult ? MEM_EXTERNAL : MEM_INTERNAL);
}
#include "da_memory.h"
#include "binproto.h"
-extern __thread int gProbeDepth;
-
static enum DaOptions _sopt = OPT_ALLOC;
void *operator new(std::size_t size) throw (std::bad_alloc)
pret = newp(size);
- if(pret != NULL && getTraceState() == 0)
+ if(pret != NULL && gProbeBlockCount == 0)
{
add_memory_hash(pret, size, MEMTYPE_NEW, blockresult ? MEM_EXTERNAL : MEM_INTERNAL);
}
pret = newp(size);
- if(pret != NULL && getTraceState() == 0)
+ if(pret != NULL && gProbeBlockCount == 0)
{
add_memory_hash(pret, size, MEMTYPE_NEW, blockresult ? MEM_EXTERNAL : MEM_INTERNAL);
}
bfiltering = INTERNAL_DELETE_FILTERING;
PRE_PROBEBLOCK();
- if(ptr != NULL && getTraceState() == 0)
+ if(ptr != NULL && gProbeBlockCount == 0)
{
probeBlockStart();
ret = del_memory_hash(ptr, MEMTYPE_DELETE, &caller);
{
setProbePoint(&probeInfo);
blockresult = 2;
- gProbeDepth++;
+ probingStart();
}
probeBlockEnd();
}
bfiltering = INTERNAL_DELETE_FILTERING;
PRE_PROBEBLOCK();
- if(ptr != NULL && getTraceState() == 0)
+ if(ptr != NULL && gProbeBlockCount == 0)
{
probeBlockStart();
ret = del_memory_hash(ptr, MEMTYPE_DELETE, &caller);
{
setProbePoint(&probeInfo);
blockresult = 2;
- gProbeDepth++;
+ probingStart();
}
probeBlockEnd();
}
pret = newp(size, nothrow);
- if(pret != NULL && getTraceState() == 0)
+ if(pret != NULL && gProbeBlockCount == 0)
{
add_memory_hash(pret, size, MEMTYPE_NEW, blockresult ? MEM_EXTERNAL : MEM_INTERNAL);
}
pret = newp(size, nothrow);
- if(pret != NULL && getTraceState() == 0)
+ if(pret != NULL && gProbeBlockCount == 0)
{
add_memory_hash(pret, size, MEMTYPE_NEW, blockresult ? MEM_EXTERNAL : MEM_INTERNAL);
}
bfiltering = INTERNAL_DELETE_FILTERING;
PRE_PROBEBLOCK();
- if(ptr != NULL && getTraceState() == 0)
+ if(ptr != NULL && gProbeBlockCount == 0)
{
probeBlockStart();
ret = del_memory_hash(ptr, MEMTYPE_DELETE, &caller);
{
setProbePoint(&probeInfo);
blockresult = 2;
- gProbeDepth++;
+ probingStart();
}
probeBlockEnd();
}
bfiltering = INTERNAL_DELETE_FILTERING;
PRE_PROBEBLOCK();
- if(ptr != NULL && getTraceState() == 0)
+ if(ptr != NULL && gProbeBlockCount == 0)
{
probeBlockStart();
ret = del_memory_hash(ptr, MEMTYPE_DELETE, &caller);
{
setProbePoint(&probeInfo);
blockresult = 2;
- gProbeDepth++;
+ probingStart();
}
probeBlockEnd();
}
void *profil_log_func(void *data)
{
- TRACE_STATE_SET(TS_PROFIL_THREAD);
+ probeBlockStart();
sigset_t profsigmask;
sigemptyset(&profsigmask);
}
usleep(PROFIL_LOG_SENDING_INTERVAL_USEC);
}
- TRACE_STATE_UNSET(TS_PROFIL_THREAD);
+ probeBlockEnd();
return NULL;
}
if((pc >= (void*)(&profil_count - 0x18)) && (pc <= (void*)(&profil_count)))
return;
#endif
- if(gSTrace != 0)
+ if(gProbeBlockCount != 0)
return;
- TRACE_STATE_SET(TS_PROFIL_COUNT);
+ probeBlockStart();
real_pthread_mutex_lock(&profil_log_mutex);
do {
} while(0);
real_pthread_mutex_unlock(&profil_log_mutex);
- TRACE_STATE_UNSET(TS_PROFIL_COUNT);
+ probeBlockEnd();
}
#if defined(__i386__)