diff options
author | Andreas Rumpf <rumpf_a@web.de> | 2017-01-26 10:41:40 +0100 |
---|---|---|
committer | Andreas Rumpf <rumpf_a@web.de> | 2017-01-26 11:26:02 +0100 |
commit | 303c49b9f3bfe90b248fb414dc514b8e61d4ad0f (patch) | |
tree | 1c22c03c6f1b97ac91b410c3cf4f586f2aec012e /lib/system | |
parent | 5421ec8dae713a37dde2401a8681e2d1f3265b01 (diff) | |
download | Nim-303c49b9f3bfe90b248fb414dc514b8e61d4ad0f.tar.gz |
memory tracker is aware of threads (still not threadsafe though)
Diffstat (limited to 'lib/system')
-rw-r--r-- | lib/system/memtracker.nim | 37 |
1 files changed, 30 insertions, 7 deletions
diff --git a/lib/system/memtracker.nim b/lib/system/memtracker.nim index a9767bbca..f37b0c45a 100644 --- a/lib/system/memtracker.nim +++ b/lib/system/memtracker.nim @@ -28,23 +28,46 @@ type TrackLog* = object count*: int disabled: bool - data*: array[4000, LogEntry] - TrackLogger* = proc (log: TrackLog) {.nimcall, tags: [], locks: 0.} + data*: array[400, LogEntry] + TrackLogger* = proc (log: TrackLog) {.nimcall, tags: [], locks: 0, gcsafe.} var gLog*: TrackLog gLogger*: TrackLogger = proc (log: TrackLog) = discard + ilocs: array[4000, (int, int)] + ilocn: int + +proc trackLocation*(p: pointer; size: int) = + let x = (cast[int](p), size) + for i in 0..ilocn-1: + # already known? + if ilocs[i] == x: return + ilocs[ilocn] = x + inc ilocn proc setTrackLogger*(logger: TrackLogger) = gLogger = logger proc addEntry(entry: LogEntry) = if not gLog.disabled: - if gLog.count > high(gLog.data): - gLogger(gLog) - gLog.count = 0 - gLog.data[gLog.count] = entry - inc gLog.count + var interesting = false + for i in 0..ilocn-1: + let p = ilocs[i] + # X..Y and C..D overlap iff (X <= D and C <= Y) + let x = p[0] + let y = p[0]+p[1]-1 + let c = cast[int](entry.address) + let d = c + entry.size-1 + if x <= d and c <= y: + interesting = true + break + if interesting: + cprintf("interesting %s:%ld\n", entry.file, entry.line) + if gLog.count > high(gLog.data): + gLogger(gLog) + gLog.count = 0 + gLog.data[gLog.count] = entry + inc gLog.count proc memTrackerWrite(address: pointer; size: int; file: cstring; line: int) {.compilerProc.} = addEntry LogEntry(op: "write", address: address, |