public inbox for frysk-cvs@sourceware.org
help / color / mirror / Atom feed
From: cagney@sourceware.org
To: frysk-cvs@sourceware.org
Subject: [SCM]  master: Immediatly unmap the unwind-info image when notified its free by libunwind.
Date: Sat, 24 May 2008 20:47:00 -0000	[thread overview]
Message-ID: <20080524204757.24227.qmail@sourceware.org> (raw)

The branch, master has been updated
       via  68021418975e2fa86f8189b61f67f437796a9b96 (commit)
      from  9e513ef98a772fee06a688072310aad9011494dc (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email.

- Log -----------------------------------------------------------------
commit 68021418975e2fa86f8189b61f67f437796a9b96
Author: Andrew Cagney <cagney@redhat.com>
Date:   Sat May 24 16:47:08 2008 -0400

    Immediatly unmap the unwind-info image when notified its free by libunwind.
    
    This leverages a change to libunwind to notify the eh-frame supplier
    that libunwind's dwarf code has finished using the information.
    
    When so notified the eh-frame data image is freed; previously the code
    was relying on the garbage collector to release this memory.
    
    frysk-sys/lib/unwind/ChangeLog
    2008-05-24  Andrew Cagney  <cagney@redhat.com>
    
    	* cni/UnwindH.hxx (image_put_unwind_info): New.
    	(struct image): New.
    	(fillProcInfoFromImage): Create an image and pass to
    	unw_get_unwind_table.
    
    2008-05-24  Andrew Cagney  <cagney@redhat.com>
    
    	* NEWS: Mention reduced memory footprint.

-----------------------------------------------------------------------

Summary of changes:
 NEWS                                 |   14 ++++---
 frysk-sys/lib/unwind/ChangeLog       |    5 ++
 frysk-sys/lib/unwind/cni/UnwindH.hxx |   78 ++++++++++++++++++++++-----------
 frysk-top/ChangeLog                  |    4 ++
 4 files changed, 69 insertions(+), 32 deletions(-)

First 500 lines of diff:
diff --git a/NEWS b/NEWS
index e3f0e39..f980797 100644
--- a/NEWS
+++ b/NEWS
@@ -11,6 +11,14 @@ multi-process, and multi-threaded systems while they are running.
 
 --
 
+Release 0.4, ????-??-??
+
+-> Smaller memory foot-print when generating stack backtraces.
+   Frysk has been changed to more aggressively release memory
+   allocated by the unwinder.
+
+--
+
 Release 0.3, 2008-05-09
 
 - Exported a prototype of low level watchpoint api on IA32,X8664 
@@ -29,18 +37,12 @@ Release 0.3, 2008-05-09
 - Imported a newer version of upstream elfutils.
 - Fixed breakpoints to work correctly through forks.
 
---
-
-Post-Release 0.2 Updates:
-
 -> 2004-04-24 - New support in FHPD: sysroot
 
    Frysk now also supports finding libraries in a special system
    directory heirarchy as well as the previously supported source files
    and debuginfo files.  This is specified via the -sysroot option.
 
---
-
 -> 2004-04-16 - New command in FHPD: watch
 
    Use to set watchpoints on expressions or variables. This stops
diff --git a/frysk-sys/lib/unwind/ChangeLog b/frysk-sys/lib/unwind/ChangeLog
index 4c93d20..f8dd2a1 100644
--- a/frysk-sys/lib/unwind/ChangeLog
+++ b/frysk-sys/lib/unwind/ChangeLog
@@ -1,5 +1,10 @@
 2008-05-24  Andrew Cagney  <cagney@redhat.com>
 
+	* cni/UnwindH.hxx (image_put_unwind_info): New.
+	(struct image): New.
+	(fillProcInfoFromImage): Create an image and pass to
+	unw_get_unwind_table.
+
  	* Unwind.java (createElfImageFromVDSO): Delete.
  	(createProcInfoFromElfImage): Delete.
  	(fillProcInfoFromVDSO): New.
diff --git a/frysk-sys/lib/unwind/cni/UnwindH.hxx b/frysk-sys/lib/unwind/cni/UnwindH.hxx
index dda792f..1b55b66 100644
--- a/frysk-sys/lib/unwind/cni/UnwindH.hxx
+++ b/frysk-sys/lib/unwind/cni/UnwindH.hxx
@@ -587,25 +587,48 @@ get_eh_frame_hdr_addr(unw_proc_info_t *pi, char *image, size_t size,
 
 /**
  * The following are local memory image address space memory accessors
- * used by unw_get_unwind_table to access the eh_frame_hdr.  The arg
- * pointer is the base address, addr is the offset from the base
- * address.
+ * used by unw_get_unwind_table and run_cfi_program to access and
+ * interpret the eh_frame_hdr.  The arg pointer contains an image
+ * descriptor, ADDR is the offset into the eh-frame table within the
+ * image.
  */
+struct image {
+  int magic;
+  void *bytes;
+  size_t size;
+  char *table;
+};
+const int IMAGE_MAGIC = 0xfeed;
 
 static int 
 image_access_mem(unw_addr_space_t as, unw_word_t addr,
-		 unw_word_t *val, int write, void *baseAddress) {
+		 unw_word_t *val, int write, void *arg) {
+  struct image *image = (struct image*) arg;
+  if (image->magic != IMAGE_MAGIC) {
+    throw new RuntimeException(JvNewStringUTF("bad image magic number"));
+  }
   // Writing is not supported
   if (write)
     return -UNW_EINVAL;
   else
-    *val = *(unw_word_t *) ((char *)baseAddress + addr);
-
+    *val = *(unw_word_t *) (image->table + addr);
   return UNW_ESUCCESS;
 }
   
+static void
+image_put_unwind_info(::unw_addr_space_t as, ::unw_proc_info_t *proc_info,
+		      void *arg) {
+  struct image *image = (struct image*) arg;
+  if (image->magic != IMAGE_MAGIC) {
+    fprintf(stderr, "corrupt image pointer\n");
+    throw new RuntimeException(JvNewStringUTF("bad image magic number"));
+  }
+  munmap(image->bytes, image->size);
+  ::free(image);
+}
+
 static unw_accessors_t image_accessors = {
-    NULL, NULL, NULL, image_access_mem, NULL, NULL, NULL, NULL
+  NULL, image_put_unwind_info, NULL, image_access_mem, NULL, NULL, NULL, NULL
 };
 
 static jint
@@ -614,36 +637,47 @@ fillProcInfoFromImage(frysk::rsl::Log* fine,
 		      jlong unwProcInfo,
 		      jlong ip,
 		      jboolean needUnwindInfo,
-		      void *image,
+		      void *bytes,
 		      long size,
 		      long segbase) {
   unw_proc_info_t *procInfo = (::unw_proc_info_t *) unwProcInfo;
   logf(fine, "fillProcInfoFromImage"
-       " %s unwProcInfo %lx, ip %lx, image %p, size %ld, segBase %lx",
-       name, (long) unwProcInfo, (long)ip, image, size, segbase);
+       " %s unwProcInfo %lx, ip %lx, bytes %p, size %ld, segBase %lx",
+       name, (long) unwProcInfo, (long)ip, bytes, size, segbase);
   
   unw_word_t peh_vaddr = 0;
   char *eh_table_hdr = get_eh_frame_hdr_addr(procInfo,
-					     (char *) image,
+					     (char *) bytes,
 					     size, segbase,
 					     &peh_vaddr);
   if (eh_table_hdr == NULL) {
     logf(fine, "get_eh_frame_hdr failed");
-    munmap(image, size);
+    munmap(bytes, size);
+    return -UNW_ENOINFO;
+  }
+
+  struct image *image = new struct image();
+  if (image == NULL) {
+    munmap(bytes, size);
     return -UNW_ENOINFO;
   }
+  image->magic = IMAGE_MAGIC;
+  image->bytes = bytes;
+  image->size = size;
 
   int ret;
-  if (procInfo->format == UNW_INFO_FORMAT_REMOTE_TABLE)
+  if (procInfo->format == UNW_INFO_FORMAT_REMOTE_TABLE) {
+    // address adjustment
+    image->table = eh_table_hdr - peh_vaddr;
     ret = unw_get_unwind_table((unw_word_t) ip,
 			       procInfo,
 			       (int) needUnwindInfo,
 			       &image_accessors,
 			       // virtual address
 			       peh_vaddr,
-			       // address adjustment
-			       eh_table_hdr - peh_vaddr);
-  else
+			       image);
+  } else {
+    image->table = eh_table_hdr;
     ret = unw_get_unwind_table((unw_word_t) ip,
                                procInfo,
                                (int) needUnwindInfo,
@@ -651,16 +685,8 @@ fillProcInfoFromImage(frysk::rsl::Log* fine,
                                // virtual address
                                0,
                                // address adjustment
-                               eh_table_hdr);
-
-  // FIXME: The munmap can't be done until after the step code has
-  // finished with the proc-info.  For moment ack around this by
-  // creating an ElfImage object that does the unmap in the finaliser.
-  // Of course this A) leaves many mmaped objects around; and B) has a
-  // race where the object could be unmapped before step has finished
-  // with it.
-  new ElfImage((jlong) image, (jlong) size);
-  // munmap(image, size);
+                               image);
+  }
   logf(fine, "Post unw_get_unwind_table %d", ret);
   return ret;
 }
diff --git a/frysk-top/ChangeLog b/frysk-top/ChangeLog
index 243104d..1eb6691 100644
--- a/frysk-top/ChangeLog
+++ b/frysk-top/ChangeLog
@@ -1,3 +1,7 @@
+2008-05-24  Andrew Cagney  <cagney@redhat.com>
+
+	* NEWS: Mention reduced memory footprint.
+
 2008-05-12  Rick Moseley  <rmoseley@redhat.com>
 
 	* Update NEWS file for release 0.3.


hooks/post-receive
--
frysk system monitor/debugger


                 reply	other threads:[~2008-05-24 20:47 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20080524204757.24227.qmail@sourceware.org \
    --to=cagney@sourceware.org \
    --cc=frysk-cvs@sourceware.org \
    --cc=frysk@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).