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

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

このコミットは、Go言語の標準ライブラリのAPI変更を追跡する api/next.txt ファイルを更新するものです。具体的には、syscall パッケージにFreeBSD、OpenBSD、およびWindows向けの新しい定数、型、関数が追加されたことを反映しています。これは、Goがこれらのオペレーティングシステム上でより低レベルのシステムコール機能を提供するための継続的な取り組みの一環です。

コミット

commit 077faf28511232203177f2fa6199561a6231e431
Author: Brad Fitzpatrick <bradfitz@golang.org>
Date:   Tue Jan 14 10:18:43 2014 -0800

    api: update next.txt
    
    Now with more syscall!
    
    R=golang-codereviews, minux.ma
    CC=golang-codereviews
    https://golang.org/cl/52150043

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

https://github.com/golang/go/commit/077faf28511232203177f2fa6199561a6231e431

元コミット内容

このコミットは、api/next.txt ファイルを更新し、Goの syscall パッケージに以下の変更が加えられたことを記録しています。

  • FreeBSD (386, amd64, およびcgo版): Termios 型とそのフィールド (Cc, Cflag, Iflag, Ispeed, Lflag, Oflag, Ospeed) の追加。
  • OpenBSD (386, amd64, およびcgo版): 多数の MADV_* (メモリ助言)、MAP_* (メモリマップ)、MCL_* (メモリロック)、MS_* (メモリ同期)、PROT_* (メモリ保護) 定数の追加。
  • Windows (386, amd64): ERROR_NETNAME_DELETED, IOC_VENDOR, SIO_KEEPALIVE_VALS, WSAECONNRESET といったエラーコードやIOCTL定数、NewCallbackCDecl 関数、そして TCPKeepalive 型とそのフィールド (Interval, OnOff, Time) の追加。また、以前存在した NewCallbackCDecl のエントリが削除されていますが、これは重複または移動によるものと推測されます。

コミットメッセージは簡潔に「Now with more syscall!」と述べており、syscall パッケージの機能拡張を強調しています。

変更の背景

Go言語は、クロスプラットフォーム対応を重視しており、様々なオペレーティングシステム上で動作するアプリケーションを開発できるように設計されています。syscall パッケージは、Goプログラムが基盤となるOSのシステムコールに直接アクセスするためのインターフェースを提供します。これにより、ファイル操作、ネットワーク通信、プロセス管理、メモリ管理など、低レベルのOS機能を利用できます。

このコミットの背景には、Goがサポートする各OS(特にFreeBSD、OpenBSD、Windows)において、より多くのシステムコールや関連する定数、データ構造をGoの syscall パッケージを通じて利用可能にすることで、GoプログラムがこれらのOSの機能をより深く、より効率的に活用できるようにするという目的があります。

  • FreeBSDのTermios: ターミナルI/O制御のための標準的なインターフェースであり、Goプログラムがシリアルポートやコンソールなどのターミナルデバイスと対話する際に必要となります。
  • OpenBSDのメモリ関連定数: mmapmadvise といったメモリ管理システムコールで使用される定数であり、Goプログラムがメモリをより細かく制御したり、パフォーマンスを最適化したりするために重要です。
  • Windowsのネットワーク・エラー関連: Windows固有のネットワークエラーコードやソケットオプション、コールバックメカニズムなどをGoから利用できるようにすることで、Windows上でのネットワークプログラミングの柔軟性と堅牢性を向上させます。

api/next.txt は、Goの次期リリースで公開される予定のAPI変更を記録するためのファイルです。このファイルが更新されるということは、これらの syscall 関連の機能がGoの公式APIとして提供される準備が整ったことを意味します。

前提知識の解説

このコミットを理解するためには、以下の概念に関する前提知識が役立ちます。

  1. システムコール (System Call): オペレーティングシステムが提供するサービスを、ユーザー空間のプログラムが利用するためのインターフェースです。ファイルI/O、メモリ管理、プロセス制御、ネットワーク通信など、OSカーネルが提供する低レベルの機能にアクセスするために使用されます。Goの syscall パッケージは、これらのシステムコールをGo言語から呼び出すためのラッパーを提供します。

  2. api/next.txt: Goプロジェクトにおける特別なファイルで、次期メジャーリリースでGoの公開APIに追加される予定の変更(新しい関数、型、定数など)を記録します。このファイルは、GoのAPI互換性ポリシー(Go 1互換性保証)を維持するために非常に重要です。このファイルにエントリが追加されることで、そのAPIが将来のGoバージョンでも安定して利用できることが保証されます。

  3. Goの syscall パッケージ: Go言語の標準ライブラリの一部であり、オペレーティングシステム固有のシステムコールへの低レベルなアクセスを提供します。このパッケージは、OSに依存する処理(例: ファイルディスクリプタの操作、ソケットオプションの設定、プロセス間通信など)をGoから直接行う必要がある場合に利用されます。通常、高レベルな標準ライブラリ(os, net など)が syscall パッケージを内部的に利用しています。

  4. Termios 構造体 (Unix系OS): Unix系オペレーティングシステム(FreeBSD、Linux、macOSなど)で、ターミナルデバイス(シリアルポート、コンソールなど)の属性(ボーレート、文字サイズ、エコーの有無、特殊文字など)を制御するために使用されるデータ構造です。tcgetattrtcsetattr といったシステムコールを通じて操作されます。

  5. メモリ管理関連のシステムコールと定数 (Unix系OS):

    • mmap (memory map): ファイルやデバイスをプロセスのアドレス空間にマッピングしたり、匿名メモリ領域を確保したりするためのシステムコールです。
    • madvise (memory advise): カーネルに対して、特定のメモリ領域の利用パターンに関する助言(例: アクセス頻度、解放の可能性など)を与えるためのシステムコールです。これにより、カーネルはメモリ管理の最適化を行うことができます。
    • mlock / munlock (memory lock): プロセスのアドレス空間内のページを物理メモリにロックし、スワップアウトされないようにするためのシステムコールです。リアルタイムアプリケーションなどで使用されます。
    • PROT_* 定数: mmapmprotect システムコールで、メモリ領域のアクセス権限(読み取り、書き込み、実行)を指定するために使用されます。
    • MAP_* 定数: mmap システムコールで、メモリマッピングの動作(共有、プライベート、匿名など)を指定するために使用されます。
    • MADV_* 定数: madvise システムコールで、メモリ利用パターンに関する助言の種類を指定するために使用されます。
    • MCL_* 定数: mlockall システムコールで、メモリロックの範囲(現在のメモリ、将来確保されるメモリ)を指定するために使用されます。
    • MS_* 定数: msync システムコールで、メモリマップされたファイルの同期動作を指定するために使用されます。
  6. Windows APIとシステムコール: Windowsオペレーティングシステムは、Win32 APIを通じてシステム機能を提供します。Goの syscall パッケージは、これらのWin32 API関数をGoから呼び出すためのインターフェースを提供します。

    • エラーコード: Windows API関数は、成功または失敗を示すために特定のエラーコードを返します。ERROR_NETNAME_DELETEDWSAECONNRESET は、ネットワーク関連の一般的なエラーコードです。
    • IOCTL (Input/Output Control): デバイスドライバに直接コマンドを送信するためのメカニズムです。IOC_VENDOR は、ベンダー固有のIOCTLコードの範囲を示す定数の一部です。
    • SIO_KEEPALIVE_VALS: WindowsソケットAPI (Winsock) で、TCPキープアライブの動作(アイドル時間、再送間隔)を設定するためのIOCTLコマンドです。
    • NewCallbackCDecl: Goの関数ポインタをC言語の __cdecl 呼び出し規約に準拠するコールバック関数としてWindows APIに渡すためのメカニズムです。

技術的詳細

このコミットで追加された各要素は、それぞれのOSにおける低レベルプログラミングの重要な側面をカバーしています。

FreeBSD Termios

Termios 構造体は、Unix系システムにおけるPOSIXターミナルインターフェースの一部です。Goの syscall パッケージにこの構造体とそのフィールドが追加されることで、GoプログラムはFreeBSD上で以下の操作を直接行えるようになります。

  • ターミナル属性の取得と設定: tcgetattr (現在の属性を取得) および tcsetattr (新しい属性を設定) システムコールを通じて、ターミナルの動作(例: 入力モード、出力モード、制御文字、ローカルモードなど)をプログラムから制御できます。
  • シリアル通信: シリアルポートを介したデバイスとの通信において、ボーレート、パリティ、ストップビットなどの設定をGoから直接行えるようになります。
  • コンソールI/Oのカスタマイズ: Goで書かれたCLIツールやインタラクティブなアプリケーションが、FreeBSDのコンソールや擬似ターミナル(pty)の動作をより細かく制御できるようになります。例えば、エコーを無効にしたり、特殊文字の処理を変更したりすることが可能です。

Cc フィールドは制御文字の配列、Cflag は制御モードフラグ、Iflag は入力モードフラグ、Oflag は出力モードフラグ、Lflag はローカルモードフラグ、IspeedOspeed は入力および出力のボーレートをそれぞれ表します。これらのフィールドをGoの型として定義することで、GoプログラムはC言語の構造体と直接やり取りすることなく、型安全な方法でターミナル属性を操作できます。

OpenBSD メモリ管理定数

OpenBSD向けの MADV_*, MAP_*, MCL_*, MS_*, PROT_* 定数の追加は、GoプログラムがOpenBSD上で高度なメモリ管理を行うための基盤を強化します。

  • MADV_* (Memory Advise):

    • MADV_DONTNEED: 指定されたメモリ範囲のページがもはや必要ないことをカーネルに通知します。これにより、カーネルはこれらのページを解放し、物理メモリを再利用できます。
    • MADV_FREE: ページがもはや必要ないことを示しますが、すぐに解放するのではなく、必要になったときに再利用される可能性があります。
    • MADV_NORMAL, MADV_RANDOM, MADV_SEQUENTIAL: メモリのアクセスパターン(通常、ランダム、シーケンシャル)をカーネルに通知し、プリフェッチやキャッシュ戦略の最適化に役立てます。
    • MADV_WILLNEED: 指定されたメモリ範囲のページがすぐに必要になることをカーネルに通知し、プリフェッチを促します。 これらの定数により、Goプログラムはメモリ使用量を最適化し、パフォーマンスを向上させることができます。
  • MAP_* (Memory Map):

    • MAP_ANON: ファイルではなく、匿名メモリ領域をマッピングします。
    • MAP_PRIVATE: マッピングがプライベートであり、書き込み時にコピーオンライトが発生することを示します。
    • MAP_SHARED: マッピングが共有され、他のプロセスと変更が共有されることを示します。
    • MAP_FIXED: 指定されたアドレスにマッピングを配置しようとします。 これらの定数は、mmap システムコールを使用して、共有メモリ、匿名メモリ、またはファイルマッピングをGoプログラム内で柔軟に作成するために不可欠です。
  • PROT_* (Protection):

    • PROT_READ, PROT_WRITE, PROT_EXEC, PROT_NONE: メモリ領域の読み取り、書き込み、実行、またはアクセスなしの権限を指定します。これらは mmapmprotect システムコールで使用され、セキュリティとメモリ保護を強化します。

これらの定数がGoの syscall パッケージに公開されることで、Goで書かれたデータベースシステム、高性能なサーバー、またはカスタムメモリマネージャなどが、OpenBSDのメモリ管理機能を最大限に活用できるようになります。

Windows syscall 拡張

Windows向けの追加は、GoがWindows環境でより堅牢なネットワークアプリケーションを構築するためのサポートを強化します。

  • ERROR_NETNAME_DELETED (64): ネットワーク接続が切断されたことを示すWindowsエラーコードです。共有フォルダへのアクセス中にネットワーク接続が失われた場合などに発生します。Goプログラムがこのエラーを適切に処理することで、ネットワーク障害に対する回復力を高めることができます。

  • IOC_VENDOR (402653184): IOCTL (Input/Output Control) コードの一部で、ベンダー固有のIOCTLコマンドの範囲を示します。これにより、Goプログラムは特定のハードウェアデバイスやドライバと低レベルで通信するためのカスタムIOCTLコマンドを送信できるようになります。

  • SIO_KEEPALIVE_VALS (2550136836): Winsock (Windows Sockets API) のIOCTLコマンドで、TCPキープアライブの動作を制御するために使用されます。これには、TCPKeepalive 構造体が関連します。

    • TCPKeepalive 構造体:
      • OnOff: キープアライブを有効にするか無効にするか (1 または 0)。
      • Time: アイドル状態が何ミリ秒続いたら最初のキープアライブプローブを送信するか。
      • Interval: 最初のプローブが送信された後、キープアライブプローブを何ミリ秒間隔で再送するか。 この機能により、Goで書かれたネットワークアプリケーションは、アイドル状態のTCP接続が切断されていないことを確認したり、ネットワーク障害時に迅速に接続の切断を検出したりすることができます。
  • WSAECONNRESET (10054): Winsockエラーコードで、リモートホストが既存のTCP接続を強制的に切断したことを示します。これは、リモートアプリケーションがクラッシュしたり、ソケットを適切にシャットダウンせずに終了したりした場合によく発生します。Goプログラムがこのエラーを認識し、適切に処理することで、ネットワーク通信の信頼性を向上させることができます。

  • NewCallbackCDecl: Goの関数をC言語の __cdecl 呼び出し規約に準拠するコールバック関数としてWindows APIに渡すためのメカニズムです。Windows APIの多くはコールバック関数を引数として受け取りますが、Goの関数とCの呼び出し規約は異なるため、この変換が必要です。これにより、GoプログラムはWindowsのイベント処理、列挙関数、非同期I/Oなど、コールバックを多用するAPIとシームレスに連携できるようになります。

これらのWindows固有の要素が追加されることで、GoはWindowsプラットフォーム上でのシステムプログラミング能力を向上させ、より複雑で高性能なアプリケーションの開発を可能にします。

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

このコミットのコアとなる変更は、api/next.txt ファイルへの追加と削除です。

--- a/api/next.txt
+++ b/api/next.txt
@@ -117,6 +117,38 @@ pkg sync, method (*Pool) Get() interface{}
 pkg sync, method (*Pool) Put(interface{})
 pkg sync, type Pool struct
 pkg sync, type Pool struct, New func() interface{}
+pkg syscall (freebsd-386), type Termios struct
+pkg syscall (freebsd-386), type Termios struct, Cc [20]uint8
+pkg syscall (freebsd-386), type Termios struct, Cflag uint32
+pkg syscall (freebsd-386), type Termios struct, Iflag uint32
+pkg syscall (freebsd-386), type Termios struct, Ispeed uint32
+pkg syscall (freebsd-386), type Termios struct, Lflag uint32
+pkg syscall (freebsd-386), type Termios struct, Oflag uint32
+pkg syscall (freebsd-386), type Termios struct, Ospeed uint32
+pkg syscall (freebsd-386-cgo), type Termios struct
+pkg syscall (freebsd-386-cgo), type Termios struct, Cc [20]uint8
+pkg syscall (freebsd-386-cgo), type Termios struct, Cflag uint32
+pkg syscall (freebsd-386-cgo), type Termios struct, Iflag uint32
+pkg syscall (freebsd-386-cgo), type Termios struct, Ispeed uint32
+pkg syscall (freebsd-386-cgo), type Termios struct, Lflag uint32
+pkg syscall (freebsd-386-cgo), type Termios struct, Oflag uint32
+pkg syscall (freebsd-386-cgo), type Termios struct, Ospeed uint32
+pkg syscall (freebsd-amd64), type Termios struct
+pkg syscall (freebsd-amd64), type Termios struct, Cc [20]uint8
+pkg syscall (freebsd-amd64), type Termios struct, Cflag uint32
+pkg syscall (freebsd-amd64), type Termios struct, Iflag uint32
+pkg syscall (freebsd-amd64), type Termios struct, Ispeed uint32
+pkg syscall (freebsd-amd64), type Termios struct, Lflag uint32
+pkg syscall (freebsd-amd64), type Termios struct, Oflag uint32
+pkg syscall (freebsd-amd64), type Termios struct, Ospeed uint32
+pkg syscall (freebsd-amd64-cgo), type Termios struct
+pkg syscall (freebsd-amd64-cgo), type Termios struct, Cc [20]uint8
+pkg syscall (freebsd-amd64-cgo), type Termios struct, Cflag uint32
+pkg syscall (freebsd-amd64-cgo), type Termios struct, Iflag uint32
+pkg syscall (freebsd-amd64-cgo), type Termios struct, Ispeed uint32
+pkg syscall (freebsd-amd64-cgo), type Termios struct, Lflag uint32
+pkg syscall (freebsd-amd64-cgo), type Termios struct, Oflag uint32
+pkg syscall (freebsd-amd64-cgo), type Termios struct, Ospeed uint32
  pkg syscall (netbsd-386), const CLONE_CSIGNAL = 255
  pkg syscall (netbsd-386), const CLONE_CSIGNAL ideal-int
  pkg syscall (netbsd-386), const CLONE_FILES = 1024
@@ -509,8 +541,6 @@ pkg syscall (netbsd-amd64-cgo), const PROT_READ = 1
  pkg syscall (netbsd-amd64-cgo), const PROT_READ ideal-int
  pkg syscall (netbsd-amd64-cgo), const PROT_WRITE = 2
  pkg syscall (netbsd-amd64-cgo), const PROT_WRITE ideal-int
--pkg syscall (windows-386), func NewCallbackCDecl(interface{}) uintptr
--pkg syscall (windows-amd64), func NewCallbackCDecl(interface{}) uintptr
  pkg syscall (openbsd-386), const BIOCGRTIMEOUT = 1074545262
  pkg syscall (openbsd-386), const BIOCSRTIMEOUT = 2148287085
  pkg syscall (openbsd-386), const IPPROTO_DIVERT_INIT = 2
@@ -521,6 +551,72 @@ pkg syscall (openbsd-386), const IPV6_RECVDSTPORT = 64
  pkg syscall (openbsd-386), const IPV6_RECVDSTPORT ideal-int
  pkg syscall (openbsd-386), const IP_DIVERTFL = 4130
  pkg syscall (openbsd-386), const IP_DIVERTFL ideal-int
+pkg syscall (openbsd-386), const MADV_DONTNEED = 4
+pkg syscall (openbsd-386), const MADV_DONTNEED ideal-int
+pkg syscall (openbsd-386), const MADV_FREE = 6
+pkg syscall (openbsd-386), const MADV_FREE ideal-int
+pkg syscall (openbsd-386), const MADV_NORMAL = 0
+pkg syscall (openbsd-386), const MADV_NORMAL ideal-int
+pkg syscall (openbsd-386), const MADV_RANDOM = 1
+pkg syscall (openbsd-386), const MADV_RANDOM ideal-int
+pkg syscall (openbsd-386), const MADV_SEQUENTIAL = 2
+pkg syscall (openbsd-386), const MADV_SEQUENTIAL ideal-int
+pkg syscall (openbsd-386), const MADV_SPACEAVAIL = 5
+pkg syscall (openbsd-386), const MADV_SPACEAVAIL ideal-int
+pkg syscall (openbsd-386), const MADV_WILLNEED = 3
+pkg syscall (openbsd-386), const MADV_WILLNEED ideal-int
+pkg syscall (openbsd-386), const MAP_ANON = 4096
+pkg syscall (openbsd-386), const MAP_ANON ideal-int
+pkg syscall (openbsd-386), const MAP_COPY = 4
+pkg syscall (openbsd-386), const MAP_COPY ideal-int
+pkg syscall (openbsd-386), const MAP_FILE = 0
+pkg syscall (openbsd-386), const MAP_FILE ideal-int
+pkg syscall (openbsd-386), const MAP_FIXED = 16
+pkg syscall (openbsd-386), const MAP_FIXED ideal-int
+pkg syscall (openbsd-386), const MAP_FLAGMASK = 8183
+pkg syscall (openbsd-386), const MAP_FLAGMASK ideal-int
+pkg syscall (openbsd-386), const MAP_HASSEMAPHORE = 512
+pkg syscall (openbsd-386), const MAP_HASSEMAPHORE ideal-int
+pkg syscall (openbsd-386), const MAP_INHERIT = 128
+pkg syscall (openbsd-386), const MAP_INHERIT ideal-int
+pkg syscall (openbsd-386), const MAP_INHERIT_COPY = 1
+pkg syscall (openbsd-386), const MAP_INHERIT_COPY ideal-int
+pkg syscall (openbsd-386), const MAP_INHERIT_DONATE_COPY = 3
+pkg syscall (openbsd-386), const MAP_INHERIT_DONATE_COPY ideal-int
+pkg syscall (openbsd-386), const MAP_INHERIT_NONE = 2
+pkg syscall (openbsd-386), const MAP_INHERIT_NONE ideal-int
+pkg syscall (openbsd-386), const MAP_INHERIT_SHARE = 0
+pkg syscall (openbsd-386), const MAP_INHERIT_SHARE ideal-int
+pkg syscall (openbsd-386), const MAP_NOEXTEND = 256
+pkg syscall (openbsd-386), const MAP_NOEXTEND ideal-int
+pkg syscall (openbsd-386), const MAP_NORESERVE = 64
+pkg syscall (openbsd-386), const MAP_NORESERVE ideal-int
+pkg syscall (openbsd-386), const MAP_PRIVATE = 2
+pkg syscall (openbsd-386), const MAP_PRIVATE ideal-int
+pkg syscall (openbsd-386), const MAP_RENAME = 32
+pkg syscall (openbsd-386), const MAP_RENAME ideal-int
+pkg syscall (openbsd-386), const MAP_SHARED = 1
+pkg syscall (openbsd-386), const MAP_SHARED ideal-int
+pkg syscall (openbsd-386), const MAP_TRYFIXED = 1024
+pkg syscall (openbsd-386), const MAP_TRYFIXED ideal-int
+pkg syscall (openbsd-386), const MCL_CURRENT = 1
+pkg syscall (openbsd-386), const MCL_CURRENT ideal-int
+pkg syscall (openbsd-386), const MCL_FUTURE = 2
+pkg syscall (openbsd-386), const MCL_FUTURE ideal-int
+pkg syscall (openbsd-386), const MS_ASYNC = 1
+pkg syscall (openbsd-386), const MS_ASYNC ideal-int
+pkg syscall (openbsd-386), const MS_INVALIDATE = 4
+pkg syscall (openbsd-386), const MS_INVALIDATE ideal-int
+pkg syscall (openbsd-386), const MS_SYNC = 2
+pkg syscall (openbsd-386), const MS_SYNC ideal-int
+pkg syscall (openbsd-386), const PROT_EXEC = 4
+pkg syscall (openbsd-386), const PROT_EXEC ideal-int
+pkg syscall (openbsd-386), const PROT_NONE = 0
+pkg syscall (openbsd-386), const PROT_NONE ideal-int
+pkg syscall (openbsd-386), const PROT_READ = 1
+pkg syscall (openbsd-386), const PROT_READ ideal-int
+pkg syscall (openbsd-386), const PROT_WRITE = 2
+pkg syscall (openbsd-386), const PROT_WRITE ideal-int
  pkg syscall (openbsd-386), const RTF_FMASK = 1112072
  pkg syscall (openbsd-386), const RTM_VERSION = 5
  pkg syscall (openbsd-386), const SIOCBRDGDADDR = 2166909255
@@ -608,6 +704,72 @@ pkg syscall (openbsd-386-cgo), const IPV6_RECVDSTPORT = 64
  pkg syscall (openbsd-386-cgo), const IPV6_RECVDSTPORT ideal-int
  pkg syscall (openbsd-386-cgo), const IP_DIVERTFL = 4130
  pkg syscall (openbsd-386-cgo), const IP_DIVERTFL ideal-int
+pkg syscall (openbsd-386-cgo), const MADV_DONTNEED = 4
+pkg syscall (openbsd-386-cgo), const MADV_DONTNEED ideal-int
+pkg syscall (openbsd-386-cgo), const MADV_FREE = 6
+pkg syscall (openbsd-386-cgo), const MADV_FREE ideal-int
+pkg syscall (openbsd-386-cgo), const MADV_NORMAL = 0
+pkg syscall (openbsd-386-cgo), const MADV_NORMAL ideal-int
+pkg syscall (openbsd-386-cgo), const MADV_RANDOM = 1
+pkg syscall (openbsd-386-cgo), const MADV_RANDOM ideal-int
+pkg syscall (openbsd-386-cgo), const MADV_SEQUENTIAL = 2
+pkg syscall (openbsd-386-cgo), const MADV_SEQUENTIAL ideal-int
+pkg syscall (openbsd-386-cgo), const MADV_SPACEAVAIL = 5
+pkg syscall (openbsd-386-cgo), const MADV_SPACEAVAIL ideal-int
+pkg syscall (openbsd-386-cgo), const MADV_WILLNEED = 3
+pkg syscall (openbsd-386-cgo), const MADV_WILLNEED ideal-int
+pkg syscall (openbsd-386-cgo), const MAP_ANON = 4096
+pkg syscall (openbsd-386-cgo), const MAP_ANON ideal-int
+pkg syscall (openbsd-386-cgo), const MAP_COPY = 4
+pkg syscall (openbsd-386-cgo), const MAP_COPY ideal-int
+pkg syscall (openbsd-386-cgo), const MAP_FILE = 0
+pkg syscall (openbsd-386-cgo), const MAP_FILE ideal-int
+pkg syscall (openbsd-386-cgo), const MAP_FIXED = 16
+pkg syscall (openbsd-386-cgo), const MAP_FIXED ideal-int
+pkg syscall (openbsd-386-cgo), const MAP_FLAGMASK = 8183
+pkg syscall (openbsd-386-cgo), const MAP_FLAGMASK ideal-int
+pkg syscall (openbsd-386-cgo), const MAP_HASSEMAPHORE = 512
+pkg syscall (openbsd-386-cgo), const MAP_HASSEMAPHORE ideal-int
+pkg syscall (openbsd-386-cgo), const MAP_INHERIT = 128
+pkg syscall (openbsd-386-cgo), const MAP_INHERIT ideal-int
+pkg syscall (openbsd-386-cgo), const MAP_INHERIT_COPY = 1
+pkg syscall (openbsd-386-cgo), const MAP_INHERIT_COPY ideal-int
+pkg syscall (openbsd-386-cgo), const MAP_INHERIT_DONATE_COPY = 3
+pkg syscall (openbsd-386-cgo), const MAP_INHERIT_DONATE_COPY ideal-int
+pkg syscall (openbsd-386-cgo), const MAP_INHERIT_NONE = 2
+pkg syscall (openbsd-386-cgo), const MAP_INHERIT_NONE ideal-int
+pkg syscall (openbsd-386-cgo), const MAP_INHERIT_SHARE = 0
+pkg syscall (openbsd-386-cgo), const MAP_INHERIT_SHARE ideal-int
+pkg syscall (openbsd-386-cgo), const MAP_NOEXTEND = 256
+pkg syscall (openbsd-386-cgo), const MAP_NOEXTEND ideal-int
+pkg syscall (openbsd-386-cgo), const MAP_NORESERVE = 64
+pkg syscall (openbsd-386-cgo), const MAP_NORESERVE ideal-int
+pkg syscall (openbsd-386-cgo), const MAP_PRIVATE = 2
+pkg syscall (openbsd-386-cgo), const MAP_PRIVATE ideal-int
+pkg syscall (openbsd-386-cgo), const MAP_RENAME = 32
+pkg syscall (openbsd-386-cgo), const MAP_RENAME ideal-int
+pkg syscall (openbsd-386-cgo), const MAP_SHARED = 1
+pkg syscall (openbsd-386-cgo), const MAP_SHARED ideal-int
+pkg syscall (openbsd-386-cgo), const MAP_TRYFIXED = 1024
+pkg syscall (openbsd-386-cgo), const MAP_TRYFIXED ideal-int
+pkg syscall (openbsd-386-cgo), const MCL_CURRENT = 1
+pkg syscall (openbsd-386-cgo), const MCL_CURRENT ideal-int
+pkg syscall (openbsd-386-cgo), const MCL_FUTURE = 2
+pkg syscall (openbsd-386-cgo), const MCL_FUTURE ideal-int
+pkg syscall (openbsd-386-cgo), const MS_ASYNC = 1
+pkg syscall (openbsd-386-cgo), const MS_ASYNC ideal-int
+pkg syscall (openbsd-386-cgo), const MS_INVALIDATE = 4
+pkg syscall (openbsd-386-cgo), const MS_INVALIDATE ideal-int
+pkg syscall (openbsd-386-cgo), const MS_SYNC = 2
+pkg syscall (openbsd-386-cgo), const MS_SYNC ideal-int
+pkg syscall (openbsd-386-cgo), const PROT_EXEC = 4
+pkg syscall (openbsd-386-cgo), const PROT_EXEC ideal-int
+pkg syscall (openbsd-386-cgo), const PROT_NONE = 0
+pkg syscall (openbsd-386-cgo), const PROT_NONE ideal-int
+pkg syscall (openbsd-386-cgo), const PROT_READ = 1
+pkg syscall (openbsd-386-cgo), const PROT_READ ideal-int
+pkg syscall (openbsd-386-cgo), const PROT_WRITE = 2
+pkg syscall (openbsd-386-cgo), const PROT_WRITE ideal-int
  pkg syscall (openbsd-386-cgo), const RTF_FMASK = 1112072
  pkg syscall (openbsd-386-cgo), const RTM_VERSION = 5
  pkg syscall (openbsd-386-cgo), const SIOCBRDGDADDR = 2166909255
@@ -693,6 +855,72 @@ pkg syscall (openbsd-amd64), const IPV6_RECVDSTPORT = 64
  pkg syscall (openbsd-amd64), const IPV6_RECVDSTPORT ideal-int
  pkg syscall (openbsd-amd64), const IP_DIVERTFL = 4130
  pkg syscall (openbsd-amd64), const IP_DIVERTFL ideal-int
+pkg syscall (openbsd-amd64), const MADV_DONTNEED = 4
+pkg syscall (openbsd-amd64), const MADV_DONTNEED ideal-int
+pkg syscall (openbsd-amd64), const MADV_FREE = 6
+pkg syscall (openbsd-amd64), const MADV_FREE ideal-int
+pkg syscall (openbsd-amd64), const MADV_NORMAL = 0
+pkg syscall (openbsd-amd64), const MADV_NORMAL ideal-int
+pkg syscall (openbsd-amd64), const MADV_RANDOM = 1
+pkg syscall (openbsd-amd64), const MADV_RANDOM ideal-int
+pkg syscall (openbsd-amd64), const MADV_SEQUENTIAL = 2
+pkg syscall (openbsd-amd64), const MADV_SEQUENTIAL ideal-int
+pkg syscall (openbsd-amd64), const MADV_SPACEAVAIL = 5
+pkg syscall (openbsd-amd64), const MADV_SPACEAVAIL ideal-int
+pkg syscall (openbsd-amd64), const MADV_WILLNEED = 3
+pkg syscall (openbsd-amd64), const MADV_WILLNEED ideal-int
+pkg syscall (openbsd-amd64), const MAP_ANON = 4096
+pkg syscall (openbsd-amd64), const MAP_ANON ideal-int
+pkg syscall (openbsd-amd64), const MAP_COPY = 4
+pkg syscall (openbsd-amd64), const MAP_COPY ideal-int
+pkg syscall (openbsd-amd64), const MAP_FILE = 0
+pkg syscall (openbsd-amd64), const MAP_FILE ideal-int
+pkg syscall (openbsd-amd64), const MAP_FIXED = 16
+pkg syscall (openbsd-amd64), const MAP_FIXED ideal-int
+pkg syscall (openbsd-amd64), const MAP_FLAGMASK = 8183
+pkg syscall (openbsd-amd64), const MAP_FLAGMASK ideal-int
+pkg syscall (openbsd-amd64), const MAP_HASSEMAPHORE = 512
+pkg syscall (openbsd-amd64), const MAP_HASSEMAPHORE ideal-int
+pkg syscall (openbsd-amd64), const MAP_INHERIT = 128
+pkg syscall (openbsd-amd64), const MAP_INHERIT ideal-int
+pkg syscall (openbsd-amd64), const MAP_INHERIT_COPY = 1
+pkg syscall (openbsd-amd64), const MAP_INHERIT_COPY ideal-int
+pkg syscall (openbsd-amd64), const MAP_INHERIT_DONATE_COPY = 3
+pkg syscall (openbsd-amd64), const MAP_INHERIT_DONATE_COPY ideal-int
+pkg syscall (openbsd-amd64), const MAP_INHERIT_NONE = 2
+pkg syscall (openbsd-amd64), const MAP_INHERIT_NONE ideal-int
+pkg syscall (openbsd-amd64), const MAP_INHERIT_SHARE = 0
+pkg syscall (openbsd-amd64), const MAP_INHERIT_SHARE ideal-int
+pkg syscall (openbsd-amd64), const MAP_NOEXTEND = 256
+pkg syscall (openbsd-amd64), const MAP_NOEXTEND ideal-int
+pkg syscall (openbsd-amd64), const MAP_NORESERVE = 64
+pkg syscall (openbsd-amd64), const MAP_NORESERVE ideal-int
+pkg syscall (openbsd-amd64), const MAP_PRIVATE = 2
+pkg syscall (openbsd-amd64), const MAP_PRIVATE ideal-int
+pkg syscall (openbsd-amd64), const MAP_RENAME = 32
+pkg syscall (openbsd-amd64), const MAP_RENAME ideal-int
+pkg syscall (openbsd-amd64), const MAP_SHARED = 1
+pkg syscall (openbsd-amd64), const MAP_SHARED ideal-int
+pkg syscall (openbsd-amd64), const MAP_TRYFIXED = 1024
+pkg syscall (openbsd-amd64), const MAP_TRYFIXED ideal-int
+pkg syscall (openbsd-amd64), const MCL_CURRENT = 1
+pkg syscall (openbsd-amd64), const MCL_CURRENT ideal-int
+pkg syscall (openbsd-amd64), const MCL_FUTURE = 2
+pkg syscall (openbsd-amd64), const MCL_FUTURE ideal-int
+pkg syscall (openbsd-amd64), const MS_ASYNC = 1
+pkg syscall (openbsd-amd64), const MS_ASYNC ideal-int
+pkg syscall (openbsd-amd64), const MS_INVALIDATE = 4
+pkg syscall (openbsd-amd64), const MS_INVALIDATE ideal-int
+pkg syscall (openbsd-amd64), const MS_SYNC = 2
+pkg syscall (openbsd-amd64), const MS_SYNC ideal-int
+pkg syscall (openbsd-amd64), const PROT_EXEC = 4
+pkg syscall (openbsd-amd64), const PROT_EXEC ideal-int
+pkg syscall (openbsd-amd64), const PROT_NONE = 0
+pkg syscall (openbsd-amd64), const PROT_NONE ideal-int
+pkg syscall (openbsd-amd64), const PROT_READ = 1
+pkg syscall (openbsd-amd64), const PROT_READ ideal-int
+pkg syscall (openbsd-amd64), const PROT_WRITE = 2
+pkg syscall (openbsd-amd64), const PROT_WRITE ideal-int
  pkg syscall (openbsd-amd64), const RTF_FMASK = 1112072
  pkg syscall (openbsd-amd64), const RTM_VERSION = 5
  pkg syscall (openbsd-amd64), const SIOCBRDGDADDR = 2166909255
@@ -777,6 +1005,72 @@ pkg syscall (openbsd-amd64-cgo), const IPV6_RECVDSTPORT = 64
  pkg syscall (openbsd-amd64-cgo), const IPV6_RECVDSTPORT ideal-int
  pkg syscall (openbsd-amd64-cgo), const IP_DIVERTFL = 4130
  pkg syscall (openbsd-amd64-cgo), const IP_DIVERTFL ideal-int
+pkg syscall (openbsd-amd64-cgo), const MADV_DONTNEED = 4
+pkg syscall (openbsd-amd64-cgo), const MADV_DONTNEED ideal-int
+pkg syscall (openbsd-amd64-cgo), const MADV_FREE = 6
+pkg syscall (openbsd-amd64-cgo), const MADV_FREE ideal-int
+pkg syscall (openbsd-amd64-cgo), const MADV_NORMAL = 0
+pkg syscall (openbsd-amd64-cgo), const MADV_NORMAL ideal-int
+pkg syscall (openbsd-amd64-cgo), const MADV_RANDOM = 1
+pkg syscall (openbsd-amd64-cgo), const MADV_RANDOM ideal-int
+pkg syscall (openbsd-amd64-cgo), const MADV_SEQUENTIAL = 2
+pkg syscall (openbsd-amd64-cgo), const MADV_SEQUENTIAL ideal-int
+pkg syscall (openbsd-amd64-cgo), const MADV_SPACEAVAIL = 5
+pkg syscall (openbsd-amd64-cgo), const MADV_SPACEAVAIL ideal-int
+pkg syscall (openbsd-amd64-cgo), const MADV_WILLNEED = 3
+pkg syscall (openbsd-amd64-cgo), const MADV_WILLNEED ideal-int
+pkg syscall (openbsd-amd64-cgo), const MAP_ANON = 4096
+pkg syscall (openbsd-amd64-cgo), const MAP_ANON ideal-int
+pkg syscall (openbsd-amd64-cgo), const MAP_COPY = 4
+pkg syscall (openbsd-amd64-cgo), const MAP_COPY ideal-int
+pkg syscall (openbsd-amd64-cgo), const MAP_FILE = 0
+pkg syscall (openbsd-amd64-cgo), const MAP_FILE ideal-int
+pkg syscall (openbsd-amd64-cgo), const MAP_FIXED = 16
+pkg syscall (openbsd-amd64-cgo), const MAP_FIXED ideal-int
+pkg syscall (openbsd-amd64-cgo), const MAP_FLAGMASK = 8183
+pkg syscall (openbsd-amd64-cgo), const MAP_FLAGMASK ideal-int
+pkg syscall (openbsd-amd64-cgo), const MAP_HASSEMAPHORE = 512
+pkg syscall (openbsd-amd64-cgo), const MAP_HASSEMAPHORE ideal-int
+pkg syscall (openbsd-amd64-cgo), const MAP_INHERIT = 128
+pkg syscall (openbsd-amd64-cgo), const MAP_INHERIT ideal-int
+pkg syscall (openbsd-amd64-cgo), const MAP_INHERIT_COPY = 1
+pkg syscall (openbsd-amd64-cgo), const MAP_INHERIT_COPY ideal-int
+pkg syscall (openbsd-amd64-cgo), const MAP_INHERIT_DONATE_COPY = 3
+pkg syscall (openbsd-amd64-cgo), const MAP_INHERIT_DONATE_COPY ideal-int
+pkg syscall (openbsd-amd64-cgo), const MAP_INHERIT_NONE = 2
+pkg syscall (openbsd-amd64-cgo), const MAP_INHERIT_NONE ideal-int
+pkg syscall (openbsd-amd64-cgo), const MAP_INHERIT_SHARE = 0
+pkg syscall (openbsd-amd64-cgo), const MAP_INHERIT_SHARE ideal-int
+pkg syscall (openbsd-amd64-cgo), const MAP_NOEXTEND = 256
+pkg syscall (openbsd-amd64-cgo), const MAP_NOEXTEND ideal-int
+pkg syscall (openbsd-amd64-cgo), const MAP_NORESERVE = 64
+pkg syscall (openbsd-amd64-cgo), const MAP_NORESERVE ideal-int
+pkg syscall (openbsd-amd64-cgo), const MAP_PRIVATE = 2
+pkg syscall (openbsd-amd64-cgo), const MAP_PRIVATE ideal-int
+pkg syscall (openbsd-amd64-cgo), const MAP_RENAME = 32
+pkg syscall (openbsd-amd64-cgo), const MAP_RENAME ideal-int
+pkg syscall (openbsd-amd64-cgo), const MAP_SHARED = 1
+pkg syscall (openbsd-amd64-cgo), const MAP_SHARED ideal-int
+pkg syscall (openbsd-amd64-cgo), const MAP_TRYFIXED = 1024
+pkg syscall (openbsd-amd64-cgo), const MAP_TRYFIXED ideal-int
+pkg syscall (openbsd-amd64-cgo), const MCL_CURRENT = 1
+pkg syscall (openbsd-amd64-cgo), const MCL_CURRENT ideal-int
+pkg syscall (openbsd-amd64-cgo), const MCL_FUTURE = 2
+pkg syscall (openbsd-amd64-cgo), const MCL_FUTURE ideal-int
+pkg syscall (openbsd-amd64-cgo), const MS_ASYNC = 1
+pkg syscall (openbsd-amd64-cgo), const MS_ASYNC ideal-int
+pkg syscall (openbsd-amd64-cgo), const MS_INVALIDATE = 4
+pkg syscall (openbsd-amd64-cgo), const MS_INVALIDATE ideal-int
+pkg syscall (openbsd-amd64-cgo), const MS_SYNC = 2
+pkg syscall (openbsd-amd64-cgo), const MS_SYNC ideal-int
+pkg syscall (openbsd-amd64-cgo), const PROT_EXEC = 4
+pkg syscall (openbsd-amd64-cgo), const PROT_EXEC ideal-int
+pkg syscall (openbsd-amd64-cgo), const PROT_NONE = 0
+pkg syscall (openbsd-amd64-cgo), const PROT_NONE ideal-int
+pkg syscall (openbsd-amd64-cgo), const PROT_READ = 1
+pkg syscall (openbsd-amd64-cgo), const PROT_READ ideal-int
+pkg syscall (openbsd-amd64-cgo), const PROT_WRITE = 2
+pkg syscall (openbsd-amd64-cgo), const PROT_WRITE ideal-int
  pkg syscall (openbsd-amd64-cgo), const RTF_FMASK = 1112072
  pkg syscall (openbsd-amd64-cgo), const RTM_VERSION = 5
  pkg syscall (openbsd-amd64-cgo), const SIOCBRDGDADDR = 2166909255
@@ -853,3 +1147,29 @@ pkg syscall (openbsd-amd64-cgo), type Statfs_t struct, F_ctime uint64
  pkg syscall (openbsd-amd64-cgo), type Statfs_t struct, F_mntfromspec [90]int8
  pkg syscall (openbsd-amd64-cgo), type Statfs_t struct, Pad_cgo_1 [2]uint8
  pkg syscall (openbsd-amd64-cgo), type Timespec struct, Sec int64
+pkg syscall (windows-386), const ERROR_NETNAME_DELETED = 64
+pkg syscall (windows-386), const ERROR_NETNAME_DELETED Errno
+pkg syscall (windows-386), const IOC_VENDOR = 402653184
+pkg syscall (windows-386), const IOC_VENDOR ideal-int
+pkg syscall (windows-386), const SIO_KEEPALIVE_VALS = 2550136836
+pkg syscall (windows-386), const SIO_KEEPALIVE_VALS ideal-int
+pkg syscall (windows-386), const WSAECONNRESET = 10054
+pkg syscall (windows-386), const WSAECONNRESET Errno
+pkg syscall (windows-386), func NewCallbackCDecl(interface{}) uintptr
+pkg syscall (windows-386), type TCPKeepalive struct
+pkg syscall (windows-386), type TCPKeepalive struct, Interval uint32
+pkg syscall (windows-386), type TCPKeepalive struct, OnOff uint32
+pkg syscall (windows-386), type TCPKeepalive struct, Time uint32
+pkg syscall (windows-amd64), const ERROR_NETNAME_DELETED = 64
+pkg syscall (windows-amd64), const ERROR_NETNAME_DELETED Errno
+pkg syscall (windows-amd64), const IOC_VENDOR = 402653184
+pkg syscall (windows-amd64), const IOC_VENDOR ideal-int
+pkg syscall (windows-amd64), const SIO_KEEPALIVE_VALS = 2550136836
+pkg syscall (windows-amd64), const SIO_KEEPALIVE_VALS ideal-int
+pkg syscall (windows-amd64), const WSAECONNRESET = 10054
+pkg syscall (windows-amd64), const WSAECONNRESET Errno
+pkg syscall (windows-amd64), func NewCallbackCDecl(interface{}) uintptr
+pkg syscall (windows-amd64), type TCPKeepalive struct
+pkg syscall (windows-amd64), type TCPKeepalive struct, Interval uint32
+pkg syscall (windows-amd64), type TCPKeepalive struct, OnOff uint32
+pkg syscall (windows-amd64), type TCPKeepalive struct, Time uint32

コアとなるコードの解説

この差分は、GoのAPI互換性チェックツールが使用する api/next.txt ファイルの変更を示しています。このファイルは、Goの次期リリースで公開されるAPIの変更点を記録するために存在します。

  • 追加行 (+ で始まる行): これらの行は、Goの syscall パッケージに新しく追加されるAPI要素を示しています。各行のフォーマットは pkg <パッケージ名> (<OS>-<アーキテクチャ>), <要素の種類> <要素名> [= <値>] となっています。

    • pkg syscall (freebsd-386), type Termios struct: FreeBSDの32ビット版 (386) 向けに syscall パッケージに Termios 型が追加されることを示します。その後の行は、この構造体の各フィールド(Cc, Cflag, Iflag など)が公開されることを示しています。これは freebsd-amd64 および cgo を使用するバージョンでも同様です。
    • pkg syscall (openbsd-386), const MADV_DONTNEED = 4: OpenBSDの32ビット版 (386) 向けに syscall パッケージに MADV_DONTNEED 定数が値 4 で追加されることを示します。同様に、他の MADV_*, MAP_*, MCL_*, MS_*, PROT_* 定数もOpenBSDの各アーキテクチャ向けに追加されています。
    • pkg syscall (windows-386), const ERROR_NETNAME_DELETED = 64: Windowsの32ビット版 (386) 向けに syscall パッケージに ERROR_NETNAME_DELETED 定数が値 64 で追加されることを示します。同様に、他のWindows固有の定数、NewCallbackCDecl 関数、TCPKeepalive 型も追加されています。
  • 削除行 (- で始まる行):

    • -pkg syscall (windows-386), func NewCallbackCDecl(interface{}) uintptr
    • -pkg syscall (windows-amd64), func NewCallbackCDecl(interface{}) uintptr これらの行は、以前 api/next.txt に存在していた NewCallbackCDecl 関数のエントリが削除されたことを示しています。しかし、追加行を見ると、同じ NewCallbackCDecl 関数が再度追加されています。これは、おそらく以前のエントリが何らかの理由で一時的に削除されたか、または定義が変更されて再追加されたことを示唆しています。GoのAPI変更履歴では、このような一時的な削除と再追加は、APIの調整やリファクタリングの過程で発生することがあります。

このコミット自体は、Goのソースコード(.go ファイル)に直接的な機能変更を加えるものではなく、GoのAPIサーフェスがどのように進化しているかを記録するメタデータファイルを更新するものです。しかし、この変更は、GoがFreeBSD、OpenBSD、Windowsといった異なるOS環境で、より低レベルのシステム機能へのアクセスを拡大しているという重要な方向性を示しています。これにより、Go開発者はこれらのプラットフォーム上で、より高度なシステムプログラミングやパフォーマンス最適化を行うためのツールを手に入れることになります。

関連リンク

参考にした情報源リンク

  • Go言語の公式ドキュメント
  • FreeBSD、OpenBSD、Linuxのmanページ
  • Microsoft Docs (Windows APIドキュメント)
  • Go言語のソースコードリポジトリ (特に src/syscall ディレクトリ)
  • Go言語のコードレビューシステム (Gerrit) の該当コミットページ
  • Go言語のAPI互換性に関する議論やドキュメント
  • 一般的なオペレーティングシステムのシステムプログラミングに関する知識