Optimize util.threadlocal, Add luci.store as global threadlocal store

This commit is contained in:
Steven Barth 2009-07-27 10:27:39 +00:00
parent 7b5cdb36b5
commit ce98fdd80f
2 changed files with 30 additions and 13 deletions

View file

@ -0,0 +1,16 @@
--[[
LuCI - Lua Development Framework
(c) 2009 Steven Barth <steven@midlink.org>
(c) 2009 Jo-Philipp Wich <xm@leipzig.freifunk.net>
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
]]--
local util = require "luci.util"
module("luci.store", util.threadlocal)

View file

@ -114,19 +114,16 @@ end
-- Scope manipulation routines -- Scope manipulation routines
-- --
--- Create a new or get an already existing thread local store associated with local tl_meta = {
-- the current active coroutine. A thread local store is private a table object __mode = "k",
-- whose values can't be accessed from outside of the running coroutine.
-- @return Table value representing the corresponding thread local store
function threadlocal()
local tbl = {}
local function get(self, key) __index = function(self, key)
local t = rawget(self, coxpt[coroutine.running()] or coroutine.running() or 0) local t = rawget(self, coxpt[coroutine.running()]
or coroutine.running() or 0)
return t and t[key] return t and t[key]
end end,
local function set(self, key, value) __newindex = function(self, key, value)
local c = coxpt[coroutine.running()] or coroutine.running() or 0 local c = coxpt[coroutine.running()] or coroutine.running() or 0
if not rawget(self, c) then if not rawget(self, c) then
rawset(self, c, { [key] = value }) rawset(self, c, { [key] = value })
@ -134,10 +131,14 @@ function threadlocal()
rawget(self, c)[key] = value rawget(self, c)[key] = value
end end
end end
}
setmetatable(tbl, {__index = get, __newindex = set, __mode = "k"}) --- Create a new or get an already existing thread local store associated with
-- the current active coroutine. A thread local store is private a table object
return tbl -- whose values can't be accessed from outside of the running coroutine.
-- @return Table value representing the corresponding thread local store
function threadlocal(tbl)
return setmetatable(tbl or {}, tl_meta)
end end