# 機能設計書 74-TTYモードリセット

## 概要

uv_tty_reset_mode()により全TTYのモードをリセットする機能の設計書である。プロセス終了時やシグナルハンドラ内で端末の状態を元に復元するために使用される。

### 本機能の処理概要

uv_tty_reset_mode()は、uv_tty_set_mode()で変更された端末設定を元の状態にリセットするグローバル関数である。引数を取らず、最初にモード変更が行われたTTYのoriginal termios設定を復元する。この関数はasync-signal-safe（シグナルハンドラ内から安全に呼び出し可能）に設計されている。

**業務上の目的・背景**：TTYをRAWモードに変更したアプリケーションが異常終了した場合、端末が使用不能な状態になることがある。uv_tty_reset_mode()は、シグナルハンドラ（SIGINT, SIGTERM等）やatexit()ハンドラから呼び出すことで、端末を元の状態に確実に復元できる。

**機能の利用シーン**：
- SIGINTシグナルハンドラ内での端末状態リストア
- atexit()ハンドラでのクリーンアップ処理
- アプリケーション正常終了時の端末状態復元

**主要な処理内容**：
1. atomic exchangeでspinlockを取得する（既にロック中ならUV_EBUSYを返す）
2. orig_termios_fdが-1でない場合、tcsetattr()で元の設定を復元する
3. spinlockを解放する
4. errnoを保存・復元する

**関連システム・外部連携**：POSIXのtcsetattr() API。

**権限による制御**：特段の権限制御はない。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 20 | TTY | 主機能 | uv_tty_reset_mode()による全TTYモードリセットのAPI定義 |

## 機能種別

リストア処理 - 端末設定の復元

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| (なし) | void | - | 引数なし | - |

### 入力データソース

グローバル変数orig_termios_fd, orig_termios, termios_spinlockを参照する。

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| 戻り値 | int | 成功時0、ロック競合時UV_EBUSY、tcsetattr失敗時は負のエラーコード |

### 出力先

OS端末の設定が元の状態に復元される。

## 処理フロー

### 処理シーケンス

```
1. errnoの保存
2. atomic_exchange(&termios_spinlock, 1)でspinlock取得
   └─ 非0ならreturn UV_EBUSY
3. orig_termios_fd != -1の場合、uv__tcsetattr(TCSANOW)で復元
4. atomic_store(&termios_spinlock, 0)でspinlock解放
5. errno復元
```

### フローチャート

```mermaid
flowchart TD
    A[開始] --> B[errno保存]
    B --> C[atomic_exchange spinlock]
    C --> D{ロック取得成功?}
    D -->|No| E[return UV_EBUSY]
    D -->|Yes| F{orig_termios_fd != -1?}
    F -->|Yes| G[uv__tcsetattr TCSANOW]
    F -->|No| H[err = 0]
    G --> I[spinlock解放]
    H --> I
    I --> J[errno復元]
    J --> K[return err]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-74-01 | async-signal-safe | シグナルハンドラ内から安全に呼び出し可能 | 常時 |
| BR-74-02 | ロック競合回避 | spinlock保持中はUV_EBUSYを返す | 他スレッドがlock保持中 |
| BR-74-03 | TCSANOW適用 | 即座に適用される | 常時 |
| BR-74-04 | errno保全 | errnoを保存・復元する | 常時 |

### 計算ロジック

特段の計算ロジックはない。

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

該当なし。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| UV_EBUSY | ロック競合 | uv_tty_set_mode()またはuv__tty_close()が実行中 | 時間をおいて再試行 |

### リトライ仕様

uv__tcsetattr()内でEINTRリトライは自動的に行われる。

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

該当なし。

## パフォーマンス要件

軽量な操作であり、シグナルハンドラ内からの呼び出しに適している。

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

- async-signal-safe設計
- uv_tty_set_mode()のクリティカルセクション内でシグナル発生時のみ非安全

## 備考

- Windows版ではコンソール入力モードのリセットを行う（src/win/tty.c L2323以降）
- orig_termios_fd == -1の場合、何もせず成功を返す

---

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

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

### 推奨読解順序

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | tty.c | `src/unix/tty.c` | **L65-67**: orig_termios_fd, orig_termios, termios_spinlock |

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | tty.c | `src/unix/tty.c` | **L486-503**: uv_tty_reset_mode()の全実装 |

**主要処理フロー**:
1. **490行目**: saved_errno = errno
2. **492行目**: atomic_exchange(&termios_spinlock, 1)
3. **493行目**: 非0ならUV_EBUSY
4. **496-497行目**: uv__tcsetattr()
5. **499行目**: atomic_store(&termios_spinlock, 0)
6. **500行目**: errno = saved_errno

#### Step 3: 関連するクローズ処理

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | tty.c | `src/unix/tty.c` | **L345-373**: uv__tty_close() |

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

```
uv_tty_reset_mode()                      [src/unix/tty.c L486]
    +-- atomic_exchange(&termios_spinlock, 1)
    +-- uv__tcsetattr(orig_termios_fd, TCSANOW, &orig_termios)
    |       +-- tcsetattr()
    +-- atomic_store(&termios_spinlock, 0)
```

### データフロー図

```
[入力]                        [処理]                    [出力]
orig_termios_fd (グローバル) -> tcsetattr(TCSANOW) ---> OS端末設定復元
orig_termios (グローバル) ----> termios適用              戻り値
termios_spinlock (atomic) ---> ロック制御
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| uv.h | `include/uv.h` | ヘッダ | uv_tty_reset_mode()宣言（L841） |
| tty.c | `src/unix/tty.c` | ソース | Unix版実装（L486-503） |
| tty.c | `src/win/tty.c` | ソース | Windows版実装（L2323以降） |
