gitlab.com/danp128/sqlite@v1.0.0/internal/threadtest1/threadtest1_linux_386.go (about) 1 // Code generated by ccgo. DO NOT EDIT. 2 3 // threadtest1 4 // /* 5 // ** 2002 January 15 6 // ** 7 // ** The author disclaims copyright to this source code. In place of 8 // ** a legal notice, here is a blessing: 9 // ** 10 // ** May you do good and not evil. 11 // ** May you find forgiveness for yourself and forgive others. 12 // ** May you share freely, never taking more than you give. 13 // ** 14 // ************************************************************************* 15 // ** This file implements a simple standalone program used to test whether 16 // ** or not the SQLite library is threadsafe. 17 // ** 18 // ** Testing the thread safety of SQLite is difficult because there are very 19 // ** few places in the code that are even potentially unsafe, and those 20 // ** places execute for very short periods of time. So even if the library 21 // ** is compiled with its mutexes disabled, it is likely to work correctly 22 // ** in a multi-threaded program most of the time. 23 // ** 24 // ** This file is NOT part of the standard SQLite library. It is used for 25 // ** testing only. 26 // */ 27 package main 28 29 import ( 30 "math" 31 "os" 32 "unsafe" 33 34 "modernc.org/ccgo/crt" 35 "modernc.org/sqlite/internal/bin" 36 ) 37 38 var argv []*int8 39 40 func main() { 41 for _, v := range os.Args { 42 argv = append(argv, (*int8)(crt.CString(v))) 43 } 44 argv = append(argv, nil) 45 X_start(crt.NewTLS(), int32(len(os.Args)), &argv[0]) 46 } 47 48 func X_start(tls *crt.TLS, _argc int32, _argv **int8) { 49 crt.X__register_stdfiles(tls, Xstdin, Xstdout, Xstderr) 50 crt.X__builtin_exit(tls, Xmain(tls, _argc, _argv)) 51 } 52 53 var Xstdin unsafe.Pointer 54 55 func init() { 56 Xstdin = unsafe.Pointer(&X__stdfiles) 57 } 58 59 var X__stdfiles [3]unsafe.Pointer 60 61 var Xstdout unsafe.Pointer 62 63 func init() { 64 Xstdout = unsafe.Pointer(uintptr(unsafe.Pointer(&X__stdfiles)) + 4) 65 } 66 67 var Xstderr unsafe.Pointer 68 69 func init() { 70 Xstderr = unsafe.Pointer(uintptr(unsafe.Pointer(&X__stdfiles)) + 8) 71 } 72 73 func Xmain(tls *crt.TLS, _argc int32, _argv **int8) (r0 int32) { 74 var _i, _n int32 75 var _id uint32 76 var _zFile, _4_zDb, _4_zJournal *int8 77 var _2_zBuf, _6_zBuf [200]int8 78 r0 = int32(0) 79 if (_argc > int32(2)) && (crt.Xstrcmp(tls, *elem0(_argv, uintptr(1)), str(0)) == int32(0)) { 80 _verbose = int32(1) 81 bug20530(_verbose) 82 _argc -= 1 83 *(*uintptr)(unsafe.Pointer(&_argv)) += uintptr(4) 84 } 85 if (_argc < int32(2)) || (store1(&_n, crt.Xatoi(tls, *elem0(_argv, uintptr(1)))) < int32(1)) { 86 _n = int32(10) 87 } 88 _i = int32(0) 89 _4: 90 if _i >= _n { 91 goto _7 92 } 93 crt.Xsprintf(tls, (*int8)(unsafe.Pointer(&_2_zBuf)), str(3), (_i+int32(1))/int32(2)) 94 crt.Xunlink(tls, (*int8)(unsafe.Pointer(&_2_zBuf))) 95 _i += 1 96 goto _4 97 _7: 98 _i = int32(0) 99 _8: 100 if _i >= _n { 101 goto _11 102 } 103 _zFile = bin.Xsqlite3_mprintf(tls, str(13), (_i%int32(2))+int32(1), (_i+int32(2))/int32(2)) 104 if (_i % int32(2)) == int32(0) { 105 _4_zDb = elem2(_zFile, uintptr(2)) 106 _4_zJournal = bin.Xsqlite3_mprintf(tls, str(26), unsafe.Pointer(_4_zDb)) 107 crt.Xunlink(tls, _4_zDb) 108 crt.Xunlink(tls, _4_zJournal) 109 crt.Xfree(tls, unsafe.Pointer(_4_zJournal)) 110 } 111 crt.Xpthread_create(tls, &_id, nil, _worker_bee, unsafe.Pointer(_zFile)) 112 crt.Xpthread_detach(tls, _id) 113 _i += 1 114 goto _8 115 _11: 116 crt.Xpthread_mutex_lock(tls, &Xlock) 117 _13: 118 if Xthread_cnt > int32(0) { 119 crt.Xpthread_cond_wait(tls, &Xsig, &Xlock) 120 goto _13 121 } 122 crt.Xpthread_mutex_unlock(tls, &Xlock) 123 _i = int32(0) 124 _15: 125 if _i >= _n { 126 goto _18 127 } 128 crt.Xsprintf(tls, (*int8)(unsafe.Pointer(&_6_zBuf)), str(3), (_i+int32(1))/int32(2)) 129 crt.Xunlink(tls, (*int8)(unsafe.Pointer(&_6_zBuf))) 130 _i += 1 131 goto _15 132 _18: 133 return int32(0) 134 135 _ = _2_zBuf 136 _ = _6_zBuf 137 panic(0) 138 } 139 140 // C comment 141 // /* 142 // ** Enable for tracing 143 // */ 144 var _verbose int32 145 146 func _worker_bee(tls *crt.TLS, _pArg unsafe.Pointer) (r0 unsafe.Pointer) { 147 var _i, _cnt, _t int32 148 var _zFilename, _azErr *int8 149 var _db unsafe.Pointer 150 var _az **int8 151 var _4_z1, _4_z2 [30]int8 152 _zFilename = (*int8)(_pArg) 153 _t = crt.Xatoi(tls, _zFilename) 154 crt.Xpthread_mutex_lock(tls, &Xlock) 155 Xthread_cnt += 1 156 crt.Xpthread_mutex_unlock(tls, &Xlock) 157 crt.Xprintf(tls, str(37), unsafe.Pointer(_zFilename)) 158 crt.Xfflush(tls, (*crt.XFILE)(Xstdout)) 159 _cnt = int32(0) 160 _0: 161 if _cnt >= int32(10) { 162 goto _3 163 } 164 bin.Xsqlite3_open(tls, elem2(_zFilename, uintptr(2)), (**bin.Xsqlite3)(unsafe.Pointer(&_db))) 165 if _db == nil { 166 crt.Xfprintf(tls, (*crt.XFILE)(Xstdout), str(48), unsafe.Pointer(_zFilename)) 167 _Exit(tls, int32(1)) 168 } 169 bin.Xsqlite3_busy_handler(tls, (*bin.Xsqlite3)(_db), _db_is_locked, unsafe.Pointer(_zFilename)) 170 Xdb_execute(tls, _db, _zFilename, str(64), _t) 171 _i = int32(1) 172 _5: 173 if _i > int32(100) { 174 goto _8 175 } 176 Xdb_execute(tls, _db, _zFilename, str(89), _t, _i, _i*int32(2), _i*_i) 177 _i += 1 178 goto _5 179 _8: 180 _az = Xdb_query(tls, _db, _zFilename, str(123), _t) 181 Xdb_check(tls, _zFilename, str(148), _az, unsafe.Pointer(str(156)), int32(0)) 182 _az = Xdb_query(tls, _db, _zFilename, str(160), _t) 183 Xdb_check(tls, _zFilename, str(183), _az, unsafe.Pointer(str(190)), int32(0)) 184 Xdb_execute(tls, _db, _zFilename, str(196), _t) 185 _az = Xdb_query(tls, _db, _zFilename, str(160), _t) 186 Xdb_check(tls, _zFilename, str(223), _az, unsafe.Pointer(str(231)), int32(0)) 187 _i = int32(1) 188 _9: 189 if _i > int32(50) { 190 goto _12 191 } 192 _az = Xdb_query(tls, _db, _zFilename, str(236), _t, _i) 193 crt.Xsprintf(tls, (*int8)(unsafe.Pointer(&_4_z1)), str(268), _i*int32(2)) 194 crt.Xsprintf(tls, (*int8)(unsafe.Pointer(&_4_z2)), str(268), _i*_i) 195 Xdb_check(tls, _zFilename, str(271), _az, unsafe.Pointer(&_4_z1), unsafe.Pointer(&_4_z2), int32(0)) 196 _i += 1 197 goto _9 198 _12: 199 Xdb_execute(tls, _db, _zFilename, str(280), _t) 200 bin.Xsqlite3_close(tls, (*bin.Xsqlite3)(_db)) 201 _cnt += 1 202 goto _0 203 _3: 204 crt.Xprintf(tls, str(296), unsafe.Pointer(_zFilename)) 205 crt.Xfflush(tls, (*crt.XFILE)(Xstdout)) 206 crt.Xpthread_mutex_lock(tls, &Xlock) 207 Xthread_cnt -= 1 208 if Xthread_cnt <= int32(0) { 209 crt.Xpthread_cond_signal(tls, &Xsig) 210 } 211 crt.Xpthread_mutex_unlock(tls, &Xlock) 212 return nil 213 214 _ = _azErr 215 _ = _4_z1 216 _ = _4_z2 217 panic(0) 218 } 219 220 var Xlock crt.Xpthread_mutex_t 221 222 var Xthread_cnt int32 223 224 // C comment 225 // /* 226 // ** Come here to die. 227 // */ 228 func _Exit(tls *crt.TLS, _rc int32) { 229 crt.Xexit(tls, _rc) 230 } 231 232 // C comment 233 // /* 234 // ** When a lock occurs, yield. 235 // */ 236 func _db_is_locked(tls *crt.TLS, _NotUsed unsafe.Pointer, _iCount int32) (r0 int32) { 237 if _verbose != 0 { 238 crt.Xprintf(tls, str(305), _NotUsed, _iCount) 239 } 240 crt.Xusleep(tls, uint32(100)) 241 return bool2int(_iCount < int32(40000)) 242 } 243 244 // C comment 245 // /* 246 // ** Execute an SQL statement. 247 // */ 248 func Xdb_execute(tls *crt.TLS, _db unsafe.Pointer, _zFile *int8, _zFormat *int8, args ...interface{}) { 249 var _rc int32 250 var _zSql, _zErrMsg *int8 251 var _ap []interface{} 252 _zErrMsg = nil 253 _ap = args 254 _zSql = bin.Xsqlite3_vmprintf(tls, _zFormat, _ap) 255 _ap = nil 256 if _verbose != 0 { 257 crt.Xprintf(tls, str(318), unsafe.Pointer(_zFile), unsafe.Pointer(_zSql)) 258 } 259 _0: 260 _rc = bin.Xsqlite3_exec(tls, (*bin.Xsqlite3)(_db), _zSql, nil, nil, &_zErrMsg) 261 if _rc == int32(5) { 262 goto _0 263 } 264 if _verbose != 0 { 265 crt.Xprintf(tls, str(331), unsafe.Pointer(_zFile), unsafe.Pointer(_zSql)) 266 } 267 if _zErrMsg != nil { 268 crt.Xfprintf(tls, (*crt.XFILE)(Xstdout), str(344), unsafe.Pointer(_zFile), unsafe.Pointer(_zSql), unsafe.Pointer(_zErrMsg)) 269 crt.Xfree(tls, unsafe.Pointer(_zErrMsg)) 270 bin.Xsqlite3_free(tls, unsafe.Pointer(_zSql)) 271 _Exit(tls, int32(1)) 272 } 273 bin.Xsqlite3_free(tls, unsafe.Pointer(_zSql)) 274 } 275 276 // C comment 277 // /* 278 // ** Execute a query against the database. NULL values are returned 279 // ** as an empty string. The list is terminated by a single NULL pointer. 280 // */ 281 func Xdb_query(tls *crt.TLS, _db unsafe.Pointer, _zFile *int8, _zFormat *int8, args ...interface{}) (r0 **int8) { 282 var _rc int32 283 var _zSql, _zErrMsg *int8 284 var _ap []interface{} 285 var _sResult TQueryResult 286 _zErrMsg = nil 287 _ap = args 288 _zSql = bin.Xsqlite3_vmprintf(tls, _zFormat, _ap) 289 _ap = nil 290 crt.Xmemset(tls, unsafe.Pointer(&_sResult), int32(0), uint32(16)) 291 _sResult.XzFile = _zFile 292 if _verbose != 0 { 293 crt.Xprintf(tls, str(373), unsafe.Pointer(_zFile), unsafe.Pointer(_zSql)) 294 } 295 _rc = bin.Xsqlite3_exec(tls, (*bin.Xsqlite3)(_db), _zSql, _db_query_callback, unsafe.Pointer(&_sResult), &_zErrMsg) 296 if _rc != int32(17) { 297 goto _1 298 } 299 if _zErrMsg != nil { 300 crt.Xfree(tls, unsafe.Pointer(_zErrMsg)) 301 } 302 _rc = bin.Xsqlite3_exec(tls, (*bin.Xsqlite3)(_db), _zSql, _db_query_callback, unsafe.Pointer(&_sResult), &_zErrMsg) 303 _1: 304 if _verbose != 0 { 305 crt.Xprintf(tls, str(387), unsafe.Pointer(_zFile), unsafe.Pointer(_zSql)) 306 } 307 if _zErrMsg != nil { 308 crt.Xfprintf(tls, (*crt.XFILE)(Xstdout), str(399), unsafe.Pointer(_zFile), unsafe.Pointer(_zSql), unsafe.Pointer(_zErrMsg)) 309 crt.Xfree(tls, unsafe.Pointer(_zErrMsg)) 310 crt.Xfree(tls, unsafe.Pointer(_zSql)) 311 _Exit(tls, int32(1)) 312 } 313 bin.Xsqlite3_free(tls, unsafe.Pointer(_zSql)) 314 if _sResult.XazElem == nil { 315 _db_query_callback(tls, unsafe.Pointer(&_sResult), int32(0), nil, nil) 316 } 317 *elem0(_sResult.XazElem, uintptr(_sResult.XnElem)) = nil 318 return _sResult.XazElem 319 } 320 321 // C comment 322 // /* 323 // ** The callback function for db_query 324 // */ 325 func _db_query_callback(tls *crt.TLS, _pUser unsafe.Pointer, _nArg int32, _azArg **int8, _NotUsed **int8) (r0 int32) { 326 var _i int32 327 var _pResult *TQueryResult 328 _pResult = (*TQueryResult)(_pUser) 329 if (_pResult.XnElem + _nArg) < _pResult.XnAlloc { 330 goto _0 331 } 332 if _pResult.XnAlloc == int32(0) { 333 _pResult.XnAlloc = _nArg + int32(1) 334 goto _2 335 } 336 _pResult.XnAlloc = ((_pResult.XnAlloc * int32(2)) + _nArg) + int32(1) 337 _2: 338 _pResult.XazElem = (**int8)(crt.Xrealloc(tls, unsafe.Pointer(_pResult.XazElem), uint32(_pResult.XnAlloc)*uint32(4))) 339 if _pResult.XazElem == nil { 340 crt.Xfprintf(tls, (*crt.XFILE)(Xstdout), str(426), unsafe.Pointer(_pResult.XzFile)) 341 return int32(1) 342 } 343 _0: 344 if _azArg == nil { 345 return int32(0) 346 } 347 _i = int32(0) 348 _5: 349 if _i >= _nArg { 350 goto _8 351 } 352 *elem0(_pResult.XazElem, uintptr(postInc1(&_pResult.XnElem, 1))) = bin.Xsqlite3_mprintf(tls, str(445), unsafe.Pointer(func() *int8 { 353 if (*elem0(_azArg, uintptr(_i))) != nil { 354 return (*elem0(_azArg, uintptr(_i))) 355 } 356 return str(448) 357 }())) 358 _i += 1 359 goto _5 360 _8: 361 return int32(0) 362 } 363 364 // C comment 365 // /* 366 // ** Check results 367 // */ 368 func Xdb_check(tls *crt.TLS, _zFile *int8, _zMsg *int8, _az **int8, args ...interface{}) { 369 var _i int32 370 var _z *int8 371 var _ap []interface{} 372 _ap = args 373 _i = int32(0) 374 _0: 375 if store2(&_z, (*int8)(crt.VAPointer(&_ap))) == nil { 376 goto _3 377 } 378 if ((*elem0(_az, uintptr(_i))) == nil) || (crt.Xstrcmp(tls, *elem0(_az, uintptr(_i)), _z) != int32(0)) { 379 crt.Xfprintf(tls, (*crt.XFILE)(Xstdout), str(449), unsafe.Pointer(_zFile), unsafe.Pointer(_zMsg), _i+int32(1), unsafe.Pointer(*elem0(_az, uintptr(_i)))) 380 Xdb_query_free(tls, _az) 381 _Exit(tls, int32(1)) 382 } 383 _i += 1 384 goto _0 385 _3: 386 _ap = nil 387 Xdb_query_free(tls, _az) 388 } 389 390 // C comment 391 // /* 392 // ** Free the results of a db_query() call. 393 // */ 394 func Xdb_query_free(tls *crt.TLS, _az **int8) { 395 var _i int32 396 _i = int32(0) 397 _0: 398 if (*elem0(_az, uintptr(_i))) == nil { 399 goto _3 400 } 401 bin.Xsqlite3_free(tls, unsafe.Pointer(*elem0(_az, uintptr(_i)))) 402 _i += 1 403 goto _0 404 _3: 405 crt.Xfree(tls, unsafe.Pointer(_az)) 406 } 407 408 var Xsig crt.Xpthread_cond_t 409 410 func bool2int(b bool) int32 { 411 if b { 412 return 1 413 } 414 return 0 415 } 416 func bug20530(interface{}) {} //TODO remove when https://github.com/golang/go/issues/20530 is fixed. 417 func init() { nzf32 *= -1; nzf64 *= -1 } 418 419 var inf = math.Inf(1) 420 var nzf32 float32 // -0.0 421 var nzf64 float64 // -0.0 422 func elem0(a **int8, index uintptr) **int8 { 423 return (**int8)(unsafe.Pointer(uintptr(unsafe.Pointer(a)) + 4*index)) 424 } 425 func elem2(a *int8, index uintptr) *int8 { 426 return (*int8)(unsafe.Pointer(uintptr(unsafe.Pointer(a)) + 1*index)) 427 } 428 func postInc1(p *int32, d int32) int32 { v := *p; *p += d; return v } 429 func store2(p **int8, v *int8) *int8 { *p = v; return v } 430 func store1(p *int32, v int32) int32 { *p = v; return v } 431 432 type TQueryResult struct { 433 XzFile *int8 434 XnElem int32 435 XnAlloc int32 436 XazElem **int8 437 } // t3 struct{zFile *int8,nElem int32,nAlloc int32,azElem **int8} 438 func str(n int) *int8 { return (*int8)(unsafe.Pointer(&strTab[n])) } 439 func wstr(n int) *int32 { return (*int32)(unsafe.Pointer(&strTab[n])) } 440 441 var strTab = []byte("-v\x00testdb-%d\x00%d.testdb-%d\x00%s-journal\x00%s: START\x0a\x00%s: can't open\x0a\x00CREATE TABLE t%d(a,b,c);\x00INSERT INTO t%d VALUES(%d,%d,%d);\x00SELECT count(*) FROM t%d\x00tX size\x00100\x00SELECT avg(b) FROM t%d\x00tX avg\x00101.0\x00DELETE FROM t%d WHERE a>50\x00tX avg2\x0051.0\x00SELECT b, c FROM t%d WHERE a=%d\x00%d\x00readback\x00DROP TABLE t%d;\x00%s: END\x0a\x00BUSY %s #%d\x0a\x00EXEC %s: %s\x0a\x00DONE %s: %s\x0a\x00%s: command failed: %s - %s\x0a\x00QUERY %s: %s\x0a\x00DONE %s %s\x0a\x00%s: query failed: %s - %s\x0a\x00%s: malloc failed\x0a\x00%s\x00\x00%s: %s: bad result in column %d: %s\x0a\x00")