r8655: add timeouts for functions that did not return as well as a handler-case for...
[irc-logger.git] / logger.lisp
index deb4ba5c8f9f2488de3ec32494d1b14a37cbbf3a..3bb165f1560f7145d07c48cada914db38b582331 100644 (file)
     *standard-output*))
 
 (defun add-log-entry (stream fmt &rest args)
-  (format-date-time (get-universal-time) :stream stream)
-  (write-char #\space stream)
-  (apply #'format stream fmt args)
-  (write-char #\newline stream)
-  (force-output stream))
+  (handler-case 
+      (progn
+       (format-date-time (get-universal-time) :stream stream)
+       (write-char #\space stream)
+       (apply #'format stream fmt args)
+       (write-char #\newline stream)
+       (force-output stream))
+    (error (e)
+     (warn "Error ~A when trying to add-log-entry '~A'." e
+          (apply #'format nil fmt args)))))
 
 (defun add-private-log-entry (logger fmt &rest args)
   (apply #'add-log-entry (get-private-log-stream logger) fmt args))
 (defun is-connected (logger)
   (%is-connected logger))
 
+(defparameter *timeout* 60)
+
 (defun is-connected (logger)
   #-allegro (%is-connected logger)
-  #+allegro (mp:with-timeout (60 nil)
+  #+allegro (mp:with-timeout (*timeout* nil)
              (%is-connected logger)))
 
+(defun quit-maybe-timeout (connection msg)
+  #-allegro (quit connection msg)
+  #+allegro (mp:with-timeout (*timeout* nil)
+             (quit connection msg)))
+
 (defun %is-connected (logger)
   (when (ignore-errors (ping (connection logger) (server logger)))
     (dotimes (i 20)
     
     (log-disconnection logger)
     (when (connection logger)
-      (ignore-errors (quit (connection logger) "Client terminated by server"))
+      (ignore-errors (quit-maybe-timeout (connection logger) "Client terminated by server"))
       (setf *recon-nick* (nickname logger)
            *recon-server* (server logger)
            *recon-username* (username logger)