File: lj-flush-on-trace.test.lua

package info (click to toggle)
tarantool 2.6.0-1.4
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 85,412 kB
  • sloc: ansic: 513,775; cpp: 69,493; sh: 25,650; python: 19,190; perl: 14,973; makefile: 4,178; yacc: 1,329; sql: 1,074; pascal: 620; ruby: 190; awk: 18; lisp: 7
file content (48 lines) | stat: -rwxr-xr-x 1,186 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#!/usr/bin/env tarantool

if #arg == 0 then
  require('utils').selfrun(arg, {
    {
      arg = {
        1, -- hotloop (arg[1])
        1, -- trigger (arg[2])
      },
      res = 'OK',
      msg = 'Trace is aborted',
    },
    {
      arg = {
        1, -- hotloop (arg[1])
        2, -- trigger (arg[2])
      },
      res = 'JIT mode change is detected while executing the trace',
      msg = 'Trace is recorded',
    },
  })
end

local cfg = {
  hotloop = arg[1] or 1,
  trigger = arg[2] or 1,
}

local ffi = require('ffi')
local ffiflush = ffi.load('libflush')
ffi.cdef('void flush(struct flush *state, int i)')

-- Save the current coroutine and set the value to trigger
-- <flush> call the Lua routine instead of C implementation.
local flush = require('libflush')(cfg.trigger)

-- Depending on trigger and hotloop values the following contexts
-- are possible:
-- * if trigger <= hotloop -> trace recording is aborted
-- * if trigger >  hotloop -> trace is recorded but execution
--   leads to panic
jit.opt.start("3", string.format("hotloop=%d", cfg.hotloop))

for i = 0, cfg.trigger + cfg.hotloop do
  ffiflush.flush(flush, i)
end
-- Panic didn't occur earlier.
print('OK')