ptrace_context_t* load_ptrace_context(pid_t pid) { ptrace_context_t* context = (ptrace_context_t*)calloc(1, sizeof(ptrace_context_t)); if (context) { context->map_info_list = load_map_info_list(pid); for (map_info_t* mi = context->map_info_list; mi; mi = mi->next) { load_ptrace_map_info_data(pid, mi); } } return context; }
map_info_t* acquire_my_map_info_list() { pthread_mutex_lock(&g_my_map_info_list_mutex); int64_t time = now(); if (g_my_map_info_list) { my_map_info_data_t* data = (my_map_info_data_t*)g_my_map_info_list->data; int64_t age = time - data->timestamp; if (age >= MAX_CACHE_AGE) { ALOGV("Invalidated my_map_info_list %p, age=%lld.", g_my_map_info_list, age); dec_ref(g_my_map_info_list, data); g_my_map_info_list = NULL; } else { ALOGV("Reusing my_map_info_list %p, age=%lld.", g_my_map_info_list, age); } } if (!g_my_map_info_list) { my_map_info_data_t* data = (my_map_info_data_t*)malloc(sizeof(my_map_info_data_t)); g_my_map_info_list = load_map_info_list(getpid()); if (g_my_map_info_list) { ALOGV("Loaded my_map_info_list %p.", g_my_map_info_list); g_my_map_info_list->data = data; data->refs = 1; data->timestamp = time; } else { free(data); } } map_info_t* milist = g_my_map_info_list; if (milist) { my_map_info_data_t* data = (my_map_info_data_t*)g_my_map_info_list->data; data->refs += 1; } pthread_mutex_unlock(&g_my_map_info_list_mutex); return milist; }