#include "dahelper.h"
#include "da_thread.h"
+#include "binproto.h"
+
typedef struct thread_routine_call_t {
void *(*thread_routine)(void *);
void *argument;
pSelf, THREAD_PTHREAD, THREAD_API_INTERNAL_STOP);
APPEND_LOG_NULL_CALLSTACK();
printLog(&log, MSG_LOG);
+
+ PREPARE_LOCAL_BUF();
+ PACK_COMMON_BEGIN(MSG_PROBE_THREAD, LC_THREAD, "p", data);
+ PACK_COMMON_END(0, 0, 1);
+ PACK_THREAD(pSelf, THREAD_PTHREAD, THREAD_API_INTERNAL_STOP);
+ FLUSH_LOCAL_BUF();
+
PRE_UNCONDITIONAL_BLOCK_END();
return;
pSelf, THREAD_PTHREAD, THREAD_API_INTERNAL_START);
APPEND_LOG_NULL_CALLSTACK();
printLog(&log, MSG_LOG);
+
+ PREPARE_LOCAL_BUF();
+ PACK_COMMON_BEGIN(MSG_PROBE_THREAD, LC_THREAD, "p", params);
+ PACK_COMMON_END(0, 0, 1);
+ PACK_THREAD(pSelf, THREAD_PTHREAD, THREAD_API_INTERNAL_START);
+ FLUSH_LOCAL_BUF();
+
PRE_UNCONDITIONAL_BLOCK_END();
pthread_cleanup_push(_da_cleanup_handler, NULL);
pSelf, THREAD_PTHREAD, THREAD_API_INTERNAL_STOP);
APPEND_LOG_NULL_CALLSTACK();
printLog(&log, MSG_LOG);
+
+ PREPARE_LOCAL_BUF();
+ PACK_COMMON_BEGIN(MSG_PROBE_THREAD, LC_THREAD, "p", params);
+ PACK_COMMON_END(ret, 0, 1);
+ PACK_THREAD(pSelf, THREAD_PTHREAD, THREAD_API_INTERNAL_STOP);
+ FLUSH_LOCAL_BUF();
+
PRE_UNCONDITIONAL_BLOCK_END();
free(ptrc);
BEFORE_ORIGINAL_THREAD(pthread_create, LIBPTHREAD);
+ BEFORE_PACK_ORIGINAL_THREAD(pthread_create, LIBPTHREAD);
+
if(blockresult)
{
probeBlockStart();
AFTER_ORIGINAL_THREAD_RET(VT_INT, ret, *thread, THREAD_API_START,
"%p,%p,%p,%p", thread, attr, start_routine, arg);
+ AFTER_PACK_ORIGINAL_THREAD(ret, *thread, THREAD_API_START,
+ "pppp", thread, attr, start_routine, arg);
+
return ret;
}
THREAD_PTHREAD, THREAD_API_WAIT_START);
APPEND_LOG_NULL_CALLSTACK();
printLog(&log, MSG_LOG);
+
+ PREPARE_LOCAL_BUF();
+ PACK_COMMON_BEGIN(MSG_PROBE_THREAD, LC_THREAD, "xp", thread, retval);
+ PACK_COMMON_END(0, 0, blockresult);
+ PACK_THREAD(thread, THREAD_PTHREAD, THREAD_API_WAIT_START);
+ FLUSH_LOCAL_BUF();
+
PRE_PROBEBLOCK_END();
ret = pthread_joinp(thread, retval);
POST_PROBEBLOCK_MIDDLE_THREAD(thread, THREAD_API_WAIT_END);
POST_PROBEBLOCK_CALLSTACK();
printLog(&log, MSG_LOG);
+
+ PREPARE_LOCAL_BUF();
+ PACK_COMMON_BEGIN(MSG_PROBE_THREAD, LC_THREAD, "xp", thread, retval);
+ PACK_COMMON_END(ret, errno, blockresult);
+ PACK_THREAD(thread, THREAD_PTHREAD, THREAD_API_WAIT_END);
+ FLUSH_LOCAL_BUF();
+
postBlockEnd();
}
pSelf, THREAD_PTHREAD, THREAD_API_EXIT);
APPEND_LOG_NULL_CALLSTACK();
printLog(&log, MSG_LOG);
+
+ PREPARE_LOCAL_BUF();
+ PACK_COMMON_BEGIN(MSG_PROBE_THREAD, LC_THREAD, "p", retval);
+ PACK_COMMON_END(0, 0, blockresult);
+ PACK_THREAD(pSelf, THREAD_PTHREAD, THREAD_API_EXIT);
+ FLUSH_LOCAL_BUF();
+
PRE_PROBEBLOCK_END();
pthread_exitp(retval);
BEFORE_ORIGINAL_THREAD(pthread_cancel, LIBPTHREAD);
+ BEFORE_PACK_ORIGINAL_THREAD(pthread_cancel, LIBPTHREAD);
+
ret = pthread_cancelp(thread);
AFTER_ORIGINAL_THREAD_RET(VT_INT, ret, thread, THREAD_API_STOP, "%lu", thread);
+ AFTER_PACK_ORIGINAL_THREAD(ret, thread, THREAD_API_STOP, "x", thread);
+
return ret;
}
BEFORE_ORIGINAL_THREAD(pthread_detach, LIBPTHREAD);
+ BEFORE_PACK_ORIGINAL_THREAD(pthread_detach, LIBPTHREAD);
+
ret = pthread_detachp(thread);
AFTER_ORIGINAL_THREAD_RET(VT_INT, ret, thread, THREAD_API_OTHER, "%lu", thread);
+ AFTER_PACK_ORIGINAL_THREAD(ret, thread, THREAD_API_OTHER, "x", thread);
+
return ret;
}
BEFORE_ORIGINAL_THREAD(pthread_self, LIBPTHREAD);
+ BEFORE_PACK_ORIGINAL_THREAD(pthread_self, LIBPTHREAD);
+
ret_pthr = pthread_selfp();
newerrno = errno;
POST_PROBEBLOCK_MIDDLE_THREAD(ret_pthr, THREAD_API_OTHER);
POST_PROBEBLOCK_CALLSTACK();
printLog(&log, MSG_LOG);
+
+ AFTER_PACK_ORIGINAL_THREAD(ret_pthr, ret_pthr, THREAD_API_OTHER, "", 0);
+
postBlockEnd();
+ } else {
+ FLUSH_LOCAL_BUF();
}
return ret_pthr;
BEFORE_ORIGINAL_THREAD(pthread_equal, LIBPTHREAD);
+ BEFORE_PACK_ORIGINAL_THREAD(pthread_equal, LIBPTHREAD);
+
ret = pthread_equalp(t1, t2);
AFTER_ORIGINAL_THREAD_RET(VT_INT, ret, t1, THREAD_API_OTHER, "%lu,%lu", t1, t2);
+ AFTER_PACK_ORIGINAL_THREAD(ret, t1, THREAD_API_OTHER, "xx", t1, t2);
+
return ret;
}
BEFORE_ORIGINAL_THREAD(pthread_setcancelstate, LIBPTHREAD);
+ BEFORE_PACK_ORIGINAL_THREAD(pthread_setcancelstate, LIBPTHREAD);
+
pSelf = pthread_self();
ret = pthread_setcancelstatep(state, oldstate);
AFTER_ORIGINAL_THREAD_RET(VT_INT, ret, pSelf, THREAD_API_OTHER,
- "%d,%p", state, oldstate);
+ "%d,%p", state, oldstate);
+
+ AFTER_PACK_ORIGINAL_THREAD(ret, pSelf, THREAD_API_OTHER,
+ "dp", state, oldstate);
return ret;
}
BEFORE_ORIGINAL_THREAD(pthread_setcanceltype, LIBPTHREAD);
+ BEFORE_PACK_ORIGINAL_THREAD(pthread_setcanceltype, LIBPTHREAD);
+
pSelf = pthread_self();
ret = pthread_setcanceltypep(type, oldtype);
AFTER_ORIGINAL_THREAD_RET(VT_INT, ret, pSelf, THREAD_API_OTHER,
- "%d,%p", type, oldtype);
+ "%d,%p", type, oldtype);
+
+ AFTER_PACK_ORIGINAL_THREAD(ret, pSelf, THREAD_API_OTHER,
+ "dp", type, oldtype);
return ret;
}
BEFORE_ORIGINAL_THREAD(pthread_attr_init, LIBPTHREAD);
+ BEFORE_PACK_ORIGINAL_THREAD(pthread_attr_init, LIBPTHREAD);
+
ret = pthread_attr_initp(attr);
AFTER_ORIGINAL_THREAD_RET(VT_INT, ret, thread, THREAD_API_OTHER, "%p", attr);
+ AFTER_PACK_ORIGINAL_THREAD(ret, thread, THREAD_API_OTHER, "p", attr);
+
return ret;
}
BEFORE_ORIGINAL_THREAD(pthread_attr_destroy, LIBPTHREAD);
+ BEFORE_PACK_ORIGINAL_THREAD(pthread_attr_destroy, LIBPTHREAD);
+
ret = pthread_attr_destroyp(attr);
AFTER_ORIGINAL_THREAD_RET(VT_INT, ret, thread, THREAD_API_OTHER, "%p", attr);
+ AFTER_PACK_ORIGINAL_THREAD(ret, thread, THREAD_API_OTHER, "p", attr);
+
return ret;
}
BEFORE_ORIGINAL_THREAD(pthread_attr_getdetachstate, LIBPTHREAD);
+ BEFORE_PACK_ORIGINAL_THREAD(pthread_attr_getdetachstate, LIBPTHREAD);
+
ret = pthread_attr_getdetachstatep(attr, detachstate);
AFTER_ORIGINAL_THREAD_RET(VT_INT, ret, thread, THREAD_API_OTHER,
"%p,%p", attr, detachstate);
+ AFTER_PACK_ORIGINAL_THREAD(ret, thread, THREAD_API_OTHER,
+ "pp", attr, detachstate);
+
return ret;
}
BEFORE_ORIGINAL_THREAD(pthread_attr_setdetachstate, LIBPTHREAD);
+ BEFORE_PACK_ORIGINAL_THREAD(pthread_attr_setdetachstate, LIBPTHREAD);
+
ret = pthread_attr_setdetachstatep(attr, detachstate);
AFTER_ORIGINAL_THREAD_RET(VT_INT, ret, thread, THREAD_API_OTHER,
"%p,%d", attr, detachstate);
+ AFTER_PACK_ORIGINAL_THREAD(ret, thread, THREAD_API_OTHER,
+ "pd", attr, detachstate);
+
return ret;
}
BEFORE_ORIGINAL_THREAD(pthread_attr_getstacksize, LIBPTHREAD);
+ BEFORE_PACK_ORIGINAL_THREAD(pthread_attr_getstacksize, LIBPTHREAD);
+
ret = pthread_attr_getstacksizep(attr, stacksize);
AFTER_ORIGINAL_THREAD_RET(VT_INT, ret, thread, THREAD_API_OTHER,
"%p,%p", attr, stacksize);
+ AFTER_PACK_ORIGINAL_THREAD(ret, thread, THREAD_API_OTHER,
+ "pp", attr, stacksize);
+
return ret;
}
BEFORE_ORIGINAL_THREAD(pthread_attr_setstacksize, LIBPTHREAD);
+ BEFORE_PACK_ORIGINAL_THREAD(pthread_attr_setstacksize, LIBPTHREAD);
+
ret = pthread_attr_setstacksizep(attr, stacksize);
AFTER_ORIGINAL_THREAD_RET(VT_INT, ret, thread, THREAD_API_OTHER,
"%p,%u", attr, stacksize);
+ AFTER_PACK_ORIGINAL_THREAD(ret, thread, THREAD_API_OTHER,
+ "pd", attr, stacksize);
+
return ret;
}
BEFORE_ORIGINAL_THREAD(pthread_attr_getstackaddr, LIBPTHREAD);
+ BEFORE_PACK_ORIGINAL_THREAD(pthread_attr_getstackaddr, LIBPTHREAD);
+
ret = pthread_attr_getstackaddrp(attr, stackaddr);
AFTER_ORIGINAL_THREAD_RET(VT_INT, ret, thread, THREAD_API_OTHER,
"%p,%p", attr, stackaddr);
+ AFTER_PACK_ORIGINAL_THREAD(ret, thread, THREAD_API_OTHER,
+ "pp", attr, stackaddr);
+
return ret;
}
BEFORE_ORIGINAL_THREAD(pthread_attr_setstackaddr, LIBPTHREAD);
+ BEFORE_PACK_ORIGINAL_THREAD(pthread_attr_setstackaddr, LIBPTHREAD);
+
ret = pthread_attr_setstackaddrp(attr, stackaddr);
AFTER_ORIGINAL_THREAD_RET(VT_INT, ret, thread, THREAD_API_OTHER,
"%p,%p", attr, stackaddr);
+ AFTER_PACK_ORIGINAL_THREAD(ret, thread, THREAD_API_OTHER,
+ "pp", attr, stackaddr);
+
return ret;
}
BEFORE_ORIGINAL_THREAD(pthread_attr_getinheritsched, LIBPTHREAD);
+ BEFORE_PACK_ORIGINAL_THREAD(pthread_attr_getinheritsched, LIBPTHREAD);
+
ret = pthread_attr_getinheritschedp(attr, inheritsched);
AFTER_ORIGINAL_THREAD_RET(VT_INT, ret, thread, THREAD_API_OTHER,
"%p,%p", attr, inheritsched);
+ AFTER_PACK_ORIGINAL_THREAD(ret, thread, THREAD_API_OTHER,
+ "pp", attr, inheritsched);
+
return ret;
}
BEFORE_ORIGINAL_THREAD(pthread_attr_setinheritsched, LIBPTHREAD);
+ BEFORE_PACK_ORIGINAL_THREAD(pthread_attr_setinheritsched, LIBPTHREAD);
+
ret = pthread_attr_setinheritschedp(attr, inheritsched);
AFTER_ORIGINAL_THREAD_RET(VT_INT, ret, thread, THREAD_API_OTHER,
"%p,%d", attr, inheritsched);
+ AFTER_PACK_ORIGINAL_THREAD(ret, thread, THREAD_API_OTHER,
+ "pd", attr, inheritsched);
+
return ret;
}
BEFORE_ORIGINAL_THREAD(pthread_attr_getschedparam, LIBPTHREAD);
+ BEFORE_PACK_ORIGINAL_THREAD(pthread_attr_getschedparam, LIBPTHREAD);
+
ret = pthread_attr_getschedparamp(attr, param);
AFTER_ORIGINAL_THREAD_RET(VT_INT, ret, thread, THREAD_API_OTHER,
"%p,%p", attr, param);
+ AFTER_PACK_ORIGINAL_THREAD(ret, thread, THREAD_API_OTHER,
+ "pp", attr, param);
+
return ret;
}
BEFORE_ORIGINAL_THREAD(pthread_attr_setschedparam, LIBPTHREAD);
+ BEFORE_PACK_ORIGINAL_THREAD(pthread_attr_setschedparam, LIBPTHREAD);
+
ret = pthread_attr_setschedparamp(attr, param);
AFTER_ORIGINAL_THREAD_RET(VT_INT, ret, thread, THREAD_API_OTHER,
"%p,%p", attr, param);
+ AFTER_PACK_ORIGINAL_THREAD(ret, thread, THREAD_API_OTHER,
+ "pp", attr, param);
+
return ret;
}
BEFORE_ORIGINAL_THREAD(pthread_attr_getschedpolicy, LIBPTHREAD);
+ BEFORE_PACK_ORIGINAL_THREAD(pthread_attr_getschedpolicy, LIBPTHREAD);
+
ret = pthread_attr_getschedpolicyp(attr, policy);
AFTER_ORIGINAL_THREAD_RET(VT_INT, ret, thread, THREAD_API_OTHER,
"%p,%p", attr, policy);
+ AFTER_PACK_ORIGINAL_THREAD(ret, thread, THREAD_API_OTHER,
+ "pp", attr, policy);
+
return ret;
}
BEFORE_ORIGINAL_THREAD(pthread_attr_setschedpolicy, LIBPTHREAD);
+ BEFORE_PACK_ORIGINAL_THREAD(pthread_attr_setschedpolicy, LIBPTHREAD);
+
ret = pthread_attr_setschedpolicyp(attr, policy);
AFTER_ORIGINAL_THREAD_RET(VT_INT, ret, thread, THREAD_API_OTHER,
"%p,%d", attr, policy);
+ AFTER_PACK_ORIGINAL_THREAD(ret, thread, THREAD_API_OTHER,
+ "pd", attr, policy);
+
return ret;
}
BEFORE_ORIGINAL_THREAD(pthread_attr_getguardsize, LIBPTHREAD);
+ BEFORE_PACK_ORIGINAL_THREAD(pthread_attr_getguardsize, LIBPTHREAD);
+
ret = pthread_attr_getguardsizep(attr, guardsize);
AFTER_ORIGINAL_THREAD_RET(VT_INT, ret, thread, THREAD_API_OTHER,
"%p,%p", attr, guardsize);
+ AFTER_PACK_ORIGINAL_THREAD(ret, thread, THREAD_API_OTHER,
+ "pp", attr, guardsize);
+
return ret;
}
BEFORE_ORIGINAL_THREAD(pthread_attr_setguardsize, LIBPTHREAD);
+ BEFORE_PACK_ORIGINAL_THREAD(pthread_attr_setguardsize, LIBPTHREAD);
+
ret = pthread_attr_setguardsizep(attr, guardsize);
AFTER_ORIGINAL_THREAD_RET(VT_INT, ret, thread, THREAD_API_OTHER,
"%p,%u", attr, guardsize);
+ AFTER_PACK_ORIGINAL_THREAD(ret, thread, THREAD_API_OTHER,
+ "pd", attr, guardsize);
+
return ret;
}
BEFORE_ORIGINAL_THREAD(pthread_attr_getscope, LIBPTHREAD);
+ BEFORE_PACK_ORIGINAL_THREAD(pthread_attr_getscope, LIBPTHREAD);
+
ret = pthread_attr_getscopep(attr, contentionscope);
AFTER_ORIGINAL_THREAD_RET(VT_INT, ret, thread, THREAD_API_OTHER,
"%p,%p", attr, contentionscope);
+ AFTER_PACK_ORIGINAL_THREAD(ret, thread, THREAD_API_OTHER,
+ "pp", attr, contentionscope);
+
return ret;
}
BEFORE_ORIGINAL_THREAD(pthread_attr_setscope, LIBPTHREAD);
+ BEFORE_PACK_ORIGINAL_THREAD(pthread_attr_setscope, LIBPTHREAD);
+
ret = pthread_attr_setscopep(attr, contentionscope);
AFTER_ORIGINAL_THREAD_RET(VT_INT, ret, thread, THREAD_API_OTHER,
"%p,%d", attr, contentionscope);
+ AFTER_PACK_ORIGINAL_THREAD(ret, thread, THREAD_API_OTHER,
+ "pd", attr, contentionscope);
+
return ret;
}
BEFORE_ORIGINAL_THREAD(pthread_attr_getstack, LIBPTHREAD);
+ BEFORE_PACK_ORIGINAL_THREAD(pthread_attr_getstack, LIBPTHREAD);
+
ret = pthread_attr_getstackp(attr, stackaddr, stacksize);
AFTER_ORIGINAL_THREAD_RET(VT_INT, ret, thread, THREAD_API_OTHER,
"%p,%p,%p", attr, stackaddr, stacksize);
+ AFTER_PACK_ORIGINAL_THREAD(ret, thread, THREAD_API_OTHER,
+ "ppp", attr, stackaddr, stacksize);
+
return ret;
}
BEFORE_ORIGINAL_THREAD(pthread_attr_setstack, LIBPTHREAD);
+ BEFORE_PACK_ORIGINAL_THREAD(pthread_attr_setstack, LIBPTHREAD);
+
ret = pthread_attr_setstackp(attr, stackaddr, stacksize);
AFTER_ORIGINAL_THREAD_RET(VT_INT, ret, thread, THREAD_API_OTHER,
"%p,%p,%u", attr, stackaddr, stacksize);
+ AFTER_PACK_ORIGINAL_THREAD(ret, thread, THREAD_API_OTHER,
+ "ppd", attr, stackaddr, stacksize);
+
return ret;
}