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

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

このコミットは、GoランタイムにおけるNative Client (NaCl) の「フェイクタイムサポート」を無効にする変更です。具体的には、src/pkg/runtime/time.goc ファイルに数行のコードを追加し、NaClビルドがコンパイルできるようにするための最小限の修正が含まれています。

コミット

commit 42da29f47469ae9cc72ab96375e85506606ade33
Author: Dave Cheney <dave@cheney.net>
Date:   Wed Mar 12 08:55:30 2014 +1100

    runtime: disable Native Client fake time support
    
    This CL is a reformulation of CL 73110043 containing only the minimum required to get the nacl builds compiling.
    
    LGTM=bradfitz
    R=rsc, bradfitz
    CC=golang-codereviews
    https://golang.org/cl/74220043

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

https://github.com/golang/go/commit/42da29f47469ae9cc72ab96375e85506606ade33

元コミット内容

runtime: disable Native Client fake time support

This CL is a reformulation of CL 73110043 containing only the minimum required to get the nacl builds compiling.

LGTM=bradfitz
R=rsc, bradfitz
CC=golang-codereviews
https://golang.org/cl/74220043

変更の背景

このコミットの背景には、Go言語のNative Client (NaCl) ビルドにおける時間管理の課題がありました。NaClは、Webブラウザ内で安全にネイティブコードを実行するためのGoogleの技術です。Goランタイムは、システム時刻の取得やタイマーの管理など、時間に関連する多くの内部処理を行います。

元のコミットメッセージによると、この変更は「CL 73110043 の再構成であり、nacl ビルドをコンパイルするために必要な最小限のものが含まれている」とあります。これは、以前の変更セット (CL 73110043) が何らかの問題を抱えていたか、または必要以上の変更を含んでいたため、NaClビルドのコンパイルを妨げていた可能性を示唆しています。このコミットは、その問題を解決し、NaCl環境でのGoプログラムのビルドを可能にすることを目的としています。

「フェイクタイムサポート」という言葉は、NaCl環境が通常のオペレーティングシステムとは異なる時間管理メカニズムを持っていることを示唆しています。NaClはサンドボックス化された環境であり、システムコールや時間取得の方法が制限されることがあります。そのため、Goランタイムが期待するような正確なシステム時刻やタイマー機能を提供できない場合があり、そのギャップを埋めるために「フェイクタイム」の概念が導入されていたと考えられます。しかし、このコミットではそのサポートを無効にすることで、ビルドの問題を回避しています。これは、フェイクタイムサポートがNaClビルドにおいて予期せぬ副作用や互換性の問題を引き起こしていた可能性を示唆しています。

前提知識の解説

Native Client (NaCl)

Native Client (NaCl) は、Googleが開発したオープンソース技術で、Webブラウザ内でネイティブコード(C/C++など)を安全かつポータブルに実行することを可能にします。NaClはサンドボックス環境を提供し、悪意のあるコードがシステムにアクセスするのを防ぎます。これにより、Webアプリケーションは高性能な処理をクライアント側で実行できるようになります。Go言語もNaClをターゲットとしてサポートしており、GoプログラムをNaClモジュールとしてコンパイルし、Webブラウザで実行することができました。

Goランタイムにおける時間管理

Goランタイムは、プログラムの実行中に時間に関連する多くの機能を提供します。これには、現在のシステム時刻の取得(time.Now())、タイマーの作成(time.NewTimer())、スリープ(time.Sleep())、およびゴルーチンのスケジューリングにおける時間ベースのイベント処理などが含まれます。これらの機能は、オペレーティングシステムが提供する時間関連のシステムコール(例: gettimeofday, clock_gettime)に依存しています。

フェイクタイムサポート

一部の特殊な環境(テスト環境、シミュレーション環境、またはサンドボックス化された環境)では、実際のシステム時刻を使用する代わりに、プログラムに「フェイク」の時間を供給することがあります。これは、時間の流れを制御したり、特定の時間条件をシミュレートしたりするために使用されます。NaClのようなサンドボックス環境では、ホストOSのシステム時刻への直接アクセスが制限されるため、GoランタイムがNaCl環境で動作するために、何らかの形で時間情報を提供する必要がありました。この「フェイクタイムサポート」は、NaCl環境がGoランタイムに時間情報を提供するためのメカニズムであったと考えられます。しかし、このコミットではそのサポートを無効にしているため、その実装がNaClビルドのコンパイルを妨げていたか、または不要になったことを示唆しています。

CL (Change List)

Goプロジェクトでは、変更は「Change List (CL)」として提出され、レビューされます。コミットメッセージに記載されている「CL 73110043」や「CL 74220043」は、Goのコードレビューシステム(Gerrit)における特定の変更セットを指します。このコミットは、以前のCLの再構成版であることが明記されており、開発プロセスにおける反復と改善を示しています。

技術的詳細

このコミットは、src/pkg/runtime/time.goc ファイルに int64 runtime·timens; という変数の宣言を追加しています。この変数は、コメントで「nacl fake time support.」と明記されており、Native Client環境におけるフェイクタイムサポートに関連するものであることがわかります。

time.goc はGoランタイムのC言語部分であり、時間管理に関連する低レベルの処理を実装しています。Goランタイムは、プラットフォーム固有の時間取得メカニズムを抽象化し、Goプログラムに一貫した時間APIを提供します。

int64 runtime·timens; の追加は、この変数がGoランタイムの内部で時間関連の計算や状態管理に使用されることを示唆しています。しかし、このコミットの目的が「フェイクタイムサポートの無効化」であることから、この変数の追加は、フェイクタイムサポートを完全に削除するのではなく、その機能を無効化または迂回するためのプレースホルダー、あるいは以前のフェイクタイム実装の名残である可能性が高いです。

考えられるシナリオとしては、以下のいずれかが挙げられます。

  1. 条件付きコンパイルによる無効化: NaClビルド時に特定のコンパイルフラグが設定され、この変数が存在することで、フェイクタイムに関連するコードパスがコンパイルされないように制御されている可能性があります。
  2. 機能の削除と残骸: 以前のフェイクタイムサポートの実装が削除されたが、この変数が他のコードから参照されており、ビルドエラーを避けるために残された可能性があります。ただし、その機能はもはやアクティブではない。
  3. 新しい時間管理への移行: NaCl環境での時間管理方法が変更され、この変数は新しいアプローチの一部として、フェイクタイムサポートを置き換える役割を果たすが、その機能はまだ完全に実装されていないか、あるいは別の方法で制御されている。

コミットメッセージが「disable Native Client fake time support」と明確に述べていることから、この変数の追加は、フェイクタイムサポートをアクティブに利用しないようにするための変更の一部であると解釈するのが最も適切です。これは、NaCl環境でのGoランタイムの時間管理が、より標準的な、あるいはNaClが提供するネイティブな時間取得メカニズムに依存するように変更されたことを示唆しています。

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

--- a/src/pkg/runtime/time.goc
+++ b/src/pkg/runtime/time.goc
@@ -21,6 +21,9 @@ static Timers timers;
 static void addtimer(Timer*);
 static void dumptimers(int8*);
 
+// nacl fake time support. 
+int64 runtime·timens;
+
 // Package time APIs.
 // Godoc uses the comments in package time, not these.
 

コアとなるコードの解説

変更は src/pkg/runtime/time.goc ファイルの21行目以降に集中しています。

static Timers timers; static void addtimer(Timer*); static void dumptimers(int8*);

これらの行は、Goランタイム内部のタイマー管理に関連する既存の宣言です。Timers 構造体は複数のタイマーを管理し、addtimer は新しいタイマーを追加する関数、dumptimers はタイマーの状態をダンプする関数であると推測されます。

追加されたコードは以下の3行です。

// nacl fake time support. 
int64 runtime·timens;
  • // nacl fake time support.:このコメントは、直後の変数宣言がNative Clientのフェイクタイムサポートに関連するものであることを明確に示しています。
  • int64 runtime·timens;:これは runtime·timens という名前のグローバル変数を int64 型で宣言しています。GoランタイムのCコードでは、Goのパッケージ名と変数名を区切るために · (ミドルドット) が慣習的に使用されます。したがって、これはGoの runtime パッケージ内で使用される timens という名前の変数に対応すると考えられます。

この変数の具体的な用途は、このコミット単体では明らかではありませんが、コミットメッセージの「disable Native Client fake time support」という文脈から、この変数がフェイクタイムサポートの有効/無効を制御するため、あるいはフェイクタイムサポートが削除された後の残骸として、コンパイルエラーを避けるために宣言された可能性が高いです。つまり、この変数が存在することで、以前のフェイクタイムサポートに関連するコードパスがコンパイル時にスキップされるか、あるいは単に参照されなくなったことを示唆しています。

この変更は、GoランタイムがNaCl環境で時間をどのように扱うかという低レベルな実装の詳細に触れています。Goランタイムは、異なるプラットフォームや環境で一貫した時間APIを提供するために、プラットフォーム固有の差異を抽象化する必要があります。このコミットは、NaCl環境におけるその抽象化の一部を調整していることを示しています。

関連リンク

参考にした情報源リンク