public inbox for frysk-cvs@sourceware.org
help / color / mirror / Atom feed
From: cagney@sourceware.org
To: frysk-cvs@sourceware.org
Subject: [SCM]  master: frysk-core/frysk/hpd/ChangeLog
Date: Mon, 25 Feb 2008 17:17:00 -0000	[thread overview]
Message-ID: <20080225171719.25946.qmail@sourceware.org> (raw)

The branch, master has been updated
       via  cc4b69ddad67f0d3efcb1574f32f37d0ad3e92e6 (commit)
      from  8ae8b5bbf07d2a0dde2b5db8bcf01199e3ea2ced (commit)

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

- Log -----------------------------------------------------------------
commit cc4b69ddad67f0d3efcb1574f32f37d0ad3e92e6
Author: Andrew Cagney <cagney@redhat.com>
Date:   Mon Feb 25 12:15:29 2008 -0500

    frysk-core/frysk/hpd/ChangeLog
    2008-02-25  Andrew Cagney  <cagney@redhat.com>
    
    	* LoadCommand.java: Use LinuxExeFactory.
    
    frysk-core/frysk/proc/dead/ChangeLog
    2008-02-25  Andrew Cagney  <cagney@redhat.com>
    
    	* LinuxExeFactory.java: New.  Merge in LinuxExeHost, LinuxExeProc,
    	and LinuxExeTask.
    	* LinuxExeHost.java: Simplify.
    	* LinuxExeProc.java: Simplify.
    	* LinuxExeTask.java: Simplify.
    	* ExeByteBuffer.java (ExeByteBuffer(MemoryMap[])): Replace
    	ExeByteBuffer(ArrayList).
    	* TestLinuxExe.java: Update.
    
    frysk-core/frysk/util/ChangeLog
    2008-02-25  Andrew Cagney  <cagney@redhat.com>
    
    	* ProcStopUtil.java: Use LinuxExeFactory.

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

Summary of changes:
 frysk-core/frysk/hpd/ChangeLog                     |    4 +
 frysk-core/frysk/hpd/LoadCommand.java              |   11 +--
 frysk-core/frysk/proc/dead/ChangeLog               |   11 +++
 frysk-core/frysk/proc/dead/ExeByteBuffer.java      |   53 +++++-------
 .../{LinuxExeTask.java => LinuxExeFactory.java}    |   85 ++++++++----------
 frysk-core/frysk/proc/dead/LinuxExeHost.java       |   92 ++------------------
 frysk-core/frysk/proc/dead/LinuxExeProc.java       |   67 ++++-----------
 frysk-core/frysk/proc/dead/LinuxExeTask.java       |   35 ++------
 frysk-core/frysk/proc/dead/TestLinuxExe.java       |   75 ++--------------
 frysk-core/frysk/util/ChangeLog                    |    4 +
 frysk-core/frysk/util/ProcStopUtil.java            |    7 +-
 11 files changed, 128 insertions(+), 316 deletions(-)
 copy frysk-core/frysk/proc/dead/{LinuxExeTask.java => LinuxExeFactory.java} (61%)

First 500 lines of diff:
diff --git a/frysk-core/frysk/hpd/ChangeLog b/frysk-core/frysk/hpd/ChangeLog
index 7862c42..fc9b4d7 100644
--- a/frysk-core/frysk/hpd/ChangeLog
+++ b/frysk-core/frysk/hpd/ChangeLog
@@ -1,3 +1,7 @@
+2008-02-25  Andrew Cagney  <cagney@redhat.com>
+
+	* LoadCommand.java: Use LinuxExeFactory.
+
 2008-02-21  Nurdin Premji  <npremji@redhat.com>
 
 	* StepCommand.java (StepCommand): Added -instruction parameter. 
diff --git a/frysk-core/frysk/hpd/LoadCommand.java b/frysk-core/frysk/hpd/LoadCommand.java
index bbd9893..4bc03ae 100644
--- a/frysk-core/frysk/hpd/LoadCommand.java
+++ b/frysk-core/frysk/hpd/LoadCommand.java
@@ -40,16 +40,12 @@
 package frysk.hpd;
 
 import java.io.File;
-//import java.util.HashMap;
 import java.util.Iterator;
-//import java.util.Map;
-//import java.util.Set;
+import frysk.proc.dead.LinuxExeFactory;
 import frysk.debuginfo.DebugInfo;
 import frysk.debuginfo.DebugInfoFrame;
 import frysk.debuginfo.DebugInfoStackFactory;
 import frysk.dwfl.DwflCache;
-import frysk.proc.Host;
-import frysk.proc.dead.LinuxExeHost;
 import frysk.proc.Manager;
 import frysk.proc.Proc;
 import frysk.proc.Task;
@@ -112,8 +108,9 @@ public class LoadCommand extends ParameterizedCommand {
 	    	("File does not exist or is not readable or is not a file.");
 	}
 
-	Host exeHost = new LinuxExeHost(Manager.eventLoop, executableFile);
-	Proc exeProc = frysk.util.Util.getProcFromExeFile(exeHost);
+	Proc exeProc = LinuxExeFactory.createProc(Manager.eventLoop,
+						  executableFile,
+						  cmd.stringArrayValue());
 
 	int procID;
 	if (cli.taskID < 0)
diff --git a/frysk-core/frysk/proc/dead/ChangeLog b/frysk-core/frysk/proc/dead/ChangeLog
index a79fb3b..f09f868 100644
--- a/frysk-core/frysk/proc/dead/ChangeLog
+++ b/frysk-core/frysk/proc/dead/ChangeLog
@@ -1,3 +1,14 @@
+2008-02-25  Andrew Cagney  <cagney@redhat.com>
+
+	* LinuxExeFactory.java: New.  Merge in LinuxExeHost, LinuxExeProc,
+	and LinuxExeTask.
+	* LinuxExeHost.java: Simplify.
+	* LinuxExeProc.java: Simplify.
+	* LinuxExeTask.java: Simplify.
+	* ExeByteBuffer.java (ExeByteBuffer(MemoryMap[])): Replace
+	ExeByteBuffer(ArrayList).
+	* TestLinuxExe.java: Update.
+
 2008-02-20  Andrew Cagney  <cagney@redhat.com>
 
 	* LinuxExeProc.java (sendRefresh()): Delete.
diff --git a/frysk-core/frysk/proc/dead/ExeByteBuffer.java b/frysk-core/frysk/proc/dead/ExeByteBuffer.java
index cde7b8d..59f6d09 100644
--- a/frysk-core/frysk/proc/dead/ExeByteBuffer.java
+++ b/frysk-core/frysk/proc/dead/ExeByteBuffer.java
@@ -1,6 +1,6 @@
 // This file is part of the program FRYSK.
 //
-// Copyright 2007, Red Hat Inc.
+// Copyright 2007, 2008, Red Hat Inc.
 //
 // FRYSK is free software; you can redistribute it and/or modify it
 // under the terms of the GNU General Public License as published by
@@ -40,52 +40,41 @@
 package frysk.proc.dead;
 
 import java.io.File;
-import java.util.ArrayList;
-import java.util.Iterator;
-
 import frysk.sys.StatelessFile;
 import frysk.proc.MemoryMap;
-
 import inua.eio.ByteBuffer;
 
 public class ExeByteBuffer extends ByteBuffer {
 
-    ArrayList metaData = new ArrayList();
+    private final MemoryMap[] memoryMaps;
+    private final StatelessFile[] statelessFiles;
+    private final byte[] buffer = new byte[1];
     
-    protected ExeByteBuffer(long lowWater, long highWater) {
-	super(lowWater, highWater);
-    }
-
-    public ExeByteBuffer(ArrayList metaData)
-    {
+    public ExeByteBuffer(MemoryMap[] memoryMaps) {
 	super(0,-1);
-	
-	this.metaData = metaData;
+	this.memoryMaps = memoryMaps;
+	this.statelessFiles = new StatelessFile[memoryMaps.length];
     }
     
     protected int peek(long caret) {
-	
-	Iterator i = metaData.iterator();
-	MemoryMap line = null;
 	long offset = -1;
-	byte[] buffer = new byte[1];
-	
-	while (i.hasNext())
-	{
-	    line = ((MemoryMap)i.next());
-	    if ((caret >= line.addressLow) && (caret<= line.addressHigh))
-		    {
-			offset = line.offset + (caret - line.addressLow);
-			break;
-		    }
+	int i;
+	MemoryMap line = null;
+	for (i = 0; i < memoryMaps.length; i++) {
+	    line = memoryMaps[i];
+	    if ((caret >= line.addressLow) && (caret<= line.addressHigh)) {
+		offset = line.offset + (caret - line.addressLow);
+		break;
+	    }
 	}
-	
-	if (offset == -1)
+	if (i >= memoryMaps.length)
 	    throw new RuntimeException("Cannot find memory in exe file");
-
-	StatelessFile temp = new StatelessFile(new File(line.name));
+	StatelessFile temp = statelessFiles[i];
+	if (temp == null) {
+	    temp = new StatelessFile(new File(line.name));
+	    statelessFiles[i] = temp;
+	}
 	temp.pread(offset, buffer,0,1);
-	
 	return buffer[0];
     }
 
diff --git a/frysk-core/frysk/proc/dead/LinuxExeTask.java b/frysk-core/frysk/proc/dead/LinuxExeFactory.java
similarity index 61%
copy from frysk-core/frysk/proc/dead/LinuxExeTask.java
copy to frysk-core/frysk/proc/dead/LinuxExeFactory.java
index 4d90354..28d0082 100644
--- a/frysk-core/frysk/proc/dead/LinuxExeTask.java
+++ b/frysk-core/frysk/proc/dead/LinuxExeFactory.java
@@ -39,59 +39,50 @@
 
 package frysk.proc.dead;
 
-import inua.eio.ArrayByteBuffer;
-import inua.eio.ByteBuffer;
-import frysk.isa.banks.RegisterBanks;
-import frysk.isa.ISA;
+import java.io.File;
+import java.util.List;
+import java.util.LinkedList;
 import lib.dwfl.Elf;
 import lib.dwfl.ElfCommand;
 import lib.dwfl.ElfEHeader;
-import lib.dwfl.ElfException;
-import java.io.File;
-
-public class LinuxExeTask extends DeadTask {
-    private final long pc;
-    private final LinuxExeProc proc;
+import frysk.proc.MemoryMap;
+import frysk.event.EventLoop;
 
-    LinuxExeTask(LinuxExeProc proc, ISA isa) {
-	super(proc, 0, isa, constructRegisterBanks(isa));
-	this.proc = proc;
-	// Compute a Fake PC.  XXX should be done in Proc instead of
-	// creating Elf object in the Task itself.
-	Elf e = null;
-	long pc;
+public class LinuxExeFactory {
+    public static LinuxExeProc createProc(EventLoop eventLoop,
+					  final File exeFile,
+					  String[] args) {
+	Elf exeElf = null;
 	try {
-	    e = new Elf(new File(getProc().getExe()), ElfCommand.ELF_C_READ);
-	    ElfEHeader h = e.getEHeader();
-	    pc = h.entry;
-	} catch (ElfException ee) {
-	    // Nice try, just give up.
-	    pc = 0;
+	    exeElf = new Elf(exeFile, ElfCommand.ELF_C_READ);
+	    ElfEHeader eHeader = exeElf.getEHeader();
+	    class BuildExeMaps extends SOLibMapBuilder {
+		private final List metaData = new LinkedList();
+		public void buildMap(long addrLow, long addrHigh, boolean permRead,
+				     boolean permWrite, boolean permExecute,
+				     long offset, String name, long align) {
+		    metaData.add(new MemoryMap(addrLow, addrHigh, permRead,
+					       permWrite, permExecute, false,
+					       offset, -1, -1, -1, -1, -1,
+					       exeFile.getAbsolutePath()));
+		}
+		MemoryMap[] getMemoryMaps() {
+		    MemoryMap[] memoryMaps = new MemoryMap[metaData.size()];
+		    metaData.toArray(memoryMaps);
+		    return memoryMaps;
+		}
+	    }
+	    BuildExeMaps SOMaps = new BuildExeMaps();
+	    // Add in case for executables maps.
+	    SOMaps.construct(exeFile, 0);
+	    
+	    LinuxExeHost host
+		= new LinuxExeHost(exeFile, eHeader, SOMaps.getMemoryMaps(),
+				   args);
+	    return host.getProc();
 	} finally {
-	    if (e != null)
-		e.close();
+	    if (exeElf != null)
+		exeElf.close();
 	}
-	this.pc = pc;
-    }
-  
-    public long getPC() {
-	return pc;
-    }
-
-    public ByteBuffer getMemory() {
-	return proc.getMemory();
     }
-  
-    private static RegisterBanks constructRegisterBanks(ISA isa) {
-	ByteBuffer[] bankBuffers = new ByteBuffer[4];
-	// Create an empty page
-	byte[] emptyBuffer = new byte[4096];
-	for (int i = 0; i < emptyBuffer.length; i++)
-	    emptyBuffer[i] = 0;
-	bankBuffers[0] = new ArrayByteBuffer(emptyBuffer);
-	bankBuffers[1] = new ArrayByteBuffer(emptyBuffer);
-	bankBuffers[2] = new ArrayByteBuffer(emptyBuffer);
-	bankBuffers[3] = new ArrayByteBuffer(emptyBuffer);
-	return CorefileRegisterBanksFactory.create(isa, bankBuffers);
-  }
 }
diff --git a/frysk-core/frysk/proc/dead/LinuxExeHost.java b/frysk-core/frysk/proc/dead/LinuxExeHost.java
index 7dd7431..a9932e0 100644
--- a/frysk-core/frysk/proc/dead/LinuxExeHost.java
+++ b/frysk-core/frysk/proc/dead/LinuxExeHost.java
@@ -40,100 +40,24 @@
 package frysk.proc.dead;
 
 import java.io.File;
-import java.util.Iterator;
-import java.util.List;
-import java.util.LinkedList;
-
-import lib.dwfl.Elf;
-import lib.dwfl.ElfCommand;
-import lib.dwfl.ElfData;
 import lib.dwfl.ElfEHeader;
-import lib.dwfl.ElfPHeader;
-
-import frysk.event.EventLoop;
-import frysk.proc.Proc;
-import frysk.proc.ProcId;
+import frysk.proc.MemoryMap;
 
 public class LinuxExeHost extends DeadHost {
-
-    protected File exeFile = null;
-    EventLoop eventLoop = null;
-    Elf exeFileElf = null;
+    private final File exeFile;
+    private final LinuxExeProc proc;
     
-    public LinuxExeHost(EventLoop eventLoop, File exeFile) {
+    LinuxExeHost(File exeFile, ElfEHeader eHeader, MemoryMap[] memoryMaps,
+		 String[] args) {
 	this.exeFile = exeFile;
-	this.eventLoop = eventLoop;
-	this.exeFileElf = new Elf(exeFile, ElfCommand.ELF_C_READ);
-	// Iterate (build) the /proc tree, passing each found PID to
-	// procChanges where it can update the /proc tree.
-	// Changes individual process.
-	new DeconstructExeFile(this.exeFileElf);
-	for (Iterator i = procPool.values().iterator(); i.hasNext();) {
-	    LinuxExeProc proc = (LinuxExeProc) i.next();
-	    proc.sendRefresh();
-	}
-    }
-
-    private class DeconstructExeFile
-    {
-      List addedProcs = new LinkedList();
-      Elf exeFileElf;
-      ElfData noteData = null;
-
-      DeconstructExeFile(Elf exeFileElf)
-      {
-        this.exeFileElf =  exeFileElf;
-        ElfEHeader eHeader = this.exeFileElf.getEHeader();
-        
-        // Get number of program header entries.
-        long phSize = eHeader.phnum;
-        for (int i=0; i<phSize; i++)
-  	{
-  	  // Test if pheader is of types notes..
-  	  ElfPHeader pHeader = exeFileElf.getPHeader(i);
-  	  if (pHeader.type == ElfPHeader.PTYPE_NOTE)
-  	    {
-  	      // if so, copy, break and leave.
-  	      noteData = exeFileElf.getRawData(pHeader.offset,pHeader.filesz);
-  	      break;
-  	    }
-  	}
-
-        if (noteData != null)
-  	update(noteData);
-      }
-
-      Proc update (ElfData proc_pid) 
-      {
-        final ProcId procId = new ProcId(0);
-        // Currently there can only be one process per core file.
-        // What happens when we have two core files denoting the same
-        // process/pid? Leave the test here for now.
-     
-        Proc proc = (Proc) procPool.get(procId);
-        if (proc == null)
-  	{
-  	  // executable file processes have no parents as thy are captured
-  	  // in isolation, and reconstructed.
-  	  proc = new LinuxExeProc(proc_pid,LinuxExeHost.this);
-  	}
-
-        addedProcs.add(proc);
-
-        return proc;
-      }
+	proc = new LinuxExeProc(this, exeFile, eHeader, memoryMaps, args);
     }
 
     public String getName() {
 	return exeFile.getName();
     }
 
-    /**
-     * finalize closes the file descriptor for the executable.
-     */
-    protected void finalize()
-    {
-	this.exeFileElf.close();
+    LinuxExeProc getProc() {
+	return proc;
     }
-
 }
diff --git a/frysk-core/frysk/proc/dead/LinuxExeProc.java b/frysk-core/frysk/proc/dead/LinuxExeProc.java
index 4732d0e..9616965 100644
--- a/frysk-core/frysk/proc/dead/LinuxExeProc.java
+++ b/frysk-core/frysk/proc/dead/LinuxExeProc.java
@@ -39,50 +39,45 @@
 
 package frysk.proc.dead;
 
-import inua.eio.ByteBuffer;
-
-import java.util.ArrayList;
-import lib.dwfl.ElfData;
-
-import frysk.isa.ISA;
-import frysk.isa.ElfMap;
+import lib.dwfl.ElfEHeader;
 import frysk.proc.Auxv;
 import frysk.proc.MemoryMap;
+import java.io.File;
 
 public class LinuxExeProc extends DeadProc {
 
-    private ElfData elfData = null;
-    ArrayList metaData = new ArrayList();
-    LinuxExeHost host = null;
+    private final MemoryMap[] memoryMaps;
+    private final String[] argv;
+    private final File exeFile;
 
-    public LinuxExeProc(ElfData data, LinuxExeHost host) {
+    public LinuxExeProc(LinuxExeHost host, File exeFile, ElfEHeader eHeader,
+			MemoryMap[] memoryMaps, String[] argv) {
 	super(host, null, 0);
-	this.host = host;
-	this.elfData = data;
-	sendRefresh();
-	ISA isa = ElfMap.getISA(elfData.getParent().getEHeader());
-	new LinuxExeTask(this, isa);
-	buildMetaData();
+	this.exeFile = exeFile;
+	this.memoryMaps = memoryMaps;
+	this.argv = argv;
+	new LinuxExeTask(this, eHeader, memoryMaps);
     }
 
     public Auxv[] getAuxv() {
-	return null;
+	return auxv;
     }
+    private final Auxv[] auxv = new Auxv[0];
     
     public int getUID() {
 	return 0;
     }
 
     public String[] getCmdLine() {
-	return null;
+	return argv;
     }
 
     public String getCommand() {
-	return this.host.exeFile.getName();
+	return exeFile.getName();
     }
 
     public String getExe() {
-	return host.exeFile.getAbsolutePath();
+	return exeFile.getAbsolutePath();
     }
 
     public int getGID() {
@@ -90,34 +85,6 @@ public class LinuxExeProc extends DeadProc {
     }
     
     public MemoryMap[] getMaps() {
-	return (MemoryMap[]) metaData.toArray(new MemoryMap[metaData.size()]);
-    }
-
-    ByteBuffer getMemory() {
-	if (memory == null)
-	    memory = new ExeByteBuffer(metaData);
-	return memory;
+	return memoryMaps;
     }
-    private ByteBuffer memory;
-    
-    private void buildMetaData()
-    {
-	class BuildExeMaps extends SOLibMapBuilder
-
-	{
-	    public void buildMap(long addrLow, long addrHigh, boolean permRead,
-		    boolean permWrite, boolean permExecute, long offset,
-		    String name, long align) 
-	    {
-		metaData.add(new MemoryMap(addrLow, addrHigh, permRead,
-			permWrite, permExecute, false, offset, -1, -1, -1, -1, -1,
-			host.exeFile.getAbsolutePath()));
-	    }
-	}
-	
-	BuildExeMaps SOMaps = new BuildExeMaps();
-	// Add in case for executables maps.
-	SOMaps.construct(this.host.exeFile, 0);
-    }
-
 }
diff --git a/frysk-core/frysk/proc/dead/LinuxExeTask.java b/frysk-core/frysk/proc/dead/LinuxExeTask.java
index 4d90354..a762769 100644
--- a/frysk-core/frysk/proc/dead/LinuxExeTask.java
+++ b/frysk-core/frysk/proc/dead/LinuxExeTask.java
@@ -43,35 +43,20 @@ import inua.eio.ArrayByteBuffer;
 import inua.eio.ByteBuffer;
 import frysk.isa.banks.RegisterBanks;
 import frysk.isa.ISA;
-import lib.dwfl.Elf;
-import lib.dwfl.ElfCommand;
 import lib.dwfl.ElfEHeader;
-import lib.dwfl.ElfException;
-import java.io.File;
+import frysk.isa.ElfMap;
+import frysk.proc.MemoryMap;
 
 public class LinuxExeTask extends DeadTask {
     private final long pc;
-    private final LinuxExeProc proc;
+    private final ByteBuffer memory;
 
-    LinuxExeTask(LinuxExeProc proc, ISA isa) {
-	super(proc, 0, isa, constructRegisterBanks(isa));
-	this.proc = proc;
-	// Compute a Fake PC.  XXX should be done in Proc instead of


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


             reply	other threads:[~2008-02-25 17:17 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-02-25 17:17 cagney [this message]
  -- strict thread matches above, loose matches on Subject: below --
2008-06-06 19:31 swagiaal
2008-03-17 19:09 cagney
2008-03-03 23:09 cagney
2008-02-26 16:54 cagney
2008-01-08 21:41 cagney

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=20080225171719.25946.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).