# 機能設計書 17-ハンドルクローズ中判定

## 概要

`uv_is_closing()`によりハンドルがクローズ処理中かどうかを判定する機能の設計書である。

### 本機能の処理概要

**業務上の目的・背景**：`uv_close()`が呼ばれたハンドルはCLOSINGフラグがセットされ、最終的にCLOSEDフラグがセットされて完全にクローズされる。アプリケーションはハンドルがクローズ処理中かどうかを確認し、二重クローズの防止や、クローズ中のハンドルに対する操作の回避に利用する。

**機能の利用シーン**：ハンドルに対する操作前にクローズ中でないことを確認する場合、デバッグ時にハンドルのライフサイクル状態を確認する場合、コールバック内でハンドルの状態を確認する場合に使用される。

**主要な処理内容**：
1. ハンドルの`flags`フィールドの`UV_HANDLE_CLOSING`または`UV_HANDLE_CLOSED`ビットをチェックする
2. いずれかがセットされていれば非ゼロを返す

**関連システム・外部連携**：特になし。内部フラグの参照のみ。

**権限による制御**：特になし。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 7 | ハンドル基底 | 主機能 | uv_is_closing()によるクローズ処理中判定のAPI定義 |

## 機能種別

データ取得（状態判定）

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| handle | const uv_handle_t* | Yes | 対象のハンドル | NULLチェックなし |

### 入力データソース

呼び出し元から渡されるハンドル構造体ポインタ。

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| 戻り値 | int | クローズ中またはクローズ済みなら非ゼロ、それ以外は0 |

### 出力先

関数の戻り値として呼び出し元へ返却。

## 処理フロー

### 処理シーケンス

```
1. uv_is_closing()が呼び出される
2. uv__is_closing()マクロに委譲
3. (handle->flags & (UV_HANDLE_CLOSING | UV_HANDLE_CLOSED)) != 0 を返す
```

### フローチャート

```mermaid
flowchart TD
    A[uv_is_closing 呼び出し] --> B{CLOSING or CLOSEDフラグ?}
    B -->|いずれかセット| C[非ゼロを返す]
    B -->|未セット| D[0を返す]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-17-01 | CLOSING判定 | UV_HANDLE_CLOSINGフラグはuv_close()呼び出し時にセットされる | uv_close()呼び出し後 |
| BR-17-02 | CLOSED判定 | UV_HANDLE_CLOSEDフラグはクローズ完了処理時にセットされる | uv__finish_close()完了後 |
| BR-17-03 | OR条件 | CLOSINGまたはCLOSEDのいずれかがセットされていればtrueを返す | 常時 |

### 計算ロジック

`(handle->flags & (UV_HANDLE_CLOSING | UV_HANDLE_CLOSED)) != 0`

UV_HANDLE_CLOSING = 0x00000001、UV_HANDLE_CLOSED = 0x00000002 であるため、ビットマスクは0x00000003となる。

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

該当なし。

## エラー処理

### エラーケース一覧

本関数はエラーを返さない。

### リトライ仕様

リトライ不要。

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

該当なし。

## パフォーマンス要件

O(1)の定数時間。ビットフラグの確認のみ。

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

特になし。

## 備考

- `uv_is_closing()`はクローズ完了後（CLOSEDフラグセット後）もtrueを返す点に注意
- libuv内部では`uv__is_closing()`マクロが直接使用される
- 参照: include/uv.h L584

---

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

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

### 推奨読解順序

#### Step 1: データ構造を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | uv-common.h | `src/uv-common.h` | **L82-83**: UV_HANDLE_CLOSING(0x01)とUV_HANDLE_CLOSED(0x02)の定義 |

**読解のコツ**: CLOSINGとCLOSEDは別々のフラグであり、状態遷移の過程で両方がセットされることがある。

#### Step 2: エントリーポイントを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | uv.h | `include/uv.h` | **L584**: uv_is_closing()のAPI宣言 |
| 2-2 | core.c (unix) | `src/unix/core.c` | **L383-385**: Unix実装。uv__is_closing()マクロに委譲 |

**主要処理フロー**:
- **383行目**: `int uv_is_closing(const uv_handle_t* handle)` 関数定義
- **384行目**: `return uv__is_closing(handle);` マクロ呼び出し

#### Step 3: マクロ定義を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | uv-common.h | `src/uv-common.h` | **L277-278**: `uv__is_closing(h)` マクロ。`(h->flags & (UV_HANDLE_CLOSING | UV_HANDLE_CLOSED)) != 0` |

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

```
uv_is_closing(handle)          [src/unix/core.c:383]
    │
    └─ uv__is_closing(h)       [src/uv-common.h:277 マクロ]
         └─ (h->flags & (UV_HANDLE_CLOSING | UV_HANDLE_CLOSED)) != 0
```

### データフロー図

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

const uv_handle_t* handle ──> flags & (CLOSING | CLOSED) ──────> int (0 or 非ゼロ)
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| uv.h | `include/uv.h` | ヘッダ | 公開API宣言（L584） |
| core.c (unix) | `src/unix/core.c` | ソース | Unix実装（L383-385） |
| uv-common.h | `src/uv-common.h` | ヘッダ | マクロ定義（L277-278）、フラグ定数（L82-83） |
