The dropped (agent/start ...) note named the wrong cause rather than being unreachable: an over-long socket path fails the agent's bind while it is linked. That case is now refused before anything is built, and the comments, the TODO entry and the fixture say so.
28 lines
1.5 KiB
OCaml
28 lines
1.5 KiB
OCaml
(** The agent, as the compiler reaches it when both are in one process.
|
|
|
|
[flan dev] builds one binary that is the compiled program and holds this
|
|
compiler; the agent's listener thread and this one are threads in it. So a
|
|
request that used to be a connect, a write and a read on a unix socket
|
|
looping back into this address space is a call into
|
|
[vendor/agent/flan_agent.c] instead.
|
|
|
|
[None] means there is no agent in this process — the [flan] binary that
|
|
builds the merged program, [flan reload], the two-process daemon, every
|
|
test. The answer comes from the linker rather than from a flag: the symbol
|
|
is weak in [dynload_stubs.c] and is null in a binary that links no
|
|
[flan_agent.o]. [Dev] falls back to the socket on [None], which is what
|
|
keeps [--two-process] working unchanged.
|
|
|
|
What does *not* change is where a delivery lands. The agent still only
|
|
publishes to its ring; the game thread picks the job up when it next
|
|
reaches a frame boundary. The rule that keeps the collector away from the
|
|
frame thread — the game thread never calls into OCaml, requests are left
|
|
somewhere and picked up — is the same rule with the same mechanism. This is
|
|
the compiler thread calling C, never the other way. *)
|
|
|
|
external request : string -> string option = "flan_agent_direct"
|
|
|
|
(** Whether this process links the agent. [false] in the same binaries where
|
|
[request] is [None]. *)
|
|
external present : unit -> bool = "flan_agent_present"
|