[merged_serve] waited up to ten seconds for the program to bind agent.sock before it started [accept_loop]. The listening socket was already up, so an editor connected fine and then heard nothing: every first request of every session cost the whole wait when the program calls (agent/start ...) late — sand.flan starts it after rl/init-window returns — or never. Nothing the editor asks needs that socket. In one process a delivery is a call into flan_agent.c, not a connect, and the two-process daemon has already waited for the bind in [two_process] and fails if it never comes. What the wait was for is the sentence a program with no agent deserves, and a sentence does not have to be in front of the loop to be said. So it is a deadline the session passes ([agent_check]) rather than a wait it does: read from the accept loop between connections and from [serve] before each request, because an editor holds one connection for a whole session and the loop is not cycling while it is attached. No thread, for the reason lib/dune gives about what the merged link does to this library's dependencies. Delivery stays honest either way. A program that links no agent at all refuses through [over_socket]'s ENOENT, as before. One that has the agent but has not started it takes the module into the ring and is answered with a note that promises the poll and not a frame: a program with no (agent/poll) in it never installs this, and "at its next frame boundary" would be the reply that makes a redefinition look applied when it is not. C-x C-e's five-second timeout gets the same distinction instead of asking whether a program that has not got to its loop yet is calling the poll in it. And the note a parked program's delivery carries is now said once per park. A finished program is parked, so re-evaluating while a run's output is on the screen repeated a paragraph on every C-c C-c. The first delivery of each park explains itself; the rest say the one line that is the claim. [rerun] clears the flag as well as [eval] does, so a new park is a new reader.
22 lines
807 B
Plaintext
22 lines
807 B
Plaintext
;;;; A program that parks the moment it is up: an agent, a line of output and
|
|
;;;; a return from main.
|
|
;;;;
|
|
;;;; Every other fixture here has to be driven to its park through the run it
|
|
;;;; was written for. What the note test needs is the park itself, repeatedly
|
|
;;;; and cheaply — a redefinition sent to a parked program is answered with an
|
|
;;;; explanation of what "queued" means for one, and the claim under test is
|
|
;;;; that the explanation is given once per park rather than once per
|
|
;;;; keystroke. So the run is as short as a run can be, and [rerun] gets it
|
|
;;;; back to a fresh park in one op.
|
|
(import agent "vendor:agent")
|
|
|
|
(defvar runs i64)
|
|
|
|
(defn step [] i64 7)
|
|
|
|
(defn main [] i32
|
|
(agent/start "/tmp/flan-dev-parknote-fallback.sock")
|
|
(set runs (+ runs 1))
|
|
(print runs) (println "")
|
|
0)
|