mirror of
https://github.com/ilyakooo0/urbit.git
synced 2024-11-10 18:21:34 +03:00
clay: add sprig cache
This commit is contained in:
parent
21cc132884
commit
53a417dc43
@ -123,7 +123,7 @@
|
||||
tom=(map tako norm) :: tomb policies
|
||||
nor=norm :: default policy
|
||||
mim=(map path mime) :: mime cache
|
||||
fod=(set leak) :: ford cache
|
||||
fod=flue :: ford cache
|
||||
== ::
|
||||
::
|
||||
:: Commit state.
|
||||
@ -149,6 +149,7 @@
|
||||
$% [%0 =desk =lobe]
|
||||
[%1 =desk =lobe]
|
||||
==
|
||||
::
|
||||
+$ fell
|
||||
$% [%direct p=lobe q=page]
|
||||
[%delta p=lobe q=[p=mark q=lobe] r=page]
|
||||
@ -156,6 +157,31 @@
|
||||
[%1 peg=(unit page)]
|
||||
==
|
||||
::
|
||||
:: Global ford cache
|
||||
::
|
||||
:: Refcount includes references from other items in the cache, and
|
||||
:: from spills in each desk
|
||||
::
|
||||
:: This is optimized for minimizing the number of rebuilds, and given
|
||||
:: that, minimizing the amount of memory used. It is relatively slow
|
||||
:: to lookup, because generating a cache key can be fairly slow (for
|
||||
:: files, it requires parsing; for tubes, it even requires building
|
||||
:: the marks).
|
||||
::
|
||||
+$ flow (map leak [refs=@ud =soak])
|
||||
::
|
||||
:: Per-desk ford cache
|
||||
::
|
||||
:: Spill is the set of "roots" we have into the global ford cache.
|
||||
:: We add a root for everything referenced directly or indirectly on
|
||||
:: a desk, then invalidate them on commit only if their dependencies
|
||||
:: change.
|
||||
::
|
||||
:: Sprig is a fast-lookup index over the global ford cache. The only
|
||||
:: goal is to make cache hits fast.
|
||||
::
|
||||
+$ flue [spill=(set leak) sprig=(map poor soak)]
|
||||
::
|
||||
:: Ford build with content.
|
||||
::
|
||||
+$ pour
|
||||
@ -190,7 +216,6 @@
|
||||
[%arch dir=(map @ta vase)]
|
||||
[%dais =dais]
|
||||
[%tube =tube]
|
||||
[%none ~]
|
||||
==
|
||||
::
|
||||
:: Ford cache key
|
||||
@ -204,13 +229,6 @@
|
||||
deps=(set leak)
|
||||
==
|
||||
::
|
||||
:: Ford cache
|
||||
::
|
||||
:: Refcount includes references from other items in the cache, and
|
||||
:: from spills in each desk
|
||||
::
|
||||
+$ flow (map leak [refs=@ud =soak])
|
||||
::
|
||||
:: New desk data.
|
||||
::
|
||||
:: Sent to other ships to update them about a particular desk.
|
||||
@ -473,6 +491,14 @@
|
||||
::
|
||||
[deletes changes]
|
||||
::
|
||||
++ pour-to-poor
|
||||
|= =pour
|
||||
^- poor
|
||||
?+ -.pour pour
|
||||
%vale [%vale path.pour]
|
||||
%arch [%arch path.pour]
|
||||
==
|
||||
::
|
||||
++ fell-to-page
|
||||
|= =fell
|
||||
^- (unit page)
|
||||
@ -531,7 +557,7 @@
|
||||
::
|
||||
++ wrap
|
||||
|* [* state:ford]
|
||||
[+<- +<+< +<+>+<] :: [result cache.state spill.state]
|
||||
[+<- +<+< +<+>-] :: [result cache.state flue]
|
||||
::
|
||||
++ with-face |=([face=@tas =vase] vase(p [%face face p.vase]))
|
||||
++ with-faces
|
||||
@ -547,8 +573,8 @@
|
||||
=> |%
|
||||
+$ state
|
||||
$: cache=flow
|
||||
flue
|
||||
cycle=(set poor)
|
||||
spill=(set leak)
|
||||
drain=(map poor leak)
|
||||
stack=(list (set leak))
|
||||
==
|
||||
@ -556,7 +582,7 @@
|
||||
$: files=(map path (each page lobe))
|
||||
file-store=(map lobe page)
|
||||
cache=flow
|
||||
spill=(set leak)
|
||||
flue
|
||||
==
|
||||
--
|
||||
|= args
|
||||
@ -565,6 +591,7 @@
|
||||
=| nub=state
|
||||
=. cache.nub cache
|
||||
=. spill.nub spill
|
||||
=. sprig.nub sprig
|
||||
|%
|
||||
:: +read-file: retrieve marked, validated file contents at path
|
||||
::
|
||||
@ -572,12 +599,14 @@
|
||||
|= =path
|
||||
^- [cage state]
|
||||
~| %error-validating^path
|
||||
%- soak-cage
|
||||
?^ got=(~(get by sprig.nub) vale+path)
|
||||
[u.got nub]
|
||||
=. stack.nub [~ stack.nub]
|
||||
?: (~(has in cycle.nub) vale+path)
|
||||
~|(cycle+vale+path^cycle.nub !!)
|
||||
=. cycle.nub (~(put in cycle.nub) vale+path)
|
||||
%- soak-cage
|
||||
%+ gain-leak [%vale path]
|
||||
%+ gain-leak vale+path
|
||||
|= nob=state
|
||||
=. nub nob
|
||||
::~> %slog.0^leaf/"ford: read file {(spud path)}"
|
||||
@ -598,6 +627,9 @@
|
||||
|= mak=mark
|
||||
^- [vase state]
|
||||
~| %error-building-mark^mak
|
||||
%- soak-vase
|
||||
?^ got=(~(get by sprig.nub) nave+mak)
|
||||
[u.got nub]
|
||||
=. stack.nub [~ stack.nub]
|
||||
?: (~(has in cycle.nub) nave+mak)
|
||||
~|(cycle+nave+mak^cycle.nub !!)
|
||||
@ -610,8 +642,7 @@
|
||||
=^ deg=vase nub $(mak mok)
|
||||
=^ tub=vase nub (build-cast mak mok)
|
||||
=^ but=vase nub (build-cast mok mak)
|
||||
%- soak-vase
|
||||
%+ gain-leak [%nave mak]
|
||||
%+ gain-leak nave+mak
|
||||
|= nob=state
|
||||
=. nub nob
|
||||
:_ nub :- %vase
|
||||
@ -636,8 +667,7 @@
|
||||
(but (pact:deg (tub v) d))
|
||||
++ vale noun:grab:cor
|
||||
--
|
||||
%- soak-vase
|
||||
%+ gain-leak [%nave mak]
|
||||
%+ gain-leak nave+mak
|
||||
|= nob=state
|
||||
=. nub nob
|
||||
:_ nub :- %vase
|
||||
@ -671,13 +701,15 @@
|
||||
|= mak=mark
|
||||
^- [dais state]
|
||||
~| %error-building-dais^mak
|
||||
%- soak-dais
|
||||
?^ got=(~(get by sprig.nub) dais+mak)
|
||||
[u.got nub]
|
||||
=. stack.nub [~ stack.nub]
|
||||
?: (~(has in cycle.nub) dais+mak)
|
||||
~|(cycle+dais+mak^cycle.nub !!)
|
||||
=. cycle.nub (~(put in cycle.nub) dais+mak)
|
||||
=^ nav=vase nub (build-nave mak)
|
||||
%- soak-dais
|
||||
%+ gain-leak [%dais mak]
|
||||
%+ gain-leak dais+mak
|
||||
|= nob=state
|
||||
=. nub nob
|
||||
::~> %slog.0^leaf/"ford: make dais {<mak>}"
|
||||
@ -720,9 +752,12 @@
|
||||
|= [a=mark b=mark]
|
||||
^- [vase state]
|
||||
~| error-building-cast+[a b]
|
||||
%- soak-vase
|
||||
?^ got=(~(get by sprig.nub) cast+a^b)
|
||||
[u.got nub]
|
||||
=. stack.nub [~ stack.nub]
|
||||
?: =([%mime %hoon] [a b])
|
||||
:_(nub =>(..zuse !>(|=(m=mime q.q.m))))
|
||||
:_(nub [%vase =>(..zuse !>(|=(m=mime q.q.m)))])
|
||||
?: (~(has in cycle.nub) cast+[a b])
|
||||
~|(cycle+cast+[a b]^cycle.nub !!)
|
||||
:: try +grow; is there a +grow core with a .b arm?
|
||||
@ -736,8 +771,7 @@
|
||||
p.lab
|
||||
:: +grow core has .b arm; use that
|
||||
::
|
||||
%- soak-vase
|
||||
%+ gain-leak [%cast a b]
|
||||
%+ gain-leak cast+a^b
|
||||
|= nob=state
|
||||
=. nub nob
|
||||
:_ nub :- %vase
|
||||
@ -751,8 +785,7 @@
|
||||
=^ new=vase nub (build-fit %mar b)
|
||||
=/ rab (mule |.((slap new tsgl/[limb/a limb/%grab])))
|
||||
?: &(?=(%& -.rab) ?=(^ q.p.rab))
|
||||
%- soak-vase
|
||||
%+ gain-leak [%cast a b]
|
||||
%+ gain-leak cast+a^b
|
||||
|= nob=state
|
||||
=. nub nob
|
||||
:_(nub vase+p.rab)
|
||||
@ -764,8 +797,7 @@
|
||||
?: ?=(%& -.rab)
|
||||
(compose-casts a !<(mark p.rab) b)
|
||||
?: ?=(%noun b)
|
||||
%- soak-vase
|
||||
%+ gain-leak [%cast a b]
|
||||
%+ gain-leak cast+a^b
|
||||
|= nob=state
|
||||
=. nub nob
|
||||
:_(nub vase+same.bud)
|
||||
@ -773,11 +805,10 @@
|
||||
::
|
||||
++ compose-casts
|
||||
|= [x=mark y=mark z=mark]
|
||||
^- [vase state]
|
||||
^- [soak state]
|
||||
=^ uno=vase nub (build-cast x y)
|
||||
=^ dos=vase nub (build-cast y z)
|
||||
%- soak-vase
|
||||
%+ gain-leak [%cast x z]
|
||||
%+ gain-leak cast+x^z
|
||||
|= nob=state
|
||||
=. nub nob
|
||||
:_ nub :- %vase
|
||||
@ -790,12 +821,14 @@
|
||||
|= [a=mark b=mark]
|
||||
^- [tube state]
|
||||
~| error-building-tube+[a b]
|
||||
%- soak-tube
|
||||
?^ got=(~(get by sprig.nub) tube+a^b)
|
||||
[u.got nub]
|
||||
=. stack.nub [~ stack.nub]
|
||||
?: (~(has in cycle.nub) tube+[a b])
|
||||
~|(cycle+tube+[a b]^cycle.nub !!)
|
||||
=^ gat=vase nub (build-cast a b)
|
||||
%- soak-tube
|
||||
%+ gain-leak [%tube a b]
|
||||
%+ gain-leak tube+a^b
|
||||
|= nob=state
|
||||
=. nub nob
|
||||
:: ~> %slog.0^leaf/"ford: make tube {<a>} -> {<b>}"
|
||||
@ -863,6 +896,9 @@
|
||||
=/ =path
|
||||
?:(?=(%| -.dep) p.dep fil.p.dep)
|
||||
~| %error-building^path
|
||||
%- soak-vase
|
||||
?^ got=(~(get by sprig.nub) file+path)
|
||||
[u.got nub]
|
||||
=. stack.nub [~ stack.nub]
|
||||
~> %slog.0^leaf/"ford: make file {(spud path)}"
|
||||
?: (~(has in cycle.nub) file+path)
|
||||
@ -873,8 +909,7 @@
|
||||
=/ tex=tape (trip !<(@t q.cag))
|
||||
=/ =pile (parse-pile path tex)
|
||||
=^ sut=vase nub (run-prelude pile)
|
||||
%- soak-vase
|
||||
%+ gain-leak [%file path]
|
||||
%+ gain-leak file+path
|
||||
|= nob=state
|
||||
=. nub nob
|
||||
=/ res=vase (road |.((slap sut hoon.pile)))
|
||||
@ -894,7 +929,9 @@
|
||||
|= =path
|
||||
^- [(map @ta vase) state]
|
||||
%- soak-arch
|
||||
%+ gain-leak [%arch path]
|
||||
?^ got=(~(get by sprig.nub) arch+path)
|
||||
[u.got nub]
|
||||
%+ gain-leak arch+path
|
||||
|= nob=state
|
||||
=. nub nob
|
||||
=/ fiz=(list @ta)
|
||||
@ -1180,8 +1217,7 @@
|
||||
=? stack.nub ?=(^ stack.nub)
|
||||
stack.nub(i (~(put in i.stack.nub) leak))
|
||||
=/ spilt (~(has in spill.nub) leak)
|
||||
:: %- (slog leaf+"ford: spilt: {<spilt>}" ~)
|
||||
=? spill.nub !spilt (~(put in spill.nub) leak)
|
||||
=^ =soak nub
|
||||
?^ got=(~(get by cache.nub) leak)
|
||||
=/ refs ?:(spilt 0 1)
|
||||
=/ tape-1 "ford: cache {<pour.leak>}: adding {<refs>}"
|
||||
@ -1205,6 +1241,13 @@
|
||||
(slog leaf+(welp tape-1 tape-2) ~)
|
||||
=. cache.nub (~(put by cache.nub) i.deps got(refs +(refs.got)))
|
||||
$(deps t.deps)
|
||||
?: spilt
|
||||
[soak nub]
|
||||
:: %- (slog leaf+"ford: spilt: {<spilt>}" ~)
|
||||
=: spill.nub (~(put in spill.nub) leak)
|
||||
sprig.nub (~(put by sprig.nub) poor soak)
|
||||
==
|
||||
[soak nub]
|
||||
--
|
||||
::
|
||||
++ lose-leak
|
||||
@ -1436,11 +1479,11 @@
|
||||
|= yon=aeon
|
||||
%- ford:fusion
|
||||
=/ files (~(run by q:(aeon-to-yaki:ze yon)) |=(=lobe |+lobe))
|
||||
[files lat.ran fad ?:(=(yon let.dom) fod.dom *(set leak))]
|
||||
[files lat.ran fad ?:(=(yon let.dom) fod.dom [~ ~])]
|
||||
:: Produce ford cache appropriate for the aeon
|
||||
::
|
||||
++ aeon-flow
|
||||
|* [yon=aeon res=* fud=flow fod=(set leak)]
|
||||
|* [yon=aeon res=* fud=flow fod=flue]
|
||||
:- res
|
||||
^+ ..park
|
||||
?: &(?=(~ ref) =(let.dom yon))
|
||||
@ -1726,9 +1769,9 @@
|
||||
::
|
||||
=/ old-fod fod.dom
|
||||
=. fod.dom
|
||||
?: updated *(set leak)
|
||||
?: updated [~ ~]
|
||||
(promote-ford fod.dom invalid)
|
||||
=. fad (lose-leaks:fusion fad (~(dif in old-fod) fod.dom))
|
||||
=. fad (lose-leaks:fusion fad (~(dif in spill.old-fod) spill.fod.dom))
|
||||
=? changes updated (changes-for-upgrade q.old-yaki deletes changes)
|
||||
::
|
||||
=/ files
|
||||
@ -1774,7 +1817,7 @@
|
||||
::
|
||||
=^ mim args (checkout-mime args deletes ~(key by changes))
|
||||
=. mim.dom (apply-changes-to-mim mim.dom mim)
|
||||
=. fod.dom spill.args
|
||||
=. fod.dom [spill sprig]:args
|
||||
=. fad cache.args
|
||||
=. ..park (emil (print q.old-yaki data))
|
||||
wake:(ergo 0 mim)
|
||||
@ -1873,11 +1916,11 @@
|
||||
(~(uni by pre) changes)
|
||||
::
|
||||
++ promote-ford
|
||||
|= [fod=(set leak) invalid=(set path)]
|
||||
^- (set leak)
|
||||
=/ old=(list leak) ~(tap in fod)
|
||||
=| new=(set leak)
|
||||
|- ^- (set leak)
|
||||
|= [fod=flue invalid=(set path)]
|
||||
^- flue
|
||||
=/ old=(list leak) ~(tap in spill.fod)
|
||||
=| new=flue
|
||||
|- ^- flue
|
||||
?~ old
|
||||
new
|
||||
=/ invalid
|
||||
@ -1902,7 +1945,12 @@
|
||||
$(deps t.deps)
|
||||
==
|
||||
==
|
||||
=? new !invalid (~(put in new) i.old)
|
||||
=? new !invalid
|
||||
:- (~(put in spill.new) i.old)
|
||||
=/ =poor (pour-to-poor pour.i.old)
|
||||
?~ got=(~(get by sprig.fod) poor)
|
||||
sprig.new
|
||||
(~(put by sprig.new) poor u.got)
|
||||
$(old t.old)
|
||||
::
|
||||
++ page-to-cord
|
||||
@ -1932,12 +1980,13 @@
|
||||
==
|
||||
^+ [built ford-args]
|
||||
=. ford-args cache
|
||||
=/ [=cage fud=flow fod=(set leak)]
|
||||
=/ [=cage fud=flow fod=flue]
|
||||
:: ~> %slog.[0 leaf/"clay: validating {(spud path)}"]
|
||||
%- wrap:fusion
|
||||
(read-file:(ford:fusion ford-args) path)
|
||||
=. cache.ford-args fud
|
||||
=. spill.ford-args fod
|
||||
=. spill.ford-args spill.fod
|
||||
=. sprig.ford-args sprig.fod
|
||||
=/ =lobe
|
||||
?- -.change
|
||||
%| p.change
|
||||
@ -2018,7 +2067,7 @@
|
||||
=/ original=(map path (each page lobe))
|
||||
(~(run by q.yaki) |=(=lobe |+lobe))
|
||||
(~(uni by original) changes)
|
||||
=/ =args:ford:fusion [all-changes lat.ran ~ *(set leak)]
|
||||
=/ =args:ford:fusion [all-changes lat.ran ~ ~ ~]
|
||||
=^ all-change-cages args (checkout-changes args all-changes)
|
||||
=/ ccs=(list [=path =lobe =cage]) ~(tap by change-cages)
|
||||
|- ^+ *sane-changes
|
||||
@ -2771,11 +2820,12 @@
|
||||
|- ^- [(map path (unit mime)) args:ford:fusion]
|
||||
?~ cans
|
||||
[mim ford-args]
|
||||
=/ [=cage fud=flow fod=(set leak)]
|
||||
=/ [=cage fud=flow fod=flue]
|
||||
~| mime-cast-fail+i.cans
|
||||
(wrap:fusion (cast-path:(ford:fusion ford-args) i.cans %mime))
|
||||
=. cache.ford-args fud
|
||||
=. spill.ford-args fod
|
||||
=. spill.ford-args spill.fod
|
||||
=. sprig.ford-args sprig.fod
|
||||
=^ mim ford-args $(cans t.cans)
|
||||
[(~(put by mim) i.cans `!<(mime q.cage)) ford-args]
|
||||
::
|
||||
@ -2841,7 +2891,7 @@
|
||||
=/ =yaki (~(got by hut.ran) (~(got by hit.dom) u.yon))
|
||||
=/ files (~(run by q.yaki) |=(=lobe |+lobe))
|
||||
=/ =args:ford:fusion
|
||||
[files lat.ran fad ?:(=(yon let.dom) fod.dom *(set leak))]
|
||||
[files lat.ran fad ?:(=(yon let.dom) fod.dom [~ ~])]
|
||||
=^ mim args
|
||||
(checkout-mime args ~ ~(key by files))
|
||||
=. mim.dom (apply-changes-to-mim mim.dom mim)
|
||||
@ -4694,6 +4744,7 @@
|
||||
*norm
|
||||
mim.dom.dojo-10
|
||||
~
|
||||
~
|
||||
==
|
||||
==
|
||||
::
|
||||
@ -4714,6 +4765,7 @@
|
||||
*norm
|
||||
mim.dom.rede-10
|
||||
~
|
||||
~
|
||||
==
|
||||
::
|
||||
ref
|
||||
@ -4879,7 +4931,7 @@
|
||||
dos.rom
|
||||
%- ~(run by dos.rom.ruf)
|
||||
|= =dojo
|
||||
dojo(fod.dom ~)
|
||||
dojo(fod.dom `flue`[~ ~])
|
||||
::
|
||||
hoy
|
||||
%- ~(run by hoy.ruf)
|
||||
@ -4888,7 +4940,7 @@
|
||||
rus
|
||||
%- ~(run by rus.rung)
|
||||
|= =rede
|
||||
rede(fod.dom ~)
|
||||
rede(fod.dom `flue`[~ ~])
|
||||
==
|
||||
==
|
||||
::
|
||||
@ -5107,7 +5159,7 @@
|
||||
|= [=desk =dojo]
|
||||
:+ desk %|
|
||||
:~ mime+&+mim.dom.dojo
|
||||
spill+&+fod.dom.dojo
|
||||
flue+&+fod.dom.dojo
|
||||
dome+&+dom.dojo
|
||||
==
|
||||
:~ domestic+|+domestic
|
||||
|
Loading…
Reference in New Issue
Block a user