aboutsummaryrefslogtreecommitdiffstats
path: root/lua/nvim-lsp-installer/jobs/pool.lua
blob: 783026434abdf7be8262d3981562fc424b68e09a (plain) (blame)
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
local log = require "nvim-lsp-installer.log"

local JobExecutionPool = {}
JobExecutionPool.__index = JobExecutionPool

function JobExecutionPool:new(opts)
    return setmetatable({
        size = opts.size,
        _queue = {},
        _supplied_jobs = 0,
        _running_jobs = 0,
    }, JobExecutionPool)
end

function JobExecutionPool:supply(fn)
    self._supplied_jobs = self._supplied_jobs + 1
    self._queue[#self._queue + 1] = setmetatable({
        id = self._supplied_jobs,
    }, {
        __call = function(_, ...)
            fn(...)
        end,
    })
    self:_dequeue()
end

function JobExecutionPool:_dequeue()
    log.fmt_trace("Dequeuing job running_jobs=%s, size=%s", self._running_jobs, self.size)
    if self._running_jobs < self.size and #self._queue > 0 then
        local dequeued = table.remove(self._queue, 1)
        self._running_jobs = self._running_jobs + 1
        log.fmt_trace("Dequeued job job_id=%s, running_jobs=%s, size=%s", dequeued.id, self._running_jobs, self.size)
        dequeued(function()
            log.fmt_trace("Job finished job_id=%s", dequeued.id)
            self._running_jobs = self._running_jobs - 1
            self:_dequeue()
        end)
    end
end

return JobExecutionPool