遅すぎるPCでsbclのソースをコンパイルする
遅すぎるPC上でsbclのソースをコンパイルすると、途中でエラーが発生して止まります。 あまり問題になっていないように見えるのですが、 みんないいコンピュータを使用しているからなのでしょう。
うちにあるのはクソみてえなPCばかりで、 FreeBSDのportsでコンパイルしてもあっさりエラーになってしまいます。 エラーの内容は下記の通り。
# 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というのはそういう意味はないって 英語部さんのサイトで説明されていました。
- 日米英で意味が全然違う「fancy」の正しい使い方
勉強になります。
【参考】ファンシー
https://www.nijntje.nl/
https://www.miffy.com/
https://www.dickbruna.jp/