sync module improvements

This commit is contained in:
kepler155c@gmail.com
2018-10-31 19:38:09 -04:00
parent 846569952c
commit 88f126bf2f
5 changed files with 53 additions and 10 deletions

View File

@@ -1,26 +1,61 @@
local syncLocks = { }
local Sync = {
syncLocks = { }
}
local os = _G.os
return function(obj, fn)
function Sync.sync(obj, fn)
local key = tostring(obj)
if syncLocks[key] then
if Sync.syncLocks[key] then
local cos = tostring(coroutine.running())
table.insert(syncLocks[key], cos)
table.insert(Sync.syncLocks[key], cos)
repeat
local _, co = os.pullEvent('sync_lock')
until co == cos
else
syncLocks[key] = { }
Sync.syncLocks[key] = { }
end
local s, m = pcall(fn)
local co = table.remove(syncLocks[key], 1)
local co = table.remove(Sync.syncLocks[key], 1)
if co then
os.queueEvent('sync_lock', co)
else
syncLocks[key] = nil
Sync.syncLocks[key] = nil
end
if not s then
error(m)
end
end
function Sync.lock(obj)
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
end
function Sync.release(obj)
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
end
function Sync.isLocked(obj)
local key = tostring(obj)
return not not Sync.syncLocks[key]
end
return Sync