# libuv

## 概要

libuv は、非同期I/O処理に焦点を当てたマルチプラットフォーム対応のCライブラリです。元々 Node.js のために開発され、現在は Luvit、Julia、uvloop など多くのプロジェクトで利用されています。Linux では epoll、macOS/BSD では kqueue、Windows では IOCP（I/O Completion Ports）をバックエンドとしたイベント駆動型の非同期I/Oモデルを提供します。現在のバージョンは 1.52.1-dev（開発版）です。

## 主な機能

| 機能カテゴリ | 説明 |
| --- | --- |
| イベントループ | epoll/kqueue/IOCP を抽象化したクロスプラットフォームイベントループ |
| TCP/UDP ソケット | 非同期TCP接続・通信、UDPデータグラム送受信、マルチキャスト対応 |
| パイプ・IPC | Unix ドメインソケット / Windows 名前付きパイプによるプロセス間通信 |
| ファイルシステム | 非同期ファイル読み書き、ディレクトリ操作、ファイルコピー等 |
| ファイルシステムイベント | inotify（Linux）/ fsevents（macOS）によるファイル変更監視 |
| DNS 解決 | 非同期 getaddrinfo / getnameinfo |
| プロセス管理 | 子プロセスの起動・管理、標準入出力リダイレクト |
| シグナルハンドリング | シグナルの非同期処理 |
| スレッド・同期プリミティブ | スレッド生成、ミューテックス、リードライトロック、セマフォ、条件変数、バリア |
| スレッドプール | ワーカースレッドプールによるタスクキューイング |
| タイマー | ミリ秒精度のタイマースケジューリング |
| TTY 制御 | ターミナル制御、ANSI エスケープコード対応 |
| 動的ライブラリ | dlopen/dlsym による動的ライブラリのロード |
| システム情報 | CPU情報、メモリ使用量、ネットワークインターフェース、環境変数操作 |

## 技術スタック

### コア

- 言語: C（C11 標準）
- ビルドシステム: CMake 3.10+ / Autotools
- ライセンス: MIT（コード）、CC BY 4.0（ドキュメント）

### 主要ライブラリ

- pthread（UNIX/Linux スレッド処理）
- dl（動的ライブラリローディング）
- kstat（Solaris システム情報）
- perfstat（AIX システム情報）
- rt（リアルタイム拡張）

### 対応プラットフォーム

| ティア | プラットフォーム |
| --- | --- |
| Tier 1（CI自動テスト） | GNU/Linux（glibc 2.17+, Linux 3.10+）、macOS 11+、Windows 10+ |
| Tier 2（公式サポート） | FreeBSD 12+、AIX 6+、IBM i 7.2+、z/OS V2R2+、Linux musl 1.0+ |
| Tier 3（コミュニティ） | Android（NDK r15b+）、MinGW-w64 |

## ディレクトリ構成

```
libuv-1.x/
├── include/                   パブリックヘッダファイル
│   ├── uv.h                  メインヘッダ（318個の公開API関数）
│   └── uv/                   プラットフォーム固有ヘッダ
│       ├── errno.h           エラーコード定義（170+エラーコード）
│       ├── version.h         バージョン定義
│       ├── unix.h            Unix/Linux API定義
│       ├── win.h             Windows API定義
│       ├── tree.h            レッドブラックツリー実装
│       └── ...               その他プラットフォーム固有ヘッダ
├── src/                       ソースコード
│   ├── uv-common.c           共通API実装
│   ├── timer.c               タイマー実装
│   ├── threadpool.c          スレッドプール実装
│   ├── fs-poll.c             ファイルシステムポーリング
│   ├── inet.c                IPアドレス処理
│   ├── random.c              乱数生成
│   ├── idna.c                国際化ドメイン名処理
│   ├── unix/                 Unix/Linux/macOS 実装（50+ファイル）
│   │   ├── core.c            イベントループコア
│   │   ├── fs.c              ファイルシステム操作
│   │   ├── tcp.c             TCP実装
│   │   ├── udp.c             UDP実装
│   │   ├── pipe.c            パイプ実装
│   │   ├── process.c         プロセス管理
│   │   ├── signal.c          シグナルハンドリング
│   │   ├── thread.c          スレッド処理
│   │   ├── stream.c          ストリーム基盤
│   │   ├── darwin.c          macOS固有実装
│   │   ├── linux.c           Linux固有実装
│   │   └── ...               その他プラットフォーム固有実装
│   └── win/                  Windows 実装（32ファイル）
│       ├── core.c            IOCP イベントループ
│       ├── fs.c              ファイルシステム操作
│       ├── tcp.c             TCP実装
│       └── ...               その他Windows固有実装
├── test/                      テストスイート（177+テストケース）
│   ├── run-tests.c           テストランナー
│   ├── test-list.h           テストリスト定義
│   ├── test-*.c              個別テストファイル
│   ├── benchmark-*.c         ベンチマークテスト
│   └── fixtures/             テストフィクスチャ
├── docs/                      ドキュメント（Sphinx RST形式）
│   ├── src/                  ドキュメントソース（39個のRSTファイル）
│   └── code/                 コード例
├── .github/workflows/         GitHub Actions CI/CD
├── cmake-toolchains/          CMakeクロスコンパイル用ツールチェーン
├── m4/                        Autotools用マクロ
├── CMakeLists.txt            CMakeビルド設定
├── configure.ac              Autotools設定
├── Makefile.am               Automake設定
├── autogen.sh                Autotools初期化スクリプト
├── LICENSE                   MITライセンス
├── CONTRIBUTING.md           コントリビューションガイド
└── AUTHORS                   著者一覧
```

## セットアップ

### 必要条件

- C11 対応コンパイラ（GCC 4.8+、Clang、MSVC 2017+、Apple Clang）
- CMake 3.10 以上 または Autotools（automake、autoconf、libtool）
- Python + Sphinx（ドキュメントビルド時のみ）

### ビルド手順

#### CMake（推奨）

```bash
cmake -B build -DBUILD_TESTING=ON
cmake --build build
```

#### Autotools（UNIX系）

```bash
sh autogen.sh
./configure
make
make install
```

### パッケージマネージャによるインストール

```bash
# Homebrew (macOS)
brew install --HEAD libuv

# vcpkg (Windows)
vcpkg install libuv

# Conan
conan install --requires="libuv/[*]" --build=missing
```

### クロスコンパイル（MinGW-w64 例）

```bash
cmake ../.. \
  -DCMAKE_SYSTEM_NAME=Windows \
  -DCMAKE_SYSTEM_VERSION=6.1 \
  -DCMAKE_C_COMPILER=i686-w64-mingw32-gcc
```

## 開発

### テスト実行

```bash
# CMake ビルド後
cd build && ctest -C Debug --output-on-failure

# または直接実行
build/uv_run_tests_a

# 特定テストの実行
build/uv_run_tests_a TEST_NAME

# タイムアウト倍率の調整
UV_TEST_TIMEOUT_MULTIPLIER=2 build/uv_run_tests
```

### ベンチマーク実行

```bash
build/uv_run_benchmarks_a
```

### サニタイザー付きビルド

```bash
cmake -B build -DASAN=ON    # AddressSanitizer
cmake -B build -DTSAN=ON    # ThreadSanitizer
cmake -B build -DUBSAN=ON   # UndefinedBehaviorSanitizer
cmake -B build -DMSAN=ON    # MemorySanitizer
```

### 静的解析

- Clang-Tidy：`.clang-tidy` 設定ファイルで管理

### ドキュメントビルド

```bash
cd docs
make html      # HTMLドキュメント生成
make man       # manページ生成
make livehtml  # ホットリロード付きプレビュー
```

### コード規約

- Google C/C++ スタイルガイド準拠
- 2スペースインデント（タブ禁止）
- 行幅80文字
- 公開API：`uv_` / `UV_` プレフィックス
- 内部関数：`uv__` プレフィックス
- Unix行終端（LF）
