# 機能設計書 148-CPUマスクサイズ取得

## 概要

本ドキュメントは、libuvのOS情報機能におけるCPUマスクサイズ取得機能 `uv_cpumask_size()` の設計仕様を定義する。

### 本機能の処理概要

`uv_cpumask_size()` は、CPUアフィニティマスクに使用可能なビット数（マスクサイズ）を取得する関数である。この値はスレッドアフィニティ制御（`uv_thread_setaffinity()`/`uv_thread_getaffinity()`）で使用するマスク配列のサイズを決定するために使用される。

**業務上の目的・背景**：マルチコアシステムにおいて、スレッドを特定のCPUコアにバインドする（CPUアフィニティ制御）際、システムがサポートするCPU数に応じたマスクサイズが必要となる。`uv_cpumask_size()` はこのマスクサイズを返すことで、適切なサイズのマスク配列をアプリケーションが確保できるようにする。

**機能の利用シーン**：`uv_thread_setaffinity()`/`uv_thread_getaffinity()` を使用する前に、マスク配列のサイズを決定するために呼び出される。高性能計算やリアルタイム処理でCPUアフィニティを制御する際の前準備として使用される。

**主要な処理内容**：
1. CPUアフィニティがサポートされているかを確認する
2. サポートされている場合は `CPU_SETSIZE` を返す
3. サポートされていない場合は `UV_ENOTSUP` を返す

**関連システム・外部連携**：Linux/FreeBSD等の `CPU_SETSIZE` 定数に依存する。

**権限による制御**：権限による実行可否の制御は存在しない。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 29 | その他ユーティリティ | 主機能 | uv_cpumask_size()によるCPUマスクサイズ取得のAPI定義 |

## 機能種別

情報取得処理（システム定数のリードオンリー参照）

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| （なし） | - | - | パラメータなし | - |

### 入力データソース

コンパイル時定数（`CPU_SETSIZE`）または非サポート判定。

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| 戻り値 | int | CPUマスクサイズ（ビット数）。サポートされていない場合はUV_ENOTSUP（負値） |

### 出力先

呼び出し元への戻り値として返却される。

## 処理フロー

### 処理シーケンス

```
1. UV__CPU_AFFINITY_SUPPORTED マクロを確認
   ├─ 定義されている場合 → CPU_SETSIZE を返却
   └─ 定義されていない場合 → UV_ENOTSUP を返却
```

### フローチャート

```mermaid
flowchart TD
    A[uv_cpumask_size 呼び出し] --> B{UV__CPU_AFFINITY_SUPPORTED?}
    B -->|Yes| C[CPU_SETSIZE を返却]
    B -->|No| D[UV_ENOTSUP を返却]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-148-01 | プラットフォーム依存 | CPUアフィニティはLinux/FreeBSD/NetBSD等でサポート、macOS等では非サポート | プラットフォームによる |
| BR-148-02 | コンパイル時決定 | 戻り値はコンパイル時定数CPU_SETSIZEまたはUV_ENOTSUP | 常時 |
| BR-148-03 | マスク用途 | 戻り値はuv_thread_setaffinity()/getaffinity()のマスク配列サイズ決定に使用 | アフィニティ制御時 |

### 計算ロジック

特になし。コンパイル時定数を返すのみ。

## データベース操作仕様

該当なし。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| UV_ENOTSUP | 非サポート | CPUアフィニティがサポートされていないプラットフォーム | CPUアフィニティ制御を使用しない |

### リトライ仕様

リトライは不要。コンパイル時に決定される結果。

## トランザクション仕様

該当なし。

## パフォーマンス要件

O(1)の定数時間。プリプロセッサ条件分岐のみ。

## セキュリティ考慮事項

特になし。

## 備考

- Linux: CPU_SETSIZEは通常1024
- FreeBSD/NetBSD: CPU_SETSIZEはプラットフォームによって異なる
- macOS: CPUアフィニティは非サポート（UV_ENOTSUPが返る）
- Windows: 独自の実装あり

---

## コードリーディングガイド

本機能を理解するために参照すべきファイルと、推奨する読み解き順序を以下に示す。

### 推奨読解順序

#### Step 1: API宣言を確認する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | uv.h | `include/uv.h` | API宣言（L1357） |

#### Step 2: Unix実装を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | core.c | `src/unix/core.c` | uv_cpumask_size() 実装 |

**主要処理フロー**:
- **1675-1681行目**: `uv_cpumask_size()` - `UV__CPU_AFFINITY_SUPPORTED` プリプロセッサマクロで分岐。定義されていればCPU_SETSIZEを返却、未定義ならUV_ENOTSUPを返却

**読解のコツ**: `UV__CPU_AFFINITY_SUPPORTED` マクロの定義箇所を確認することで、どのプラットフォームでCPUアフィニティがサポートされているかが分かる。

### プログラム呼び出し階層図

```
uv_cpumask_size()                    [公開API - src/unix/core.c L1675]
    └─ [コンパイル時分岐]
         ├─ UV__CPU_AFFINITY_SUPPORTED → CPU_SETSIZE
         └─ 未定義 → UV_ENOTSUP
```

### データフロー図

```
[入力]           [処理]                    [出力]

（なし） ────▶ uv_cpumask_size()     ────▶ int (CPU_SETSIZE or UV_ENOTSUP)
               └─ コンパイル時定数参照
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| uv.h | `include/uv.h` | ヘッダー | API宣言 (L1357) |
| core.c | `src/unix/core.c` | ソース | Unix版実装 (L1675-1681) |
| thread.c | `src/unix/thread.c` | ソース | UV__CPU_AFFINITY_SUPPORTED定義元、関連するアフィニティ関数 |
| core.c | `src/win/core.c` | ソース | Windows版実装 |
