From: Steven Barth Date: Fri, 5 Sep 2008 23:24:39 +0000 (+0000) Subject: Added bytecodecache X-Git-Tag: 0.8.0~121 X-Git-Url: https://git.archive.openwrt.org/?p=project%2Fluci.git;a=commitdiff_plain;h=40d4e839eff49bc2390537d465c4543105e95f59 Added bytecodecache --- diff --git a/libs/core/luasrc/ccache.lua b/libs/core/luasrc/ccache.lua new file mode 100644 index 000000000..437d38525 --- /dev/null +++ b/libs/core/luasrc/ccache.lua @@ -0,0 +1,86 @@ +--[[ +LuCI - Lua Configuration Interface + +Copyright 2008 Steven Barth +Copyright 2008 Jo-Philipp Wich + +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 + +$Id$ +]]-- + +local io = require "io" +local util = require "luci.util" +local posix = require "posix" +local debug = require "debug" +local string = require "string" +local package = require "package" + +local type, loadfile = type, loadfile + + +module "luci.ccache" + +function cache_ondemand(...) + if debug.getinfo(1, 'S').source ~= "=?" then + cache_enable(...) + end +end + +function cache_enable(cachepath, mode) + cachepath = cachepath or "/tmp/.luciccache" + mode = mode or "r--r--r--" + + local loader = package.loaders[2] + local uid = posix.getpid("uid") + + if not posix.stat(cachepath) then + posix.mkdir(cachepath) + end + + local function _encode_filename(name) + local encoded = "" + for i=1, #name do + encoded = encoded .. ("%2X" % string.byte(name, i)) + end + return encoded + end + + local function _load_sane(file) + local stat = posix.stat(file) + if stat and stat.uid == uid and stat.mode == mode then + return loadfile(file) + end + end + + local function _write_sane(file, func) + if posix.getpid("uid") == uid then + local fp = io.open(file, "w") + if fp then + fp:write(util.get_bytecode(func)) + fp:close() + posix.chmod(file, mode) + end + end + end + + package.loaders[2] = function(mod) + local encoded = cachepath .. "/" .. _encode_filename(mod) + local modcons = _load_sane(encoded) + + if modcons then + return modcons + end + + -- No cachefile + modcons = loader(mod) + if type(modcons) == "function" then + _write_sane(encoded, modcons) + end + return modcons + end +end diff --git a/libs/core/luasrc/util.lua b/libs/core/luasrc/util.lua index 49a75be83..177de43fb 100644 --- a/libs/core/luasrc/util.lua +++ b/libs/core/luasrc/util.lua @@ -28,6 +28,7 @@ local io = require "io" local math = require "math" local table = require "table" local debug = require "debug" +local ldebug = require "luci.debug" local string = require "string" local coroutine = require "coroutine" @@ -667,7 +668,7 @@ end --- Returns the absolute path to LuCI base directory. -- @return String containing the directory path function libpath() - return require "luci.fs".dirname(require "luci.debug".__file__) + return require "luci.fs".dirname(ldebug.__file__) end diff --git a/libs/sgi-cgi/htdocs/cgi-bin/luci b/libs/sgi-cgi/htdocs/cgi-bin/luci index 0435e59ba..cd9bb5966 100755 --- a/libs/sgi-cgi/htdocs/cgi-bin/luci +++ b/libs/sgi-cgi/htdocs/cgi-bin/luci @@ -1,4 +1,5 @@ #!/usr/bin/lua -require("luci.sgi.cgi") +require "luci.cacheloader" +require "luci.sgi.cgi" luci.dispatcher.indexcache = "/tmp/.luciindex" luci.sgi.cgi.run() \ No newline at end of file diff --git a/libs/web/luasrc/cacheloader.lua b/libs/web/luasrc/cacheloader.lua new file mode 100644 index 000000000..942c4b7b4 --- /dev/null +++ b/libs/web/luasrc/cacheloader.lua @@ -0,0 +1,23 @@ +--[[ +LuCI - Lua Configuration Interface + +Copyright 2008 Steven Barth +Copyright 2008 Jo-Philipp Wich + +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 + +$Id$ +]]-- + +local config = require "luci.config" +local ccache = require "luci.ccache" + +module "luci.cacheloader" + +if config.ccache and config.ccache.enable == "1" then + ccache.cache_ondemand() +end \ No newline at end of file diff --git a/libs/web/root/etc/config/luci b/libs/web/root/etc/config/luci index 76fa441c8..8b222aaaa 100644 --- a/libs/web/root/etc/config/luci +++ b/libs/web/root/etc/config/luci @@ -41,6 +41,9 @@ config internal sauth option sessionpath "/tmp/.lucisessions" option sessiontime 3600 +config internal ccache + option enable 1 + config internal template option compiler_mode file option compiledir "/tmp/.lucitplcache"