void VT_User_start__(const char* name, const char *file, int lno) { uint32_t rid; uint64_t time; /* -- if not yet initialized, initialize VampirTrace -- */ if ( vt_init ) { VT_MEMHOOKS_OFF(); vt_init = 0; vt_open(); VT_MEMHOOKS_ON(); } VT_MEMHOOKS_OFF(); time = vt_pform_wtime(); /* -- get region identifier -- */ if ( (rid = hash_get((unsigned long) name)) == VT_NO_ID ) { /* -- region entered the first time, register region -- */ #if (defined(VT_MT) || defined(VT_HYB)) VTTHRD_LOCK_IDS(); if ( (rid = hash_get((unsigned long) name)) == VT_NO_ID ) rid = register_region(name, 0, file, lno); VTTHRD_UNLOCK_IDS(); #else /* VT_MT || VT_HYB */ rid = register_region(name, 0, file, lno); #endif /* VT_MT || VT_HYB */ } /* -- write enter record -- */ vt_enter(&time, rid); VT_MEMHOOKS_ON(); }
VT_DECLDEF(int VT_pthread_create__(pthread_t* thread, const pthread_attr_t* attr, void *(*start_routine)(void*), void* arg)) { int rc; uint64_t time; struct vt_pthread_pack_struct* pack; if (vt_init) { vt_init = 0; vt_open(); } time = vt_pform_wtime(); vt_enter(VT_CURRENT_THREAD, &time, vt_pthread_regid[VT__PTHREAD_CREATE]); pack = (struct vt_pthread_pack_struct*)malloc( sizeof(struct vt_pthread_pack_struct)); if (pack == NULL) vt_error(); pack->start_routine = start_routine; pack->arg = arg; pack->ptid = VTThrd_getThreadId(); rc = pthread_create(thread, attr, vt_pthread_function, (void*)pack); time = vt_pform_wtime(); vt_exit(VT_CURRENT_THREAD, &time); return rc; }
void ___rouent2(struct s1 *p) { uint32_t tid; uint64_t time; /* -- if not yet initialized, initialize VampirTrace -- */ if (rou_init) { rou_init = 0; vt_open(); } /* -- if VampirTrace already finalized, return -- */ if ( !vt_is_alive ) return; /* -- get calling thread id -- */ GET_THREAD_ID(tid); VT_SUSPEND_MALLOC_TRACING(tid); time = vt_pform_wtime(); if (!p->isseen) { char* rname = p->rout; char* modpos; /* fix opari output file names */ if ( (modpos = strstr(p->file, ".mod.")) != NULL ) { strcpy(modpos, modpos+4); } #if (defined(VT_MT) || defined(VT_HYB)) VTTHRD_LOCK_IDS(); if (!p->isseen) { p->fid = vt_def_scl_file(tid, p->file); p->rid = vt_def_region(tid, rname, p->fid, p->lineno, VT_NO_LNO, NULL, VT_FUNCTION); p->isseen = 1; } VTTHRD_UNLOCK_IDS(); #else /* VT_MT || VT_HYB */ p->fid = vt_def_scl_file(tid, p->file); p->rid = vt_def_region(tid, rname, p->fid, p->lineno, VT_NO_LNO, NULL, VT_FUNCTION); p->isseen = 1; #endif /* VT_MT || VT_HYB */ } /* write enter trace record */ vt_enter(tid, &time, p->rid); VT_RESUME_MALLOC_TRACING(tid); }
void VT_Dyn_start(uint32_t index, const char* name, const char* fname, uint32_t lno, uint32_t loop) { uint64_t time; uint32_t* rid; vt_libassert(index < VT_MAX_DYNINST_REGIONS); /* Ignore events if VT is initializing */ if( !dyn_init && !vt_is_alive ) return; /* If not yet initialized, initialize VampirTrace */ if ( dyn_init ) { VT_MEMHOOKS_OFF(); dyn_init = 0; rtab = (uint32_t*)calloc(VT_MAX_DYNINST_REGIONS, sizeof(uint32_t)); if ( rtab == NULL ) vt_error(); vt_open(); vt_comp_finalize = VT_Dyn_finalize; VT_MEMHOOKS_ON(); } /* If VampirTrace already finalized, return */ if ( !vt_is_alive ) return; VT_MEMHOOKS_OFF(); time = vt_pform_wtime(); /* Get region identifier */ rid = &(rtab[index]); if ( *rid == 0 ) { /* If region entered the first time, register region */ #if (defined(VT_MT) || defined(VT_HYB)) VTTHRD_LOCK_IDS(); if ( *rid == 0 ) *rid = register_region(name, fname, lno, loop); VTTHRD_UNLOCK_IDS(); #else /* VT_MT || VT_HYB */ *rid = register_region(name, fname, lno, loop); #endif /* VT_MT || VT_HYB */ } /* Write enter record */ vt_enter(VT_CURRENT_THREAD, &time, *rid); VT_MEMHOOKS_ON(); }
VT_DECLDEF(void __profile_init(struct profile_init_struct* d)) { (void)d; if ( openuh_init ) { VT_MEMHOOKS_OFF(); openuh_init = 0; vt_open(); vt_comp_finalize = &__profile_finish; VT_MEMHOOKS_ON(); } }
void phat_enter(char *str, int *id) { uint64_t time; /* -- if not yet initialized, initialize VampirTrace -- */ if ( phat_init ) { uint32_t main_id; VT_MEMHOOKS_OFF(); phat_init = 0; vt_open(); main_id = register_region("main"); time = vt_pform_wtime(); vt_enter(&time, main_id); VT_MEMHOOKS_ON(); } /* -- if VampirTrace already finalized, return -- */ if ( !vt_is_alive ) return; /* -- ignore SUN OMP runtime functions -- */ if ( strchr(str, '$') != NULL ) return; VT_MEMHOOKS_OFF(); time = vt_pform_wtime(); /* -- get region identifier -- */ if ( *id == -1 ) { /* -- region entered the first time, register region -- */ # if defined (VT_OMPI) || defined (VT_OMP) if (omp_in_parallel()) { # pragma omp critical (vt_comp_phat_1) { if ( (*id = hash_get((long) str)) == VT_NO_ID ) { *id = register_region(str); } } } else { *id = register_region(str); } # else *id = register_region(str); # endif } /* -- write enter record -- */ vt_enter(&time, *id); VT_MEMHOOKS_ON(); }
void __cyg_profile_func_enter(void* func, void* callsite) { void* funcptr; uint64_t time; HashNode* hn; funcptr = DEREF_IA64_FUNC_PTR(func); /* -- if not yet initialized, initialize VampirTrace -- */ if ( gnu_init ) { VT_MEMHOOKS_OFF(); gnu_init = 0; vt_open(); vt_comp_finalize = gnu_finalize; get_symtab(); VT_MEMHOOKS_ON(); } /* -- if VampirTrace already finalized, return -- */ if ( !vt_is_alive ) return; VT_MEMHOOKS_OFF(); time = vt_pform_wtime(); /* -- get region identifier -- */ if ( (hn = hash_get((long)funcptr))) { if ( hn->vtid == VT_NO_ID ) { /* -- region entered the first time, register region -- */ #if (defined(VT_MT) || defined(VT_HYB)) VTTHRD_LOCK_IDS(); if( hn->vtid == VT_NO_ID ) register_region(hn); VTTHRD_UNLOCK_IDS(); #else /* VT_MT || VT_HYB */ register_region(hn); #endif /* VT_MT || VT_HYB */ } /* -- write enter record -- */ vt_enter(VT_CURRENT_THREAD, &time, hn->vtid); } VT_MEMHOOKS_ON(); }
void VT_User_start___f(const char* name, const char *file, int *lno, int nl, int fl) { uint32_t rid; uint64_t time; int namlen; int fillen; /* -- convert Fortran to C strings -- */ namlen = ( nl < 128 ) ? nl : 127; fillen = ( fl < 1024 ) ? fl : 1023; strncpy(fnambuf, name, namlen); fnambuf[namlen] = '\0'; strncpy(ffilbuf, file, fillen); ffilbuf[fillen] = '\0'; /* -- if not yet initialized, initialize VampirTrace -- */ if ( vt_init ) { VT_MEMHOOKS_OFF(); vt_init = 0; vt_open(); VT_MEMHOOKS_ON(); } VT_MEMHOOKS_OFF(); time = vt_pform_wtime(); /* -- get region identifier -- */ if ( (rid = hash_get((unsigned long) name)) == VT_NO_ID ) { /* -- region entered the first time, register region -- */ #if (defined(VT_MT) || defined(VT_HYB)) VTTHRD_LOCK_IDS(); if ( (rid = hash_get((unsigned long) name)) == VT_NO_ID ) rid = register_region(fnambuf, (unsigned long) name, ffilbuf, *lno); VTTHRD_UNLOCK_IDS(); #else rid = register_region(fnambuf, (unsigned long) name, ffilbuf, *lno); #endif } /* -- write enter record -- */ vt_enter(&time, rid); VT_MEMHOOKS_ON(); } VT_GENERATE_F77_BINDINGS(vt_user_start__, VT_USER_START__,
void _ftrace_enter2_() { char *func = (char *)vftr_getname(); int len = vftr_getname_len(); uint32_t rid; uint64_t time; /* -- if not yet initialized, initialize VampirTrace -- */ if ( necsx_init ) { VT_MEMHOOKS_OFF(); necsx_init = 0; vt_open(); vt_comp_finalize = &ftrace_finalize; VT_MEMHOOKS_ON(); } /* -- if VampirTrace already finalized, return -- */ if ( !vt_is_alive ) return; /* -- ignore NEC OMP runtime functions -- */ if ( strchr(func, '$') != NULL ) return; VT_MEMHOOKS_OFF(); time = vt_pform_wtime(); /* -- get region identifier -- */ if ( (rid = hash_get((long) func)) == VT_NO_ID ) { /* -- region entered the first time, register region -- */ #if (defined(VT_MT) || defined(VT_HYB)) VTTHRD_LOCK_IDS(); if ( (rid = hash_get((long) func)) == VT_NO_ID ) rid = register_region(func, len); VTTHRD_UNLOCK_IDS(); #else /* VT_MT || VT_HYB */ rid = register_region(func, len); #endif /* VT_MT || VT_HYB */ } /* -- write enter record -- */ vt_enter(VT_CURRENT_THREAD, &time, rid); VT_MEMHOOKS_ON(); }
void __func_trace_enter(char* name, char* fname, int lno) { HashNode *hn; uint64_t time; /* -- if not yet initialized, initialize VampirTrace -- */ if ( xl_init ) { VT_MEMHOOKS_OFF(); xl_init = 0; vt_open(); vt_comp_finalize = &xl_finalize; VT_MEMHOOKS_ON(); } /* -- if VampirTrace already finalized, return -- */ if ( !vt_is_alive ) return; /* -- ignore IBM OMP runtime functions -- */ if ( strchr(name, '@') != NULL ) return; VT_MEMHOOKS_OFF(); time = vt_pform_wtime(); /* -- get region identifier -- */ if ( (hn = hash_get((long) name)) == 0 ) { /* -- region entered the first time, register region -- */ #if (defined(VT_MT) || defined(VT_HYB)) VTTHRD_LOCK_IDS(); if ( (hn = hash_get((long) name)) == 0 ) hn = register_region(name, fname, lno); VTTHRD_UNLOCK_IDS(); #else /* VT_MT || VT_HYB */ hn = register_region(name, fname, lno); #endif /* VT_MT || VT_HYB */ } /* -- write enter record -- */ vt_enter(VT_CURRENT_THREAD, &time, hn->vtid); VT_MEMHOOKS_ON(); }
void phat_enter(char *str, int *id) { uint64_t time; /* -- if not yet initialized, initialize VampirTrace -- */ if ( phat_init ) { VT_MEMHOOKS_OFF(); phat_init = 0; vt_open(); vt_comp_finalize = &phat_finalize; VT_MEMHOOKS_ON(); } /* -- if VampirTrace already finalized, return -- */ if ( !vt_is_alive ) return; /* -- ignore SUN OMP runtime functions -- */ if ( strchr(str, '$') != NULL ) return; VT_MEMHOOKS_OFF(); time = vt_pform_wtime(); /* -- get region identifier -- */ if ( *id == -1 ) { /* -- region entered the first time, register region -- */ #if (defined(VT_MT) || defined(VT_HYB)) VTTHRD_LOCK_IDS(); if ( (*id = hash_get((long) str)) == VT_NO_ID ) *id = register_region(str); VTTHRD_UNLOCK_IDS(); #else /* VT_MT || VT_HYB */ *id = register_region(str); #endif /* VT_MT || VT_HYB */ } /* -- write enter record -- */ vt_enter(VT_CURRENT_THREAD, &time, *id); VT_MEMHOOKS_ON(); }
VT_DECLDEF(void VT_pthread_exit__(void* value_ptr)) { uint64_t time; int i, stack_level; if (vt_init) { vt_init = 0; vt_open(); } time = vt_pform_wtime(); vt_enter(VT_CURRENT_THREAD, &time, vt_pthread_regid[VT__PTHREAD_EXIT]); /* shutdown call stack */ stack_level = VTTHRD_STACK_LEVEL(VTThrdv[VT_MY_THREAD]); for(i = stack_level; i > 0; i--) { time = vt_pform_wtime(); vt_exit(VT_CURRENT_THREAD, &time); } pthread_exit(value_ptr); }
void POMP_Init() { static int pomp_init_called = 0; static struct VTRegDescr rd_data_table[1000]; char anno_rname[256]; /* annotated region name */ int max_threads = omp_get_max_threads(); int i; uint8_t rtype = VT_UNKNOWN; char* rname = ""; const char* rdesc; if ( ! pomp_init_called ) { pomp_init_called = 1; vt_open(); atexit(POMP_Finalize); /* register all threads in sequential order to make the VT thread ids equal to the OpenMP thread ids */ # pragma omp parallel for ordered private(i) for(i = 0; i < max_threads; i++) { # pragma omp ordered VT_CHECK_THREAD; } /* register wrapper functions for OpenMP API */ vt_omp_register(); for(i = 0; i < POMP_MAX_ID; ++i) { if ( pomp_rd_table[i] ) { struct VTRegDescr* data = &rd_data_table[i]; struct ompregdescr* r = pomp_rd_table[i]; r->data = data; rdesc = "OMP"; /* -- register file --*/ data->fid = vt_def_scl_file(VT_CURRENT_THREAD, r->file_name); data->begln = r->begin_first_line; data->endln = r->end_last_line; data->sbrid = VT_NO_ID; if (strcmp(r->name, "region") == 0) { rtype = VT_USER_REGION; rname = (char*)(r->sub_name); rdesc = VT_DEFAULT_REGION_GROUP; } else if (strcmp(r->name, "atomic") == 0) { rtype = VT_OMP_ATOMIC; rname = "!$omp atomic"; } else if (strcmp(r->name, "barrier") == 0) { rtype = VT_OMP_BARRIER; rname = "!$omp barrier"; } else if (strcmp(r->name, "critical") == 0) { rtype = VT_OMP_CRITICAL; rname = "!$omp critical"; sprintf(anno_rname, "%s @%s:%d", "!$omp critical sblock", basename((char*)(r->file_name)), r->begin_first_line+1); data->sbrid = vt_def_region(VT_CURRENT_THREAD, anno_rname, data->fid, r->begin_last_line+1, r->end_first_line-1, NULL, VT_OMP_CRITICAL_SBLOCK); } else if (strcmp(r->name, "do") == 0) { rtype = VT_OMP_LOOP; rname = "!$omp do"; } else if (strcmp(r->name, "flush") == 0) { rtype = VT_OMP_FLUSH; rname = "!$omp flush"; } else if (strcmp(r->name, "for") == 0) { rtype = VT_OMP_LOOP; rname = "!$omp for"; } else if (strcmp(r->name, "function") == 0) { rtype = VT_FUNCTION; rname = (char*)(r->sub_name); rdesc = VT_DEFAULT_REGION_GROUP; } else if (strcmp(r->name, "master") == 0) { rtype = VT_OMP_MASTER; rname = "!$omp master"; } else if (strcmp(r->name, "parallel") == 0) { rtype = VT_OMP_PARALLEL; rname = "!$omp parallel"; } else if (strcmp(r->name, "paralleldo") == 0) { rtype = VT_OMP_PARALLEL; rname = "!$omp parallel"; sprintf(anno_rname, "%s @%s:%d", "!$omp do", basename((char*)(r->file_name)), r->begin_first_line); data->sbrid = vt_def_region(VT_CURRENT_THREAD, anno_rname, data->fid, data->begln, data->endln, NULL, VT_OMP_LOOP); } else if (strcmp(r->name, "parallelfor") == 0) { rtype = VT_OMP_PARALLEL; rname = "!$omp parallel"; sprintf(anno_rname, "%s @%s:%d", "!$omp for", basename((char*)(r->file_name)), r->begin_first_line); data->sbrid = vt_def_region(VT_CURRENT_THREAD, anno_rname, data->fid, data->begln, data->endln, NULL, VT_OMP_LOOP); } else if (strcmp(r->name, "parallelsections") == 0) { rtype = VT_OMP_PARALLEL; rname = "!$omp parallel"; sprintf(anno_rname, "%s @%s:%d", "!$omp sections", basename((char*)(r->file_name)), r->begin_first_line); data->sbrid = vt_def_region(VT_CURRENT_THREAD, anno_rname, data->fid, data->begln, data->endln, NULL, VT_OMP_SECTIONS); } else if (strcmp(r->name, "parallelworkshare") == 0) { rtype = VT_OMP_PARALLEL; rname = "!$omp parallel"; sprintf(anno_rname, "%s @%s:%d", "!$omp workshare", basename((char*)(r->file_name)), r->begin_first_line); data->sbrid = vt_def_region(VT_CURRENT_THREAD, anno_rname, data->fid, data->begln, data->endln, NULL, VT_OMP_WORKSHARE); } else if (strcmp(r->name, "sections") == 0) { rtype = VT_OMP_SECTIONS; rname = "!$omp sections"; sprintf(anno_rname, "%s @%s:%d", "!$omp section", basename((char*)(r->file_name)), r->begin_last_line); data->sbrid = vt_def_region(VT_CURRENT_THREAD, anno_rname, data->fid, r->begin_last_line, r->end_first_line, NULL, VT_OMP_SECTION); } else if (strcmp(r->name, "section") == 0) { /* NOT DEFINED BY POMP YET */ /* rtype = VT_OMP_SECTION; */ /* rname = "!$omp section"; */ } else if (strcmp(r->name, "single") == 0) { rtype = VT_OMP_SINGLE; rname = "!$omp single"; sprintf(anno_rname, "%s @%s:%d", "!$omp single sblock", basename((char*)(r->file_name)), r->begin_last_line+1); data->sbrid = vt_def_region(VT_CURRENT_THREAD, anno_rname, data->fid, r->begin_last_line+1, r->end_first_line-1, NULL, VT_OMP_SINGLE_SBLOCK); } else if (strcmp(r->name, "workshare") == 0) { rtype = VT_OMP_WORKSHARE; rname = "!$omp workshare"; } else { rtype = VT_UNKNOWN; rname = (char*)(r->name); } if (strcmp(rdesc, "OMP") == 0) { sprintf(anno_rname, "%s @%s:%d", rname, basename((char*)(r->file_name)), r->begin_first_line); rname = anno_rname; } /* -- register region -- */ data->rid = vt_def_region(VT_CURRENT_THREAD, rname, data->fid, data->begln, data->endln, NULL, rtype); if (rtype == VT_OMP_PARALLEL || rtype == VT_OMP_LOOP || rtype == VT_OMP_SECTIONS || rtype == VT_OMP_SINGLE || rtype == VT_OMP_WORKSHARE) { /* -- register implicit barrier -- */ rname = "!$omp ibarrier"; sprintf(anno_rname, "%s @%s:%d", rname, basename((char*)(r->file_name)), r->end_last_line); data->brid = vt_def_region(VT_CURRENT_THREAD, anno_rname, data->fid, data->endln, data->endln, NULL, VT_OMP_IBARRIER); } else data->brid = VT_NO_ID; } } pomp_initialized = 1; pomp_tracing = vt_env_omptrace(); } }
/** * This function should initialise the server, * and it not invoked after a re-exec. * * @return Non-zero on error */ int initialise_server(void) { struct vt_mode mode; char* display_env; int primary_socket_fd; int stage = 0; const char* const message = "Command: intercept\n" "Message ID: 0\n" "Length: 38\n" "\n" "Command: get-vt\n" "Command: configure-vt\n"; const char* const secondary_message = "Command: intercept\n" "Message ID: 0\n" "Priority: -4611686018427387904\n" /* −2⁶² */ "Length: 22\n" "\n" "Command: switching-vt\n"; primary_socket_fd = socket_fd; fail_if (connect_to_display()); secondary_socket_fd = socket_fd; socket_fd = primary_socket_fd; display_env = getenv("MDS_DISPLAY"); display_env = display_env ? strchr(display_env, ':') : NULL; if ((display_env == NULL) || (strlen(display_env) < 2)) goto no_display; memset(vtfile_path, 0, sizeof(vtfile_path)); xsnprintf(vtfile_path, "%s/%s.vt", MDS_RUNTIME_ROOT_DIRECTORY, display_env + 1); stage = 1; if (is_respawn == 0) { display_vt = select_vt(); fail_if (display_vt < 0); display_tty_fd = vt_open(display_vt, &old_vt_stat); fail_if (write_vt_file() < 0); fail_if (vt_set_active(display_vt) < 0); } else { fail_if (read_vt_file() < 0); vt_is_active = (display_vt == vt_get_active()); fail_if (vt_is_active < 0); } fail_if (full_send(secondary_socket_fd, secondary_message, strlen(secondary_message))); fail_if (full_send(socket_fd, message, strlen(message))); fail_if (server_initialised() < 0); fail_if (mds_message_initialise(&received)); stage = 2; fail_if (xsigaction(SIGRTMIN + 2, received_switch_vt) < 0); fail_if (xsigaction(SIGRTMIN + 3, received_switch_vt) < 0); vt_construct_mode(1, SIGRTMIN + 2, SIGRTMIN + 3, &mode); fail_if (vt_get_set_mode(display_tty_fd, 1, &mode) < 0); if (vt_set_exclusive(display_tty_fd, 1) < 0) xperror(*argv); return 0; no_display: eprint("no display has been set, how did this happen."); return 1; fail: xperror(*argv); if (stage >= 1) unlink(vtfile_path); if (display_tty_fd >= 0) vt_close(display_tty_fd, &old_vt_stat); if (stage >= 2) mds_message_destroy(&received); return 1; }
/* * This function is called at the entry of each function * The call is generated by the IBM xl compilers * * XL C/C++ 11.x / XLF 13.x or later pass the address of a static pointer * variable, initialized with NULL, as additional parameter. */ #if __IBMC__ > 1100 void __func_trace_enter(char* name, char* fname, int lno, HashNode** ihn) #else /* __IBMC__ */ void __func_trace_enter(char* name, char* fname, int lno) #endif /* __IBMC__ */ { HashNode *hn; uint32_t tid; uint64_t time; /* -- ignore IBM OMP runtime functions -- */ # if __IBMC__ > 1100 if ( *ihn == &ignored_func ) return; # endif /* __IBMC__ */ if ( ( strchr(name, '@') != NULL ) || (strchr(name, '$') != NULL) ) { # if __IBMC__ > 1100 *ihn = &ignored_func; # endif /* __IBMC__ */ return; } /* -- if not yet initialized, initialize VampirTrace -- */ if ( xl_init ) { xl_init = 0; vt_open(); vt_comp_finalize = &xl_finalize; } /* -- if VampirTrace already finalized, return -- */ if ( !vt_is_alive ) return; /* -- get calling thread id -- */ GET_THREAD_ID(tid); VT_SUSPEND_MALLOC_TRACING(tid); time = vt_pform_wtime(); # if __IBMC__ > 1100 /* -- region not yet registered -- */ if ( *ihn == NULL ) { # endif /* __IBMC__ */ /* -- get region identifier -- */ if ( (hn = hash_get((long) name)) == 0 ) { /* -- region entered the first time, register region -- */ #if (defined(VT_MT) || defined(VT_HYB)) VTTHRD_LOCK_IDS(); if ( (hn = hash_get((long) name)) == 0 ) { hn = register_region(tid, name, fname, lno); # if __IBMC__ > 1100 *ihn = hn; # endif /* __IBMC__ */ } VTTHRD_UNLOCK_IDS(); #else /* VT_MT || VT_HYB */ hn = register_region(tid, name, fname, lno); # if __IBMC__ > 1100 *ihn = hn; # endif /* __IBMC__ */ #endif /* VT_MT || VT_HYB */ } #if __IBMC__ > 1100 } else { /* -- region already registered -- */ hn = *ihn; } #endif /* __IBMC__ */ /* -- write enter record -- */ vt_enter(tid, &time, hn->vtid); VT_RESUME_MALLOC_TRACING(tid); }