# HG changeset patch # User Matthew Wild # Date 1521212381 0 # Node ID 96f20cf92b84e32420dc70dc4ee03438a09a1694 # Parent 62bfc85a53c86fe3d3b527e8a2d7325424a606ef util.async: Add per-runner ids and add runner:log() method diff -r 62bfc85a53c8 -r 96f20cf92b84 util/async.lua --- a/util/async.lua Fri Mar 16 14:51:24 2018 +0000 +++ b/util/async.lua Fri Mar 16 14:59:41 2018 +0000 @@ -1,4 +1,5 @@ local log = require "util.logger".init("util.async"); +local new_id = require "util.id".short; local function checkthread() local thread, main = coroutine.running(); @@ -99,13 +100,14 @@ local empty_watchers = {}; local function runner(func, watchers, data) return setmetatable({ func = func, thread = false, state = "ready", notified_state = "ready", - queue = {}, watchers = watchers or empty_watchers, data = data } + queue = {}, watchers = watchers or empty_watchers, data = data, id = new_id() } , runner_mt); end -- Add a task item for the runner to process function runner_mt:run(input) if input ~= nil then + self:log("debug", "queued new work item, %d items queued", #self.queue); table.insert(self.queue, input); end if self.state ~= "ready" then @@ -116,6 +118,7 @@ local q, thread = self.queue, self.thread; if not thread or coroutine.status(thread) == "dead" then + self:log("debug", "creating new coroutine"); -- Create a new coroutine for this runner thread = runner_create_thread(self.func, self); self.thread = thread; @@ -124,6 +127,7 @@ -- Process task item(s) while the queue is not empty, and we're not blocked local n, state, err = #q, self.state, nil; self.state = "running"; + self:log("debug", "running main loop"); while n > 0 and state == "ready" do local consumed; -- Loop through queue items, and attempt to run them @@ -156,6 +160,7 @@ -- Runner processed all items it can, so save current runner state self.state = state; if err or state ~= self.notified_state then + self:log("debug", "changed state from %s to %s", self.notified_state, err and "error" or state); if err then state = "error" else @@ -172,4 +177,8 @@ table.insert(self.queue, input); end +function runner_mt:log(level, fmt, ...) + return log(level, "[runner %s] "..fmt, self.id, ...); +end + return { waiter = waiter, guarder = guarder, runner = runner };