< prev index next >

src/jdk.hotspot.agent/linux/native/libsaproc/ps_proc.c

Print this page

        

*** 26,35 **** --- 26,36 ---- #include <stdlib.h> #include <string.h> #include <signal.h> #include <errno.h> #include <elf.h> + #include <dirent.h> #include <sys/types.h> #include <sys/wait.h> #include <sys/ptrace.h> #include <sys/uio.h> #include "libproc_impl.h"
*** 372,382 **** .get_lwp_regs= process_get_lwp_regs }; // attach to the process. One and only one exposed stuff JNIEXPORT struct ps_prochandle* JNICALL ! Pgrab(pid_t pid, char* err_buf, size_t err_buf_len) { struct ps_prochandle* ph = NULL; thread_info* thr = NULL; if ( (ph = (struct ps_prochandle*) calloc(1, sizeof(struct ps_prochandle))) == NULL) { snprintf(err_buf, err_buf_len, "can't allocate memory for ps_prochandle"); --- 373,383 ---- .get_lwp_regs= process_get_lwp_regs }; // attach to the process. One and only one exposed stuff JNIEXPORT struct ps_prochandle* JNICALL ! Pgrab(pid_t pid, char* err_buf, size_t err_buf_len, bool is_in_container) { struct ps_prochandle* ph = NULL; thread_info* thr = NULL; if ( (ph = (struct ps_prochandle*) calloc(1, sizeof(struct ps_prochandle))) == NULL) { snprintf(err_buf, err_buf_len, "can't allocate memory for ps_prochandle");
*** 399,409 **** --- 400,431 ---- // as the symbols in the pthread library will be used to figure out // the list of threads within the same process. read_lib_info(ph); // read thread info + if (is_in_container) { + char taskpath[PATH_MAX]; + DIR *dirp; + struct dirent *entry; + + snprintf(taskpath, PATH_MAX, "/proc/%d/task", ph->pid); + dirp = opendir(taskpath); + int lwp_id; + while ((entry = readdir(dirp)) != NULL) { + if (*entry->d_name == '.') { + continue; + } + lwp_id = atoi(entry->d_name); + if (lwp_id == ph->pid) { + continue; + } + add_new_thread(ph, -1, lwp_id); + } + closedir(dirp); + } else { read_thread_info(ph, add_new_thread); + } // attach to the threads thr = ph->threads; while (thr) { // don't attach to the main thread again
< prev index next >