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

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

このコミットは、Go言語のランタイムにおけるデータ競合検出ツール(Race Detector)のサポート範囲をFreeBSDオペレーティングシステムに拡張するための変更です。具体的には、src/race.bashというシェルスクリプトが修正され、FreeBSD/amd64環境でのRace Detectorの利用を許可するように更新されました。race.bashは、GoのビルドシステムやテストシステムがRace Detectorの利用可能性を判断する際に使用されるスクリプトの一つです。

コミット

  • コミットハッシュ: de2feeafdcd41a7ba2ff67299dccd33ad2fdf75
  • 作者: Dmitriy Vyukov (dvyukov@google.com)
  • コミット日時: 2014年6月24日 火曜日 15:47:22 -0700

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

https://github.com/golang/go/commit/de2feeafdcd41a7ba2ff67299dccd33ad2fdf75

元コミット内容

race.bash: support freebsd

R=golang-codereviews, iant
CC=golang-codereviews
https://golang.org/cl/110150044

変更の背景

Go言語のRace Detectorは、並行処理におけるデータ競合(複数のゴルーチンが同時に同じメモリ位置にアクセスし、少なくとも一方が書き込み操作を行う場合に発生するバグ)を検出するための強力なツールです。このツールは、プログラムの実行時に競合を検出し、開発者がデバッグするのを助けます。

元々、GoのRace DetectorはLinux/amd64およびDarwin(macOS)/amd64環境でのみ公式にサポートされていました。しかし、Go言語はクロスプラットフォーム開発を重視しており、FreeBSDもGoがサポートする主要なオペレーティングシステムの一つです。FreeBSDユーザーもRace Detectorの恩恵を受けられるようにするため、このコミットによってFreeBSD/amd64環境でのRace Detectorのサポートが追加されました。これにより、FreeBSD上でGoアプリケーションを開発する際にも、データ競合の検出と修正が容易になりました。

前提知識の解説

Go言語のRace Detector

Go言語に組み込まれているデータ競合検出ツールです。go build -racego run -racego test -raceなどのコマンドに-raceフラグを追加することで有効になります。プログラムの実行中にメモリへのアクセスを監視し、データ競合が発生した際に詳細なレポート(競合が発生した場所、関連するゴルーチンのスタックトレースなど)を出力します。これは、並行プログラミングにおけるデバッグを大幅に簡素化します。Race Detectorは、Googleが開発したThreadSanitizerという技術をベースにしています。

race.bash スクリプト

src/race.bashは、Goのソースツリー内に存在するシェルスクリプトです。このスクリプトは、Goのビルドプロセスやテストプロセスにおいて、現在のシステムがRace Detectorをサポートしているかどうかを判断するために使用されます。具体的には、unameコマンドの結果を評価し、サポートされているOSとアーキテクチャの組み合わせであるかを確認します。

uname コマンド

unameはUnix系オペレーティングシステムで利用可能なコマンドで、システム情報を表示します。

  • uname: オペレーティングシステム名(例: Linux, FreeBSD, Darwin
  • uname -m: マシンハードウェア名(アーキテクチャ、例: x86_64, amd64

amd64 アーキテクチャ

amd64は、Intel 64(旧称EM64T)およびAMD64の両方を含む64ビットのx86命令セットアーキテクチャを指す一般的な用語です。現代のほとんどのデスクトップおよびサーバーCPUで採用されています。

FreeBSD

FreeBSDは、UNIXをベースとしたオープンソースのオペレーティングシステムです。高性能、安定性、セキュリティに優れており、サーバー、組み込みシステム、デスクトップなど幅広い用途で利用されています。Go言語はFreeBSDを公式にサポートしており、多くのGo開発者がFreeBSD環境で作業しています。

cgo

cgoは、GoプログラムからC言語のコードを呼び出すためのGoの機能です。Race Detectorは、その実装の一部でC言語のランタイムライブラリ(ThreadSanitizerなど)を利用しているため、Race Detectorを有効にするにはcgoが有効になっている必要があります。非Darwinシステム(LinuxやFreeBSDなど)では、Cコンパイラ(GCCやClangなど)がシステムにインストールされていることも必要です。

技術的詳細

このコミットの技術的な変更は、src/race.bashスクリプトにFreeBSD/amd64のサポートを追加することに集約されます。

  1. エラーメッセージの更新: Race Detectorがサポートされていない環境でスクリプトが実行された際に表示されるエラーメッセージが更新されました。以前は「race detector is only supported on linux/amd64 and darwin/amd64」と表示されていましたが、FreeBSD/amd64が追加されたことで、「race detector is only supported on linux/amd64, freebsd/amd64 and darwin/amd64」に変更されました。これにより、ユーザーはFreeBSDもサポート対象であることを認識できます。

  2. FreeBSD環境の検出ロジックの追加: case $(uname) inブロックに、"FreeBSD"という新しいケースが追加されました。このケースでは、uname -mコマンドを実行してマシンアーキテクチャが"amd64"であるかを確認します。もしamd64でなければ、usage関数を呼び出してエラーメッセージを表示し、スクリプトを終了します。これにより、FreeBSD上であっても、サポートされていないアーキテクチャ(例: i386)ではRace Detectorが有効にならないように制御されます。

これらの変更により、race.bashスクリプトはFreeBSD/amd64環境を正しく認識し、Race Detectorの利用を許可するようになりました。

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

--- a/src/race.bash
+++ b/src/race.bash
@@ -9,7 +9,7 @@
 set -e
 
 function usage {
-	echo 'race detector is only supported on linux/amd64 and darwin/amd64' 1>&2
+	echo 'race detector is only supported on linux/amd64, freebsd/amd64 and darwin/amd64' 1>&2
 	exit 1
 }
 
@@ -25,6 +25,11 @@ case $(uname) in
 	\tusage
 	fi
 	;;
+\"FreeBSD\")
+\tif [ $(uname -m) != \"amd64\" ]; then
+\t\tusage
+\tfi
+\t;;
 *)
 	usage
 	;;

コアとなるコードの解説

  1. エラーメッセージの変更:

    -	echo 'race detector is only supported on linux/amd64 and darwin/amd64' 1>&2
    +	echo 'race detector is only supported on linux/amd64, freebsd/amd64 and darwin/amd64' 1>&2
    

    usage関数内で表示されるエラーメッセージが更新されました。これは、Race Detectorがサポートされているプラットフォームのリストにfreebsd/amd64が追加されたことをユーザーに明確に伝えるための変更です。1>&2は、メッセージを標準エラー出力にリダイレクトすることを意味します。

  2. FreeBSDサポートの追加:

    +\"FreeBSD\")
    +\tif [ $(uname -m) != \"amd64\" ]; then
    +\t\tusage
    +\tfi
    +\t;;
    

    case $(uname) inブロックは、現在のオペレーティングシステムを判別するために使用されます。この変更により、unameコマンドの出力がFreeBSDである場合に実行される新しいブロックが追加されました。

    • if [ $(uname -m) != "amd64" ]; then: この条件文は、現在のマシンのアーキテクチャがamd64ではない場合に真となります。uname -mはマシンアーキテクチャ(例: amd64, i386)を返します。
    • usage: もしアーキテクチャがamd64でなければ、usage関数が呼び出され、サポートされていないプラットフォームである旨のエラーメッセージが表示されてスクリプトが終了します。
    • fi: if文の終わり。
    • ;;: case文の各ブロックの区切り。

この追加により、race.bashはFreeBSD上で実行された際に、そのアーキテクチャがamd64であればRace Detectorの利用を許可し、それ以外のアーキテクチャであればエラーを返すようになりました。

関連リンク

参考にした情報源リンク