aboutsummaryrefslogtreecommitdiff
path: root/unit_tests/scripts/lane/tasking_cancelling.lua
diff options
context:
space:
mode:
Diffstat (limited to 'unit_tests/scripts/lane/tasking_cancelling.lua')
-rw-r--r--unit_tests/scripts/lane/tasking_cancelling.lua89
1 files changed, 22 insertions, 67 deletions
diff --git a/unit_tests/scripts/lane/tasking_cancelling.lua b/unit_tests/scripts/lane/tasking_cancelling.lua
index 85600ab..8bee3a6 100644
--- a/unit_tests/scripts/lane/tasking_cancelling.lua
+++ b/unit_tests/scripts/lane/tasking_cancelling.lua
@@ -15,69 +15,12 @@ local lanes_linda = assert(lanes.linda)
15-- ################################################################################################## 15-- ##################################################################################################
16-- ################################################################################################## 16-- ##################################################################################################
17 17
18local function task(a, b, c)
19 lane_threadname("task("..a..","..b..","..c..")")
20 --error "111" -- testing error messages
21 assert(hey)
22 local v=0
23 for i=a,b,c do
24 v= v+i
25 end
26 return v, hey
27end
28
29local gc_cb = function(name_, status_)
30 PRINT(" ---> lane '" .. name_ .. "' collected with status '" .. status_ .. "'")
31end
32
33-- ##################################################################################################
34-- ##################################################################################################
35-- ##################################################################################################
36
37PRINT("\n\n", "---=== Tasking (cancelling) ===---", "\n\n")
38
39local task_launch2 = lanes_gen("", { name = 'auto', globals={hey=true}, gc_cb = gc_cb }, task)
40
41local N=999999999
42local lane9= task_launch2(1,N,1) -- huuuuuuge...
43
44-- Wait until state changes "pending"->"running"
45--
46local st
47local t0= os.time()
48while os.time()-t0 < 5 do
49 st= lane9.status
50 io.stderr:write((i==1) and st.." " or '.')
51 if st~="pending" then break end
52end
53PRINT(" "..st)
54
55if st=="error" then
56 local _= lane9[0] -- propagate the error here
57end
58if st=="done" then
59 error("Looping to "..N.." was not long enough (cannot test cancellation)")
60end
61assert(st=="running", "st == " .. st)
62
63-- when running under luajit, the function is JIT-ed, and the instruction count isn't hit, so we need a different hook
64lane9:cancel(jit and "line" or "count", 100) -- 0 timeout, hook triggers cancelslation when reaching the specified count
65
66local t0= os.time()
67while os.time()-t0 < 5 do
68 st= lane9.status
69 io.stderr:write((i==1) and st.." " or '.')
70 if st~="running" then break end
71end
72PRINT(" "..st)
73assert(st == "cancelled", "st is '" .. st .. "' instead of 'cancelled'")
74
75-- cancellation of lanes waiting on a linda 18-- cancellation of lanes waiting on a linda
76local limited = lanes_linda("limited") 19local limited = lanes_linda("limited")
77assert.fails(function() limited:limit("key", -1) end) 20assert.fails(function() limited:limit("key", -1) end)
78assert.failsnot(function() limited:limit("key", 1) end) 21assert.failsnot(function() limited:limit("key", 1) end)
79-- [[################################################ 22-- [[################################################
80limited:send("key", "hello") -- saturate linda 23limited:send("key", "hello") -- saturate linda, so that subsequent sends will block
81for k, v in pairs(limited:dump()) do 24for k, v in pairs(limited:dump()) do
82 PRINT("limited[" .. tostring(k) .. "] = " .. tostring(v)) 25 PRINT("limited[" .. tostring(k) .. "] = " .. tostring(v))
83end 26end
@@ -88,11 +31,15 @@ local wait_send = function()
88end 31end
89 32
90local wait_send_lane = lanes_gen("*", { name = 'auto' }, wait_send)() 33local wait_send_lane = lanes_gen("*", { name = 'auto' }, wait_send)()
91repeat until wait_send_lane.status == "waiting" 34repeat
92print "wait_send_lane is waiting" 35 io.stderr:write('!')
36 -- currently mingw64 builds can deadlock if we cancel the lane too early (before the linda blocks, at it causes the linda condvar not to be signalled)
37 lanes.sleep(0.1)
38until wait_send_lane.status == "waiting"
39PRINT "wait_send_lane is waiting"
93wait_send_lane:cancel() -- hard cancel, 0 timeout 40wait_send_lane:cancel() -- hard cancel, 0 timeout
94repeat until wait_send_lane.status == "cancelled" 41repeat until wait_send_lane.status == "cancelled"
95print "wait_send_lane is cancelled" 42PRINT "wait_send_lane is cancelled"
96--################################################]] 43--################################################]]
97local wait_receive = function() 44local wait_receive = function()
98 local k, v 45 local k, v
@@ -101,11 +48,15 @@ local wait_receive = function()
101end 48end
102 49
103local wait_receive_lane = lanes_gen("*", { name = 'auto' }, wait_receive)() 50local wait_receive_lane = lanes_gen("*", { name = 'auto' }, wait_receive)()
104repeat until wait_receive_lane.status == "waiting" 51repeat
105print "wait_receive_lane is waiting" 52 io.stderr:write('!')
53 -- currently mingw64 builds can deadlock if we cancel the lane too early (before the linda blocks, at it causes the linda condvar not to be signalled)
54 lanes.sleep(0.1)
55until wait_receive_lane.status == "waiting"
56PRINT "wait_receive_lane is waiting"
106wait_receive_lane:cancel() -- hard cancel, 0 timeout 57wait_receive_lane:cancel() -- hard cancel, 0 timeout
107repeat until wait_receive_lane.status == "cancelled" 58repeat until wait_receive_lane.status == "cancelled"
108print "wait_receive_lane is cancelled" 59PRINT "wait_receive_lane is cancelled"
109--################################################]] 60--################################################]]
110local wait_receive_batched = function() 61local wait_receive_batched = function()
111 local k, v1, v2 62 local k, v1, v2
@@ -114,9 +65,13 @@ local wait_receive_batched = function()
114end 65end
115 66
116local wait_receive_batched_lane = lanes_gen("*", { name = 'auto' }, wait_receive_batched)() 67local wait_receive_batched_lane = lanes_gen("*", { name = 'auto' }, wait_receive_batched)()
117repeat until wait_receive_batched_lane.status == "waiting" 68repeat
118print "wait_receive_batched_lane is waiting" 69 io.stderr:write('!')
70 -- currently mingw64 builds can deadlock if we cancel the lane too early (before the linda blocks, at it causes the linda condvar not to be signalled)
71 lanes.sleep(0.1)
72until wait_receive_batched_lane.status == "waiting"
73PRINT "wait_receive_batched_lane is waiting"
119wait_receive_batched_lane:cancel() -- hard cancel, 0 timeout 74wait_receive_batched_lane:cancel() -- hard cancel, 0 timeout
120repeat until wait_receive_batched_lane.status == "cancelled" 75repeat until wait_receive_batched_lane.status == "cancelled"
121print "wait_receive_batched_lane is cancelled" 76PRINT "wait_receive_batched_lane is cancelled"
122--################################################]] 77--################################################]]