immibis

Simple thread API

Aug 17th, 2012
2,370
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 1.53 KB | None | 0 0
  1. local threads = {}
  2. local starting = {}
  3. local eventFilter = nil
  4.  
  5. rawset(os, "startThread", function(fn, blockTerminate)
  6.     table.insert(starting, {
  7.         cr = coroutine.create(fn),
  8.         blockTerminate = blockTerminate or false,
  9.         error = nil,
  10.         dead = false,
  11.         filter = nil
  12.     })
  13. end)
  14.  
  15. local function tick(t, evt, ...)
  16.     if t.dead then return end
  17.     if t.filter ~= nil and evt ~= t.filter then return end
  18.     if evt == "terminate" and t.blockTerminate then return end
  19.  
  20.     coroutine.resume(t.cr, evt, ...)
  21.     t.dead = (coroutine.status(t.cr) == "dead")
  22. end
  23.  
  24. local function tickAll()
  25.     if #starting > 0 then
  26.         local clone = starting
  27.         starting = {}
  28.         for _,v in ipairs(clone) do
  29.             tick(v)
  30.             table.insert(threads, v)
  31.         end
  32.     end
  33.     local e
  34.     if eventFilter then
  35.         e = {eventFilter(coroutine.yield())}
  36.     else
  37.         e = {coroutine.yield()}
  38.     end
  39.     local dead = nil
  40.     for k,v in ipairs(threads) do
  41.         tick(v, unpack(e))
  42.         if v.dead then
  43.             if dead == nil then dead = {} end
  44.             table.insert(dead, k - #dead)
  45.         end
  46.     end
  47.     if dead ~= nil then
  48.         for _,v in ipairs(dead) do
  49.             table.remove(threads, v)
  50.         end
  51.     end
  52. end
  53.  
  54. rawset(os, "setGlobalEventFilter", function(fn)
  55.     if eventFilter ~= nil then error("This can only be set once!") end
  56.     eventFilter = fn
  57.     rawset(os, "setGlobalEventFilter", nil)
  58. end)
  59.  
  60. if type(threadMain) == "function" then
  61.     os.startThread(threadMain)
  62. else
  63.     os.startThread(function() shell.run("shell") end)
  64. end
  65.  
  66. while #threads > 0 or #starting > 0 do
  67.     tickAll()
  68. end
  69.  
  70. print("All threads terminated!")
  71. print("Exiting thread manager")
Advertisement
Add Comment
Please, Sign In to add comment