gitlab.com/danp128/sqlite@v1.0.0/internal/threadtest2/threadtest2_linux_386.go (about) 1 modernc.orgd by ccgo. DO NOT EDIT. 2 3 // threadtest2 4 // /* 5 // ** 2004 January 13 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 // ** This file is NOT part of the standard SQLite library. It is used for 19 // ** testing only. 20 // */ 21 package main 22 23 import ( 24 "math" 25 "os" 26 "unsafe" 27 28 "modernc.org/ccgo/crt" 29 "modernc.org/sqlite/internal/bin" 30 ) 31 32 var argv []*int8 33 34 func main() { 35 for _, v := range os.Args { 36 argv = append(argv, (*int8)(crt.CString(v))) 37 } 38 argv = append(argv, nil) 39 X_start(crt.NewTLS(), int32(len(os.Args)), &argv[0]) 40 } 41 42 func X_start(tls *crt.TLS, _argc int32, _argv **int8) { 43 crt.X__register_stdfiles(tls, Xstdin, Xstdout, Xstderr) 44 crt.X__builtin_exit(tls, Xmain(tls, _argc, _argv)) 45 } 46 47 var Xstdin unsafe.Pointer 48 49 func init() { 50 Xstdin = unsafe.Pointer(&X__stdfiles) 51 } 52 53 var X__stdfiles [3]unsafe.Pointer 54 55 var Xstdout unsafe.Pointer 56 57 func init() { 58 Xstdout = unsafe.Pointer(uintptr(unsafe.Pointer(&X__stdfiles)) + 4) 59 } 60 61 var Xstderr unsafe.Pointer 62 63 func init() { 64 Xstderr = unsafe.Pointer(uintptr(unsafe.Pointer(&X__stdfiles)) + 8) 65 } 66 67 // C comment 68 // /* 69 // ** Initialize the database and start the threads 70 // */ 71 func Xmain(tls *crt.TLS, _argc int32, _argv **int8) (r0 int32) { 72 var _i, _rc int32 73 var _1_zJournal *int8 74 var _db unsafe.Pointer 75 var _aThread [5]uint32 76 r0 = int32(0) 77 if crt.Xstrcmp(tls, str(0), str(8)) != 0 { 78 _1_zJournal = bin.Xsqlite3_mprintf(tls, str(17), unsafe.Pointer(str(0))) 79 crt.Xunlink(tls, str(0)) 80 crt.Xunlink(tls, _1_zJournal) 81 bin.Xsqlite3_free(tls, unsafe.Pointer(_1_zJournal)) 82 } 83 bin.Xsqlite3_open(tls, str(0), (**bin.Xsqlite3)(unsafe.Pointer(&_db))) 84 if _db == nil { 85 crt.Xfprintf(tls, (*crt.XFILE)(Xstderr), str(28)) 86 crt.Xexit(tls, int32(1)) 87 } 88 _rc = bin.Xsqlite3_exec(tls, (*bin.Xsqlite3)(_db), str(59), nil, nil, nil) 89 if _rc != 0 { 90 crt.Xfprintf(tls, (*crt.XFILE)(Xstderr), str(79), _rc) 91 crt.Xexit(tls, int32(1)) 92 } 93 bin.Xsqlite3_close(tls, (*bin.Xsqlite3)(_db)) 94 _i = int32(0) 95 _3: 96 if uint32(_i) >= uint32(5) { 97 goto _6 98 } 99 crt.Xpthread_create(tls, elem0((*uint32)(unsafe.Pointer(&_aThread)), uintptr(_i)), nil, Xworker, crt.U2P(uintptr(_i))) 100 _i += 1 101 goto _3 102 _6: 103 _i = int32(0) 104 _7: 105 if uint32(_i) >= uint32(5) { 106 goto _10 107 } 108 crt.Xpthread_join(tls, *elem0((*uint32)(unsafe.Pointer(&_aThread)), uintptr(_i)), nil) 109 _i += 1 110 goto _7 111 _10: 112 if Xall_stop == 0 { 113 crt.Xprintf(tls, str(107)) 114 return int32(0) 115 } 116 crt.Xprintf(tls, str(129)) 117 return int32(1) 118 119 _ = _aThread 120 panic(0) 121 } 122 123 // C comment 124 // /* 125 // ** This is the worker thread 126 // */ 127 func Xworker(tls *crt.TLS, _workerArg unsafe.Pointer) (r0 unsafe.Pointer) { 128 var _id, _rc, _cnt int32 129 var _db unsafe.Pointer 130 _id = int32(crt.P2U(_workerArg)) 131 _cnt = int32(0) 132 crt.Xfprintf(tls, (*crt.XFILE)(Xstderr), str(147), _id) 133 _0: 134 if Xall_stop != 0 || postInc1(&_cnt, 1) >= int32(10000) { 135 goto _1 136 } 137 if (_cnt % int32(100)) == int32(0) { 138 crt.Xprintf(tls, str(167), _id, _cnt) 139 } 140 _3: 141 if bin.Xsqlite3_open(tls, str(0), (**bin.Xsqlite3)(unsafe.Pointer(&_db))) != int32(0) { 142 crt.Xsched_yield(tls) 143 goto _3 144 } 145 bin.Xsqlite3_exec(tls, (*bin.Xsqlite3)(_db), str(175), nil, nil, nil) 146 if Xall_stop != 0 { 147 bin.Xsqlite3_close(tls, (*bin.Xsqlite3)(_db)) 148 goto _1 149 } 150 _rc = bin.Xsqlite3_exec(tls, (*bin.Xsqlite3)(_db), str(198), nil, nil, nil) 151 bin.Xsqlite3_close(tls, (*bin.Xsqlite3)(_db)) 152 goto _0 153 _1: 154 crt.Xfprintf(tls, (*crt.XFILE)(Xstderr), str(234), _id) 155 return nil 156 157 _ = _rc 158 panic(0) 159 } 160 161 // C comment 162 // /* 163 // ** When this variable becomes non-zero, all threads stop 164 // ** what they are doing. 165 // */ 166 var Xall_stop int32 167 168 func bool2int(b bool) int32 { 169 if b { 170 return 1 171 } 172 return 0 173 } 174 func bug20530(interface{}) {} //TODO remove when https://github.com/golang/go/issues/20530 is fixed. 175 func init() { nzf32 *= -1; nzf64 *= -1 } 176 177 var inf = math.Inf(1) 178 var nzf32 float32 // -0.0 179 var nzf64 float64 // -0.0 180 func elem0(a *uint32, index uintptr) *uint32 { 181 return (*uint32)(unsafe.Pointer(uintptr(unsafe.Pointer(a)) + 4*index)) 182 } 183 func postInc1(p *int32, d int32) int32 { v := *p; *p += d; return v } 184 func str(n int) *int8 { return (*int8)(unsafe.Pointer(&strTab[n])) } 185 func wstr(n int) *int32 { return (*int32)(unsafe.Pointer(&strTab[n])) } 186 187 var strTab = []byte("test.db\x00:memory:\x00%s-journal\x00unable to initialize database\x0a\x00CREATE TABLE t1(x);\x00cannot create table t1: %d\x0a\x00Everything seems ok.\x0a\x00We hit an error.\x0a\x00Starting worker %d\x0a\x00%d: %d\x0a\x00PRAGMA synchronous=OFF\x00INSERT INTO t1 VALUES('bogus data')\x00Worker %d finished\x0a\x00")