Skip to content

Commit

Permalink
Merge branch 'start-epc-deferred' of https://github.com/tkf/emacs-epc
Browse files Browse the repository at this point in the history
…into tkf-start-epc-deferred
  • Loading branch information
kiwanami committed Jun 10, 2014
2 parents bad8889 + e58c6d2 commit cf83be2
Show file tree
Hide file tree
Showing 4 changed files with 100 additions and 0 deletions.
10 changes: 10 additions & 0 deletions demo/echo-server.el
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
(require 'epcs)

(defun echo-server-init (mngr)
(epc:define-method mngr 'echo #'identity))

(when noninteractive
(setq epcs (epcs:server-start #'echo-server-init))
;; Start "event loop".
(while t
(sleep-for 0.1)))
49 changes: 49 additions & 0 deletions epc.el
Original file line number Diff line number Diff line change
Expand Up @@ -374,6 +374,11 @@ failure."
(epc:init-epc-layer mngr)
mngr))

(defun epc:start-epc-deferred (server-prog server-args)
"Deferred version of `epc:start-epc'"
(deferred:nextc (epc:start-server-deferred server-prog server-args)
#'epc:init-epc-layer))

(defun epc:server-process-name (uid)
(format "epc:server:%s" uid))

Expand Down Expand Up @@ -414,6 +419,50 @@ to see full traceback:\n%s" port-str))
:port port
:connection (epc:connect "localhost" port))))

(defun epc:start-server-deferred (server-prog server-args)
"[internal] Same as `epc:start-server' but start the server asynchronously."
(lexical-let*
((uid (epc:uid))
(process-name (epc:server-process-name uid))
(process-buffer (get-buffer-create (epc:server-buffer-name uid)))
(process (apply 'start-process
process-name process-buffer
server-prog server-args))
(mngr (make-epc:manager
:server-process process
:commands (cons server-prog server-args)
:title (mapconcat 'identity (cons server-prog server-args) " ")))
(cont 1) port)
(set-process-query-on-exit-flag process nil)
(deferred:$
(deferred:next
(deferred:lambda (_)
(accept-process-output process 0 nil t)
(let ((port-str (with-current-buffer process-buffer
(buffer-string))))
(cond
((string-match "^[0-9]+$" port-str)
(setq port (string-to-number port-str)
cont nil))
((< 0 (length port-str))
(error "Server may raise an error. \
Use \"M-x epc:pop-to-last-server-process-buffer RET\" \
to see full traceback:\n%s" port-str))
((not (eq 'run (process-status process)))
(setq cont nil))
(t
(incf cont)
(when (< epc:accept-process-timeout-count cont)
;; timeout 15 seconds
(error "Timeout server response."))
(deferred:nextc (deferred:wait epc:accept-process-timeout)
self))))))
(deferred:nextc it
(lambda (_)
(setf (epc:manager-port mngr) port)
(setf (epc:manager-connection mngr) (epc:connect "localhost" port))
mngr)))))

(defun epc:stop-epc (mngr)
"Disconnect the connection for the server."
(let* ((proc (epc:manager-server-process mngr))
Expand Down
1 change: 1 addition & 0 deletions epcs.el
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@

;;; Code:

(eval-when-compile (require 'cl))
(require 'epc)

(defvar epcs:client-processes nil
Expand Down
40 changes: 40 additions & 0 deletions test-epc.el
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,14 @@
(require 'cl)
(require 'pp)


(defvar epc:source-dir (if load-file-name
(file-name-directory load-file-name)
default-directory))

(defvar epc:demo-dir (expand-file-name "demo" epc:source-dir))


(defmacro epc:with-self-server-client (connect-function &rest body)
`(lexical-let*
((server-process (epcs:server-start ,connect-function t))
Expand Down Expand Up @@ -225,6 +233,36 @@
server-count1 server-count2
client-count1 client-count2))))))))

(defun epc:test-start-echo-server ()
(let ((emacs (concat invocation-directory invocation-name))
(process-environment (mapcar #'identity process-environment)))
;; See: (info "(emacs) General Variables")
(setenv "EMACSLOADPATH"
(mapconcat #'identity
(loop for p in load-path
for e = (expand-file-name p)
;; `file-directory-p' is required to suppress
;; Warning: Lisp directory `...' does not exist.
when (file-directory-p e)
collect e)
path-separator))
(epc:start-epc-deferred
emacs
`("-Q" "--batch"
"-l" ,(expand-file-name "echo-server.el" epc:demo-dir)))))

(defun epc:test-start-epc-deferred-success ()
(deferred:nextc (epc:test-start-echo-server)
(lambda (mngr)
(epc:stop-epc mngr)
t)))

(defun epc:test-start-epc-deferred-fail ()
(deferred:$
(epc:start-epc-deferred "false" nil)
(deferred:nextc it (lambda (_) nil))
(deferred:error it (lambda (_) t))))


;;==================================================
;; Async Test Framework (based on deferred.el)
Expand Down Expand Up @@ -254,6 +292,8 @@
epc:test-multibytes
epc:test-epc-server-counts
epc:test-epc-methods
epc:test-start-epc-deferred-success
epc:test-start-epc-deferred-fail
))


Expand Down

0 comments on commit cf83be2

Please sign in to comment.