SBCL 1.0.28上的AllegroServe失败并显示`accept invalid keyword argument :: AUTO-CLOSE`

时间:2009-05-29 21:07:56

标签: lisp sbcl

在debian上运行的新版SBCL 1.0.28在传入连接上断开了AllegroServe 1.2.47,并出现以下错误:

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

Portable AllegroServe页面确实提到了这个问题。但是,没有谷歌搜索可以解决这个问题。

有关如何推进此问题的任何想法,或者指向指向已处理此问题的地方的链接?

1 个答案:

答案 0 :(得分:2)

经过一番捣乱,我想出了以下解决方案:

我的源文件中,在我声明我的包之后,编译/加载相应的模块,但在我在包中声明任何内容之前,我添加了以下代码:

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

(它基本上是sb-bsd-sockets/socket.lispauto-close键添加到参数列表中的内容的提升“

这样我就可以避免修改或修补系统文件,并且基本上直接挂钩到sb-bsd-sockets包中。

到目前为止,它似乎正在起作用。通过对(room)的连续调用进行的基本测试表明,没有明显的内存泄漏,性能与预期一致。

如果您认为这可能会以意想不到的方式影响我的系统的稳定性,请随时评论此kludge。