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

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

このコミットは、Go言語のランタイムパッケージにおいて、Cgo呼び出し数とゴルーチン数を取得する関数の名称を、より明確でGoの命名規則に沿ったものに変更するものです。具体的には、CgocallsNumCgoCallに、GoroutinesNumGoroutineにそれぞれリネームしています。これに伴い、関連するドキュメントやコード内の参照も更新されています。

コミット

commit 4b171e5040935f65c011ea58dde6fb49fcd9e6b3
Author: David Symonds <dsymonds@golang.org>
Date:   Fri Feb 17 08:49:41 2012 +1100

    runtime: rename Cgocalls and Goroutines to NumCgoCall and NumGoroutine, respectively.
    Update some other docs too.
    
    Update #2955.
    
    R=rsc
    CC=golang-dev
    https://golang.org/cl/5676060

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

https://github.com/golang/go/commit/4b171e5040935f65c011ea58dde6fb49fcd9e6b3

元コミット内容

runtime: rename Cgocalls and Goroutines to NumCgoCall and NumGoroutine, respectively.
Update some other docs too.

Update #2955.

R=rsc
CC=golang-dev
https://golang.org/cl/5676060

変更の背景

この変更は、Go言語のランタイムパッケージにおける統計情報取得関数の命名規則を改善することを目的としています。元の関数名CgocallsGoroutinesは、それぞれCgo呼び出しの総数と現在実行中のゴルーチン数を返すものでしたが、Goの標準的な命名規則では、数を返す関数にはNumプレフィックスを付けることが推奨されます。例えば、要素の数を返す関数はLenCount、あるいはNumを冠することが一般的です。

コミットメッセージに記載されているUpdate #2955は、この変更がIssue 2955に関連していることを示唆しています。Issue 2955は、Goの標準ライブラリにおける命名規則の一貫性に関する議論であり、特に「数を数える関数にはNumプレフィックスを付けるべきか」という点が議論されていました。このコミットは、その議論の結果として、より明確で一貫性のあるAPIを提供するために行われました。これにより、開発者が関数の目的をより直感的に理解できるようになります。

前提知識の解説

Go言語のruntimeパッケージ

runtimeパッケージは、Goプログラムのランタイムシステムと対話するためのインターフェースを提供します。これには、ガベージコレクション、ゴルーチン管理、スケジューリング、Cgo呼び出しの統計情報など、Goプログラムの実行環境に関する低レベルな機能が含まれます。開発者はこのパッケージを通じて、プログラムのパフォーマンス特性を監視したり、特定のランタイム動作を制御したりすることができます。

Cgo

Cgoは、GoプログラムからC言語のコードを呼び出すためのGoの機能です。また、C言語のプログラムからGoの関数を呼び出すことも可能です。これにより、既存のCライブラリをGoプロジェクトで再利用したり、パフォーマンスが重要な部分をCで記述したりすることができます。Cgoを使用すると、GoのランタイムとCのランタイムの間でコンテキストスイッチが発生するため、その呼び出し回数を監視することは、パフォーマンス分析において重要になる場合があります。

ゴルーチン (Goroutines)

ゴルーチンは、Go言語における軽量な並行処理の単位です。スレッドに似ていますが、Goランタイムによって管理され、OSのスレッドよりもはるかに少ないメモリで作成・実行できます。数千、数万のゴルーチンを同時に実行することが一般的であり、Goの並行処理モデルの基盤となっています。現在実行中のゴルーチン数を監視することは、アプリケーションの並行処理の負荷やリソース使用状況を把握するために役立ちます。

Go言語の命名規則

Go言語には、コードの可読性と一貫性を高めるための厳格な命名規則があります。

  • エクスポートされた名前: パッケージ外からアクセス可能な関数、変数、型などは、大文字で始まる必要があります。
  • 非エクスポートされた名前: パッケージ内でのみ使用されるものは、小文字で始まります。
  • 略語: URLHTTPのような略語は、すべて大文字またはすべて小文字で記述されます(例: ServeHTTPparseURL)。
  • 数を表す関数: 集合の要素数を返す関数には、LenCount、またはNumプレフィックスが推奨されます。例えば、NumCPUNumGoroutineなどです。

このコミットは、特に「数を表す関数」の命名規則に沿った変更を行っています。

技術的詳細

このコミットの主要な技術的変更は、Goランタイムパッケージ内の2つの公開関数の名称変更です。

  1. runtime.Cgocalls() から runtime.NumCgoCall() への変更:

    • この関数は、GoプログラムがCgoを通じてCコードを呼び出した総回数を返します。
    • 変更前はCgocallsという複数形の名詞が使われていましたが、これは「Cgo呼び出しの数」を意味する動詞的な表現としては不自然でした。
    • 変更後はNumCgoCallとなり、「Cgo呼び出しの数」を明確に示し、Goの命名規則に準拠しています。
  2. runtime.Goroutines() から runtime.NumGoroutine() への変更:

    • この関数は、現在実行中のゴルーチンの総数を返します。
    • 変更前はGoroutinesという複数形の名詞が使われていましたが、これも「ゴルーチンの数」を意味する動詞的な表現としては不自然でした。
    • 変更後はNumGoroutineとなり、「ゴルーチンの数」を明確に示し、Goの命名規則に準拠しています。

これらの変更は、単なる名称変更に留まらず、GoのAPI設計における一貫性と可読性を向上させるための重要なステップです。関数名がその機能(数を返すこと)をより正確に反映するようになり、開発者がAPIをより容易に理解し、誤用を防ぐことに貢献します。

また、この変更はGoの内部実装にも影響を与えています。src/pkg/runtime/cgocall.csrc/pkg/runtime/proc.c内のC言語で実装された対応する関数名も変更され、Goの公開APIとの整合性が保たれています。さらに、src/pkg/runtime/debug.go内のドキュメントコメントも更新され、新しい関数名と説明が反映されています。src/pkg/net/http/transport_test.goのような既存のコードベースも、新しい関数名を使用するように更新されています。

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

diff --git a/src/pkg/net/http/transport_test.go b/src/pkg/net/http/transport_test.go
index a36571a444..1a629c1727 100644
--- a/src/pkg/net/http/transport_test.go
+++ b/src/pkg/net/http/transport_test.go
@@ -648,7 +648,7 @@ func TestTransportPersistConnLeak(t *testing.T) {
 	tr := &Transport{}
 	c := &Client{Transport: tr}
 
-	n0 := runtime.Goroutines()
+	n0 := runtime.NumGoroutine()
 
 	const numReq = 25
 	didReqCh := make(chan bool)
@@ -669,7 +669,7 @@ func TestTransportPersistConnLeak(t *testing.T) {
 		<-gotReqCh
 	}
 
-	nhigh := runtime.Goroutines()
+	nhigh := runtime.NumGoroutine()
 
 	// Tell all handlers to unblock and reply.
 	for i := 0; i < numReq; i++ {
@@ -685,7 +685,7 @@ func TestTransportPersistConnLeak(t *testing.T) {
 	time.Sleep(100 * time.Millisecond)
 	runtime.GC()
 	runtime.GC() // even more.
-	nfinal := runtime.Goroutines()
+	nfinal := runtime.NumGoroutine()
 
 	growth := nfinal - n0
 
diff --git a/src/pkg/runtime/cgocall.c b/src/pkg/runtime/cgocall.c
index 756eff38f7..7a26538ec8 100644
--- a/src/pkg/runtime/cgocall.c
+++ b/src/pkg/runtime/cgocall.c
@@ -151,7 +151,7 @@ unlockm(void)
 }
 
 void
-runtime·Cgocalls(int64 ret)
+runtime·NumCgoCall(int64 ret)
 {
 	M *m;
 
diff --git a/src/pkg/runtime/debug.go b/src/pkg/runtime/debug.go
index bd6dcc971a..861017d5ff 100644
--- a/src/pkg/runtime/debug.go
+++ b/src/pkg/runtime/debug.go
@@ -26,11 +26,11 @@ func GOMAXPROCS(n int) int
 // NumCPU returns the number of logical CPUs on the local machine.
 func NumCPU() int
 
-// Cgocalls returns the number of cgo calls made by the current process.
-func Cgocalls() int64
+// NumCgoCall returns the number of cgo calls made by the current process.
+func NumCgoCall() int64
 
-// Goroutines returns the number of goroutines that currently exist.
-func Goroutines() int32
+// NumGoroutine returns the number of goroutines that currently exist.
+func NumGoroutine() int32
 
 // Alloc allocates a block of the given size.
 // FOR TESTING AND DEBUGGING ONLY.
diff --git a/src/pkg/runtime/extern.go b/src/pkg/runtime/extern.go
index eafa2f19f1..42caeb0df3 100644
--- a/src/pkg/runtime/extern.go
+++ b/src/pkg/runtime/extern.go
@@ -141,10 +141,10 @@ func Version() string {
 	return theVersion
 }
 
-// GOOS is the Go tree's operating system target:
+// GOOS is the running program's operating system target:
 // one of darwin, freebsd, linux, and so on.
 const GOOS string = theGoos
 
-// GOARCH is the Go tree's architecture target:
+// GOARCH is the running program's architecture target:
 // 386, amd64, or arm.
 const GOARCH string = theGoarch
diff --git a/src/pkg/runtime/proc.c b/src/pkg/runtime/proc.c
index 3dbf77a105..d9047c92c1 100644
--- a/src/pkg/runtime/proc.c
+++ b/src/pkg/runtime/proc.c
@@ -342,7 +342,7 @@ mcommoninit(M *m)
 	// Add to runtime·allm so garbage collector doesn't free m
 	// when it is just in a register or thread-local storage.
 	m->alllink = runtime·allm;
-	// runtime·Cgocalls() iterates over allm w/o schedlock,
+	// runtime·NumCgoCall() iterates over allm w/o schedlock,
 	// so we need to publish it safely.
 	runtime·atomicstorep(&runtime·allm, m);
 }
@@ -1652,7 +1652,7 @@ runtime·mid(uint32 ret)
 }
 
 void
-runtime·Goroutines(int32 ret)
+runtime·NumGoroutine(int32 ret)
 {
 	ret = runtime·sched.gcount;
 	FLUSH(&ret);

コアとなるコードの解説

このコミットでは、主に以下のファイルが変更されています。

  1. src/pkg/net/http/transport_test.go:

    • このファイルはnet/httpパッケージのテストコードです。
    • TestTransportPersistConnLeak関数内で、runtime.Goroutines()の呼び出しがruntime.NumGoroutine()に置き換えられています。これは、テストコードが新しい関数名に適合するように更新されたことを示しています。
  2. src/pkg/runtime/cgocall.c:

    • このファイルは、Cgo呼び出しに関連するGoランタイムのC言語実装です。
    • runtime·Cgocalls(int64 ret)関数がruntime·NumCgoCall(int64 ret)にリネームされています。これは、Goの公開APIの変更に合わせて、内部のC言語関数名も変更されたことを意味します。Goの関数は、内部的にはruntime·プレフィックスを持つC言語関数として実装されることがあります。
  3. src/pkg/runtime/debug.go:

    • このファイルは、デバッグ目的でGoランタイムの情報を提供する関数を定義しています。
    • Cgocalls()関数の宣言とドキュメントコメントがNumCgoCall()に更新されています。
    • Goroutines()関数の宣言とドキュメントコメントがNumGoroutine()に更新されています。
    • これにより、Goの公開APIとドキュメントが新しい関数名に完全に一致するようになります。
  4. src/pkg/runtime/extern.go:

    • このファイルは、Goランタイムの外部からアクセス可能な定数や関数を定義しています。
    • GOOSGOARCHのコメントが「Go tree's operating system target」から「running program's operating system target」に変更されています。これは、これらの定数がコンパイル時のターゲットだけでなく、実際に実行されているプログラムの環境を指すことをより明確にするためのドキュメントの改善です。
  5. src/pkg/runtime/proc.c:

    • このファイルは、Goランタイムのプロセッサ管理に関連するC言語実装です。
    • mcommoninit関数内のコメントでruntime·Cgocalls()への参照がruntime·NumCgoCall()に更新されています。
    • runtime·Goroutines(int32 ret)関数がruntime·NumGoroutine(int32 ret)にリネームされています。これもcgocall.cと同様に、Goの公開APIの変更に合わせて内部のC言語関数名が変更されたことを示します。

これらの変更は、GoのAPIの一貫性を高め、開発者がランタイム統計情報をより直感的に利用できるようにするためのものです。

関連リンク

参考にした情報源リンク