Turbo LUA

Getting ioloop instance:

local turbo = require 'turbo'
local tio = turbo.ioloop.instance()

There is only one instance at time. Multiple requests always return the same instance.

Always use pcall

For example: if you register periodic action using

tio:set_interval()

and registered handler fails from some reason, it will be removed by tio.

ioloop.lua
Because errors can always happen! If a handler errors, the handler is removed from the IOLoop, and never called again.

tio:add_handler

Add handler function for given event mask on fd

function MyClass:procesData()
...
end
function MyClass:init()
  tio:add_handler(TCPSocketFd, turbo.ioloop.READ, self.processData, self)
end

Internally function is performing:

self._poll:register()
self.handlers[fs] = {handler, arg}

When FD is closed:

  • Q6 Will the close of an fd cause it to be removed from all epoll sets automatically?
  • A6 Yes.

But tio behaves in stupid way, and starts calling handler in unfinished loop. Registered FD has to be manually removed:

tio:remove_handler(TCPSocketFd)

It will show short notice about already removed socket which can be ignored: [ioloop.lua] unregister() in remove_handler() failed: Bad file descriptor

tio:set_interval

tio:set_interval (10000, self.method, self)
local ref = tio:set_interval (10000, self.method, self)
tio:clear_interval (ref)

tio:add_timeout

tio:add_timeout (turbo.util.gettimemonotonic() + 10000, self.method, self)
local ref = tio:add_timeout (turbo.util.gettimemonotonic() + 10000, self.method, self)
tio:remove_timeout (ref)