SBCLで失敗1.0.28にAllegroServe `無効なキーワード引数を受け入れる:AUTO-CLOSE`

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

  •  06-09-2019
  •  | 
  •  

質問

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

ポータブルAllegroServeページには、この問題の言及して行います。しかし、Googleの検索では、この問題のために使用するものを上げていない。

どのようにこの問題で前進するか、あるいは、これが処理されている場所を指すリンクへと任意のアイデア?

役に立ちましたか?

解決

一部の周りいじくる後、私は次の解決策を作ってみた:

私は私のパッケージを宣言した後、

私ののソースファイルでは、適切なモジュールをロード/コンパイルが、私は私のパッケージに何かを宣言する前に、私は次のコードを追加します:

(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.lispキーでauto-closeにあるものからリフトです) 私は、システムファイルを変更するか、パッチ適用を回避し、基本的に直接SB-BSD-ソケットパッケージにフック

この方法で。

これまでのところ、それはそれが必要として動作しているようです。 (room)への連続呼び出しによって基本的なテストでは、明らかなメモリリークはありませんことを私に示しており、期待通りの性能がある。

あなたはそれが予想外の方法で私のシステムの安定性に影響を与えるかもしれないと思う場合は、

この場しのぎにコメントすること自由に感じ、としてください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top