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

[インデックス 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.

このコメントは、pnilの場合にアイドルな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)