scel: keep command fifo alive for the lifetime of sclang

When sclang recompiled the class library, it would close its writing
end of the fifo, which in turn would trigger fifo deletion in scel.

This starts a dummy cat process with output redirected to the fifo,
so as to keep the fifo open as long as we desire.
This commit is contained in:
Jakob Leben 2011-09-25 06:03:20 +02:00
parent d91e92f53f
commit 65b6928a97

View file

@ -247,7 +247,8 @@ If EOB-P is non-nil, positions cursor at end of buffer."
(format "*** %s %s ***" proc (substring msg 0 -1)) (format "*** %s %s ***" proc (substring msg 0 -1))
"\n\n")) "\n\n"))
(when (memq (process-status proc) '(exit signal)) (when (memq (process-status proc) '(exit signal))
(sclang-on-library-shutdown))) (sclang-on-library-shutdown)
(sclang-stop-command-process)))
(defun sclang-process-filter (process string) (defun sclang-process-filter (process string)
(let ((buffer (process-buffer process))) (let ((buffer (process-buffer process)))
@ -342,7 +343,7 @@ If EOB-P is non-nil, positions cursor at end of buffer."
(incf i) (incf i)
(sit-for 0.5)))) (sit-for 0.5))))
(sclang-kill) (sclang-kill)
(sclang-release-command-fifo)) (sclang-stop-command-process))
(defun sclang-recompile () (defun sclang-recompile ()
"Recompile class library." "Recompile class library."
@ -373,6 +374,11 @@ Change this if \"cat\" has a non-standard name or location."
(defconst sclang-command-process "SCLang Command" (defconst sclang-command-process "SCLang Command"
"Subprocess for receiving command results from sclang.") "Subprocess for receiving command results from sclang.")
(defconst sclang-cmd-helper-proc "SCLang Command Helper"
"Dummy subprocess that will keep the command fifo open for writing
so reading does not fail automatically when sclang closes its own
writing end of the fifo")
(defvar sclang-command-fifo nil (defvar sclang-command-fifo nil
"FIFO for communicating with the subprocess.") "FIFO for communicating with the subprocess.")
@ -397,20 +403,21 @@ Change this if \"cat\" has a non-standard name or location."
(message "SCLang: Couldn't create command fifo") (message "SCLang: Couldn't create command fifo")
(setq sclang-command-fifo nil)))) (setq sclang-command-fifo nil))))
(defun sclang-command-process-sentinel (proc msg)
(and (memq (process-status proc) '(exit signal))
(sclang-release-command-fifo)))
(defun sclang-start-command-process () (defun sclang-start-command-process ()
(sclang-create-command-fifo) (sclang-create-command-fifo)
(when sclang-command-fifo (when sclang-command-fifo
;; start the dummy process to keep the fifo open
(let ((process-connection-type nil))
(let ((proc (start-process-shell-command
sclang-cmd-helper-proc nil
(concat sclang-cat-program " > " sclang-command-fifo))))
(set-process-query-on-exit-flag proc nil)))
;; sclang gets the fifo path via the environment ;; sclang gets the fifo path via the environment
(setenv "SCLANG_COMMAND_FIFO" sclang-command-fifo) (setenv "SCLANG_COMMAND_FIFO" sclang-command-fifo)
(let ((process-connection-type nil)) (let ((process-connection-type nil))
(let ((proc (start-process (let ((proc (start-process
sclang-command-process nil sclang-command-process nil
sclang-cat-program sclang-command-fifo))) sclang-cat-program sclang-command-fifo)))
(set-process-sentinel proc 'sclang-command-process-sentinel)
(set-process-filter proc 'sclang-command-process-filter) (set-process-filter proc 'sclang-command-process-filter)
;; this is important. use a unibyte stream without eol ;; this is important. use a unibyte stream without eol
;; conversion for communication. ;; conversion for communication.
@ -419,6 +426,14 @@ Change this if \"cat\" has a non-standard name or location."
(unless (get-process sclang-command-process) (unless (get-process sclang-command-process)
(message "SCLang: Couldn't start command process")))) (message "SCLang: Couldn't start command process"))))
(defun sclang-stop-command-process ()
(when (get-process sclang-cmd-helper-proc)
(kill-process sclang-cmd-helper-proc)
(delete-process sclang-cmd-helper-proc))
;; the real command process should now quit automatically,
;; since there is no more writers to the command fifo
(sclang-release-command-fifo))
(defvar sclang-command-process-previous nil (defvar sclang-command-process-previous nil
"Unprocessed command process output.") "Unprocessed command process output.")