This is the mail archive of the frysk-cvs@sources.redhat.com mailing list for the frysk project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[SCM] master: Refactoring syscall & symbol working set construction


The branch, master has been updated
       via  8d3ef877015432d007f12e653677b2e41807a0b7 (commit)
       via  6e3083ef77c0a76e4d667b527fac97e2dcaf5d50 (commit)
      from  c30b94dcece7bb870346e0a5c090b9bbd37e582f (commit)

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

- Log -----------------------------------------------------------------
commit 8d3ef877015432d007f12e653677b2e41807a0b7
Author: Petr Machata <pmachata@redhat.com>
Date:   Mon Feb 11 15:36:13 2008 +0100

    Refactoring syscall & symbol working set construction

commit 6e3083ef77c0a76e4d667b527fac97e2dcaf5d50
Author: Petr Machata <pmachata@redhat.com>
Date:   Fri Feb 8 16:01:25 2008 +0100

    Const-correctify logging functions
    
    * ... because GCC 4.3 complains.

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

Summary of changes:
 frysk-core/frysk/bindir/ChangeLog   |    9 ++
 frysk-core/frysk/bindir/ftrace.java |  199 +++++++++++++++-------------------
 frysk-sys/frysk/sys/ChangeLog       |    7 ++
 frysk-sys/frysk/sys/cni/Errno.cxx   |   14 ++--
 frysk-sys/frysk/sys/cni/Errno.hxx   |   12 +-
 5 files changed, 117 insertions(+), 124 deletions(-)

First 500 lines of diff:
diff --git a/frysk-core/frysk/bindir/ChangeLog b/frysk-core/frysk/bindir/ChangeLog
index fa45822..b4b46e0 100644
--- a/frysk-core/frysk/bindir/ChangeLog
+++ b/frysk-core/frysk/bindir/ChangeLog
@@ -1,3 +1,12 @@
+2008-02-11  Petr Machata  <pmachata@redhat.com>
+
+	* ftrace.java: Refactoring.
+	(Rule.checkVersionMatches): Moved from MyFtraceController.
+	(Rule.checkNameMatches): Likewise.
+	(Rule.apply): New method, code moved from MyFtraceController.
+	(WorkingSetRule): Renamed to SymbolRule.
+	(SymbolRule.matches): Is now implemented.
+
 2008-02-08  Stan Cox  <scox@redhat.com>
 
 	* fhpd.java (main): Space after -sysroot.
diff --git a/frysk-core/frysk/bindir/ftrace.java b/frysk-core/frysk/bindir/ftrace.java
index 2a6501b..281063d 100644
--- a/frysk-core/frysk/bindir/ftrace.java
+++ b/frysk-core/frysk/bindir/ftrace.java
@@ -42,6 +42,7 @@ package frysk.bindir;
 import inua.util.PrintWriter;
 
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
@@ -89,10 +90,44 @@ abstract class Rule
 	    + (this.stackTrace ? "#" : "");
     }
 
+    public void apply(Logger logger, Collection candidates,
+		    Set workingSet, Set stackTraceSet) {
+	if (this.addition)
+	    // For '+' rules iterate over candidates,
+	    // and add what matches to workingSet, and
+	    // maybe to stackTraceSet.
+	    for (Iterator jt = candidates.iterator(); jt.hasNext(); ) {
+		Object candidate = jt.next();
+		if (this.matches(candidate))
+		{
+		    if (workingSet.add(candidate))
+			logger.log(Level.CONFIG, this + ": add " + candidate + "'.");
+		    if (this.stackTrace
+			&& stackTraceSet.add(candidate))
+			logger.log(Level.CONFIG, this + ": stack trace on " + candidate + ".");
+		}
+	    }
+	else {
+	    // For '-' or '-#' rules iterate over
+	    // workingSet or stackTraceSet, and remove
+	    // what matches.
+	    Set iterateOver = this.stackTrace ? stackTraceSet : workingSet;
+	    for (Iterator jt = iterateOver.iterator(); jt.hasNext(); ) {
+		Object candidate = jt.next();
+		if (this.matches(candidate)) {
+		    jt.remove();
+		    if (!this.stackTrace)
+			stackTraceSet.remove(candidate);
+		    logger.log(Level.CONFIG, this + ": remove " + candidate + ".");
+		}
+	    }
+	}
+    }
+
     abstract public boolean matches(Object traceable);
 }
 
-class WorkingSetRule
+class SymbolRule
     extends Rule
 {
     /** See namePattern */
@@ -104,8 +139,8 @@ class WorkingSetRule
      */
     final public Pattern namePattern;
 
-    public WorkingSetRule(boolean addition, boolean stackTrace,
-			  String nameRe, String sonameRe, String versionRe) {
+    public SymbolRule(boolean addition, boolean stackTrace,
+		      String nameRe, String sonameRe, String versionRe) {
 	super (addition, stackTrace);
 	this.sonamePattern = Pattern.compile((sonameRe != null) ? sonameRe : ".*");
 	this.versionPattern = Pattern.compile((versionRe != null) ? versionRe : ".*");
@@ -119,8 +154,49 @@ class WorkingSetRule
 	    + "@@" + this.versionPattern.pattern();
     }
 
+
+    private boolean checkVersionMatches(final TracePoint tp)
+    {
+	ElfSymbolVersion[] vers = (tp.origin == TracePointOrigin.PLT)
+	    ? (ElfSymbolVersion[])tp.symbol.verneeds
+	    : (ElfSymbolVersion[])tp.symbol.verdefs;
+
+	// When there is no version assigned to symbol, we pretend it has
+	// a version of ''.  Otherwise we require one of the versions to
+	// match the version pattern.
+	if (vers.length == 0) {
+	    if (this.versionPattern.matcher("").matches())
+		return true;
+	}
+	else
+	    for (int i = 0; i < vers.length; ++i)
+		if (this.versionPattern.matcher(vers[i].name).matches())
+		    return true;
+
+	return false;
+    }
+
+    private boolean checkNameMatches(final TracePoint tp)
+    {
+	Symbol symbol = tp.symbol;
+
+	if (this.namePattern.matcher(symbol.name).matches())
+	    return true;
+
+	if (symbol.aliases != null)
+	    for (int i = 0; i < symbol.aliases.size(); ++i) {
+		String alias = (String)symbol.aliases.get(i);
+		if (this.namePattern.matcher(alias).matches())
+		    return true;
+	    }
+
+	return false;
+    }
+
     public boolean matches(Object traceable) {
-	throw new AssertionError("NYI");
+	TracePoint tp = (TracePoint)traceable;
+	return checkNameMatches(tp)
+	    && checkVersionMatches(tp);
     }
 }
 
@@ -173,7 +249,7 @@ class MyFtraceController
 {
     protected static final Logger logger = Logger.getLogger("frysk");
 
-    // ArrayList<WorkingSetRule>
+    // ArrayList<SymbolRule>
     private final List pltRules = new ArrayList();
     private final List dynRules = new ArrayList();
     private final List symRules = new ArrayList();
@@ -208,48 +284,9 @@ class MyFtraceController
 	this.sysRules.addAll(rules);
     }
 
-    private boolean checkVersionMatches(final TracePoint tp, final WorkingSetRule rule)
-    {
-	ElfSymbolVersion[] vers = (tp.origin == TracePointOrigin.PLT)
-	    ? (ElfSymbolVersion[])tp.symbol.verneeds
-	    : (ElfSymbolVersion[])tp.symbol.verdefs;
-
-	// When there is no version assigned to symbol, we pretend it has
-	// a version of ''.  Otherwise we require one of the versions to
-	// match the version pattern.
-	if (vers.length == 0) {
-	    if (rule.versionPattern.matcher("").matches()) {
-		logger.log(Level.FINE, rule + ": `" + tp.symbol.name
-			   + "' version match, no version.");
-		return true;
-	    }
-	}
-	else
-	    for (int i = 0; i < vers.length; ++i)
-		if (rule.versionPattern.matcher(vers[i].name).matches()) {
-		    logger.log(Level.FINE, rule + ": `" + tp.symbol.name
-			       + "' version match `" + vers[i].name+ "'.");
-		    return true;
-		}
-
-	return false;
-    }
-
-    private boolean checkNameMatches(final WorkingSetRule rule, Symbol symbol)
-    {
-	if (rule.namePattern.matcher(symbol.name).matches())
-	    return true;
-
-	if (symbol.aliases != null)
-	    for (int i = 0; i < symbol.aliases.size(); ++i) {
-		String alias = (String)symbol.aliases.get(i);
-		if (rule.namePattern.matcher(alias).matches())
-		    return true;
-	    }
-
-	return false;
-    }
-
+    // Syscall working and stack trace sets can be pre-computed for
+    // each task.  This is in contrast to tracing rules, that are
+    // computed incrementally when DSOs are mapped.
     public Map computeSyscallWorkingSet(Task task) {
 	HashSet workingSet = new HashSet();
 	HashSet stackTraceSet = new HashSet();
@@ -262,36 +299,7 @@ class MyFtraceController
 	for (Iterator it = sysRules.iterator(); it.hasNext(); ) {
 	    final Rule rule = (Rule)it.next();
 	    logger.log(Level.FINEST, "Considering syscall rule " + rule + ".");
-
-	    if (rule.addition)
-		// For '+' rules iterate over candidates,
-		// and add what matches to workingSet, and
-		// maybe to stackTraceSet.
-		for (Iterator jt = candidates.iterator(); jt.hasNext(); ) {
-		    Object candidate = jt.next();
-		    if (rule.matches(candidate)) {
-			if (workingSet.add(candidate))
-			    logger.log(Level.CONFIG, rule + ": add `" + candidate + "'.");
-			if (rule.stackTrace
-			    && stackTraceSet.add(candidate))
-			    logger.log(Level.CONFIG, rule + ": stack trace on `" + candidate + "'.");
-		    }
-		}
-	    else {
-		// For '-' or '-#' rules iterate over
-		// workingSet or stackTraceSet, and remove
-		// what matches.
-		Set iterateOver = rule.stackTrace ? stackTraceSet : workingSet;
-		for (Iterator jt = iterateOver.iterator(); jt.hasNext(); ) {
-		    Object candidate = jt.next();
-		    if (rule.matches(candidate)) {
-			jt.remove();
-			if (!rule.stackTrace)
-			    stackTraceSet.remove(candidate);
-			logger.log(Level.CONFIG, rule + ": remove `" + candidate + "'.");
-		    }
-		}
-	    }
+	    rule.apply(logger, candidates, workingSet, stackTraceSet);
 	}
 
 	// Apply the two sets.
@@ -337,7 +345,7 @@ class MyFtraceController
 	// workingSet from candidates.  Candidates are initialized
 	// lazily inside the loop.
 	for (Iterator it = rules.iterator(); it.hasNext(); ) {
-	    final WorkingSetRule rule = (WorkingSetRule)it.next();
+	    final SymbolRule rule = (SymbolRule)it.next();
 	    logger.log(Level.FINEST, "Considering symbol rule " + rule + ".");
 
 	    // MAIN is meta-soname meaning "main executable".
@@ -357,38 +365,7 @@ class MyFtraceController
 			}, origin);
 		}
 
-		if (rule.addition)
-		    // For '+' rules iterate over candidates,
-		    // and add what matches to workingSet, and
-		    // maybe to stackTraceSet.
-		    for (Iterator jt = candidates.iterator(); jt.hasNext(); ) {
-			TracePoint tp = (TracePoint)jt.next();
-			if (checkNameMatches(rule, tp.symbol)
-			    && checkVersionMatches(tp, rule))
-			{
-			    if (workingSet.add(tp))
-				logger.log(Level.CONFIG, rule + ": add `" + tp.symbol.name + "'.");
-			    if (rule.stackTrace
-				&& stackTraceSet.add(tp))
-				logger.log(Level.CONFIG, rule + ": stack trace on `" + tp.symbol.name + "'.");
-			}
-		    }
-		else {
-		    // For '-' or '-#' rules iterate over
-		    // workingSet or stackTraceSet, and remove
-		    // what matches.
-		    Set iterateOver = rule.stackTrace ? stackTraceSet : workingSet;
-		    for (Iterator jt = iterateOver.iterator(); jt.hasNext(); ) {
-			TracePoint tp = (TracePoint)jt.next();
-			if (checkNameMatches(rule, tp.symbol)
-			    && checkVersionMatches(tp, rule)) {
-			    jt.remove();
-			    if (!rule.stackTrace)
-				stackTraceSet.remove(tp);
-			    logger.log(Level.CONFIG, rule + ": remove `" + tp.symbol.name + "'.");
-			}
-		    }
-		}
+		rule.apply(logger, candidates, workingSet, stackTraceSet);
 	    }
 	}
 
@@ -490,7 +467,7 @@ class ftrace
 		symbolRe = null;
 
 	    logger.log(Level.FINE, i + ": " + str + ": symbol=" + symbolRe + ", soname=" + sonameRe + ", version=" + versionRe);
-	    WorkingSetRule rule = new WorkingSetRule(addition, stackTrace, symbolRe, sonameRe, versionRe);
+	    SymbolRule rule = new SymbolRule(addition, stackTrace, symbolRe, sonameRe, versionRe);
 	    rules.add(rule);
 	}
 	return rules;
diff --git a/frysk-sys/frysk/sys/ChangeLog b/frysk-sys/frysk/sys/ChangeLog
index 29f7549..8de2b54 100644
--- a/frysk-sys/frysk/sys/ChangeLog
+++ b/frysk-sys/frysk/sys/ChangeLog
@@ -6,6 +6,13 @@
 	* ProcessIdentifierFactory.java (create(int)): Make public.
 	(createFIXME(int)): Delete.
 
+2008-02-08  Petr Machata  <pmachata@redhat.com>
+
+	* cni/Errno.cxx (vlog): Change the `message' type to const char*.
+	(logMessage, logFinest, logFine): Likewise.
+	(jLogMessage, jLogFine, jLogFinest): Likewise.
+	* cni/Errno.cxx: Likewise.
+
 2008-02-07  Andrew Cagney  <cagney@redhat.com>
 
 	* DaemonFactory.java: Replace Daemon.java.
diff --git a/frysk-sys/frysk/sys/cni/Errno.cxx b/frysk-sys/frysk/sys/cni/Errno.cxx
index 7a8b918..21f7834 100644
--- a/frysk-sys/frysk/sys/cni/Errno.cxx
+++ b/frysk-sys/frysk/sys/cni/Errno.cxx
@@ -286,7 +286,7 @@ fill_string (void *p, jstring s)
  
 static void
 vlog (jobject myThis, java::util::logging::Logger* logger, 
-      java::util::logging::Level* level, char *message, va_list argp)
+      java::util::logging::Level* level, const char *message, va_list argp)
 {
 	if (!(logger->isLoggable(level)))
 		return;
@@ -303,7 +303,7 @@ vlog (jobject myThis, java::util::logging::Logger* logger,
 
 void 
 logMessage (jobject myThis, java::util::logging::Logger* logger, 
-            java::util::logging::Level* level, char *message, ...)
+            java::util::logging::Level* level, const char *message, ...)
 {
 	va_list argp;
 	
@@ -317,7 +317,7 @@ logMessage (jobject myThis, java::util::logging::Logger* logger,
  */
 void
 jLogMessage (jobject myThis, java::util::logging::Logger* logger, 
-             java::util::logging::Level* level, char *message, ...)
+             java::util::logging::Level* level, const char *message, ...)
 {
 	if (!(logger->isLoggable(level)))
 		return;
@@ -345,7 +345,7 @@ jLogMessage (jobject myThis, java::util::logging::Logger* logger,
 
 
 void 
-logFine (jobject myThis, java::util::logging::Logger* logger, char *message, ...)
+logFine (jobject myThis, java::util::logging::Logger* logger, const char *message, ...)
 {
 	va_list argp;
 	va_start(argp, message);
@@ -354,7 +354,7 @@ logFine (jobject myThis, java::util::logging::Logger* logger, char *message, ...
 }
 	 
 void 
-logFinest (jobject myThis, java::util::logging::Logger* logger, char *message, ...)
+logFinest (jobject myThis, java::util::logging::Logger* logger, const char *message, ...)
 {
 	va_list argp;
 	va_start(argp, message);
@@ -363,7 +363,7 @@ logFinest (jobject myThis, java::util::logging::Logger* logger, char *message, .
 }
 
 void 
-jLogFine (jobject myThis, java::util::logging::Logger* logger, char *message, ...)
+jLogFine (jobject myThis, java::util::logging::Logger* logger, const char *message, ...)
 {
 	if (!(logger->isLoggable(java::util::logging::Level::FINE)))
 		return;
@@ -390,7 +390,7 @@ jLogFine (jobject myThis, java::util::logging::Logger* logger, char *message, ..
 }
 
 void
-jLogFinest (jobject myThis, java::util::logging::Logger* logger, char *message, ...)
+jLogFinest (jobject myThis, java::util::logging::Logger* logger, const char *message, ...)
 {
 	if (!(logger->isLoggable(java::util::logging::Level::FINEST)))
 		return;
diff --git a/frysk-sys/frysk/sys/cni/Errno.hxx b/frysk-sys/frysk/sys/cni/Errno.hxx
index 72c9491..52e6a87 100644
--- a/frysk-sys/frysk/sys/cni/Errno.hxx
+++ b/frysk-sys/frysk/sys/cni/Errno.hxx
@@ -88,27 +88,27 @@ extern char* fill_string (void* p, jstring s);
  * Print a log message to a java logger, uses printf notation.
  */
 extern void logMessage (jobject myThis, java::util::logging::Logger* logger, 
-	java::util::logging::Level* level, char *message, ...)	
+	java::util::logging::Level* level, const char *message, ...)	
 	__attribute__ ((format (printf, 4, 5)));
 
 /*
  * Print a log message to a java logger, uses java objects, in a vararg format.
  */
 extern void jLogMessage (jobject myThis, java::util::logging::Logger* logger, 
-	java::util::logging::Level* level, char *message, ...);
+	java::util::logging::Level* level, const char *message, ...);
 	
 /*
  * Convenience wrappers for above.
  */
-extern void logFine (jobject myThis, java::util::logging::Logger* logger, char *message, ...)
+extern void logFine (jobject myThis, java::util::logging::Logger* logger, const char *message, ...)
 	 __attribute__ ((format (printf, 3, 4)));
 	 
-extern void logFinest (jobject myThis, java::util::logging::Logger* logger, char *message, ...)
+extern void logFinest (jobject myThis, java::util::logging::Logger* logger, const char *message, ...)
 	 __attribute__ ((format (printf, 3, 4)));
 
-extern void jLogFine (jobject myThis, java::util::logging::Logger* logger, char *message, ...);
+extern void jLogFine (jobject myThis, java::util::logging::Logger* logger, const char *message, ...);
 
-extern void jLogFinest (jobject myThis, java::util::logging::Logger* logger, char *message, ...);
+extern void jLogFinest (jobject myThis, java::util::logging::Logger* logger, const char *message, ...);
 
 /**
  * Throw an ArrayIndexOutOfBounds exception if START and LENGTH do not


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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]