Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Plug memory leak in the sqlite3_close_interop function when a statement cannot be finalized. Have the vendor-specific initialization file for Eagle automatically set the TestPath of the interpreter. |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | tkt-e30b820248 |
Files: | files | file ages | folders |
SHA1: |
10d400ebd0602fad17cf8f3be39f1f2d |
User & Date: | mistachkin 2011-11-15 05:02:47.088 |
Context
2011-11-15
| ||
05:14 | Merge all diagnostic enhancements and fixes related to ticket [e30b820248] to trunk. check-in: c64aaed9f4 user: mistachkin tags: trunk | |
05:02 | Plug memory leak in the sqlite3_close_interop function when a statement cannot be finalized. Have the vendor-specific initialization file for Eagle automatically set the TestPath of the interpreter. Closed-Leaf check-in: 10d400ebd0 user: mistachkin tags: tkt-e30b820248 | |
04:01 | Add SQLiteSourceId property to the SQLiteConnection class to return the SQLite core library source identifier. Enhance and revising Trace output (in DEBUG only) to be more accurate and to report resource cleanup exceptions. More work on unit testing infrastructure and the test case for ticket [e30b820248]. The SQLite3 class should always attempt to dispose the contained SQLiteConnectionHandle, even when called via the finalizer. check-in: 1808779aa2 user: mistachkin tags: tkt-e30b820248 | |
Changes
Changes to Externals/Eagle/lib/Eagle1.0/vendor.eagle.
︙ | ︙ | |||
29 30 31 32 33 34 35 | # # NOTE: Use our own namespace here because even though we do not directly # support namespaces ourselves, we do not want to pollute the global # namespace if this script actually ends up being evaluated in Tcl. # namespace eval ::Eagle { if {[isEagle]} then { | > > | > > > | > > > > > > | > > | | > > > > > > > > | | | | | 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 | # # NOTE: Use our own namespace here because even though we do not directly # support namespaces ourselves, we do not want to pollute the global # namespace if this script actually ends up being evaluated in Tcl. # namespace eval ::Eagle { if {[isEagle]} then { proc checkForTestOverrides { channel varNames quiet } { set result 0 foreach varName $varNames { if {[uplevel 1 [list info exists $varName]]} then { incr result if {!$quiet} then { puts -nonewline $channel [appendArgs \ "Found vendor-specific test override \"" $varName "\".\n"] } } } return $result } proc addTestSuiteToAutoPath { channel varName quiet } { # # NOTE: Start with the directory containing this file. # set dir [file normalize [file dirname [info script]]] # # NOTE: Keep going until the directory name is empty OR is actually the # root of the associated volume. # while {[string length $dir] > 0 && \ [lsearch -exact -nocase -- [file volumes] $dir] == -1} { # # NOTE: Does this directory have the necessary sub-directory that # contains a package index file? # if {[file exists [file join $dir Tests]] && \ [file isdirectory [file join $dir Tests]] && \ [file exists [file join $dir Tests pkgIndex.eagle]] && \ [file isfile [file join $dir Tests pkgIndex.eagle]]} then { # # NOTE: If requested, give the caller access to the name of the # directory we just found. # if {[string length $varName] > 0} then { upvar 1 $varName dir2 } # # NOTE: Ok, show the directory we found. # set dir2 [file join $dir Tests] # # NOTE: We found the necessary directory to add to the auto-path; # However, we cannot simply add it to the auto-path directly # because the auto-path is dynamically constructed after this # script is evaluated; therefore, set the Eagle library path # environment variable and force the appropriate internal path # list to be refreshed. # if {![info exists ::env(EAGLELIBPATH)] || \ [lsearch -exact $::env(EAGLELIBPATH) $dir2] == -1} then { # # NOTE: If we have NOT been instructed to be quiet, report now. # if {!$quiet} then { puts -nonewline $channel [appendArgs \ "Found vendor-specific test package directory \"" $dir2 \ "\", adding...\n"] } # # NOTE: Append the directory to the necessary environment variable # so that it will get picked up when Eagle actually rebuilds # the auto-path list (below). # lappend ::env(EAGLELIBPATH) $dir2 # # NOTE: Force Eagle to rebuild the auto-path list for the current # interpreter right now. # object invoke Utility RefreshAutoPathList } |
︙ | ︙ | |||
117 118 119 120 121 122 123 | # # NOTE: Directory not found, return failure. # return false } | | < | < < < | | | | < < < < > > > > > > > > > > > | > > > > > > > > > | 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 | # # NOTE: Directory not found, return failure. # return false } proc setupInterpreterTestPath { channel dir quiet } { object invoke -flags +NonPublic Interpreter.GetActive TestPath $dir if {!$quiet} then { puts -nonewline $channel [appendArgs \ "Set interpreter test path to \"" $dir \".\n] } } checkForTestOverrides stdout \ [list binary_directory build_base_directory build_directory \ common_directory datetime_format test_configuration \ test_year] false # # NOTE: This variable will contain the name of the directory containing the # vendor-specific testing infrastructure. # set ::vendor_directory "" # # NOTE: This procedure will attempt to find the vendor-specific testing # infrastructure directory and add it to the auto-path for the # current interpreter. # addTestSuiteToAutoPath stdout ::vendor_directory false # # NOTE: If we actually found a vendor-specific testing infrastructure # directory then modify the TestPath property of the current # interpreter to point directly to it. # if {[string length $::vendor_directory] > 0} then { setupInterpreterTestPath stdout $::vendor_directory false } } } ############################################################################### ############################### END VENDOR CODE ############################### ############################################################################### |
Changes to SQLite.Interop/src/win/interop.c.
︙ | ︙ | |||
79 80 81 82 83 84 85 86 87 88 89 90 91 92 | db->pVdbe = p; ret = sqlite3_finalize((sqlite3_stmt *)p); // This will also free the copy's memory if (ret) { // finalize failed -- so we must put back anything we munged CopyMemory(po, p, sizeof(Vdbe)); db->pVdbe = po; break; } else { ZeroMemory(po, sizeof(Vdbe)); po->magic = VDBE_MAGIC_DEAD; } | > > > > > > | 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 | db->pVdbe = p; ret = sqlite3_finalize((sqlite3_stmt *)p); // This will also free the copy's memory if (ret) { // finalize failed -- so we must put back anything we munged CopyMemory(po, p, sizeof(Vdbe)); db->pVdbe = po; // // NOTE: Ok, we must free this block that *we* allocated (above) since // finalize did not do so. // sqlite3DbFree_interop(db, p); break; } else { ZeroMemory(po, sizeof(Vdbe)); po->magic = VDBE_MAGIC_DEAD; } |
︙ | ︙ |
Changes to Tests/tkt-e30b820248.eagle.
︙ | ︙ | |||
111 112 113 114 115 116 117 | } -constraints \ {eagle logFile monoBug28 command.sql compile.DATA SQLite System.Data.SQLite} \ -match regexp -result [appendArgs "^Ok\ System#CodeDom#Compiler#CompilerResults#\\d+ \\{\\} 0 \\{\\} " $memory_used \$]} ############################################################################### | | | 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 | } -constraints \ {eagle logFile monoBug28 command.sql compile.DATA SQLite System.Data.SQLite} \ -match regexp -result [appendArgs "^Ok\ System#CodeDom#Compiler#CompilerResults#\\d+ \\{\\} 0 \\{\\} " $memory_used \$]} ############################################################################### for {set i 2} {$i < 5} {incr i} { set memory_used [reportSQLiteResources $test_channel true] ############################################################################# runTest {test [appendArgs tkt-e30b820248-1. $i] {disposal ordering} -setup { set fileName [appendArgs tkt-e30b820248-1. $i .db] } -body { |
︙ | ︙ | |||
136 137 138 139 140 141 142 | INSERT INTO t1 (id1) VALUES (5); \ SELECT * FROM t1 ORDER BY id1; \ } unset -nocomplain results errors set code [compileCSharpWith [subst { | | | 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 | INSERT INTO t1 (id1) VALUES (5); \ SELECT * FROM t1 ORDER BY id1; \ } unset -nocomplain results errors set code [compileCSharpWith [subst { using System; using System.Data.SQLite; using System.Diagnostics; using System.IO; namespace _Dynamic${id} { public class Test${id} |
︙ | ︙ | |||
211 212 213 214 215 216 217 | { Trace.Listeners.Add(listener); Trace.WriteLine("---- START TRACE \\"${name}\\""); OpenConnection(); SQLiteDataReader dataReader = ExecuteReader("${sql}"); | | | > > > > > > | 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 | { Trace.Listeners.Add(listener); Trace.WriteLine("---- START TRACE \\"${name}\\""); OpenConnection(); SQLiteDataReader dataReader = ExecuteReader("${sql}"); [expr {$i <= 2 ? { GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect(); } : ""}] dataReader.Close(); [expr {$i <= 3 ? { GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect(); } : ""}] CloseConnection(); [expr {$i <= 4 ? { GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect(); } : ""}] Trace.WriteLine("---- END TRACE \\"${name}\\""); Trace.Listeners.Remove(listener); } } } } |
︙ | ︙ |