Hello,
i am try to write a profiler for a multithreaded applciation. When i creat e a thread for "function f2()" the profiling information for this function does not get captured in the struct profileManager. i;e i get the exit information for "function f2()" in that thread, but the entry information does not get captured. Is it because the profiling function "__cyg_profile_func_enter" does not get inserted fot that thread? Do i have to use pthread_once_t to initialize so that its entry gets profiled??
Thanks,
Vikky.
////**** This is my instrument.c file ****/////
static FILE *fp;
struct profileManager{
pid_t pth;
pthread_t th;
char Ch;
int addr;
struct timeval tp;
}pM[1000];
static int cnt=0;
void __cyg_profile_func_enter( void *this, void callsite ) {
pthread_mutex_lock(&Lock);
pM[cnt].pth=getpid();
pM[cnt].th=pthread_self();
pM[cnt].Ch='E';
pM[cnt].addr=(int)this;
gettimeofday(&pM[cnt].tp,NULL);
cnt++;
pthread_mutex_unlock(&Lock);
}
void __cyg_profile_func_exit( void *this, void callsite ) {
pthread_mutex_lock(&Lock);
pM[cnt].pth=getpid();
pM[cnt].th=pthread_self();
pM[cnt].Ch='X';
pM[cnt].addr=(int)this;
gettimeofday(&pM[cnt].tp,NULL);
cnt++;
pthread_mutex_unlock(&Lock);
}
////***** my sample code test.c ****/////
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
int f1(int i){
sleep(1);
if(i==1)
return 0;
f1(i-1);
}
void f3(){
f1(5);
}
void* f2(void* arg){
f3();
}
void f4(){
sleep(1);
}
int main(){
int i;
pthread_t th;
int code;
code = pthread_create(&th,NULL,f2,NULL); ///Create Thread for F2
if(code==0)
printf("Thread created %d\n",th);
printf("Hello World\n");
(void)f2(NULL);
for(i=0;i<5;i++)
f4();
sleep(10);
return 0;
}