From: ueno Date: Sun, 14 Dec 2003 03:46:02 +0000 (+0000) Subject: * riece-async.el (riece-async-max-buffer-size): New user option. X-Git-Tag: riece-0_1_7~14 X-Git-Url: http://git.chise.org/gitweb/?a=commitdiff_plain;h=014bd7effa4dfd91bc6c632c5d927d12a66aabde;p=elisp%2Friece.git * riece-async.el (riece-async-max-buffer-size): New user option. (riece-async-server-program): Use io/nonblock & IO#syswrite to check whether the write end of pipe (i.e. input to emacs process) would block. --- diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 54d05d7..850a7d6 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,10 @@ +2003-12-14 Daiki Ueno + + * riece-async.el (riece-async-max-buffer-size): New user option. + (riece-async-server-program): Use io/nonblock & IO#syswrite to + check whether the write end of pipe (i.e. input to emacs process) + would block. + 2003-12-13 Daiki Ueno * riece-options.el (riece-default-open-connection-function): New diff --git a/lisp/riece-async.el b/lisp/riece-async.el index a1bab54..0a1b371 100644 --- a/lisp/riece-async.el +++ b/lisp/riece-async.el @@ -49,11 +49,29 @@ (defcustom riece-async-server-program '("\ +require 'io/nonblock' + socket = TCPSocket.new(" host ", " service ") $stdout.write(\"NOTICE CONNECTED #{$$}\r\n\") $stdout.flush + +$stdout.nonblock = true +trap('STOP', 'IGNORE') +trap('TSTP', 'IGNORE') +wfds_in = [] +buf = '' loop do - rfds, = select([socket, $stdin]) + rfds, wfds = select([socket, $stdin], wfds_in) + if wfds.delete($stdout) + begin + until buf.empty? + len = $stdout.syswrite(buf) + buf.slice!(0 .. len) + end + wfds_in.delete($stdout) + rescue Errno::EAGAIN + end + end if rfds.delete(socket) line = socket.gets(\"\r\n\") break unless line @@ -61,8 +79,11 @@ loop do socket.write(\"PONG #{$1}\r\n\") socket.flush else - $stdout.write(line) - $stdout.flush + wfds_in = [$stdout] + buf << line + until buf.length <= " max-buffer-size " + buf.slice!(0 .. buf.index(\"\r\n\")) + end end end if rfds.delete($stdin) @@ -79,6 +100,11 @@ exit :type 'list :group 'riece-async) +(defcustom riece-async-max-buffer-size 65535 + "Maximum size of the write buffer" + :type 'integer + :group 'riece-async) + (defun riece-async-substitute-variables (program variable value) (setq program (copy-sequence program)) (let ((pointer program)) @@ -97,13 +123,17 @@ exit (apply #'concat (riece-async-substitute-variables (riece-async-substitute-variables - riece-async-server-program - 'host - (concat "'" host "'")) - 'service - (if (numberp service) - (number-to-string service) - (concat "'" service "'"))))) + (riece-async-substitute-variables + riece-async-server-program + 'host + (concat "'" host "'")) + 'service + (if (numberp service) + (number-to-string service) + (concat "'" service "'"))) + 'max-buffer-size + (number-to-string + riece-async-max-buffer-size)))) (process-send-string process "\0\n") ;input to process is needed (if buffer (save-excursion