Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

[インデックス 16499] ファイルの概要

このコミットは、Go言語のテストスイートにおける特定の変更を元に戻すものです。具体的には、test/sigchld.go ファイルのビルドタグを修正し、以前の変更(CL 10017045 / 6ec8c49421a0)によって導入された問題を解決します。この問題は、テストが適切にテストされていなかったこと、およびWindows環境でテストが壊れることが原因でした。

コミット

  • コミットハッシュ: 63a707e35424dfa0e4d1dffb8b22099a8d54c9f2
  • 作者: Brad Fitzpatrick bradfitz@golang.org
  • コミット日時: 2013年6月4日 火曜日 21:51:22 -0700
  • コミットメッセージ:
    undo CL 10017045 / 6ec8c49421a0
    
    It was never tested and also breaks Windows.
    
    run.go doesn't yet support the proper !windows,!plan9 syntax.
    
    ««« original CL description
    test: do not run SIGCHLD test on Plan 9
    
    R=golang-dev, bradfitz
    CC=golang-dev
    https://golang.org/cl/10017045
    »»»
    
    R=golang-dev, dave
    CC=golang-dev
    https://golang.org/cl/10024044
    

GitHub上でのコミットページへのリンク

https://github.com/golang/go/commit/63a707e35424dfa0e4d1dffb8b22099a8d54c9f2

元コミット内容

このコミットが元に戻した元の変更(CL 10017045 / 6ec8c49421a0)の目的は、「test: do not run SIGCHLD test on Plan 9」と記載されています。これは、SIGCHLDに関連するテストをPlan 9オペレーティングシステムでは実行しないようにするためのものでした。

変更の背景

このコミットが行われた背景には、以下の2つの主要な問題がありました。

  1. テスト不足とWindowsでの破損: 元の変更(CL 10017045)は、適切にテストされないままマージされたため、Windows環境でsigchld.goテストが正しく動作しないという問題を引き起こしました。Goのテストスイートは様々なプラットフォームで実行されるため、特定のプラットフォームでテストが失敗することは許容されません。
  2. run.goのビルドタグ構文の制限: Goのテストランナーであるrun.goが、!windows,!plan9のような複数の否定条件を含むビルドタグ構文を当時まだ適切にサポートしていなかったことが挙げられます。これにより、test/sigchld.goファイルに// +build !windows !plan9というビルドタグが追加された際に、run.goがその意図を正しく解釈できず、結果としてWindowsでテストが実行されてしまい、問題が発生しました。

これらの問題に対処するため、元の変更を元に戻すことが決定されました。

前提知識の解説

1. Goのビルドタグ(Build Tags)

Go言語では、ソースコードファイルの先頭に// +buildディレクティブを記述することで、特定の条件に基づいてファイルをコンパイルに含めるか除外するかを制御できます。これは、異なるオペレーティングシステム(OS)やアーキテクチャ、または特定のビルド設定に応じてコードを切り替える際に非常に有用です。

  • 構文: // +build tag1,tag2 !tag3
    • カンマ(,)は論理OR (||) を意味します。tag1またはtag2のいずれかが有効な場合にファイルがコンパイルされます。
    • スペースは論理AND (&&) を意味します。tag1tag2の両方が有効な場合にファイルがコンパイルされます。
    • 感嘆符(!)は否定を意味します。!tag3tag3が有効でない場合にコンパイルされます。
  • 一般的なタグ: linux, windows, darwin (macOS), freebsd, plan9, amd64, arm, go1.xなどがあります。
  • :
    • // +build linux darwin: LinuxまたはmacOSでのみコンパイル。
    • // +build go1.18,amd64: Go 1.18以上かつAMD64アーキテクチャでのみコンパイル。
    • // +build !windows: Windows以外のOSでのみコンパイル。

2. SIGCHLDシグナル

SIGCHLDは、Unix系オペレーティングシステムにおいて、子プロセスが終了したとき、または停止・再開したときに親プロセスに送信されるシグナルです。親プロセスは通常、このシグナルを捕捉して、終了した子プロセスのステータスをwait()システムコールなどで回収します。これにより、ゾンビプロセス(終了したが親にステータスが回収されていないプロセス)の発生を防ぎます。

WindowsにはSIGCHLDに直接対応する概念はありません。Windowsのプロセス管理は、イベントやスレッド、ジョブオブジェクトなど、Unix系とは異なるメカニズムに基づいています。そのため、SIGCHLDに依存するテストは、Windowsでは適切に動作しないか、意味をなさない場合があります。

3. run.goとGoのテストインフラ

run.goは、Goの標準ライブラリのテストスイートを実行するための内部ツールです。Goのテストは、go testコマンドによって実行されますが、その裏側ではrun.goのようなツールが、テストファイルの発見、ビルドタグの解釈、テストの実行、結果の集計などを行っています。

特に、run.goはビルドタグを解釈し、特定のプラットフォームで実行すべきでないテストファイルをスキップする役割を担っています。このコミットの背景にある問題は、run.goが当時の実装では!windows,!plan9のような複雑な否定条件を正しく処理できなかったことに起因します。

技術的詳細

このコミットの技術的な核心は、test/sigchld.goファイルのビルドタグの変更です。

  • 変更前: // +build !windows !plan9
  • 変更後: // +build !windows

この変更がもたらす影響は以下の通りです。

  1. !windows !plan9の解釈:

    • このタグは、「Windowsでもなく、かつPlan 9でもない」場合にこのファイルをコンパイルするという意味です。
    • しかし、コミットメッセージにあるように、当時のrun.goはこの構文を正しく解釈できませんでした。特に、複数の否定条件がスペースで区切られている場合(論理AND)、その解釈に問題があったと考えられます。
    • 結果として、Windows環境でもこのファイルがコンパイル対象と誤って判断され、SIGCHLDに依存するテストが実行されてしまい、WindowsではSIGCHLDが存在しないためテストが失敗していました。
  2. !windowsの解釈:

    • このタグは、「Windowsではない」場合にこのファイルをコンパイルするという意味です。
    • これはより単純な条件であり、run.goが正しく解釈できる構文でした。
    • この変更により、sigchld.goテストはWindowsではコンパイルされなくなり、Windowsでのテスト失敗の問題が解決されます。
  3. Plan 9への影響:

    • 元の変更(CL 10017045)の意図は「Plan 9でSIGCHLDテストを実行しない」ことでした。
    • しかし、このコミットで!plan9タグが削除されたため、sigchld.goはPlan 9でもコンパイルされるようになります。
    • これは、元の変更の意図とは逆の動作ですが、コミットメッセージには「It was never tested and also breaks Windows.」とあり、Windowsでの問題を優先的に解決する必要があったことが示唆されます。また、「run.go doesn't yet support the proper !windows,!plan9 syntax.」という記述から、当時のGoのテストインフラの制約により、Plan 9でのテストスキップを正しく実装することが困難であったことが伺えます。

このコミットは、特定のプラットフォームでのテストの安定性を確保するために、一時的に元の変更の意図の一部を犠牲にした、実用的な解決策であったと言えます。

コアとなるコードの変更箇所

変更はtest/sigchld.goファイルの一行のみです。

--- a/test/sigchld.go
+++ b/test/sigchld.go
@@ -1,4 +1,4 @@
-// +build !windows !plan9
+// +build !windows
 // cmpout
 
 // Copyright 2009 The Go Authors. All rights reserved.

コアとなるコードの解説

test/sigchld.goファイルの先頭にあるビルドタグが、// +build !windows !plan9から// +build !windowsに変更されています。

  • 変更前 (// +build !windows !plan9):

    • この行は、このGoソースファイルがWindowsオペレーティングシステムでもなく、かつPlan 9オペレーティングシステムでもない場合にのみコンパイルされるべきであることを示していました。
    • しかし、前述の通り、当時のrun.goテストランナーはこの複雑な否定条件を正しく処理できず、Windows環境で誤ってこのファイルをコンパイルしようとしていました。SIGCHLDシグナルはUnix系OS特有のものであり、Windowsには存在しないため、Windowsでこのテストが実行されるとビルドエラーやランタイムエラーが発生していました。
  • 変更後 (// +build !windows):

    • この行は、このGoソースファイルがWindowsオペレーティングシステムではない場合にのみコンパイルされるべきであることを示します。
    • これにより、Windows環境では確実にこのファイルがコンパイル対象から除外されるようになり、Windowsでのテスト失敗の問題が解決されました。
    • Plan 9に関しては、元の変更の意図(Plan 9でテストを実行しない)は一時的に無視される形になりますが、Windowsでのテストの安定性確保が優先されました。これは、当時のrun.goのビルドタグ解釈の限界によるものです。

この変更は、Goのテストインフラの成熟度と、異なるプラットフォームでの互換性を確保するための継続的な努力を示しています。

関連リンク

参考にした情報源リンク