public inbox for frysk-cvs@sourceware.org
help / color / mirror / Atom feed
From: cagney@sourceware.org
To: frysk-cvs@sourceware.org
Subject: [SCM]  master: Refactor Log to Callers.
Date: Wed, 13 Feb 2008 00:05:00 -0000	[thread overview]
Message-ID: <20080213000530.24916.qmail@sourceware.org> (raw)

The branch, master has been updated
       via  f0e1d0ce0f3e015de79f183f90533865aad6fc7c (commit)
      from  3d895232d71bbdf785a82ea0a0b7d43b6b0f77d6 (commit)

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

- Log -----------------------------------------------------------------
commit f0e1d0ce0f3e015de79f183f90533865aad6fc7c
Author: Andrew Cagney <cagney@redhat.com>
Date:   Tue Feb 12 18:59:00 2008 -0500

    Refactor Log to Callers.
    
    frysk-core/frysk/proc/dead/ChangeLog
    2008-02-12  Andrew Cagney  <cagney@redhat.com>
    
    	* LinuxCoreProc.java: Use Log.CALLER.
    	* LinuxCoreTask.java: Ditto.
    
    frysk-sys/frysk/rsl/ChangeLog
    2008-02-12  Andrew Cagney  <cagney@redhat.com>
    
    	* Node.java (set(Level)): Return the node.
    	* Callers.java: Extract from Log.java.
    	* TestCallers.java: New.
    	* Log.java (CALLER): New.
    	(CALLERS): New.
    	(dump(Object)): Check for null.
    	(set(PrintWriter)): New.
    	(set(PrintStream)): Return old writer.

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

Summary of changes:
 frysk-core/frysk/proc/dead/ChangeLog               |    5 +
 frysk-core/frysk/proc/dead/LinuxCoreProc.java      |    4 +-
 frysk-core/frysk/proc/dead/LinuxCoreTask.java      |    2 +-
 frysk-sys/frysk/rsl/{Setting.java => Callers.java} |   88 ++++++++++++-------
 frysk-sys/frysk/rsl/ChangeLog                      |    9 ++
 frysk-sys/frysk/rsl/Log.java                       |   95 +++++---------------
 frysk-sys/frysk/rsl/Node.java                      |    3 +-
 .../TestRegisterSet.java => rsl/TestCallers.java}  |   65 +++++++------
 8 files changed, 134 insertions(+), 137 deletions(-)
 copy frysk-sys/frysk/rsl/{Setting.java => Callers.java} (58%)
 copy frysk-sys/frysk/{sys/ptrace/TestRegisterSet.java => rsl/TestCallers.java} (59%)

First 500 lines of diff:
diff --git a/frysk-core/frysk/proc/dead/ChangeLog b/frysk-core/frysk/proc/dead/ChangeLog
index 9f8091a..d58e759 100644
--- a/frysk-core/frysk/proc/dead/ChangeLog
+++ b/frysk-core/frysk/proc/dead/ChangeLog
@@ -1,3 +1,8 @@
+2008-02-12  Andrew Cagney  <cagney@redhat.com>
+
+	* LinuxCoreProc.java: Use Log.CALLER.
+	* LinuxCoreTask.java: Ditto.
+
 2008-02-08  Andrew Cagney  <cagney@redhat.com>
 
 	* LinuxCoreHost.java (getName()): Implement.
diff --git a/frysk-core/frysk/proc/dead/LinuxCoreProc.java b/frysk-core/frysk/proc/dead/LinuxCoreProc.java
index 09f0b44..5ea4396 100644
--- a/frysk-core/frysk/proc/dead/LinuxCoreProc.java
+++ b/frysk-core/frysk/proc/dead/LinuxCoreProc.java
@@ -157,7 +157,7 @@ public class LinuxCoreProc extends DeadProc {
 		throw new RuntimeException(e);
 	    }
 
-	fine.log(this,"getMemory() caller: ", fine.caller());
+	fine.log(this, "getMemory() caller: ", Log.CALLER);
 	return memory;
     }
 
@@ -271,7 +271,7 @@ public class LinuxCoreProc extends DeadProc {
     private Auxv[] auxv;
     public Auxv[] getAuxv() {
 
-	fine.log(this,"getAuxv()",fine.caller());
+	fine.log(this,"getAuxv()", Log.CALLER);
 
 	if (auxv == null) {
 	    fine.log(this,"Auxv is null, building");
diff --git a/frysk-core/frysk/proc/dead/LinuxCoreTask.java b/frysk-core/frysk/proc/dead/LinuxCoreTask.java
index 98d399a..590bcc2 100644
--- a/frysk-core/frysk/proc/dead/LinuxCoreTask.java
+++ b/frysk-core/frysk/proc/dead/LinuxCoreTask.java
@@ -64,7 +64,7 @@ public class LinuxCoreTask extends DeadTask {
 	// ISAs. In an attempt to save system resources, get a
 	// reference to the proc's maps for now.
 
-	fine.log(this,"getMemory() called by ",fine.caller());
+	fine.log(this,"getMemory() called by ",Log.CALLER);
 	return parent.getMemory();
     }
 
diff --git a/frysk-sys/frysk/rsl/Setting.java b/frysk-sys/frysk/rsl/Callers.java
similarity index 58%
copy from frysk-sys/frysk/rsl/Setting.java
copy to frysk-sys/frysk/rsl/Callers.java
index b2ca236..5c1d84e 100644
--- a/frysk-sys/frysk/rsl/Setting.java
+++ b/frysk-sys/frysk/rsl/Callers.java
@@ -39,47 +39,73 @@
 
 package frysk.rsl;
 
+import java.util.LinkedList;
 
 /**
- * The level the node is set at.
+ * Class for constructing a backtrace string.
  */
-class Setting {
+public final class Callers {
 
-    static final Setting EPOCH = new Setting(Level.NONE);
+    private int start;
+    private int stop;
 
-    // A private variable to track a settings age.  Each time a new
-    // setting is created the age is incremented; the one with the
-    // largest age (most recent) wins.
-    private static int currentAge;
-
-    private int age;
-    private Level level;
-
-    Setting(Level level) {
-	this.age = currentAge++;
-	this.level = level;
+    Callers(int start, int stop) {
+	this.start = start;
+	this.stop = stop;
     }
 
     public String toString() {
-	return level.toPrint() + "@" + age;
-    }
-
-    Level level() {
-	return level;
+	Throwable t = new Throwable();
+	StackTraceElement[] stackTrace = t.getStackTrace();
+	if (stackTrace.length > start) {
+	    if (start == stop) {
+		return stackTrace[start].toString();
+	    } else {
+		LinkedList l = new LinkedList();
+		int i;
+		for (i = start; i < stop && i < stackTrace.length; i++) {
+		    l.add(stackTrace[i].toString());
+		}
+		if (i < stackTrace.length)
+		    l.add("...");
+		return l.toString();
+	    }
+	}
+	return "<unknown>";
     }
 
-    boolean isNewer(Setting setting) {
-	return this.age > setting.age;
-    }
-
-    boolean isLarger(Level level) {
-	return this.level.compareTo(level) > 0;
-    }
+    // Empty caller array for use in callers.
+    private static final String[] unknown = new String[] { "<unknown>" };
 
-    Level level(Setting setting) {
-	if (this.age > setting.age)
-	    return this.level;
-	else
-	    return setting.level;
+    /**
+     * Return the N callers as an array.
+     */
+    public static String[] callers(Log logger, int max) {
+	if (!logger.logging())
+	    return unknown;
+	int chop = 1;
+	Throwable t = new Throwable();
+	StackTraceElement[] stackTrace = t.getStackTrace();
+	if (stackTrace.length <= chop)
+	    // something screwed up
+	    return unknown;
+	if (max <= 1)
+	    // can't backtrace nothing
+	    return unknown;
+	int length = stackTrace.length - chop;
+	String[] callers;
+	// If trimming, leave space for "..."
+	if (length > max) {
+	    callers = new String[max];
+	    length = max - 1;
+	    callers[length] = "...";
+	} else {
+	    callers = new String[length];
+	}
+	for (int i = 0; i < length; i++) {
+	    callers[i]
+		= stackTrace[i + chop].toString();
+	}
+	return callers;
     }
 }
diff --git a/frysk-sys/frysk/rsl/ChangeLog b/frysk-sys/frysk/rsl/ChangeLog
index 810a3aa..cfce596 100644
--- a/frysk-sys/frysk/rsl/ChangeLog
+++ b/frysk-sys/frysk/rsl/ChangeLog
@@ -1,5 +1,14 @@
 2008-02-12  Andrew Cagney  <cagney@redhat.com>
 
+	* Node.java (set(Level)): Return the node.
+	* Callers.java: Extract from Log.java.
+	* TestCallers.java: New.
+	* Log.java (CALLER): New.
+	(CALLERS): New.
+	(dump(Object)): Check for null.
+	(set(PrintWriter)): New.
+	(set(PrintStream)): Return old writer.
+	
 	* Log.java: Add more loggers.
 
 2008-02-12  Mark Wielaard  <mwielaard@redhat.com>
diff --git a/frysk-sys/frysk/rsl/Log.java b/frysk-sys/frysk/rsl/Log.java
index 4d13663..be46a3b 100644
--- a/frysk-sys/frysk/rsl/Log.java
+++ b/frysk-sys/frysk/rsl/Log.java
@@ -116,8 +116,15 @@ public final class Log {
 
     // Static?
     private static PrintWriter out = new PrintWriter(System.out);
-    static void set(PrintStream out) {
+    static PrintWriter set(PrintStream out) {
+	PrintWriter old = Log.out;
 	Log.out = new PrintWriter(out);
+	return old;
+    }
+    static PrintWriter set(PrintWriter out) {
+	PrintWriter old = Log.out;
+	Log.out = out;
+	return old;
     }
 
     private static final long startTime = System.currentTimeMillis();
@@ -202,7 +209,9 @@ public final class Log {
      * @param o the object to dump
      */
     private void dump(Object o) {
-	if (o instanceof char[]) {
+	if (o == null) {
+	    out.print("<<null>>");
+	} if (o instanceof char[]) {
 	    dump((char[])o);
 	} else if (o instanceof int[]) {
 	    dump((int[])o);
@@ -490,74 +499,16 @@ public final class Log {
 	prefix(self); print(p1); print(p2); print(p3); print(p4); print(p5); print(p6); print(p7); print(p8); print(p9); print(p10); print(p11); suffix();
     }
 
-  /**
-   * Convenience method to get the caller of a method in which you
-   * use the Log object. Returns the caller (of the caller) of this
-   * method as String or "<unknown>" if caller cannot be found or if
-   * logger isn't logging. Use as:
-   * <code>log.log(this, "method called by ", log.caller());</code>.
-   */
-  public String caller()
-  {
-    if (logging)
-      {
-	Throwable t = new Throwable();
-	StackTraceElement[] stackTrace = t.getStackTrace();
-	if (stackTrace.length > 2)
-	  return stackTrace[2].toString();
-      }
-
-    return "<unknown>";
-  }
-
-  // Empty caller array for use in callersArray.
-  static private final String[] empty = new String[0];
-
-  // Private method that should only be directly called from
-  // callers() or callers(int), which in turn should only be called
-  // directly from the method that uses the Log and wants to find
-  // its callers. Depends on actual caller being of depth 3.
-  private String[] callersArray(int max)
-  {
-    if (logging)
-      {
-        Throwable t = new Throwable();
-        StackTraceElement[] stackTrace = t.getStackTrace();
-	int length = stackTrace.length > 3 ? stackTrace.length - 3 : 0;
-	if (length > max)
-	  length = max;
-	String[] callers = new String[length];
-        while (length > 0)
-	  {
-	    callers[length - 1]
-	      = stackTrace[length + 2].toString();
-	    length--;
-	  }
-	return callers;
-      }
-
-    return empty;
-  }
-
-  /**
-   * Convenience method to get an array of callers of a method in
-   * which you use the Log object. Returns the callers (of the caller)
-   * of this method as a String[] or an empty array if the callers
-   * cannot be found or if logger isn't logging. Use as:
-   * <code>log.log(this, "method called by ", log.callers());</code>.
-   * This is pretty heavyweight when the Log is enabled, so use
-   * sparingly.
-   */
-  public String[] callers()
-  {
-    return callersArray(Integer.MAX_VALUE);
-  }
-
-  /**
-   * Same as callers() but only returns at most max callers.
-   */
-  public String[] callers(int max)
-  {
-    return callersArray(max);
-  }
+
+    /**
+     * Assuming the use: <tt>log("caller", log.CALLER)</tt> prints the
+     * caller of the logging fuction.
+     */
+    public static final Callers CALLER = new Callers(4, 4);
+
+    /**
+     * Assuming the use: <tt>log("caller", log.CALLER)</tt> a list of
+     * callers.
+     */
+    public static final Callers CALLERS = new Callers(4, Integer.MAX_VALUE);
 }
diff --git a/frysk-sys/frysk/rsl/Node.java b/frysk-sys/frysk/rsl/Node.java
index 0c8145f..81b9d4f 100644
--- a/frysk-sys/frysk/rsl/Node.java
+++ b/frysk-sys/frysk/rsl/Node.java
@@ -91,13 +91,14 @@ public final class Node {
     /**
      * Set this Node, all child nodes, and extensions, to level.
      */
-    public void set(Level level) {
+    public Node set(Level level) {
 	synchronized (LogFactory.root) {
 	    Setting newSetting = new Setting(level);
 	    setChildren(newSetting);
 	    setExtensions(newSetting);
 	    setLoggers(level);
 	}
+	return this;
     }
     private void setLoggers(Level level) {
 	for (int i = 0; i < Level.MAX.intValue(); i++) {
diff --git a/frysk-sys/frysk/sys/ptrace/TestRegisterSet.java b/frysk-sys/frysk/rsl/TestCallers.java
similarity index 59%
copy from frysk-sys/frysk/sys/ptrace/TestRegisterSet.java
copy to frysk-sys/frysk/rsl/TestCallers.java
index 4d6b3d4..a009cae 100644
--- a/frysk-sys/frysk/sys/ptrace/TestRegisterSet.java
+++ b/frysk-sys/frysk/rsl/TestCallers.java
@@ -37,46 +37,51 @@
 // version and license this file solely under the GPL without
 // exception.
 
-package frysk.sys.ptrace;
+package frysk.rsl;
 
-import frysk.sys.ProcessIdentifier;
-import frysk.junit.TestCase;
-import frysk.testbed.TearDownProcess;
-import frysk.testbed.ForkFactory;
+import inua.util.PrintWriter;
+import java.io.StringWriter;
 
 /**
- * Trace a process.
+ * Class for constructing a backtrace string.
  */
-
-public class TestRegisterSet extends TestCase {
-    /**
-     * Rip down everything related to PID.
-     */
+public class TestCallers extends TestLib {
+    private PrintWriter oldPrintWriter;
     public void tearDown() {
-	TearDownProcess.tearDown ();
+	if (oldPrintWriter != null) {
+	    Log.set(oldPrintWriter);
+	    oldPrintWriter = null;
+	}
     }
 
-    private void verifyTransfer(String what, RegisterSet regs) {
-	if (unsupported(what, regs == null))
-	    return;
-	ProcessIdentifier pid = ForkFactory.attachedDaemon();
-	// Read, write, read.
-	byte[] bytes = new byte[regs.length()];
-	regs.transfer(pid, bytes, false); // read
-	byte old = bytes[0];
-	bytes[0] = (byte) ~old;
-	regs.transfer(pid, bytes, true); // write
-	regs.transfer(pid, bytes, false); // read
-	assertEquals("modified", (byte)~old, bytes[0]);
+    public void testCALLER() {
+	StringWriter buf = new StringWriter();
+	// XXX: Restored during tearDown
+	oldPrintWriter = Log.set(new PrintWriter(buf));
+	Log log = get("").set(Level.FINE).get(Level.FINE);
+	log.log("caller", Log.CALLER);
+	assertTrue("log", buf.toString().contains(" caller "));
+	assertTrue("log", buf.toString().contains("testCALLER"));
     }
 
-    public void testREGS() {
-	verifyTransfer("REGS", RegisterSet.REGS);
+    public void testNonLoggedCallers() {
+	String[] callers = Callers.callers(get("", Level.FINE), 2);
+	assertEquals("callers.length", 1, callers.length);
+	assertEquals("callers[0]", "<unknown>", callers[0]);
     }
-    public void testFPREGS() {
-	verifyTransfer("FPREGS", RegisterSet.FPREGS);
+
+    public void testLoggedCallers() {
+	Log log = get("").set(Level.FINE).get(Level.FINE);
+	String[] callers = Callers.callers(log, 2);
+	assertEquals("callers.length", 2, callers.length);
+	assertTrue("callers[0]", callers[0].contains("testLoggedCallers"));
+	assertEquals("callers[1]", "...", callers[1]);
     }
-    public void testFPXREGS() {
-	verifyTransfer("FPXREGS", RegisterSet.FPXREGS);
+
+    public void testLoggedAllCallers() {
+	Log log = get("").set(Level.FINE).get(Level.FINE);
+	String[] callers = Callers.callers(log, Integer.MAX_VALUE);
+	assertTrue("callers[0]", callers[0].contains("testLoggedAllCallers"));
+	assertTrue("callers[N]", !callers[callers.length - 1].equals("..."));
     }
 }


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


                 reply	other threads:[~2008-02-13  0:05 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=20080213000530.24916.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).