1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-06-05 08:46:02 +02:00

implement returning the linenumber of an offset.

This commit is contained in:
Alain Magloire 2003-11-20 17:06:42 +00:00
parent e118256c06
commit 40ff5c09ea
2 changed files with 79 additions and 9 deletions

View file

@ -19,6 +19,8 @@ import org.eclipse.core.runtime.IPath;
public class Symbol implements ISymbol {
BinaryObject binary;
Addr2line addr2line;
long timestamp;
public IPath filename;
public int startLine;
@ -79,10 +81,9 @@ public class Symbol implements ISymbol {
public int getLineNumber(long offset) {
int line = -1;
try {
Addr2line addr2line = binary.getAddr2Line();
if (addr2line != null) {
line = addr2line.getLineNumber(addr + offset);
addr2line.dispose();
Addr2line addressToLine = startAddr2Line();
if (addressToLine != null) {
line = addressToLine.getLineNumber(addr + offset);
}
} catch (IOException e) {
}
@ -107,4 +108,37 @@ public class Symbol implements ISymbol {
return (thisVal < anotherVal ? -1 : (thisVal == anotherVal ? 0 : 1));
}
synchronized Addr2line startAddr2Line () {
if (addr2line == null) {
addr2line = binary.getAddr2Line();
if (addr2line != null) {
timestamp = System.currentTimeMillis();
Runnable worker = new Runnable () {
public void run() {
long diff = System.currentTimeMillis() - timestamp;
while (diff < 10000) {
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
break;
}
diff = System.currentTimeMillis() - timestamp;
}
stopAddr2Line();
}
};
new Thread(worker, "Addr2line Reaper").start();
}
} else {
timestamp = System.currentTimeMillis();
}
return addr2line;
}
synchronized void stopAddr2Line() {
if (addr2line != null) {
addr2line.dispose();
}
addr2line = null;
}
}

View file

@ -19,6 +19,8 @@ import org.eclipse.core.runtime.IPath;
public class Symbol implements ISymbol, Comparable {
BinaryObject binary;
long timestamp;
Addr2line addr2line;
public IPath filename;
public int startLine;
@ -78,12 +80,11 @@ public class Symbol implements ISymbol, Comparable {
public int getLineNumber(long offset) {
int line = -1;
try {
Addr2line addr2line = binary.getAddr2Line();
if (addr2line != null) {
line = addr2line.getLineNumber(addr + offset);
addr2line.dispose();
Addr2line addressToLine = startAddr2Line();
if (addressToLine != null) {
line = addressToLine.getLineNumber(addr + offset);
}
} catch (IOException e) {
} catch (IOException e) {
}
return line;
}
@ -102,4 +103,39 @@ public class Symbol implements ISymbol, Comparable {
}
return (thisVal < anotherVal ? -1 : (thisVal == anotherVal ? 0 : 1));
}
synchronized Addr2line startAddr2Line () {
if (addr2line == null) {
addr2line = binary.getAddr2Line();
if (addr2line != null) {
timestamp = System.currentTimeMillis();
Runnable worker = new Runnable () {
public void run() {
long diff = System.currentTimeMillis() - timestamp;
while (diff < 10000) {
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
break;
}
diff = System.currentTimeMillis() - timestamp;
}
stopAddr2Line();
}
};
new Thread(worker, "Addr2line Reaper").start();
}
} else {
timestamp = System.currentTimeMillis();
}
return addr2line;
}
synchronized void stopAddr2Line() {
if (addr2line != null) {
addr2line.dispose();
}
addr2line = null;
}
}