diff options
author | Andreas Rumpf <rumpf_a@web.de> | 2016-11-22 08:24:39 +0100 |
---|---|---|
committer | Andreas Rumpf <rumpf_a@web.de> | 2016-11-22 08:40:57 +0100 |
commit | 439f43fc52c62d6d2c980645f76c30b1d2cb573d (patch) | |
tree | a6b83ab3347eaae397f88be920135490ea33b8c8 /lib/pure/nimtracker.nim | |
parent | 9a4f2225ce9901191f35fbf49fdbf6a0fea793c9 (diff) | |
download | Nim-439f43fc52c62d6d2c980645f76c30b1d2cb573d.tar.gz |
better memory tracking
Diffstat (limited to 'lib/pure/nimtracker.nim')
-rw-r--r-- | lib/pure/nimtracker.nim | 117 |
1 files changed, 62 insertions, 55 deletions
diff --git a/lib/pure/nimtracker.nim b/lib/pure/nimtracker.nim index e3d9832c6..b5072419f 100644 --- a/lib/pure/nimtracker.nim +++ b/lib/pure/nimtracker.nim @@ -9,63 +9,70 @@ ## Memory tracking support for Nim. -when isMainModule: - import db_sqlite - var db = open("memtrack.db", "", "", "") - db.exec sql""" - create table if not exists Tracking( - id integer primary key, - op varchar not null, - address integer not null, - size integer not null, - file varchar not null, - line integer not null - )""" - db.close() -else: - when not defined(memTracker): - {.error: "Memory tracking support is turned off!".} +when not defined(memTracker): + {.error: "Memory tracking support is turned off!".} - {.push memtracker: off.} - # we import the low level wrapper and are careful not to use Nim's - # memory manager for anything here. - import sqlite3 +{.push memtracker: off.} +# we import the low level wrapper and are careful not to use Nim's +# memory manager for anything here. +import sqlite3 - var - dbHandle: PSqlite3 - insertStmt: Pstmt +var + dbHandle: PSqlite3 + insertStmt: Pstmt - template sbind(x: int; value) = - when value is cstring: - let ret = insertStmt.bindText(x, value, value.len.int32, SQLITE_TRANSIENT) - if ret != SQLITE_OK: - quit "could not bind value" - else: - let ret = insertStmt.bindInt64(x, value) - if ret != SQLITE_OK: - quit "could not bind value" +template sbind(x: int; value) = + when value is cstring: + let ret = insertStmt.bindText(x, value, value.len.int32, SQLITE_TRANSIENT) + if ret != SQLITE_OK: + quit "could not bind value" + else: + let ret = insertStmt.bindInt64(x, value) + if ret != SQLITE_OK: + quit "could not bind value" - proc logEntries(log: TrackLog) {.nimcall.} = - for i in 0..log.count-1: - var success = false - let e = log.data[i] - discard sqlite3.reset(insertStmt) - discard clearBindings(insertStmt) - sbind 1, e.op - sbind(2, cast[int](e.address)) - sbind 3, e.size - sbind 4, e.file - sbind 5, e.line - if step(insertStmt) == SQLITE_DONE: - success = true - if not success: - quit "could not write to database!" +proc logEntries(log: TrackLog) {.nimcall.} = + for i in 0..log.count-1: + var success = false + let e = log.data[i] + discard sqlite3.reset(insertStmt) + discard clearBindings(insertStmt) + sbind 1, e.op + sbind(2, cast[int](e.address)) + sbind 3, e.size + sbind 4, e.file + sbind 5, e.line + if step(insertStmt) == SQLITE_DONE: + success = true + if not success: + quit "could not write to database!" - if sqlite3.open("memtrack.db", dbHandle) == SQLITE_OK: - const query = "INSERT INTO tracking(op, address, size, file, line) values (?, ?, ?, ?, ?)" - if prepare_v2(dbHandle, query, - query.len, insertStmt, nil) == SQLITE_OK: - setTrackLogger logEntries - else: - quit "could not prepare statement" - {.pop.} +proc execQuery(q: string) = + var s: Pstmt + if prepare_v2(dbHandle, q, q.len.int32, s, nil) == SQLITE_OK: + discard step(s) + if finalize(s) != SQLITE_OK: + quit "could not finalize " & $sqlite3.errmsg(dbHandle) + else: + quit "could not prepare statement " & $sqlite3.errmsg(dbHandle) + +proc setupDb() = + execQuery """create table if not exists tracking( + id integer primary key, + op varchar not null, + address integer not null, + size integer not null, + file varchar not null, + line integer not null + )""" + execQuery "delete from tracking" + +if sqlite3.open("memtrack.db", dbHandle) == SQLITE_OK: + setupDb() + const query = "INSERT INTO tracking(op, address, size, file, line) values (?, ?, ?, ?, ?)" + if prepare_v2(dbHandle, query, + query.len, insertStmt, nil) == SQLITE_OK: + setTrackLogger logEntries + else: + quit "could not prepare statement B " & $sqlite3.errmsg(dbHandle) +{.pop.} |