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