diff options
author | Mojca Miklavec <mojca.miklavec@gmail.com> | 2012-05-14 17:38:55 +0000 |
---|---|---|
committer | Mojca Miklavec <mojca.miklavec@gmail.com> | 2012-05-14 17:38:55 +0000 |
commit | 15995e10bfc68edf79970c4ea4fbb6678566c46e (patch) | |
tree | 2de7ca2a83f2d37ef043ad7429a5cb945bb79ddb /Master/texmf-dist/tex/context/base/core-uti.lua | |
parent | c9a39f716f1e5ec820ed3aab2c9aef25c5a9d730 (diff) |
ConTeXt 2012.05.14 16:00
git-svn-id: svn://tug.org/texlive/trunk@26371 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/context/base/core-uti.lua')
-rw-r--r-- | Master/texmf-dist/tex/context/base/core-uti.lua | 121 |
1 files changed, 89 insertions, 32 deletions
diff --git a/Master/texmf-dist/tex/context/base/core-uti.lua b/Master/texmf-dist/tex/context/base/core-uti.lua index 02411f13d99..1657a75e26d 100644 --- a/Master/texmf-dist/tex/context/base/core-uti.lua +++ b/Master/texmf-dist/tex/context/base/core-uti.lua @@ -19,9 +19,11 @@ saves much runtime but at the cost of more memory usage.</p> local format, match = string.format, string.match local next, type, tostring = next, type, tostring +local concat = table.concat local definetable = utilities.tables.definetable local accesstable = utilities.tables.accesstable +local migratetable = utilities.tables.migratetable local serialize = table.serialize local packers = utilities.packers local allocate = utilities.storage.allocate @@ -32,7 +34,7 @@ local report_jobcontrol = logs.reporter("jobcontrol") job = job or { } local job = job -job.version = 1.14 +job.version = 1.19 -- some day we will implement loading of other jobs and then we need -- job.jobs @@ -51,10 +53,18 @@ end job.comment(format("version: %1.2f",job.version)) +local enabled = true + +directives.register("job.save",function(v) enabled = v end) + +function job.disablesave() -- can be command + enabled = false +end + function job.initialize(loadname,savename) job.load(loadname) -- has to come after structure is defined ! luatex.registerstopactions(function() - if not status.lasterrorstring or status.lasterrorstring == "" then + if enabled and not status.lasterrorstring or status.lasterrorstring == "" then job.save(savename) end end) @@ -66,7 +76,7 @@ end -- as an example we implement variables -local tobesaved, collected, checksums = allocate(), allocate(), allocate() +local tobesaved, collected, checksums = allocate(), allocate(), allocate() local jobvariables = { collected = collected, @@ -125,9 +135,11 @@ local jobpacker = packers.new(packlist,1.01) job.pack = true -local _save_, _load_ = { }, { } -- registers timing +directives.register("job.pack",function(v) pack = v end) + +local _save_, _load_, _others_ = { }, { }, { } -- registers timing -function job.save(filename) +function job.save(filename) -- we could return a table but it can get pretty large statistics.starttiming(_save_) local f = io.open(filename,'w') if f then @@ -135,9 +147,13 @@ function job.save(filename) f:write("-- ",comment[c],"\n") end f:write("\n") + f:write("local utilitydata = { }\n") + f:write("\n") for l=1,#savelist do - local list = savelist[l] - local target, data, finalizer = list[1], list[2], list[4] + local list = savelist[l] + local target = format("utilitydata.%s",list[1]) + local data = list[2] + local finalizer = list[4] if type(finalizer) == "function" then finalizer() end @@ -149,15 +165,17 @@ function job.save(filename) end if job.pack then packers.strip(jobpacker) - f:write(serialize(jobpacker,"job.packed",true,true),"\n") + f:write(serialize(jobpacker,"utilitydata.job.packed",true,true),"\n") end + f:write("\n") + f:write("return utilitydata\n") + f:write("\n") f:close() end statistics.stoptiming(_save_) end -function job.load(filename) - statistics.starttiming(_load_) +local function load(filename) local data = io.loaddata(filename) if data and data ~= "" then local version = tonumber(match(data,"^-- version: ([%d%.]+)")) @@ -165,24 +183,51 @@ function job.load(filename) report_jobcontrol("version mismatch with jobfile: %s <> %s", version or "?", job.version) else local data = loadstring(data) - if data then - data() - end - for l=1,#savelist do - local list = savelist[l] - local target, initializer = list[1], list[3] - local result = mark(accesstable(target)) - packers.unpack(result,job.packed,true) - if type(initializer) == "function" then - initializer(result) - end + return data and data() + end + end +end + +function job.load(filename) + statistics.starttiming(_load_) + local utilitydata = load(filename) + if utilitydata then + local jobpacker = utilitydata.job.packed + for l=1,#savelist do + local list = savelist[l] + local target = list[1] + local initializer = list[3] + local result = accesstable(target,utilitydata) + packers.unpack(result,jobpacker,true) + migratetable(target,mark(result)) + if type(initializer) == "function" then + initializer(result) end - job.packed = nil end end statistics.stoptiming(_load_) end +function job.loadother(filename) + statistics.starttiming(_load_) + _others_[#_others_+1] = file.nameonly(filename) + local utilitydata = load(filename) + if utilitydata then + local jobpacker = utilitydata.job.packed + local unpacked = { } + for l=1,#savelist do + local list = savelist[l] + local target = list[1] + local result = accesstable(target,utilitydata) + packers.unpack(result,jobpacker,true) + migratetable(target,result,unpacked) + end + unpacked.job.packed = nil -- nicer in inspecting + return unpacked + end + statistics.stoptiming(_load_) +end + -- eventually this will end up in strc-ini statistics.register("startup time", function() @@ -190,8 +235,18 @@ statistics.register("startup time", function() end) statistics.register("jobdata time",function() - if statistics.elapsedindeed(_save_) or statistics.elapsedindeed(_load_) then - return format("%s seconds saving, %s seconds loading", statistics.elapsedtime(_save_), statistics.elapsedtime(_load_)) + if enabled then + if #_others_ > 0 then + return format("%s seconds saving, %s seconds loading, other files: %s",statistics.elapsedtime(_save_),statistics.elapsedtime(_load_),concat(_others_," ")) + else + return format("%s seconds saving, %s seconds loading",statistics.elapsedtime(_save_),statistics.elapsedtime(_load_)) + end + else + if #_others_ > 0 then + return format("nothing saved, %s seconds loading, other files: %s",statistics.elapsedtime(_load_),concat(_others_," ")) + else + return format("nothing saved, %s seconds loading",statistics.elapsedtime(_load_)) + end end end) @@ -212,13 +267,15 @@ statistics.register("randomizer", function() end) function statistics.formatruntime(runtime) - local shipped = tex.count['nofshipouts'] - local pages = tex.count['realpageno'] - 1 - if shipped > 0 or pages > 0 then - local persecond = shipped / runtime - if pages == 0 then pages = shipped end - return format("%s seconds, %i processed pages, %i shipped pages, %.3f pages/second",runtime,pages,shipped,persecond) - else - return format("%s seconds",runtime) + if not environment.initex then -- else error when testing as not counters yet + local shipped = tex.count['nofshipouts'] + local pages = tex.count['realpageno'] - 1 + if shipped > 0 or pages > 0 then + local persecond = shipped / runtime + if pages == 0 then pages = shipped end + return format("%s seconds, %i processed pages, %i shipped pages, %.3f pages/second",runtime,pages,shipped,persecond) + else + return format("%s seconds",runtime) + end end end |