From d2364e7ad37280f19660e41235dd8f2a53767d6c Mon Sep 17 00:00:00 2001 From: Gerd Flaig Date: Sat, 17 Jan 2009 19:17:02 +0100 Subject: [PATCH] fix reconnect --- empire.lisp | 34 +++++++++++++++++----------------- web.lisp | 3 ++- 2 files changed, 19 insertions(+), 18 deletions(-) diff --git a/empire.lisp b/empire.lisp index 14ee352..8ce62fb 100644 --- a/empire.lisp +++ b/empire.lisp @@ -44,7 +44,11 @@ (session :accessor session :initarg :session - :documentation "web session to which this connection belongs"))) + :documentation "web session to which this connection belongs") + (send-queue + :accessor send-queue + :initform (locked-queue:create) + :documentation "lines outstanding to be sent at next prompt"))) (defun make-connection (&key (user nil) (password nil) @@ -88,8 +92,12 @@ (defgeneric handle-connection (connection)) (defgeneric read-message (connection)) (defgeneric send-message (connection message)) +(defgeneric connected-p (connection)) (defgeneric reconnect (conncetion)) +(defmethod connected-p ((c connection)) + (sb-thread:thread-alive-p (connection-handler c))) + (defmethod reconnect ((c connection)) (with-slots (server-name server-port user password socket stream connection-handler) c (let* ((sock (usocket:socket-connect server-name server-port)) @@ -170,13 +178,17 @@ (let* ((c (connection m))) (empire-web:prompt (session c) message))) +(defmethod send-next-line ((c connection)) + (send-message-one c (locked-queue:dequeue (send-queue c)))) + (defmethod handle-prompt ((m play-mode) message) (let* ((c (connection m))) (with-input-from-string (s message) (let* ((minutes (read s)) ;;FIXME DANGEROUS (btus (read s))) (empire-web:prompt (session c) - (format nil "[~a,~a]: " minutes btus)))))) + (format nil "[~a,~a]: " minutes btus)))) + (send-next-line c))) (defmethod handle-ignore ((m init-mode) message) (declare (ignorable message)) @@ -244,21 +256,9 @@ (raw-send-message s message))) (defmethod send-message ((c connection) message) - (let ((sent-p nil) - (tries 3)) - (loop - while (and (not sent-p) - (> tries 0)) - do (handler-case - (progn - (send-message-one c message) - (setf sent-p t)) - (sb-int:closed-stream-error () - (progn - (decf tries) - (empire-log:info "~a: Connection close - retrying (~a tries left)" c tries) - (reconnect c)))))) - message) + (if (not (connected-p c)) + (reconnect c)) + (locked-queue:enqueue (send-queue c) message)) (defparameter +special-command-char+ #\;) diff --git a/web.lisp b/web.lisp index 06f483b..556fbf4 100644 --- a/web.lisp +++ b/web.lisp @@ -90,7 +90,8 @@ (defun command-action () (with-session - (empire:command (connection *empire-session*) (get-parameter "q")))) + (empire:command (connection *empire-session*) (get-parameter "q")) + "ok")) (defun root-page () (with-session -- 2.43.0