nptclのブログ

Common Lisp処理系nptの開発メモです。https://github.com/nptcl/npt

遅すぎるPCでsbclのソースをコンパイルする

遅すぎるPC上でsbclのソースをコンパイルすると、途中でエラーが発生して止まります。 あまり問題になっていないように見えるのですが、 みんないいコンピュータを使用しているからなのでしょう。

うちにあるのはクソみてえなPCばかりで、 FreeBSDportsコンパイルしてもあっさりエラーになってしまいます。 エラーの内容は下記の通り。

# make
・・・
・・・
WARNING! Some of the contrib modules did not build successfully or pass
their self-tests. Failed contribs:"
  sb-concurrency
      410.14 real      1025.96 user       112.83 sys
*** Error code 1

Stop.
make[1]: stopped in /usr/ports/lang/sbcl
*** Error code 1

Stop.
make: stopped in /usr/ports/lang/sbcl
#

もっとさかのぼってみると、次のようなエラーが生じていました。

Doing 25 pending tests of 25 tests total.
 SB-CONCURRENCY-TEST::FRLOCK.1 SB-CONCURRENCY-TEST::QUEUE.1
 SB-CONCURRENCY-TEST::QUEUE.2 SB-CONCURRENCY-TEST::QUEUE.3
 SB-CONCURRENCY-TEST::QUEUE.4 SB-CONCURRENCY-TEST::QUEUE.5
 SB-CONCURRENCY-TEST::QUEUE.T.1 SB-CONCURRENCY-TEST::QUEUE.T.2
 SB-CONCURRENCY-TEST::QUEUE.T.3 SB-CONCURRENCY-TEST::MAILBOX-TRIVIA.1
 SB-CONCURRENCY-TEST::MAILBOX-TRIVIA.2 SB-CONCURRENCY-TEST::MAILBOX-TRIVIA.3
 SB-CONCURRENCY-TEST::MAILBOX-TIMEOUTS
 SB-CONCURRENCY-TEST::MAILBOX.SINGLE-PRODUCER-SINGLE-CONSUMER
 SB-CONCURRENCY-TEST::MAILBOX.SINGLE-PRODUCER-MULTIPLE-CONSUMERS
 SB-CONCURRENCY-TEST::MAILBOX.MULTIPLE-PRODUCERS-SINGLE-CONSUMER
Test SB-CONCURRENCY-TEST::MAILBOX.MULTIPLE-PRODUCERS-MULTIPLE-CONSUMERS failed
Form: (SB-CONCURRENCY-TEST::TEST-MAILBOX-PRODUCERS-CONSUMERS :N-SENDERS 50
                                                             :N-RECEIVERS 50
                                                             :N-MESSAGES 1000)
Expected values: (:RECEIVED . 50000)
                 (:GARBAGE . 0)
                 (:ERRORS . 0)
                 (:TIMEOUTS . 0)
Actual values: (:RECEIVED . 48389)
               (:GARBAGE . 0)
               (:ERRORS . 0)
               (:TIMEOUTS . 6).
 SB-CONCURRENCY-TEST::MAILBOX.INTERRUPTS-SAFETY.1 SB-CONCURRENCY-TEST::GATE.0
 SB-CONCURRENCY-TEST::GATE.1 SB-CONCURRENCY-TEST::GATE.2
 SB-CONCURRENCY-TEST::GATE-DEADLINE.1 SB-CONCURRENCY-TEST::GATE-DEADLINE.2
 SB-CONCURRENCY-TEST::GATE-TIMEOUT.1 SB-CONCURRENCY-TEST::GATE-TIMEOUT.2
1 out of 25 total tests failed:
   SB-CONCURRENCY-TEST::MAILBOX.MULTIPLE-PRODUCERS-MULTIPLE-CONSUMERS.
WARNING: ignoring expected failures in test-op
Unhandled SIMPLE-ERROR in thread #<SB-THREAD:THREAD "main thread" RUNNING
                                    {10005305B3}>:
  test-op failed with unexpected failures

大体はこいつ、mailboxのせいです。 PCが遅すぎるからsb-concurrencyのテストでタイムアウトするのです。 仕方がないので次のようにファイルを変更してからコンパイルを行います。

--- contrib/sb-concurrency/tests/test-mailbox.lisp.error    2017-03-01 04:51:29.000000000 +0900
+++ contrib/sb-concurrency/tests/test-mailbox.lisp  2017-03-26 11:14:54.834397000 +0900
@@ -204,10 +204,10 @@

 #-win32
 (deftest mailbox.multiple-producers-multiple-consumers
-    (test-mailbox-producers-consumers :n-senders 50
-                                      :n-receivers 50
-                                      :n-messages 1000)
-  (:received . 50000)
+    (test-mailbox-producers-consumers :n-senders 5
+                                      :n-receivers 5
+                                      :n-messages 1)
+  (:received . 5)
   (:garbage  . 0)
   (:errors   . 0)
   (:timeouts . 0))

sbclのバージョンによって行が違うでしょうから、 上のdiffは参考にする程度で手で書き換えてください。

場合によっては他にもエラーが生じるので、 そのたびにテストケースを変更しなければなりません。 頻度は少ないですが、それなりに生じるものはfrlockです。

--- contrib/sb-concurrency/tests/test-frlock.lisp.error 2017-05-17 10:57:20.356675776 +0900
+++ contrib/sb-concurrency/tests/test-frlock.lisp   2017-05-17 10:57:30.386806999 +0900
@@ -87,7 +87,7 @@
 #+sb-thread
 (deftest* (frlock.1)
     (handler-case
-        (sb-ext:with-timeout 10
+        (sb-ext:with-timeout 100
           (test-frlocks #+win32 :outer-write-pause #+win32 t ))
       (sb-ext:timeout (c)
         (error "~A" c)))

エラーはconcurrencyで出力されているため、 遅すぎるPCにスレッドはいらんだろうという考えで コンパイル時にthreadを無効にしてもいいかもしれません。


話はかなりずれますが、sbclを手動でコンパイルするとき、 threadを使いたい場合は、例えばこんな感じでmakeを行います。

$ sh make.sh --fancy

ファンシー?

なにやら可愛らしいですねって思ってたんですが、 fancyというのはそういう意味はないって 英語部さんのサイトで説明されていました。

勉強になります。

【参考】ファンシー
https://www.nijntje.nl/
https://www.miffy.com/
https://www.dickbruna.jp/