[インデックス 18241] ファイルの概要
このコミットは、Goランタイムのsrc/pkg/runtime/proc.c
ファイルにおけるコメントの修正に関するものです。具体的には、startm
関数のコメントが、その実際の動作をより正確に反映するように変更されています。
コミット
commit e0dcf73d6163beeb4e92715d2f64fdc0ca9573be
Author: Dmitriy Vyukov <dvyukov@google.com>
Date: Tue Jan 14 12:58:13 2014 +0400
runtime: fix comment
Void function can not return false.
R=golang-codereviews, bradfitz
CC=golang-codereviews
https://golang.org/cl/52000043
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/e0dcf73d6163beeb4e92715d2f64fdc0ca9573be
元コミット内容
元のコミットメッセージは「runtime: fix comment」であり、その詳細として「Void function can not return false.」と記述されています。これは、void
型の関数がfalse
を返すことはできないという、プログラミングの基本的な原則に基づいたコメントの修正であることを示唆しています。
変更の背景
この変更の背景には、Goランタイムのスケジューラにおけるstartm
関数のコメントが、その関数の実際の振る舞いと一致していなかったという問題があります。元のコメントでは、p==nil
の場合にアイドルなP(Processor)を取得しようとし、もしアイドルなPがなければfalse
を返すと記述されていました。しかし、startm
関数はvoid
型であり、値を返すことはできません。したがって、コメントが関数のシグネチャと矛盾していました。
この修正は、コードの正確性を高め、将来の読者や開発者が関数の動作を誤解するのを防ぐことを目的としています。特に、Goランタイムのような低レベルで複雑なコードベースでは、コメントの正確性が非常に重要です。
前提知識の解説
このコミットを理解するためには、Goランタイムのスケジューラに関する基本的な知識が必要です。Goのスケジューラは、G(Goroutine)、M(Machine/Thread)、P(Processor)という3つの主要な要素で構成されています。
- G (Goroutine): Goにおける軽量な実行単位です。Goプログラム内で
go
キーワードを使って起動される関数がGoroutineとして実行されます。 - M (Machine/Thread): オペレーティングシステム(OS)のスレッドに相当します。Goランタイムは、OSスレッド上でGoroutineを実行します。
- P (Processor): 論理的なプロセッサであり、MとGの間の仲介役を果たします。Pは実行可能なGoroutineのキューを保持し、MがPに割り当てられることで、そのPのキューからGoroutineを取得して実行します。Pの数は通常、CPUのコア数に設定され、並列実行の度合いを制御します。
startm
関数は、Goランタイムのスケジューラにおいて、M(OSスレッド)を起動または再利用し、P(論理プロセッサ)に割り当ててGoroutineの実行を開始する役割を担います。具体的には、アイドル状態のPがある場合、または新しいPが必要な場合に、MをPに紐付け、Goroutineの実行を継続させます。
技術的詳細
変更が行われたsrc/pkg/runtime/proc.c
は、Goランタイムのスケジューラの中核部分を実装しているC言語のファイルです。Goランタイムは、一部がGoで書かれ、一部がC(またはアセンブリ)で書かれています。特に、OSとのインタラクションや低レベルなスケジューリングのプリミティブはCで実装されていることが多いです。
startm
関数の元のコメントは以下のようでした。
// If p==nil, tries to get an idle P, if no idle P's returns false.
このコメントは、p
がnil
の場合にアイドルなPを取得しようとし、もしアイドルなPがなければfalse
を返すと述べています。しかし、startm
関数のシグネチャはstatic void startm(P *p, bool spinning)
であり、戻り値の型がvoid
です。void
関数は値を返すことができないため、コメントの「returns false」という記述は誤りでした。
今回の修正では、この矛盾を解消するためにコメントが以下のように変更されました。
// If p==nil, tries to get an idle P, if no idle P's does nothing.
「returns false」が「does nothing」に変更されたことで、関数の実際の動作(値を返さずに、単に何もしない)が正確に表現されるようになりました。これは、コードの機能的な変更ではなく、ドキュメンテーションの正確性を向上させるための修正です。
コアとなるコードの変更箇所
変更はsrc/pkg/runtime/proc.c
ファイル内のstartm
関数のコメントに限定されています。
--- a/src/pkg/runtime/proc.c
+++ b/src/pkg/runtime/proc.c
@@ -947,7 +947,7 @@ mspinning(void)
}
// Schedules some M to run the p (creates an M if necessary).
-// If p==nil, tries to get an idle P, if no idle P's returns false.
+// If p==nil, tries to get an idle P, if no idle P's does nothing.
static void
startm(P *p, bool spinning)
{
コアとなるコードの解説
変更された行は、startm
関数の直前にあるコメントです。
- // If p==nil, tries to get an idle P, if no idle P's returns false.
- これは変更前のコメントで、
startm
関数がfalse
を返すかのように記述されていました。
- これは変更前のコメントで、
+ // If p==nil, tries to get an idle P, if no idle P's does nothing.
- これは変更後のコメントで、
startm
関数がvoid
型であるため、アイドルなPがない場合に何も行わないという実際の動作を正確に記述しています。
- これは変更後のコメントで、
この修正は、Goランタイムの内部動作自体には影響を与えません。しかし、コードベースの可読性と保守性を向上させる上で非常に重要です。特に、Goランタイムのような複雑なシステムでは、正確なコメントが開発者がコードを理解し、デバッグし、将来的に変更を加える上で不可欠な情報源となります。
関連リンク
- Goのスケジューラに関する公式ドキュメントやブログ記事: Goのスケジューラの詳細については、Goの公式ブログやドキュメントで「Go scheduler」や「M, P, G」といったキーワードで検索すると多くの情報が見つかります。
- Goのソースコードリポジトリ: https://github.com/golang/go
参考にした情報源リンク
- Goのソースコード(
src/pkg/runtime/proc.c
) - Goのスケジューラに関する一般的な知識
- コミットメッセージ自体
- Goのコードレビュープロセスに関する情報(R=golang-codereviews, bradfitz, CC=golang-codereviews)