Optimize util.threadlocal, Add luci.store as global threadlocal store
This commit is contained in:
parent
7b5cdb36b5
commit
ce98fdd80f
2 changed files with 30 additions and 13 deletions
16
libs/core/luasrc/store.lua
Normal file
16
libs/core/luasrc/store.lua
Normal 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)
|
|
@ -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
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue