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

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

このコミットは、GoランタイムにおけるFreeBSD環境でのSI_USERシグナルコードの定義を修正するものです。具体的には、src/pkg/runtime/os_freebsd.hファイル内で定義されているSI_USERの値が、FreeBSDの実際の定義と一致するように変更されています。

コミット

commit ecb2a0a9e521a0dd76ca70e00727fce9afbda687
Author: Shenghou Ma <minux.ma@gmail.com>
Date:   Mon Sep 17 01:08:41 2012 +0800

    runtime: fix SI_USER for FreeBSD
    Ref: http://svnweb.freebsd.org/base/head/sys/sys/signal.h?revision=HEAD&view=markup
    
    R=golang-dev, devon.odell, r
    CC=golang-dev
    https://golang.org/cl/6490118
---
 src/pkg/runtime/os_freebsd.h | 2 +-|
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/pkg/runtime/os_freebsd.h b/src/pkg/runtime/os_freebsd.h
index 5e8de5434a..b440bfeec6 100644
--- a/src/pkg/runtime/os_freebsd.h
+++ b/src/pkg/runtime/os_freebsd.h
@@ -15,7 +15,7 @@ int32	runtime·sysctl(uint32*, uint32, byte*, uintptr*, byte*, uintptr);
 void	runtime·raisesigpipe(void);
 
 #define	NSIG 33
-#define	SI_USER	0
+#define	SI_USER	0x10001
 
 #define RLIMIT_AS 10
 typedef struct Rlimit Rlimit;

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

https://github.com/golang/go/commit/ecb2a0a9e521a0dd76ca70e00727fce9afbda687

元コミット内容

runtime: fix SI_USER for FreeBSD
Ref: http://svnweb.freebsd.org/base/head/sys/sys/signal.h?revision=HEAD&view=markup

変更の背景

この変更の背景には、GoランタイムがFreeBSD上でシグナルを正しく処理するために、オペレーティングシステム(OS)固有の定数を正確に認識する必要があるという問題がありました。特に、SI_USERというシグナルコードは、ユーザーが生成したシグナル(kill()システムコールなどによって送信されるシグナル)を識別するために使用されます。

Goランタイムは、様々なOS上で動作するように設計されており、それぞれのOSのシステムコールや定数に合わせて調整されています。FreeBSDの場合、sys/sys/signal.hヘッダーファイルで定義されているSI_USERの値が、Goランタイム内で誤って0と定義されていました。しかし、FreeBSDの実際の定義は0x10001でした。この不一致により、GoプログラムがFreeBSD上でシグナルを処理する際に、ユーザーが送信したシグナルを正しく識別できない、あるいは予期せぬ動作を引き起こす可能性がありました。

このコミットは、FreeBSDの公式なシグナル定義との整合性を確保し、GoランタイムがFreeBSD環境でより堅牢に動作するようにするために行われました。参照されているFreeBSDのsignal.hのURLは、この値の正確な定義を確認するための情報源として提供されています。

前提知識の解説

シグナル (Signals)

シグナルは、Unix系OSにおいてプロセス間通信や非同期イベント通知のためのソフトウェア割り込みメカニズムです。プロセスは、特定のイベント(例:Ctrl+Cによる割り込み、不正なメモリアクセス、子プロセスの終了など)が発生した際に、カーネルからシグナルを受け取ります。シグナルを受け取ったプロセスは、デフォルトの動作(終了、コアダンプなど)を実行するか、事前に登録されたシグナルハンドラ関数を実行することができます。

siginfo_t構造体とシグナルコード (Signal Codes)

シグナルがプロセスに送信される際、そのシグナルに関する追加情報がsiginfo_tという構造体に格納されてシグナルハンドラに渡されることがあります。この構造体には、シグナルを送信したプロセスID、ユーザーID、そしてシグナルの原因を示す「シグナルコード」が含まれます。シグナルコードは、同じシグナル番号(例:SIGSEGV)であっても、そのシグナルが発生した具体的な原因を区別するために使用されます。

SI_USER

SI_USERは、siginfo_t構造体のsi_codeフィールドに設定される可能性のあるシグナルコードの一つです。このコードは、シグナルがユーザープロセスによって明示的に生成され、kill()システムコールやsigqueue()システムコールなどによって送信されたことを示します。つまり、カーネル内部のイベント(例:ハードウェア例外)ではなく、別のユーザープロセスが意図的にシグナルを送信した場合に設定されます。

FreeBSDにおけるシグナル定義

FreeBSDは、Unix系OSの一つであり、そのシグナル処理のメカニズムはPOSIX標準に準拠しつつも、独自の拡張や実装の詳細を持っています。sys/sys/signal.hは、FreeBSDシステムにおけるシグナル関連の定数や構造体が定義されているヘッダーファイルです。OSのバージョンやパッチレベルによって、これらの定数の具体的な値が異なる場合があります。Goランタイムのようなクロスプラットフォームなソフトウェアは、各OSのこれらの詳細に正確に対応する必要があります。

技術的詳細

このコミットの技術的な詳細は、GoランタイムがFreeBSDのシグナル処理メカニズムとどのように連携するかという点に集約されます。Goランタイムは、内部的にシグナルを処理し、Goルーチンにディスパッチする役割を担っています。この処理の正確性は、OSが提供するシグナル関連の定数や構造体の定義に依存します。

SI_USERは、siginfo_t構造体のsi_codeフィールドに設定される値であり、シグナルがユーザーによって生成されたことを示します。GoランタイムがFreeBSD上でシグナルを処理する際、si_codeの値をチェックして、シグナルの種類や発生源を特定することがあります。もしGoランタイムがFreeBSDのSI_USERの正しい値を知らない場合、ユーザーが生成したシグナルを誤って解釈したり、全く認識できなかったりする可能性があります。これは、例えばGoプログラムがkillコマンドによって終了させられた際に、その終了がユーザーによるものであることを正しく認識できない、といった問題につながりかねません。

元のコードでは、src/pkg/runtime/os_freebsd.hにおいて#define SI_USER 0と定義されていました。これは、FreeBSDの実際のSI_USERの値とは異なっていました。参照されているFreeBSDのsignal.hのソースコード(http://svnweb.freebsd.org/base/head/sys/sys/signal.h?revision=HEAD&view=markup)を確認すると、SI_USER0x10001として定義されていることがわかります。

このコミットは、GoランタイムがFreeBSDのシグナル処理と完全に互換性を持つように、この不一致を修正しています。これにより、GoプログラムはFreeBSD環境でシグナルをより正確かつ堅牢に処理できるようになります。

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

--- a/src/pkg/runtime/os_freebsd.h
+++ b/src/pkg/runtime/os_freebsd.h
@@ -15,7 +15,7 @@ int32	runtime·sysctl(uint32*, uint32, byte*, uintptr*, byte*, uintptr);
 void	runtime·raisesigpipe(void);
 
 #define	NSIG 33
-#define	SI_USER	0
+#define	SI_USER	0x10001
 
 #define RLIMIT_AS 10
 typedef struct Rlimit Rlimit;

コアとなるコードの解説

変更はsrc/pkg/runtime/os_freebsd.hファイル内の1行のみです。

  • 変更前: #define SI_USER 0
  • 変更後: #define SI_USER 0x10001

この変更は、GoランタイムがFreeBSDシステムコールやシグナル処理と連携する際に使用するSI_USER定数の値を修正しています。

#defineディレクティブは、C言語(Goランタイムの一部はCで書かれているか、Cのヘッダーファイルを模倣している)において、シンボル定数を定義するために使用されます。この場合、SI_USERというシンボルに特定の値を割り当てています。

変更前は、SI_USER0として定義されていました。これは、FreeBSDのsys/sys/signal.hで定義されている実際の値とは異なっていました。FreeBSDでは、SI_USER0x10001という16進数の値を持つことが標準です。

この修正により、GoランタイムはFreeBSD上でシグナルを処理する際に、ユーザーが生成したシグナルを正しく識別できるようになります。例えば、siginfo_t構造体のsi_codeフィールドをチェックしてシグナルの原因を判断するようなGoランタイム内部のロジックが、この正しい値に基づいて動作するようになります。これにより、FreeBSD上でのGoプログラムのシグナル処理の正確性と信頼性が向上します。

関連リンク

参考にした情報源リンク