2022-01-21 21:48:05 +03:00
|
|
|
:: %khan, thread runner
|
2022-02-08 19:42:22 +03:00
|
|
|
::
|
|
|
|
:: this vane presents a command/response interface for running
|
|
|
|
:: threads. two modes are supported: %fard for intra-arvo
|
|
|
|
:: requests (i.e. within the same kernel space) and %fyrd for
|
|
|
|
:: external requests (e.g. from the unix control plane.)
|
|
|
|
::
|
|
|
|
:: both modes take a thread start request consisting of a
|
|
|
|
:: namespace, thread name, and input data; they respond over the
|
|
|
|
:: same duct with either success or failure. %fard takes its
|
2022-03-02 22:23:06 +03:00
|
|
|
:: input arguments as a cage and produces %arow, which contains
|
|
|
|
:: a cage on success (or tang on failure). %fyrd takes an output
|
2022-02-14 21:46:31 +03:00
|
|
|
:: mark and input crag; it produces %avow, which contains a crag
|
|
|
|
:: on success.
|
2022-02-08 19:42:22 +03:00
|
|
|
::
|
2022-03-02 22:23:06 +03:00
|
|
|
:: threads currently expect input and produce output as vase,
|
|
|
|
:: not cage. %fard/%arow use cage instead since this is the
|
|
|
|
:: eventual desired thread API; however, the input mark is
|
|
|
|
:: currently ignored, and the output mark is always %noun. (for
|
|
|
|
:: forward compatibility, it is safe to specify %noun as the
|
|
|
|
:: input mark.)
|
|
|
|
::
|
|
|
|
:: %fyrd does mark conversion on both ends, and additionally
|
|
|
|
:: lifts its input into a $unit. this second step is done
|
|
|
|
:: because threads conventionally take their input as a unit,
|
|
|
|
:: with ~ for the case of "no arguments".
|
2022-02-08 19:42:22 +03:00
|
|
|
::
|
|
|
|
:: n.b. the current convention for threads is to use !< to
|
2022-03-02 22:23:06 +03:00
|
|
|
:: unpack their input vase. !< imposes the requirement that the
|
|
|
|
:: input type nests within the specified type. this limits %fyrd
|
|
|
|
:: to threads with inputs for which a named mark exists; it is
|
|
|
|
:: impossible to use %noun in general since it does not nest.
|
|
|
|
:: threads written against the current vase-based API could use
|
|
|
|
:: ;; instead of !< to unpack their input, thus allowing the
|
|
|
|
:: use of %fyrd with %noun. however the eventual solution is
|
|
|
|
:: probably to make threads consume and produce cages, and do
|
|
|
|
:: mark conversion where appropriate.
|
2022-01-21 21:48:05 +03:00
|
|
|
!:
|
|
|
|
!? 164
|
|
|
|
::
|
2022-02-12 09:13:31 +03:00
|
|
|
=, khan
|
2022-01-21 21:48:05 +03:00
|
|
|
|= our=ship
|
2022-02-12 08:14:39 +03:00
|
|
|
=> |% :: %khan types
|
2022-02-12 09:13:31 +03:00
|
|
|
+$ move [p=duct q=(wite note gift)] ::
|
2022-02-12 08:14:39 +03:00
|
|
|
+$ note :: out request $->
|
|
|
|
$~ [%g %deal *sock *term *deal:gall] ::
|
|
|
|
$% $: %g :: to %gall
|
2022-01-22 04:46:59 +03:00
|
|
|
$>(%deal task:gall) :: full transmission
|
2022-02-12 08:14:39 +03:00
|
|
|
== ::
|
|
|
|
$: %k :: to self
|
2022-02-12 09:13:31 +03:00
|
|
|
$>(%fard task) :: internal thread
|
2022-01-22 04:46:59 +03:00
|
|
|
== == ::
|
2022-02-12 08:14:39 +03:00
|
|
|
+$ sign :: in response $<-
|
|
|
|
$% $: %gall :: from %gall
|
|
|
|
$>(%unto gift:gall) :: update
|
|
|
|
== ::
|
|
|
|
$: %khan :: from self
|
2022-02-12 09:13:31 +03:00
|
|
|
$> ?(%arow %avow) gift :: thread result
|
2022-02-12 08:14:39 +03:00
|
|
|
== == ::
|
|
|
|
+$ khan-state ::
|
2022-03-02 08:38:55 +03:00
|
|
|
[%0 hey=duct] :: current unix duct
|
2022-02-12 08:14:39 +03:00
|
|
|
-- ::
|
2022-01-22 04:46:59 +03:00
|
|
|
=>
|
|
|
|
|%
|
2022-02-12 08:14:39 +03:00
|
|
|
++ get-beak
|
2022-02-12 09:13:31 +03:00
|
|
|
|= [=bear now=@da]
|
2022-02-12 08:14:39 +03:00
|
|
|
?@(bear [our bear %da now] bear)
|
2022-01-27 04:41:01 +03:00
|
|
|
++ get-dais
|
|
|
|
|= [=beak =mark rof=roof]
|
|
|
|
^- dais:clay
|
|
|
|
?~ ret=(rof ~ %cb beak /[mark])
|
2022-03-02 22:07:52 +03:00
|
|
|
~|(mark-unknown+mark !!)
|
2022-01-27 04:41:01 +03:00
|
|
|
?~ u.ret
|
2022-03-02 22:07:52 +03:00
|
|
|
~|(mark-invalid+mark !!)
|
2022-01-27 04:41:01 +03:00
|
|
|
?> =(%dais p.u.u.ret)
|
|
|
|
!<(dais:clay q.u.u.ret)
|
2022-03-02 22:07:52 +03:00
|
|
|
++ get-tube
|
|
|
|
|= [=beak =mark =out=mark rof=roof]
|
|
|
|
^- tube:clay
|
|
|
|
?~ ret=(rof ~ %cc beak /[mark]/[out-mark])
|
|
|
|
~|(tube-unknown+[mark out-mark] !!)
|
|
|
|
?~ u.ret
|
|
|
|
~|(tube-invalid+[mark out-mark] !!)
|
|
|
|
?> =(%tube p.u.u.ret)
|
|
|
|
!<(tube:clay q.u.u.ret)
|
2022-02-12 08:14:39 +03:00
|
|
|
++ make-wire
|
|
|
|
|= [=beak =mark]
|
|
|
|
^- wire
|
|
|
|
:~ %fyrd
|
|
|
|
(scot %p p.beak)
|
|
|
|
q.beak
|
|
|
|
-.r.beak
|
2022-03-02 04:33:54 +03:00
|
|
|
(scot r.beak)
|
2022-02-12 08:14:39 +03:00
|
|
|
mark
|
|
|
|
==
|
2022-03-02 04:33:54 +03:00
|
|
|
++ read-case
|
|
|
|
|= a=[p=@ @]
|
|
|
|
^- case
|
|
|
|
:: XX should be:
|
|
|
|
:: ?> ?=(?(%da %tas %ud) p.a)
|
|
|
|
:: [p.a (slav a)]
|
|
|
|
::
|
|
|
|
?+ p.a !!
|
|
|
|
%da [p.a (slav a)]
|
|
|
|
%tas [p.a (slav a)]
|
|
|
|
%ud [p.a (slav a)]
|
|
|
|
==
|
2022-02-12 08:14:39 +03:00
|
|
|
++ read-wire
|
|
|
|
|= =wire
|
|
|
|
^- (pair beak mark)
|
2022-03-02 04:33:54 +03:00
|
|
|
~| khan-read-wire+wire
|
|
|
|
?> ?=([%fyrd @ @ @ @ @ ~] wire)
|
|
|
|
:_ i.t.t.t.t.t.wire
|
|
|
|
:+ (slav %p i.t.wire)
|
|
|
|
i.t.t.wire
|
|
|
|
(read-case [i i.t]:t.t.t.wire)
|
2022-01-22 04:46:59 +03:00
|
|
|
++ start-spider
|
2022-02-08 01:46:02 +03:00
|
|
|
|= [our=@p =vase]
|
2022-01-26 02:37:48 +03:00
|
|
|
^- note
|
2022-02-08 01:46:02 +03:00
|
|
|
[%g %deal [our our] %spider %poke %spider-start vase]
|
2022-01-22 04:46:59 +03:00
|
|
|
++ watch-spider
|
2022-01-26 02:37:48 +03:00
|
|
|
|= [our=@p =path]
|
|
|
|
^- note
|
|
|
|
[%g %deal [our our] %spider %watch path]
|
2022-01-22 04:46:59 +03:00
|
|
|
--
|
2022-01-21 21:48:05 +03:00
|
|
|
=| khan-state
|
|
|
|
=* state -
|
|
|
|
|= [now=@da eny=@uvJ rof=roof]
|
|
|
|
=* khan-gate .
|
|
|
|
^?
|
|
|
|
|%
|
2022-02-12 09:13:31 +03:00
|
|
|
:: +call: handle a +task request
|
2022-01-21 21:48:05 +03:00
|
|
|
::
|
|
|
|
++ call
|
|
|
|
|= $: hen=duct
|
|
|
|
dud=(unit goof)
|
2022-02-12 09:13:31 +03:00
|
|
|
wrapped-task=(hobo task)
|
2022-01-21 21:48:05 +03:00
|
|
|
==
|
|
|
|
^- [(list move) _khan-gate]
|
|
|
|
::
|
2022-02-12 09:13:31 +03:00
|
|
|
=/ =task ((harden task) wrapped-task)
|
2022-02-13 18:33:03 +03:00
|
|
|
?^ dud
|
|
|
|
~|(%khan-call-dud (mean tang.u.dud))
|
2022-01-26 08:28:45 +03:00
|
|
|
?+ -.task [~ khan-gate]
|
2022-01-22 01:09:01 +03:00
|
|
|
%born
|
2022-02-12 08:14:39 +03:00
|
|
|
[~ khan-gate(hey hen)]
|
2022-02-08 01:46:02 +03:00
|
|
|
::
|
|
|
|
%fard
|
2022-02-19 13:14:08 +03:00
|
|
|
=/ tid=@ta
|
|
|
|
(cat 3 'khan-fyrd--' (scot %uv (sham eny)))
|
|
|
|
=* fyd p.task
|
|
|
|
=/ =beak (get-beak bear.fyd now)
|
2022-03-02 22:07:52 +03:00
|
|
|
=/ args [~ `tid beak name.fyd q.args.fyd]
|
2022-02-16 09:32:52 +03:00
|
|
|
:_ khan-gate
|
|
|
|
%+ turn
|
|
|
|
:~ (watch-spider our /thread-result/[tid])
|
|
|
|
(start-spider our !>(args))
|
|
|
|
==
|
|
|
|
|=(=note ^-(move [hen %pass //g note]))
|
2022-02-12 08:14:39 +03:00
|
|
|
::
|
|
|
|
%fyrd
|
2022-02-19 13:14:08 +03:00
|
|
|
=* fyd p.task
|
|
|
|
=/ =beak (get-beak bear.fyd now)
|
2022-02-25 22:16:47 +03:00
|
|
|
=/ =wire (make-wire beak p.args.fyd)
|
2022-02-19 13:14:08 +03:00
|
|
|
=/ =dais:clay
|
|
|
|
(get-dais beak p.q.args.fyd rof)
|
2022-02-12 08:14:39 +03:00
|
|
|
=/ =vase
|
2022-03-02 04:34:56 +03:00
|
|
|
(slap (vale.dais q.q.args.fyd) !,(*hoon [~ u=.]))
|
2022-03-02 22:07:52 +03:00
|
|
|
=- [[hen %pass wire -]~ khan-gate]
|
|
|
|
[%k %fard bear.fyd name.fyd p.q.args.fyd vase]
|
2022-01-22 01:09:01 +03:00
|
|
|
==
|
2022-01-21 21:48:05 +03:00
|
|
|
:: +load: migrate an old state to a new khan version
|
|
|
|
::
|
|
|
|
++ load
|
2022-03-02 08:38:55 +03:00
|
|
|
|= old=khan-state
|
2022-01-21 21:48:05 +03:00
|
|
|
^+ khan-gate
|
2022-03-02 08:38:55 +03:00
|
|
|
khan-gate(state old)
|
2022-01-26 08:28:45 +03:00
|
|
|
:: +scry: nothing to see as yet
|
2022-01-21 21:48:05 +03:00
|
|
|
::
|
|
|
|
++ scry
|
|
|
|
^- roon
|
|
|
|
|= [lyc=gang car=term bem=beam]
|
|
|
|
^- (unit (unit cage))
|
|
|
|
~
|
|
|
|
++ stay state
|
2022-01-26 08:28:45 +03:00
|
|
|
:: +take: handle responses.
|
|
|
|
::
|
2022-01-21 21:48:05 +03:00
|
|
|
++ take
|
|
|
|
|= [tea=wire hen=duct dud=(unit goof) hin=sign]
|
|
|
|
^- [(list move) _khan-gate]
|
|
|
|
?^ dud
|
|
|
|
~|(%khan-take-dud (mean tang.u.dud))
|
2022-02-12 08:14:39 +03:00
|
|
|
:_ khan-gate
|
|
|
|
?- -.hin
|
|
|
|
%gall
|
|
|
|
?+ -.p.hin ~
|
|
|
|
?(%poke-ack %watch-ack)
|
|
|
|
?~ p.p.hin ~
|
|
|
|
%- (slog 'khan-ack' u.p.p.hin)
|
2022-02-08 01:46:02 +03:00
|
|
|
[hen %give %arow %| -.p.hin u.p.p.hin]~
|
2022-01-26 04:43:48 +03:00
|
|
|
::
|
2022-02-12 08:14:39 +03:00
|
|
|
%fact
|
|
|
|
=* cag cage.p.hin
|
|
|
|
?+ p.cag ~&(bad-fact+p.cag !!)
|
|
|
|
%thread-fail
|
|
|
|
=/ =tang !<(tang q.cag)
|
|
|
|
%- (slog 'khan-fact' tang)
|
|
|
|
[hen %give %arow %| p.cag tang]~
|
|
|
|
::
|
|
|
|
%thread-done
|
2022-03-02 22:07:52 +03:00
|
|
|
[hen %give %arow %& %noun q.cag]~
|
2022-02-12 08:14:39 +03:00
|
|
|
==
|
2022-01-26 04:43:48 +03:00
|
|
|
==
|
2022-02-12 08:14:39 +03:00
|
|
|
::
|
|
|
|
%khan
|
|
|
|
?. ?=(%arow +<.hin) ~
|
2022-02-12 09:13:31 +03:00
|
|
|
?~ tea ~
|
2022-02-12 08:14:39 +03:00
|
|
|
?. ?=(%fyrd -.tea) ~
|
|
|
|
=* row p.hin
|
|
|
|
?. ?=(%& -.row)
|
|
|
|
[hen %give %avow row]~
|
2022-02-12 09:13:31 +03:00
|
|
|
=/ [=beak =mark]
|
|
|
|
(read-wire tea)
|
2022-03-02 22:07:52 +03:00
|
|
|
=/ =tube:clay
|
|
|
|
(get-tube beak p.p.row mark rof)
|
|
|
|
=/ =vase
|
|
|
|
(tube q.p.row)
|
2022-02-12 08:14:39 +03:00
|
|
|
[hen %give %avow %& mark q.vase]~
|
2022-01-26 04:43:48 +03:00
|
|
|
==
|
2022-01-21 21:48:05 +03:00
|
|
|
--
|