diff --git a/executer/user/mcexec.c b/executer/user/mcexec.c index bfe46ae6..26744714 100644 --- a/executer/user/mcexec.c +++ b/executer/user/mcexec.c @@ -1959,6 +1959,7 @@ struct uti_desc { int pid, tid; /* Used as the id of tracee when issuing MCEXEC_UP_TERMINATE_THREAD */ unsigned long uti_clv; sem_t arg, attach; + int exit; /* Used to tell the tracer to exit */ }; static int create_tracer(); @@ -2155,6 +2156,7 @@ int main(int argc, char **argv) if (uti_desc == (void *)-1) { exit(1); } + memset(uti_desc, 0, sizeof(struct uti_desc)); sem_init(&uti_desc->arg, 1, 0); sem_init(&uti_desc->attach, 1, 0); #if 1 @@ -2689,7 +2691,6 @@ int main(int argc, char **argv) } join_all_threads(); - fn_fail: return ret; } @@ -2966,6 +2967,11 @@ create_tracer() #endif sem_wait(&uti_desc->arg); + if (uti_desc->exit) { /* When uti is not used */ + fprintf(stderr, "%s: exiting tid=%d\n", __FUNCTION__, gettid()); + exit(0); + } + //close(uti_pfd[0]); if (ptrace(PTRACE_ATTACH, uti_desc->tid, 0, 0) == -1) { @@ -3461,6 +3467,7 @@ int main_loop(struct thread_data_s *my_thread) char pathbuf[PATH_MAX]; char tmpbuf[PATH_MAX]; int cpu = my_thread->cpu; + int sem_val; memset(&w, '\0', sizeof w); w.cpu = cpu; @@ -3605,6 +3612,16 @@ int main_loop(struct thread_data_s *my_thread) kill(getpid(), sig); pause(); } + + /* Make tracer exit when it is not used */ + if (sem_getvalue(&uti_desc->arg, &sem_val)) { + fprintf(stderr, "%s: ERROR: sem_getvalue returned %d\n", __FUNCTION__, errno); + } + if (sem_val == 0) { + uti_desc->exit = 1; + sem_post(&uti_desc->arg); + } + exit(term); //pthread_mutex_unlock(lock);