void ipm_region(int op, char *tag) { int i; struct region *reg; switch( op ) { case -1: /* exit */ ipm_region_end(ipm_rstackptr); ipm_rstackptr->nexecs++; if( ipm_rstackptr->parent ) { ipm_rstackptr=ipm_rstackptr->parent; } break; case 1: /* enter */ /* find region among child regions of current ipm_rstackptr */ reg = ipm_rstackptr->child; while(reg) { if( !(strncmp(reg->name, tag, MAXSIZE_REGLABEL)) ) { ipm_rstackptr=reg; break; } reg=reg->next; } if( !reg ) { /* region not found, create new one */ reg=(region_t*)IPM_MALLOC(sizeof(region_t)); rstack_init_region(reg, tag); reg->parent=ipm_rstackptr; if( !(ipm_rstackptr->child) ) { ipm_rstackptr->child=reg; } else { ipm_rstackptr=ipm_rstackptr->child; while(ipm_rstackptr->next) ipm_rstackptr=ipm_rstackptr->next; ipm_rstackptr->next=reg; } ipm_rstackptr=reg; } ipm_region_begin(ipm_rstackptr); break; } }
int ipm_init(int flags) { int i, state, rv; double t_init; char cmdline[MAXSIZE_CMDLINE]; char realpath[MAXSIZE_CMDLINE]; char *target; state=ipm_state; ipm_state=STATE_IN_INIT; /* check if IPM_TARGET is set and if it is, only monitor matching processes */ target=getenv("IPM_TARGET"); ipm_get_exec_cmdline(cmdline,realpath); /* IPM_TARGET specifies string that has to appear in cmdline */ if( target && target[0]!='!' && !strstr(cmdline,target) ) { ipm_state=STATE_NOTACTIVE; return IPM_OK; } /* IPM_TARGET specifies string that must not appear in cmdline */ if( target && target[0]=='!' && strstr(cmdline,target) ) { ipm_state=STATE_NOTACTIVE; return IPM_OK; } ipm_time_init(flags); rstack_init(flags); t_init = ipm_wtime(); taskdata_init(&task); htable_init(ipm_htable); /* need to get env variables before modules init */ ipm_get_env(); /* init local data structures */ for( i=0; i<MAXNUM_MODULES; i++ ) { ipm_module_init( &(modules[i]) ); } /* --- initialize modules --- */ #ifdef HAVE_MPI modules[IPM_MODULE_MPI].init=mod_mpi_init; #endif #ifdef HAVE_POSIXIO modules[IPM_MODULE_POSIXIO].init=mod_posixio_init; #endif #ifdef HAVE_MPIIO modules[IPM_MODULE_MPIIO].init=mod_mpiio_init; #endif #ifdef HAVE_CALLPATH modules[IPM_MODULE_CALLPATH].init=mod_callpath_init; #endif #ifdef HAVE_KEYHIST modules[IPM_MODULE_KEYHIST].init=mod_keyhist_init; #endif #ifdef HAVE_PAPI modules[IPM_MODULE_PAPI].init=mod_papi_init; #endif #ifdef HAVE_SELFMONITOR modules[IPM_MODULE_SELFMONITOR].init=mod_selfmonitor_init; #endif #ifdef HAVE_PROCCTRL modules[IPM_MODULE_PROCCTRL].init=mod_procctrl_init; #endif #ifdef HAVE_CLUSTERING modules[IPM_MODULE_CLUSTERING].init=mod_clustering_init; #endif #ifdef HAVE_OMPTRACEPOINTS modules[IPM_MODULE_OMPTRACEPOINTS].init=mod_omptracepoints_init; #endif #ifdef HAVE_CUDA modules[IPM_MODULE_CUDA].init=mod_cuda_init; #endif #ifdef HAVE_CUFFT modules[IPM_MODULE_CUFFT].init=mod_cufft_init; #endif #ifdef HAVE_CUBLAS modules[IPM_MODULE_CUBLAS].init=mod_cublas_init; #endif /* TODO: handle errors in module initialization, set ipm_state to STATE_ERROR */ for( i=0; i<MAXNUM_MODULES; i++ ) { if( modules[i].init ) { /* call init function if it is set */ rv=modules[i].init(&(modules[i]), flags); if(rv!=IPM_OK) { IPMERR("Error initializing module %d (%s), error %d\n", i, modules[i].name?modules[i].name:"", rv); } #ifdef HAVE_MPI if( i==IPM_MODULE_POSIXIO ) modules[i].state=STATE_NOTACTIVE; #endif } } /* --- done initializing modules --- */ #ifdef DELAYED_MPI_FINALIZE rv = atexit(ipm_atexit_handler); if(!rv) { task.flags|=FLAG_USING_ATEXIT; } else { IPMERR("Error installing atexit() handler\n"); task.flags&=~FLAG_USING_ATEXIT; } #endif signal(SIGXCPU, ipm_sig_handler); signal(SIGTERM, ipm_sig_handler); signal(SIGABRT, ipm_sig_handler); #ifdef HAVE_SELFMONITOR ipm_selfmon.t_init = ipm_wtime()-t_init; #endif /* this should be close to user code */ ipm_region(1, "ipm_main"); ipm_region_begin(&ipm_app); ipm_state=STATE_ACTIVE; return IPM_OK; }