1- import std/ [tables, random, os, times, strformat]
1+ import std/ [unittest, tables, random, os, times, strformat]
22
33import easy_sqlite3
44import easy_sqlite3/ memfs
@@ -37,53 +37,56 @@ proc connectDatabase(): Database =
3737 else :
3838 initDatabase (" file:memdb1?mode=memory&cache=shared" , {so_readwrite, so_create, so_uri})
3939
40+ test " threads" :
41+ if defined (macosx):
42+ skip ()
43+ else :
44+ var gdb = connectDatabase ()
45+ gdb.create_table ()
46+ gdb.exec " VACUUM"
4047
41- var gdb = connectDatabase ()
42- gdb.create_table ()
43- gdb.exec " VACUUM"
44-
45- const COUNT = 1000000
46- const GROUP = 100
48+ const COUNT = 1000000
49+ const GROUP = 100
4750
48- proc worker_fn () {.thread .} =
49- echo " thread start"
50- var tdb = connectDatabase ()
51- var r = initRand (42 )
52- for _ in 0 ..< (COUNT div GROUP ):
53- retry:
54- tdb.transactionImmediate:
55- for _ in 0 ..< GROUP :
56- let val = r.rand (1048576 )
57- # increase the chance of collision
58- if val < 1024 :
59- sleep (1 )
60- tdb.insert_data (val)
51+ proc worker_fn () {.thread .} =
52+ echo " thread start"
53+ var tdb = connectDatabase ()
54+ var r = initRand (42 )
55+ for _ in 0 ..< (COUNT div GROUP ):
6156 retry:
62- commit ()
57+ tdb.transactionImmediate:
58+ for _ in 0 ..< GROUP :
59+ let val = r.rand (1048576 )
60+ # increase the chance of collision
61+ if val < 1024 :
62+ sleep (1 )
63+ tdb.insert_data (val)
64+ retry:
65+ commit ()
6366
64- var worker: Thread [void ]
65- createThread (worker, worker_fn)
67+ var worker: Thread [void ]
68+ createThread (worker, worker_fn)
69+
70+ let init = cpuTime ()
71+ var prev = init
72+ while true :
73+ var c: int
74+ retry:
75+ c = gdb.count_items ().count
76+ let curr = cpuTime ()
77+ let diff = curr - prev - 0.2
78+ if diff > 0 :
79+ when useMemFs:
80+ echo fmt" { curr - init:>6.1f } s: { c:>7 } "
81+ else :
82+ echo fmt" { curr - init:>6.1f } s: { c:>7 } failures: { failedCount} "
83+ prev = curr - diff
84+ if c == COUNT :
85+ break
6686
67- let init = cpuTime ()
68- var prev = init
69- while true :
70- var c: int
71- retry:
72- c = gdb.count_items ().count
73- let curr = cpuTime ()
74- let diff = curr - prev - 0.2
75- if diff > 0 :
7687 when useMemFs:
77- echo fmt" { curr - init:>6.1f } s: { c :>7 } "
88+ echo fmt" time: { cpuTime () - init:>9.4f } s "
7889 else :
79- echo fmt" { curr - init:>6.1f } s: { c:>7 } failures: { failedCount} "
80- prev = curr - diff
81- if c == COUNT :
82- break
83-
84- when useMemFs:
85- echo fmt" time: { cpuTime () - init:>9.4f } s "
86- else :
87- echo fmt" time: { cpuTime () - init:>9.4f } s failures: { failedCount} "
90+ echo fmt" time: { cpuTime () - init:>9.4f } s failures: { failedCount} "
8891
89- worker.joinThread ()
92+ worker.joinThread ()
0 commit comments