/** Handle special swift-* environment variables that we use to control MPIX_Launch */ static void special_envs(MPI_Info info, int envc, char** envs) { int index; char* value; if (get_envs(envc,envs,"swift_timeout",&index,&value)) MPI_Info_set(info,"timeout",value); if (get_envs(envc,envs,"swift_launcher",&index,&value)) MPI_Info_set(info,"launcher",value); if (get_envs(envc,envs,"swift_write_hosts",&index,&value)) MPI_Info_set(info,"write_hosts",value); if (get_envs(envc,envs,"swift_chdir",&index,&value)) MPI_Info_set(info,"chdir",value); }
/* Resolve an unintercepted symbol via the original dlsym(), * special libGL variant: if not found, dymically try to * load libGL.so */ static void *GH_dlsym_gl(const char *name) { static void *libgl_handle=NULL; static int try_load_libgl=1; void *ptr=GH_dlsym(RTLD_NEXT, name); if (!ptr) { if (try_load_libgl && !libgl_handle) { const char *libname=get_envs("GH_LIBGL_FILE", "libGL.so"); if (libname[0]) { GH_verbose(GH_MSG_DEBUG, "trying to load libGL manually: '%s'\n", libname); libgl_handle=dlopen(libname, RTLD_GLOBAL | RTLD_LAZY); if (!libgl_handle) { GH_verbose(GH_MSG_WARNING, "failed to load '%s' manually\n", libname); /* give up on loading libGL */ try_load_libgl=0; } } else { try_load_libgl=0; } } if (libgl_handle) { GH_verbose(GH_MSG_DEBUG, "trying to find '%s' in manually loaded libGL\n", name); ptr=GH_dlsym(libgl_handle, name); } } return ptr; }
static void frametimes_init(GH_frametimes *ft, GH_frametime_mode mode, unsigned int delay, unsigned int num_timestamps, unsigned int num_results, unsigned int ctx_num) { ft->cur_pos=0; ft->cur_result=0; ft->frame=0; ft->dump=NULL; if (mode >= GH_FRAMETIME_CPU_GPU) { if (frametimes_gl_init()) { GH_verbose(GH_MSG_WARNING, "GPU timer queries not available, using CPU only\n"); mode = GH_FRAMETIME_CPU; } } if (mode && delay && num_timestamps && num_results) { ft->mode=mode; ft->delay=delay; ft->num_timestamps=num_timestamps; ft->num_results=num_results; if ((ft->frametime=malloc(sizeof(*ft->frametime) * (num_results+1) * num_timestamps))) { if ((ft->timestamp=malloc(sizeof(*ft->timestamp) * delay * num_timestamps))) { unsigned int i; GH_verbose(GH_MSG_DEBUG, "enabling frametime measurements mode %d, %u x %u timestamps\n", (int)mode, delay, num_timestamps); for (i=0; i<delay * num_timestamps; i++) { timestamp_init(&ft->timestamp[i]); } } else { GH_verbose(GH_MSG_WARNING, "failed to allocate memory for %u x %u timestamps, " "disbaling timestamps\n", delay, num_timestamps); mode=GH_FRAMETIME_NONE; } } else { GH_verbose(GH_MSG_WARNING, "failed to allocate memory for %u x %u frametime results, " "disbaling timestamps\n", num_results, num_timestamps); mode=GH_FRAMETIME_NONE; } } if (!mode || !delay || !num_timestamps || !num_results) { ft->mode=GH_FRAMETIME_NONE; ft->delay=0; ft->num_timestamps=0; ft->num_results=0; ft->timestamp=NULL; ft->frametime=NULL; } if (ft->mode) { const char *file=get_envs("GH_FRAMETIME_FILE","glx_hook_frametimes-ctx%c.csv"); if (file) { char buf[PATH_MAX]; parse_name(buf, sizeof(buf), file, ctx_num); ft->dump=fopen(buf,"wt"); } if (!ft->dump) { ft->dump=stderr; } } }