AllegroServe em SBCL 1.0.28 falhando com `aceitar o argumento palavra-chave inválida:: AUTO-CLOSE`

StackOverflow https://stackoverflow.com/questions/928163

  •  06-09-2019
  •  | 
  •  

Pergunta

Nova versão do SBCL 1.0.28 execução no breaks debian AllegroServe 1.2.47 na conexão de entrada com seguinte erro:

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).

página AllegroServe portátil faz uma menção a este problema. No entanto, há pesquisas do Google aparecer nada de uso para este problema.

Todas as ideias sobre a forma de avançar com este problema, ou, alternativamente, links que apontam para lugares onde isso tem sido tratados?

Foi útil?

Solução

Depois de algum perder tempo, eu vim acima com a seguinte solução:

Em minha arquivos de origem, depois de declarar o meu pacote, compilação / carregar os módulos apropriados mas antes de declarar qualquer coisa no meu pacote, eu adicionei o seguinte código:

(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))

(É basicamente um elevador a partir do que está no sb-bsd-sockets/socket.lisp com a chave auto-close adicionado à lista de argumentos)

Desta forma, eu evitar modificar ou remendar os arquivos do sistema, e, basicamente, ligar para o pacote de sb-BSD-soquetes diretamente.

Até agora, ele parece estar funcionando como deveria. testes básicos via chamadas sucessivas para (room) me mostra que não há vazamentos de memória óbvias, eo desempenho é o esperado.

Por favor, sinta-se livre para comentar sobre este kludge, e se você acha que pode afetar a estabilidade do meu sistema de formas inesperadas.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top