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")