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

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

このコミットは、Go言語のランタイムにおけるPlan 9オペレーティングシステム向けの32ビットビルドに関する修正です。具体的には、runtime·open関数の呼び出し方を更新することで、ビルドエラーを解決しています。

コミット

commit 293c880f13482374a4f4964902c45d8421764ae9
Author: Akshat Kumar <seed@mail.nanosouffle.net>
Date:   Tue Mar 12 23:10:18 2013 +0100

    runtime: Plan 9, 32-bit: fix build by updating call to open()
    
    With the global redefinition of runtime·open by CL 7543043,
    we need to provide a third argument and remove the cast
    to the string.
    
    Fixes build on 386 version of Plan 9.
    
    R=khr, rsc, rminnich, ality
    CC=golang-dev
    https://golang.org/cl/7644047

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

https://github.com/golang/go/commit/293c880f13482374a4f4964902c45d8421764ae9

元コミット内容

    runtime: Plan 9, 32-bit: fix build by updating call to open()
    
    With the global redefinition of runtime·open by CL 7543043,
    we need to provide a third argument and remove the cast
    to the string.
    
    Fixes build on 386 version of Plan 9.

変更の背景

この変更の背景には、Goランタイムにおけるruntime·open関数のグローバルな再定義があります。コミットメッセージに記載されている「CL 7543043」によって、runtime·open関数のシグネチャ(引数の数や型)が変更されました。

以前のruntime·openの呼び出しでは、ファイルパスの文字列をbyte*にキャストしていましたが、新しいシグネチャではこのキャストが不要になり、さらに3つ目の引数が必要となりました。この変更が適用された後、Plan 9の32ビット(386)環境でのGoのビルドが失敗するようになりました。

このコミットは、このビルドエラーを修正するために、src/pkg/runtime/time_plan9_386.cファイル内のruntime·openの呼び出しを、新しいシグネチャに合わせて更新することを目的としています。これにより、Plan 9の386アーキテクチャ上でのGoのビルドが再び成功するようになります。

前提知識の解説

Plan 9 from Bell Labs

Plan 9は、ベル研究所によって開発された分散オペレーティングシステムです。Unixの概念をさらに推し進め、すべてのリソース(ファイル、デバイス、ネットワーク接続など)をファイルとして表現し、それらをファイルシステムを通じてアクセスするという「すべてはファイルである」という哲学を徹底しています。特に、ネットワーク透過性や、ユーザーごとに異なる名前空間を持つことなどが特徴です。Go言語の開発者の一部はPlan 9の開発にも携わっており、Go言語の設計思想にもPlan 9の影響が見られます。

Goランタイム (runtime)

Go言語のプログラムは、Goランタイムと呼ばれる軽量な実行環境上で動作します。このランタイムは、ガベージコレクション、スケジューリング、システムコールインターフェースなど、Goプログラムの実行に必要な低レベルな機能を提供します。src/pkg/runtimeディレクトリには、Goランタイムのソースコードが含まれており、C言語やアセンブリ言語で書かれたプラットフォーム固有のコードも含まれています。

runtime·open関数

Goランタイムでは、オペレーティングシステムのシステムコールを直接呼び出すのではなく、ランタイムが提供するラッパー関数を介してアクセスすることが一般的です。runtime·openは、ファイルを開くためのシステムコール(Unix系OSのopen()に相当)をGoランタイムがラップした関数です。この関数は、ファイルパス、アクセスモード(読み取り、書き込みなど)、およびオプションのパーミッションなどの引数を受け取ります。

OREADOCEXEC

これらはPlan 9におけるファイルオープンモードのフラグです。

  • OREAD: ファイルを読み取り専用で開くことを示します。
  • OCEXEC: ファイルディスクリプタがexecシステムコール(新しいプログラムを実行する際に使用される)によってクローズされるべきであることを示します。これは、子プロセスに不要なファイルディスクリプタが継承されるのを防ぐために使用されます。

型キャスト ((byte*))

C言語では、ポインタの型を別の型に明示的に変換することを型キャストと呼びます。このコミットの変更前には、文字列リテラル("/dev/bintime")がbyte*型にキャストされていました。これは、runtime·openがファイルパスをバイト列として受け取ることを期待していたためと考えられます。しかし、新しいシグネチャではこのキャストが不要になった、あるいは異なる型を期待するようになったため、削除されています。

技術的詳細

この修正は、GoランタイムがPlan 9の32ビット環境でファイルを開く際に使用するruntime·open関数の呼び出し規約の変更に対応するものです。

一般的なopen()システムコールは、通常、ファイルパス、フラグ(読み取り/書き込みモードなど)、そしてオプションでパーミッション(ファイル作成時)の3つの引数を取ります。しかし、Goランタイムの内部実装や特定のプラットフォーム(この場合はPlan 9)のシステムコールラッパーは、そのシグネチャが異なる場合があります。

コミットメッセージにある「CL 7543043によるruntime·openのグローバルな再定義」とは、Goのソースコード管理システムにおける変更セット(Change List)を指します。この変更によって、runtime·open関数の定義が更新され、その結果、呼び出し元も新しい定義に合わせる必要が生じました。

具体的には、以下の2点が変更されました。

  1. 3つ目の引数の追加: 以前は2つの引数で呼び出されていたruntime·openが、3つ目の引数を必要とするようになりました。この3つ目の引数は、通常、ファイル作成時のパーミッション(モード)を指定するために使用されますが、このケースでは0が渡されており、これはデフォルトのパーミッションを使用するか、あるいはこのコンテキストでは不要であることを示唆しています。
  2. 文字列へのキャストの削除: 以前はファイルパスの文字列リテラル"/dev/bintime"byte*に明示的にキャストされていました。これは、runtime·openchar*ではなくbyte*(Goの[]byteに相当するCの型)を期待していたためと考えられます。しかし、新しいシグネチャでは、このキャストが不要になったか、あるいはコンパイラが文字列リテラルを適切な型に自動的に変換できるようになったため、削除されました。

これらの変更は、Goランタイムの内部的なAPIの整合性を保ち、特に異なるアーキテクチャやOS上での互換性を維持するために行われます。Plan 9の32ビット環境でビルドが失敗したのは、コンパイラが新しいruntime·openのシグネチャと、古い呼び出し方との不一致を検出したためです。

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

--- a/src/pkg/runtime/time_plan9_386.c
+++ b/src/pkg/runtime/time_plan9_386.c
@@ -24,7 +24,7 @@ runtime·nanotime(void)
 	// file descriptor) is roughly four times slower
 	// in 9vx on a 2.16 GHz Intel Core 2 Duo.
 
-	if(fd < 0 && (fd = runtime·open((byte*)\"/dev/bintime\", OREAD|OCEXEC)) < 0)
+	if(fd < 0 && (fd = runtime·open(\"/dev/bintime\", OREAD|OCEXEC, 0)) < 0)
 		return 0;
 	if(runtime·pread(fd, b, sizeof b, 0) != sizeof b)
 		return 0;

コアとなるコードの解説

変更はsrc/pkg/runtime/time_plan9_386.cファイルの以下の行にあります。

変更前:

if(fd < 0 && (fd = runtime·open((byte*)"/dev/bintime", OREAD|OCEXEC)) < 0)

変更後:

if(fd < 0 && (fd = runtime·open("/dev/bintime", OREAD|OCEXEC, 0)) < 0)

このコードスニペットは、runtime·nanotime関数の一部であり、システム時刻を取得するために/dev/bintimeという特殊なデバイスファイルを開こうとしています。

変更のポイントは以下の通りです。

  1. byte*キャストの削除:

    • 変更前: (byte*)"/dev/bintime"
    • 変更後: "/dev/bintime" 以前は文字列リテラル"/dev/bintime"byte*型に明示的にキャストされていました。これは、runtime·openがファイルパスをバイト配列として受け取ることを期待していたためです。しかし、CL 7543043によるruntime·openの再定義により、このキャストが不要になったか、あるいはコンパイラが文字列リテラルを適切なポインタ型に自動的に変換できるようになったため、削除されました。これにより、コードがより簡潔になり、Goの内部的な型システムとの整合性が向上しました。
  2. 3つ目の引数0の追加:

    • 変更前: runtime·open(..., OREAD|OCEXEC) (2引数)
    • 変更後: runtime·open(..., OREAD|OCEXEC, 0) (3引数) runtime·open関数のシグネチャが変更され、3つ目の引数が必要になりました。この引数に0が渡されています。一般的なopen()システムコールでは、3つ目の引数はファイル作成時のパーミッション(モード)を指定するために使用されます。この場合、/dev/bintimeは既存のデバイスファイルであるため、パーミッションの指定は不要であり、0を渡すことでデフォルトの動作を維持するか、あるいはこのコンテキストでは無視されることを示しています。この変更により、runtime·openの新しいAPI規約に準拠し、ビルドエラーが解消されました。

この修正は、Goランタイムの内部的なAPI変更に追従し、特定のプラットフォーム(Plan 9の32ビット環境)でのビルドの互換性を維持するために不可欠でした。

関連リンク

参考にした情報源リンク

  • Go言語のコミットページ: https://golang.org/cl/7644047
  • Go言語の変更セット (CL 7543043) に関する情報 (Web検索結果に基づく):
    • Goのコミット履歴や関連するメーリングリストの議論 (例: golang-devメーリングリストのアーカイブ)
    • Goのソースコード内のruntime·openの定義変更に関するコミット
  • Plan 9のopenシステムコールに関するドキュメント (Web検索結果に基づく):
    • Plan 9のmanページや関連するドキュメント
  • C言語の型キャストに関する一般的な情報
  • Goランタイムの内部構造に関する一般的な情報# [インデックス 15738] ファイルの概要

このコミットは、Go言語のランタイムにおけるPlan 9オペレーティングシステム向けの32ビットビルドに関する修正です。具体的には、runtime·open関数の呼び出し方を更新することで、ビルドエラーを解決しています。

コミット

commit 293c880f13482374a4f4964902c45d8421764ae9
Author: Akshat Kumar <seed@mail.nanosouffle.net>
Date:   Tue Mar 12 23:10:18 2013 +0100

    runtime: Plan 9, 32-bit: fix build by updating call to open()
    
    With the global redefinition of runtime·open by CL 7543043,
    we need to provide a third argument and remove the cast
    to the string.
    
    Fixes build on 386 version of Plan 9.
    
    R=khr, rsc, rminnich, ality
    CC=golang-dev
    https://golang.org/cl/7644047

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

https://github.com/golang/go/commit/293c880f13482374a4f4964902c45d8421764ae9

元コミット内容

    runtime: Plan 9, 32-bit: fix build by updating call to open()
    
    With the global redefinition of runtime·open by CL 7543043,
    we need to provide a third argument and remove the cast
    to the string.
    
    Fixes build on 386 version of Plan 9.

変更の背景

この変更の背景には、Goランタイムにおけるruntime·open関数のグローバルな再定義があります。コミットメッセージに記載されている「CL 7543043」によって、runtime·open関数のシグネチャ(引数の数や型)が変更されました。

以前のruntime·openの呼び出しでは、ファイルパスの文字列をbyte*にキャストしていましたが、新しいシグネチャではこのキャストが不要になり、さらに3つ目の引数が必要となりました。この変更が適用された後、Plan 9の32ビット(386)環境でのGoのビルドが失敗するようになりました。

このコミットは、このビルドエラーを修正するために、src/pkg/runtime/time_plan9_386.cファイル内のruntime·openの呼び出しを、新しいシグネチャに合わせて更新することを目的としています。これにより、Plan 9の386アーキテクチャ上でのGoのビルドが再び成功するようになります。

前提知識の解説

Plan 9 from Bell Labs

Plan 9は、ベル研究所によって開発された分散オペレーティングシステムです。Unixの概念をさらに推し進め、すべてのリソース(ファイル、デバイス、ネットワーク接続など)をファイルとして表現し、それらをファイルシステムを通じてアクセスするという「すべてはファイルである」という哲学を徹底しています。特に、ネットワーク透過性や、ユーザーごとに異なる名前空間を持つことなどが特徴です。Go言語の開発者の一部はPlan 9の開発にも携わっており、Go言語の設計思想にもPlan 9の影響が見られます。

Goランタイム (runtime)

Go言語のプログラムは、Goランタイムと呼ばれる軽量な実行環境上で動作します。このランタイムは、ガベージコレクション、スケジューリング、システムコールインターフェースなど、Goプログラムの実行に必要な低レベルな機能を提供します。src/pkg/runtimeディレクトリには、Goランタイムのソースコードが含まれており、C言語やアセンブリ言語で書かれたプラットフォーム固有のコードも含まれています。

runtime·open関数

Goランタイムでは、オペレーティングシステムのシステムコールを直接呼び出すのではなく、ランタイムが提供するラッパー関数を介してアクセスすることが一般的です。runtime·openは、ファイルを開くためのシステムコール(Unix系OSのopen()に相当)をGoランタイムがラップした関数です。この関数は、ファイルパス、アクセスモード(読み取り、書き込みなど)、およびオプションのパーミッションなどの引数を受け取ります。

OREADOCEXEC

これらはPlan 9におけるファイルオープンモードのフラグです。

  • OREAD: ファイルを読み取り専用で開くことを示します。
  • OCEXEC: ファイルディスクリプタがexecシステムコール(新しいプログラムを実行する際に使用される)によってクローズされるべきであることを示します。これは、子プロセスに不要なファイルディスクリプタが継承されるのを防ぐために使用されます。

型キャスト ((byte*))

C言語では、ポインタの型を別の型に明示的に変換することを型キャストと呼びます。このコミットの変更前には、文字列リテラル("/dev/bintime")がbyte*にキャストされていました。これは、runtime·openがファイルパスをバイト列として受け取ることを期待していたためと考えられます。しかし、新しいシグネチャではこのキャストが不要になった、あるいは異なる型を期待するようになったため、削除されています。

技術的詳細

この修正は、GoランタイムがPlan 9の32ビット環境でファイルを開く際に使用するruntime·open関数の呼び出し規約の変更に対応するものです。

一般的なopen()システムコールは、通常、ファイルパス、フラグ(読み取り/書き込みモードなど)、そしてオプションでパーミッション(ファイル作成時)の3つの引数を取ります。しかし、Goランタイムの内部実装や特定のプラットフォーム(この場合はPlan 9)のシステムコールラッパーは、そのシグネチャが異なる場合があります。

コミットメッセージにある「CL 7543043によるruntime·openのグローバルな再定義」とは、Goのソースコード管理システムにおける変更セット(Change List)を指します。この変更によって、runtime·open関数の定義が更新され、その結果、呼び出し元も新しい定義に合わせる必要が生じました。

具体的には、以下の2点が変更されました。

  1. 3つ目の引数の追加: 以前は2つの引数で呼び出されていたruntime·openが、3つ目の引数を必要とするようになりました。この3つ目の引数は、通常、ファイル作成時のパーミッション(モード)を指定するために使用されますが、このケースでは0が渡されており、これはデフォルトのパーミッションを使用するか、あるいはこのコンテキストでは不要であることを示唆しています。
  2. 文字列へのキャストの削除: 以前はファイルパスの文字列リテラル"/dev/bintime"byte*に明示的にキャストされていました。これは、runtime·openchar*ではなくbyte*(Goの[]byteに相当するCの型)を期待していたためと考えられます。しかし、新しいシグネチャでは、このキャストが不要になったか、あるいはコンパイラが文字列リテラルを適切な型に自動的に変換できるようになったため、削除されました。

これらの変更は、Goランタイムの内部的なAPIの整合性を保ち、特に異なるアーキテクチャやOS上での互換性を維持するために行われます。Plan 9の32ビット環境でビルドが失敗したのは、コンパイラが新しいruntime·openのシグネチャと、古い呼び出し方との不一致を検出したためです。

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

--- a/src/pkg/runtime/time_plan9_386.c
+++ b/src/pkg/runtime/time_plan9_386.c
@@ -24,7 +24,7 @@ runtime·nanotime(void)
 	// file descriptor) is roughly four times slower
 	// in 9vx on a 2.16 GHz Intel Core 2 Duo.
 
-	if(fd < 0 && (fd = runtime·open((byte*)\"/dev/bintime\", OREAD|OCEXEC)) < 0)
+	if(fd < 0 && (fd = runtime·open(\"/dev/bintime\", OREAD|OCEXEC, 0)) < 0)
 		return 0;
 	if(runtime·pread(fd, b, sizeof b, 0) != sizeof b)
 		return 0;

コアとなるコードの解説

変更はsrc/pkg/runtime/time_plan9_386.cファイルの以下の行にあります。

変更前:

if(fd < 0 && (fd = runtime·open((byte*)"/dev/bintime", OREAD|OCEXEC)) < 0)

変更後:

if(fd < 0 && (fd = runtime·open("/dev/bintime", OREAD|OCEXEC, 0)) < 0)

このコードスニペットは、runtime·nanotime関数の一部であり、システム時刻を取得するために/dev/bintimeという特殊なデバイスファイルを開こうとしています。

変更のポイントは以下の通りです。

  1. byte*キャストの削除:

    • 変更前: (byte*)"/dev/bintime"
    • 変更後: "/dev/bintime" 以前は文字列リテラル"/dev/bintime"byte*型に明示的にキャストされていました。これは、runtime·openがファイルパスをバイト配列として受け取ることを期待していたためです。しかし、CL 7543043によるruntime·openの再定義により、このキャストが不要になったか、あるいはコンパイラが文字列リテラルを適切なポインタ型に自動的に変換できるようになったため、削除されました。これにより、コードがより簡潔になり、Goの内部的な型システムとの整合性が向上しました。
  2. 3つ目の引数0の追加:

    • 変更前: runtime·open(..., OREAD|OCEXEC) (2引数)
    • 変更後: runtime·open(..., OREAD|OCEXEC, 0) (3引数) runtime·open関数のシグネチャが変更され、3つ目の引数が必要になりました。この引数に0が渡されています。一般的なopen()システムコールでは、3つ目の引数はファイル作成時のパーミッション(モード)を指定するために使用されます。この場合、/dev/bintimeは既存のデバイスファイルであるため、パーミッションの指定は不要であり、0を渡すことでデフォルトの動作を維持するか、あるいはこのコンテキストでは無視されることを示しています。この変更により、runtime·openの新しいAPI規約に準拠し、ビルドエラーが解消されました。

この修正は、Goランタイムの内部的なAPI変更に追従し、特定のプラットフォーム(Plan 9の32ビット環境)でのビルドの互換性を維持するために不可欠でした。

関連リンク

参考にした情報源リンク

  • Go言語のコミットページ: https://golang.org/cl/7644047
  • Go言語の変更セット (CL 7543043) に関する情報 (Web検索結果に基づく):
    • Goのコミット履歴や関連するメーリングリストの議論 (例: golang-devメーリングリストのアーカイブ)
    • Goのソースコード内のruntime·openの定義変更に関するコミット
  • Plan 9のopenシステムコールに関するドキュメント (Web検索結果に基づく):
    • Plan 9のmanページや関連するドキュメント
  • C言語の型キャストに関する一般的な情報
  • Goランタイムの内部構造に関する一般的な情報