diff --git a/winsup/cygwin/fhandler/console.cc b/winsup/cygwin/fhandler/console.cc index 68ab43d81..0cbfe4ea4 100644 --- a/winsup/cygwin/fhandler/console.cc +++ b/winsup/cygwin/fhandler/console.cc @@ -219,6 +219,8 @@ fhandler_console::open_shared_console (HWND hw, HANDLE& h, bool& created) shared_locations m = created ? SH_SHARED_CONSOLE : SH_JUSTOPEN; console_state *res = (console_state *) open_shared (namebuf, 0, h, sizeof (console_state), m, created); + if (m == SH_SHARED_CONSOLE) + cygheap->shared_regions.console_shared_addr = res; return res; } diff --git a/winsup/cygwin/fhandler/process.cc b/winsup/cygwin/fhandler/process.cc index b0aef2ebe..864e2f4d5 100644 --- a/winsup/cygwin/fhandler/process.cc +++ b/winsup/cygwin/fhandler/process.cc @@ -860,8 +860,11 @@ format_process_maps (void *data, char *&destbuf) /* The heap info on the cygheap is also in the same spot in each process because the cygheap is located at the same address. */ user_heap_info user_heap; + shared_region_info region_info; ReadProcessMemory (proc, &cygheap->user_heap, &user_heap, sizeof user_heap, NULL); + ReadProcessMemory (proc, &cygheap->shared_regions, ®ion_info, + sizeof region_info, NULL); off_t len = 0; @@ -1060,12 +1063,14 @@ peb_teb_rinse_repeat: strcpy (posix_modname, "[peb]"); else if (cur.abase == (char *) &SharedUserData) strcpy (posix_modname, "[shared-user-data]"); - else if (cur.abase == (char *) cygwin_shared) + else if (cur.abase == region_info.cygwin_shared_addr) strcpy (posix_modname, "[cygwin-shared]"); - else if (cur.abase == (char *) user_shared) + else if (cur.abase == region_info.user_shared_addr) strcpy (posix_modname, "[cygwin-user-shared]"); - else if (cur.abase == (char *) *proc_pinfo) + else if (cur.abase == region_info.myself_shared_addr) strcpy (posix_modname, "[procinfo]"); + else if (cur.abase == region_info.console_shared_addr) + strcpy (posix_modname, "[cygwin-shared-console]"); else if (cur.abase == (char *) cygheap) strcpy (posix_modname, "[cygheap]"); else if (cur.abase == user_heap.base) diff --git a/winsup/cygwin/local_includes/cygheap.h b/winsup/cygwin/local_includes/cygheap.h index ceff0fdcf..d885ca123 100644 --- a/winsup/cygwin/local_includes/cygheap.h +++ b/winsup/cygwin/local_includes/cygheap.h @@ -302,6 +302,15 @@ struct user_heap_info void init (); }; +/* This info is maintained for /proc//maps ONLY! */ +struct shared_region_info +{ + void *cygwin_shared_addr; + void *user_shared_addr; + void *myself_shared_addr; + void *console_shared_addr; +}; + class cygheap_domain_info { PWCHAR pdom_name; @@ -503,6 +512,7 @@ struct init_cygheap: public mini_cygheap cygheap_ugid_cache ugid_cache; cygheap_user user; user_heap_info user_heap; + shared_region_info shared_regions; mode_t umask; LONG rlim_as_id; unsigned long rlim_core; diff --git a/winsup/cygwin/mm/shared.cc b/winsup/cygwin/mm/shared.cc index d23cc8e0e..d7d6547ec 100644 --- a/winsup/cygwin/mm/shared.cc +++ b/winsup/cygwin/mm/shared.cc @@ -274,6 +274,7 @@ user_info::create (bool reinit) debug_printf ("user shared version %x", user_shared->version); if (reinit) user_shared->initialize (); + cygheap->shared_regions.user_shared_addr = user_shared; } void @@ -315,6 +316,7 @@ shared_info::create () SH_CYGWIN_SHARED, &sec_all_nih); cygwin_shared->initialize (); + cygheap->shared_regions.cygwin_shared_addr = cygwin_shared; } void diff --git a/winsup/cygwin/pinfo.cc b/winsup/cygwin/pinfo.cc index c05cf2662..37770b643 100644 --- a/winsup/cygwin/pinfo.cc +++ b/winsup/cygwin/pinfo.cc @@ -466,6 +466,8 @@ pinfo::init (pid_t n, DWORD flag, HANDLE h0) h = h0; _pinfo_release (); } + if (shloc == SH_MYSELF) + cygheap->shared_regions.myself_shared_addr = procinfo; } void