Ошибка AllegroServe на SBCL 1.0.28 с `принять неверный аргумент ключевого слова :: AUTO-CLOSE` - PullRequest
2 голосов
/ 30 мая 2009

Новая версия SBCL 1.0.28, запущенная на debian, прерывает 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 не поможет вам решить эту проблему.

Любые идеи о том, как двигаться дальше с этой проблемой, или, альтернативно, ссылки, указывающие на места, где это было решено?

1 Ответ

2 голосов
/ 31 мая 2009

После недолгих поисков я нашел следующее решение:

В моих исходных файлах после того, как я объявил свой пакет, скомпилировал / загрузил соответствующие модули, но прежде чем я объявил что-либо в моем пакете, я добавил следующий код:

(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-sockets напрямую.

Пока, похоже, работает как надо. Базовое тестирование через последовательные вызовы (room) показывает, что явных утечек памяти нет, а производительность соответствует ожидаемой.

Пожалуйста, не стесняйтесь комментировать этот кладж, и если вы думаете, что он может неожиданно повлиять на стабильность моей системы.

...