2009-05-29 5 views
2

Nouvelle version de SBCL 1.0.28 en cours d'exécution sur debian brise AllegroServe 1.2.47 sur connexion entrante avec l'erreur suivante:AllegroServe sur SBCL 1.0.28 échoue avec `accepter l'argument de mot clé incorrect:: AUTO-CLOSE`

aserve-accept-6: 05/26/09 - 21:11:01 - accept: error 0 on accept invalid 
          keyword argument: :AUTO-CLOSE (valid keys are 
          :INPUT, :OUTPUT, :ELEMENT-TYPE, :EXTERNAL-FORMAT, 
          :BUFFERING, :TIMEOUT).

La page Portable AllegroServe fait mention de ce problème. Cependant, aucune recherche google n'indique quoi que ce soit d'utile pour ce problème.

Des idées sur la façon d'avancer avec ce problème ou, alternativement, des liens pointant vers des endroits où cela a été traité?

Répondre

2

Après quelques bidouiller, je suis venu avec la solution suivante:

Dans mes fichiers source, après que je déclare mon paquet, compiler/charger les modules appropriés, mais avant que je déclare quoi que ce soit dans mon paquet , j'ai ajouté le code suivant:

(defmethod sb-bsd-sockets:socket-make-stream ((socket sb-bsd-sockets:socket) 
           &key input output 
           (element-type 'character) 
           (buffering :full) 
           (external-format :default) 
           timeout 
         (auto-close t)) 
    "Default method for SOCKET objects. An ELEMENT-TYPE of :DEFAULT 
will construct a bivalent stream. Acceptable values for BUFFERING 
are :FULL, :LINE and :NONE. Streams will have no TIMEOUT 
by default. 
    The stream for SOCKET will be cached, and a second invocation of this 
method will return the same stream. This may lead to oddities if this 
function is invoked with inconsistent arguments \(e.g., one might request 
an input stream and get an output stream in response\)." 
    (let ((stream 
     (and (slot-boundp socket 'stream) (slot-value socket 'stream)))) 
    (unless stream 
     (setf stream (sb-sys:make-fd-stream 
        (sb-bsd-sockets:socket-file-descriptor socket) 
        :name "a socket" 
        :dual-channel-p t 
        :input input 
        :output output 
        :element-type element-type 
        :buffering buffering 
        :external-format external-format 
        :timeout timeout 
      :auto-close auto-close))) 
     (setf (slot-value socket 'stream) stream) 
    (sb-ext:cancel-finalization socket) 
    stream)) 

(Il est essentiellement un ascenseur de ce qui est dans le sb-bsd-sockets/socket.lisp avec la touche auto-close ajouté à la liste des arguments)

T De cette façon, j'évite de modifier ou de patcher les fichiers système, et de me connecter directement au paquet sb-bsd-sockets directement.

Jusqu'à présent, il semble fonctionner comme il se doit. Les tests de base via des appels successifs à (room) me montrent qu'il n'y a pas de fuite de mémoire évidente, et que les performances sont conformes aux attentes. S'il vous plaît n'hésitez pas à commenter sur ce kludge, et si vous pensez que cela pourrait affecter la stabilité de mon système de manière inattendue.