diff options
author | Jan Mercl <0xjnml@gmail.com> | 2017-07-01 23:04:53 +0200 |
---|---|---|
committer | Jan Mercl <0xjnml@gmail.com> | 2017-07-01 23:04:53 +0200 |
commit | 5e8a085cfb2f6df373a2a68436b1c1acacba592b (patch) | |
tree | 6cd0e355f252b4e45331b7e476904c9b588ddce5 /internal/threadtest2 | |
parent | 8370d1a12ed5bbad6630675316ee3985d8372a7b (diff) |
Add a couple of tests. Build only on linux, do not pass.
modified: Makefile
modified: all_test.go
modified: generator.go
modified: internal/bin/bin_linux_386.go
modified: internal/bin/bin_linux_amd64.go
new file: internal/mptest/mptest_linux_386.go
new file: internal/mptest/mptest_linux_amd64.go
new file: internal/threadtest1/threadtest1_linux_386.go
new file: internal/threadtest1/threadtest1_linux_amd64.go
new file: internal/threadtest2/threadtest2_linux_386.go
new file: internal/threadtest2/threadtest2_linux_amd64.go
new file: internal/threadtest4/threadtest4_linux_386.go
new file: internal/threadtest4/threadtest4_linux_amd64.go
modified: main.c
new file: sqlite.h
new file: testdata/mptest/config01.test
new file: testdata/mptest/config02.test
new file: testdata/mptest/crash01.test
new file: testdata/mptest/crash02.subtest
new file: testdata/mptest/multiwrite01.test
Diffstat (limited to 'internal/threadtest2')
-rw-r--r-- | internal/threadtest2/threadtest2_linux_386.go | 181 | ||||
-rw-r--r-- | internal/threadtest2/threadtest2_linux_amd64.go | 181 |
2 files changed, 362 insertions, 0 deletions
diff --git a/internal/threadtest2/threadtest2_linux_386.go b/internal/threadtest2/threadtest2_linux_386.go new file mode 100644 index 0000000..c6f394c --- /dev/null +++ b/internal/threadtest2/threadtest2_linux_386.go @@ -0,0 +1,181 @@ +// Code generated by ccgo. DO NOT EDIT. + +// threadtest2.c + +// 2004 January 13 +// +// The author disclaims copyright to this source code. In place of +// a legal notice, here is a blessing: +// +// May you do good and not evil. +// May you find forgiveness for yourself and forgive others. +// May you share freely, never taking more than you give. +// +// ************************************************************************* +// This file implements a simple standalone program used to test whether +// or not the SQLite library is threadsafe. +// +// This file is NOT part of the standard SQLite library. It is used for +// testing only. + +package main + +import ( + "math" + "os" + "unsafe" + + "github.com/cznic/crt" + "github.com/cznic/sqlite/internal/bin" +) + +var argv []*int8 + +func main() { + for _, v := range os.Args { + argv = append(argv, (*int8)(crt.CString(v))) + } + argv = append(argv, nil) + X_start(crt.NewTLS(), int32(len(os.Args)), &argv[0]) +} + +func X_start(tls *crt.TLS, _argc int32, _argv **int8) { + crt.X__register_stdfiles(tls, Xstdin, Xstdout, Xstderr) + crt.X__builtin_exit(tls, Xmain(tls, _argc, _argv)) +} + +var Xstdin unsafe.Pointer + +func init() { + Xstdin = unsafe.Pointer(&X__stdfiles) +} + +var X__stdfiles [3]unsafe.Pointer + +var Xstdout unsafe.Pointer + +func init() { + Xstdout = (unsafe.Pointer)(uintptr(unsafe.Pointer(&X__stdfiles)) + 4) +} + +var Xstderr unsafe.Pointer + +func init() { + Xstderr = (unsafe.Pointer)(uintptr(unsafe.Pointer(&X__stdfiles)) + 8) +} + +// Initialize the database and start the threads +func Xmain(tls *crt.TLS, _argc int32, _argv **int8) (r0 int32) { + var _i, _rc int32 + var _1_zJournal *int8 + var _db unsafe.Pointer + var _aThread [5]uint32 + r0 = i32(0) + if crt.Xstrcmp(tls, str(0), str(8)) != 0 { + _1_zJournal = bin.Xsqlite3_mprintf(tls, str(17), unsafe.Pointer(str(0))) + crt.Xunlink(tls, str(0)) + crt.Xunlink(tls, _1_zJournal) + bin.Xsqlite3_free(tls, (unsafe.Pointer)(_1_zJournal)) + } + bin.Xsqlite3_open(tls, str(0), (**bin.Xsqlite3)(unsafe.Pointer(&_db))) + if _db == nil { + crt.Xfprintf(tls, (*crt.XFILE)(Xstderr), str(28)) + crt.Xexit(tls, i32(1)) + } + _rc = bin.Xsqlite3_exec(tls, (*bin.Xsqlite3)(_db), str(59), nil, nil, nil) + if _rc != 0 { + crt.Xfprintf(tls, (*crt.XFILE)(Xstderr), str(79), _rc) + crt.Xexit(tls, i32(1)) + } + bin.Xsqlite3_close(tls, (*bin.Xsqlite3)(_db)) + _i = i32(0) +_3: + if uint32(_i) >= u32(5) { + goto _6 + } + crt.Xpthread_create(tls, (*uint32)(unsafe.Pointer(uintptr((unsafe.Pointer)(&_aThread))+4*uintptr(_i))), nil, Xworker, (unsafe.Pointer)(uintptr(_i))) + _i += 1 + goto _3 +_6: + _i = i32(0) +_7: + if uint32(_i) >= u32(5) { + goto _10 + } + crt.Xpthread_join(tls, *(*uint32)(unsafe.Pointer(uintptr((unsafe.Pointer)(&_aThread)) + 4*uintptr(_i))), nil) + _i += 1 + goto _7 +_10: + if Xall_stop == 0 { + crt.Xprintf(tls, str(107)) + return i32(0) + } + crt.Xprintf(tls, str(129)) + return i32(1) + + _ = _aThread + panic(0) +} + +// This is the worker thread +func Xworker(tls *crt.TLS, _workerArg unsafe.Pointer) (r0 unsafe.Pointer) { + var _id, _rc, _cnt int32 + var _db unsafe.Pointer + _id = int32(uintptr(_workerArg)) + _cnt = i32(0) + crt.Xfprintf(tls, (*crt.XFILE)(Xstderr), str(147), _id) +_0: + if Xall_stop != 0 || postInc0(&_cnt, int32(1)) >= i32(10000) { + goto _1 + } + if (_cnt % i32(100)) == i32(0) { + crt.Xprintf(tls, str(167), _id, _cnt) + } +_4: + if bin.Xsqlite3_open(tls, str(0), (**bin.Xsqlite3)(unsafe.Pointer(&_db))) != i32(0) { + crt.Xsched_yield(tls) + goto _4 + } + bin.Xsqlite3_exec(tls, (*bin.Xsqlite3)(_db), str(175), nil, nil, nil) + if Xall_stop != 0 { + bin.Xsqlite3_close(tls, (*bin.Xsqlite3)(_db)) + goto _1 + } + _rc = bin.Xsqlite3_exec(tls, (*bin.Xsqlite3)(_db), str(198), nil, nil, nil) + bin.Xsqlite3_close(tls, (*bin.Xsqlite3)(_db)) + goto _0 +_1: + crt.Xfprintf(tls, (*crt.XFILE)(Xstderr), str(234), _id) + return nil + + _ = _rc + panic(0) +} + +var Xall_stop int32 + +func bool2int(b bool) int32 { + if b { + return 1 + } + return 0 +} +func bug20530(interface{}) {} //TODO remove when https://github.com/golang/go/issues/20530 is fixed. +func i16(n int16) int16 { return n } +func i32(n int32) int32 { return n } +func i64(n int64) int64 { return n } +func i8(n int8) int8 { return n } +func init() { nzf32 *= -1; nzf64 *= -1 } +func u16(n uint16) uint16 { return n } +func u32(n uint32) uint32 { return n } +func u64(n uint64) uint64 { return n } +func u8(n byte) byte { return n } + +var inf = math.Inf(1) +var nzf32 float32 // -0.0 +var nzf64 float64 // -0.0 +func postInc0(p *int32, d int32) int32 { v := *p; *p += d; return v } +func str(n int) *int8 { return (*int8)(unsafe.Pointer(&strTab[n])) } +func wstr(n int) *int32 { return (*int32)(unsafe.Pointer(&strTab[n])) } + +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") diff --git a/internal/threadtest2/threadtest2_linux_amd64.go b/internal/threadtest2/threadtest2_linux_amd64.go new file mode 100644 index 0000000..aba5c8d --- /dev/null +++ b/internal/threadtest2/threadtest2_linux_amd64.go @@ -0,0 +1,181 @@ +// Code generated by ccgo. DO NOT EDIT. + +// threadtest2.c + +// 2004 January 13 +// +// The author disclaims copyright to this source code. In place of +// a legal notice, here is a blessing: +// +// May you do good and not evil. +// May you find forgiveness for yourself and forgive others. +// May you share freely, never taking more than you give. +// +// ************************************************************************* +// This file implements a simple standalone program used to test whether +// or not the SQLite library is threadsafe. +// +// This file is NOT part of the standard SQLite library. It is used for +// testing only. + +package main + +import ( + "math" + "os" + "unsafe" + + "github.com/cznic/crt" + "github.com/cznic/sqlite/internal/bin" +) + +var argv []*int8 + +func main() { + for _, v := range os.Args { + argv = append(argv, (*int8)(crt.CString(v))) + } + argv = append(argv, nil) + X_start(crt.NewTLS(), int32(len(os.Args)), &argv[0]) +} + +func X_start(tls *crt.TLS, _argc int32, _argv **int8) { + crt.X__register_stdfiles(tls, Xstdin, Xstdout, Xstderr) + crt.X__builtin_exit(tls, Xmain(tls, _argc, _argv)) +} + +var Xstdin unsafe.Pointer + +func init() { + Xstdin = unsafe.Pointer(&X__stdfiles) +} + +var X__stdfiles [3]unsafe.Pointer + +var Xstdout unsafe.Pointer + +func init() { + Xstdout = (unsafe.Pointer)(uintptr(unsafe.Pointer(&X__stdfiles)) + 8) +} + +var Xstderr unsafe.Pointer + +func init() { + Xstderr = (unsafe.Pointer)(uintptr(unsafe.Pointer(&X__stdfiles)) + 16) +} + +// Initialize the database and start the threads +func Xmain(tls *crt.TLS, _argc int32, _argv **int8) (r0 int32) { + var _i, _rc int32 + var _1_zJournal *int8 + var _db unsafe.Pointer + var _aThread [5]uint64 + r0 = i32(0) + if crt.Xstrcmp(tls, str(0), str(8)) != 0 { + _1_zJournal = bin.Xsqlite3_mprintf(tls, str(17), unsafe.Pointer(str(0))) + crt.Xunlink(tls, str(0)) + crt.Xunlink(tls, _1_zJournal) + bin.Xsqlite3_free(tls, (unsafe.Pointer)(_1_zJournal)) + } + bin.Xsqlite3_open(tls, str(0), (**bin.Xsqlite3)(unsafe.Pointer(&_db))) + if _db == nil { + crt.Xfprintf(tls, (*crt.XFILE)(Xstderr), str(28)) + crt.Xexit(tls, i32(1)) + } + _rc = bin.Xsqlite3_exec(tls, (*bin.Xsqlite3)(_db), str(59), nil, nil, nil) + if _rc != 0 { + crt.Xfprintf(tls, (*crt.XFILE)(Xstderr), str(79), _rc) + crt.Xexit(tls, i32(1)) + } + bin.Xsqlite3_close(tls, (*bin.Xsqlite3)(_db)) + _i = i32(0) +_3: + if uint64(_i) >= u64(5) { + goto _6 + } + crt.Xpthread_create(tls, (*uint64)(unsafe.Pointer(uintptr((unsafe.Pointer)(&_aThread))+8*uintptr(_i))), nil, Xworker, (unsafe.Pointer)(uintptr(_i))) + _i += 1 + goto _3 +_6: + _i = i32(0) +_7: + if uint64(_i) >= u64(5) { + goto _10 + } + crt.Xpthread_join(tls, *(*uint64)(unsafe.Pointer(uintptr((unsafe.Pointer)(&_aThread)) + 8*uintptr(_i))), nil) + _i += 1 + goto _7 +_10: + if Xall_stop == 0 { + crt.Xprintf(tls, str(107)) + return i32(0) + } + crt.Xprintf(tls, str(129)) + return i32(1) + + _ = _aThread + panic(0) +} + +// This is the worker thread +func Xworker(tls *crt.TLS, _workerArg unsafe.Pointer) (r0 unsafe.Pointer) { + var _id, _rc, _cnt int32 + var _db unsafe.Pointer + _id = int32(uintptr(_workerArg)) + _cnt = i32(0) + crt.Xfprintf(tls, (*crt.XFILE)(Xstderr), str(147), _id) +_0: + if Xall_stop != 0 || postInc0(&_cnt, int32(1)) >= i32(10000) { + goto _1 + } + if (_cnt % i32(100)) == i32(0) { + crt.Xprintf(tls, str(167), _id, _cnt) + } +_4: + if bin.Xsqlite3_open(tls, str(0), (**bin.Xsqlite3)(unsafe.Pointer(&_db))) != i32(0) { + crt.Xsched_yield(tls) + goto _4 + } + bin.Xsqlite3_exec(tls, (*bin.Xsqlite3)(_db), str(175), nil, nil, nil) + if Xall_stop != 0 { + bin.Xsqlite3_close(tls, (*bin.Xsqlite3)(_db)) + goto _1 + } + _rc = bin.Xsqlite3_exec(tls, (*bin.Xsqlite3)(_db), str(198), nil, nil, nil) + bin.Xsqlite3_close(tls, (*bin.Xsqlite3)(_db)) + goto _0 +_1: + crt.Xfprintf(tls, (*crt.XFILE)(Xstderr), str(234), _id) + return nil + + _ = _rc + panic(0) +} + +var Xall_stop int32 + +func bool2int(b bool) int32 { + if b { + return 1 + } + return 0 +} +func bug20530(interface{}) {} //TODO remove when https://github.com/golang/go/issues/20530 is fixed. +func i16(n int16) int16 { return n } +func i32(n int32) int32 { return n } +func i64(n int64) int64 { return n } +func i8(n int8) int8 { return n } +func init() { nzf32 *= -1; nzf64 *= -1 } +func u16(n uint16) uint16 { return n } +func u32(n uint32) uint32 { return n } +func u64(n uint64) uint64 { return n } +func u8(n byte) byte { return n } + +var inf = math.Inf(1) +var nzf32 float32 // -0.0 +var nzf64 float64 // -0.0 +func postInc0(p *int32, d int32) int32 { v := *p; *p += d; return v } +func str(n int) *int8 { return (*int8)(unsafe.Pointer(&strTab[n])) } +func wstr(n int) *int32 { return (*int32)(unsafe.Pointer(&strTab[n])) } + +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") |