opus/sys/modules/opus/sync.lua

62 lines
1.2 KiB
Lua
Raw Permalink Normal View History

2018-10-31 23:38:09 +00:00
local Sync = {
2019-06-18 19:19:24 +00:00
syncLocks = { }
2018-10-31 23:38:09 +00:00
}
2016-12-11 19:24:52 +00:00
2017-10-08 21:45:01 +00:00
local os = _G.os
2018-10-31 23:38:09 +00:00
function Sync.sync(obj, fn)
2019-06-18 19:19:24 +00:00
local key = tostring(obj)
if Sync.syncLocks[key] then
local cos = tostring(coroutine.running())
table.insert(Sync.syncLocks[key], cos)
repeat
local _, co = os.pullEvent('sync_lock')
until co == cos
else
Sync.syncLocks[key] = { }
end
local s, m = pcall(fn)
local co = table.remove(Sync.syncLocks[key], 1)
if co then
os.queueEvent('sync_lock', co)
else
Sync.syncLocks[key] = nil
end
if not s then
error(m)
end
2016-12-11 19:24:52 +00:00
end
2018-10-31 23:38:09 +00:00
function Sync.lock(obj)
2019-06-18 19:19:24 +00:00
local key = tostring(obj)
if Sync.syncLocks[key] then
local cos = tostring(coroutine.running())
table.insert(Sync.syncLocks[key], cos)
repeat
local _, co = os.pullEvent('sync_lock')
until co == cos
else
Sync.syncLocks[key] = { }
end
2018-10-31 23:38:09 +00:00
end
function Sync.release(obj)
2019-06-18 19:19:24 +00:00
local key = tostring(obj)
if not Sync.syncLocks[key] then
error('Sync.release: Lock was not obtained', 2)
end
local co = table.remove(Sync.syncLocks[key], 1)
if co then
os.queueEvent('sync_lock', co)
else
Sync.syncLocks[key] = nil
end
2018-10-31 23:38:09 +00:00
end
function Sync.isLocked(obj)
2019-06-18 19:19:24 +00:00
local key = tostring(obj)
return not not Sync.syncLocks[key]
2018-10-31 23:38:09 +00:00
end
return Sync