Allegroserve على SBCL 1.0.28 الفشل مع "قبول وسيطة كلمة أساسية غير صالحة :: Auto-Close`

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

  •  06-09-2019
  •  | 
  •  

سؤال

إصدار جديد من SBCL 1.0.28 يعمل على Debian Breaks Allegroserve 1.2.47 على اتصال وارد مع الخطأ التالي:

aserve-accept-6: 05/26/09 - 21:11:01 - اقبل: خطأ 0 ON قبول وسيطة كلمة أساسية غير صالحة :: إغلاق إغلاق تلقائي (مفاتيح صالحة هي: الإدخال،: الإخراج،: نوع العنصر،: التنسيق،: التخزين المؤقت،: مهلة).

صفحة 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-Sockets مباشرة.

حتى الآن، يبدو أنه يعمل كما ينبغي. الاختبار الأساسي عبر مكالمات متتالية (room) يظهر لي أنه لا يوجد تسربات ذاكرة واضحة، والأداء هو كما هو متوقع.

لا تتردد في التعليق على هذا kludge، وإذا كنت تعتقد أنه قد يؤثر على استقرار نظامي بطرق غير متوقعة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top