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

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

このコミットは、Go言語のランタイムライブラリにおけるコメント内の記号修正を行う軽微だが重要な変更です。具体的には、C言語で書かれたランタイム実装のロック機構において、関数名表記の中の「.」(ピリオド)を「·」(中点記号)に修正することで、Go言語の内部的な命名規則に統一性をもたらしています。

コミット

  • コミットハッシュ: 21af3d86cd0e0ff9441cb67b068277d08c496c84
  • 作成者: Ian Lance Taylor iant@golang.org
  • 日付: 2011年12月19日 20:56:37 -0800
  • コミットメッセージ: "runtime: correct '.' to '·' in comments"

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

https://github.com/golang/go/commit/21af3d86cd0e0ff9441cb67b068277d08c496c84

元コミット内容

このコミットでは、以下の2つのファイルが修正されています:

  1. src/pkg/runtime/lock_futex.c - 4行の変更(2行削除、2行追加)
  2. src/pkg/runtime/lock_sema.c - 6行の変更(3行削除、3行追加)

変更内容は全てコメント部分の関数名表記における記号の修正です:

  • runtime.futexsleepruntime·futexsleep
  • runtime.futexwakeupruntime·futexwakeup
  • runtime.semacreateruntime·semacreate
  • runtime.semasleepruntime·semasleep
  • runtime.semawakeupruntime·semawakeup

変更の背景

この変更は、Go言語の内部的な命名規則の統一性を保つためのものです。2011年当時、Go言語はまだランタイムの多くの部分をC言語で実装していました。Go言語の内部的なコンパイラ(Plan 9由来のCコンパイラ)では、中点記号(·)がパッケージ名と関数名の間のセパレータとして使用されていました。

Go言語の開発フェーズ

2011年は、Go言語がまだ初期段階にあり、多くのランタイム機能がC言語で実装されていた時期です。この時期のGoの特徴:

  • ランタイムの多くがC言語で実装されている
  • Plan 9由来のCコンパイラを使用
  • Unicode文字(中点記号)を識別子に使用可能
  • 後のGo 1.5でランタイムが完全にGoで書き直される前の状態

前提知識の解説

中点記号(·)の意味

Go言語の内部実装において、中点記号(·)は特別な意味を持ちます:

  1. パッケージセパレータ: Go言語のC実装部分では、「パッケージ名·関数名」という形式でパッケージと関数を区別
  2. アセンブリ表記: Go言語のアセンブリファイルでは、関数名の先頭に中点記号を付加
  3. リンカでの処理: 最終的なオブジェクトファイルでは、中点記号が通常のドット(.)に変換される

Plan 9の影響

Go言語のツールチェーンはPlan 9由来のため、以下の特徴があります:

  • Unicode対応: Plan 9はASCIIではなくUnicodeを使用
  • コンパイラ: Plan 9のCコンパイラを基盤とする
  • アセンブラ: Plan 9のアセンブラ構文を採用
  • リンカ: Plan 9スタイルのローダーを使用

FutexとSemaphore

変更されたファイルは、Linuxでの並行処理制御に関する重要な機能を実装しています:

Futex(Fast Userspace Mutex):

  • 高速なユーザースペースミューテックス
  • 2003年にLinuxカーネルに統合
  • 競合がない場合はシステムコール不要

Semaphore(セマフォ):

  • 並行処理での同期プリミティブ
  • カウンタベースのリソース管理
  • プロセス間通信で使用

技術的詳細

修正された関数群

Futexベースの実装:

// 修正前
runtime.futexsleep(uint32 *addr, uint32 val, int64 ns)
runtime.futexwakeup(uint32 *addr, uint32 cnt)

// 修正後
runtime·futexsleep(uint32 *addr, uint32 val, int64 ns)
runtime·futexwakeup(uint32 *addr, uint32 cnt)

Semaphoreベースの実装:

// 修正前
runtime.semacreate(void)
runtime.semasleep(int64 ns)
runtime.semawakeup(M *mp)

// 修正後
runtime·semacreate(void)
runtime·semasleep(int64 ns)
runtime·semawakeup(M *mp)

コンパイラでの処理

Go言語のC実装では、以下の変換が行われます:

  1. コンパイル時: 中点記号(·)は内部的にパッケージセパレータとして認識
  2. リンク時: 中点記号が通常のドット(.)に変換される
  3. 実行時: 最終的なバイナリでは標準的な形式で関数が参照される

命名規則の統一性

この修正により、以下の統一性が保たれます:

  • 一貫性: 全てのランタイム関数が同じ命名規則を使用
  • 可読性: コメントと実装の命名が一致
  • 保守性: 後の開発者が混乱しない統一された表記

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

lock_futex.cの変更

// 変更前
//	runtime.futexsleep(uint32 *addr, uint32 val, int64 ns)
//	runtime.futexwakeup(uint32 *addr, uint32 cnt)

// 変更後
//	runtime·futexsleep(uint32 *addr, uint32 val, int64 ns)
//	runtime·futexwakeup(uint32 *addr, uint32 cnt)

lock_sema.cの変更

// 変更前
//	uintptr runtime.semacreate(void)
//	int32 runtime.semasleep(int64 ns)
//	int32 runtime.semawakeup(M *mp)

// 変更後
//	uintptr runtime·semacreate(void)
//	int32 runtime·semasleep(int64 ns)
//	int32 runtime·semawakeup(M *mp)

コアとなるコードの解説

Futexの実装詳細

futexsleep関数:

  • アトミックに条件をチェックしてスリープ
  • 偽の覚醒(spurious wakeup)を許容
  • タイムアウト機能付き(ns < 0は無制限)

futexwakeup関数:

  • 指定されたアドレスで待機中のプロセスを起床
  • 最大cnt個のプロセスを起床

Semaphoreの実装詳細

semacreate関数:

  • セマフォを作成してm->waitsemaに割り当て
  • 0値は未割り当てを意味するため、非ゼロ値を返す

semasleep関数:

  • ns < 0の場合、m->waitsemaを取得して0を返す
  • ns >= 0の場合、最大nsナノ秒待機してタイムアウト処理

semawakeup関数:

  • 指定されたM(機械スレッド)を起床
  • mp->waitsemaで待機中または待機予定のmpを対象

同期プリミティブの役割

これらの関数は、Go言語の以下の機能を支える基盤となります:

  1. Goroutineスケジューリング: 軽量スレッドの効率的な管理
  2. チャネル通信: 並行処理での安全なデータ交換
  3. Mutex/RWMutex: クリティカルセクションの保護
  4. WaitGroup: 複数のGoroutineの同期

関連リンク

参考にした情報源リンク