docs(issues): DebugBox Arc<Mutex>→RwLock変換Issue作成 + FutureBox import修正
## 📋 新規Issue作成 - phase_9_75c_debugbox_fix.md: DebugBox専用修正Issue作成 - phase_9_75c_fix_compile_errors_jp.md: 既存Issue日本語版更新 ## 🔧 FutureBox import修正 - src/interpreter/mod.rs: crate::boxes::FutureBox import追加 - src/interpreter/io.rs: FutureBox import パス修正 ## 🎯 現状 - Issue #92: ✅ 解決済み (FutureBox二重定義) - PR #93: ✅ 完了 (FutureBox統一) - 残存: 39個エラー (DebugBox未変換) ## 📊 技術詳細 - DebugBox: 11箇所の.lock() → .read()/.write()変換必要 - Clone derive: 手動実装が必要 - 他10個Box型: RwLock変換完了済み 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
303
docs/予定/native-plan/issues/phase_9_75c_debugbox_fix.md
Normal file
303
docs/予定/native-plan/issues/phase_9_75c_debugbox_fix.md
Normal file
@ -0,0 +1,303 @@
|
|||||||
|
# Phase 9.75-C DebugBox修正: 残存する39個のコンパイルエラー解決
|
||||||
|
|
||||||
|
**優先度**: 🔴 **緊急** (全開発ブロック中)
|
||||||
|
**担当者**: @copilot-swe-agent
|
||||||
|
**ステータス**: 未解決
|
||||||
|
**作成日**: 2025-08-15
|
||||||
|
**関連**: Issue #92 (解決済み), PR #93 (FutureBox修正完了)
|
||||||
|
|
||||||
|
## 🚨 問題概要
|
||||||
|
|
||||||
|
**Issue #92とPR #93でFutureBox問題は解決済み**ですが、**DebugBox**のArc<Mutex>→RwLock変換が完全に見落とされており、**39個のコンパイルエラー**が残存しています。
|
||||||
|
|
||||||
|
### 現在の状況
|
||||||
|
```bash
|
||||||
|
$ cargo check --lib
|
||||||
|
error: could not compile `nyash-rust` (lib) due to 39 previous errors; 80 warnings emitted
|
||||||
|
```
|
||||||
|
|
||||||
|
**影響**: 全開発がブロック - ビルド、テスト、Phase 9.5以降の作業継続不可
|
||||||
|
|
||||||
|
## 📋 現在の状況
|
||||||
|
|
||||||
|
### ✅ **解決済み問題** (Issue #92 / PR #93)
|
||||||
|
- **FutureBox二重定義**: 完全解決
|
||||||
|
- **10個のBox型**: HTTPServerBox、P2PBox等はRwLock変換済み
|
||||||
|
|
||||||
|
### ❌ **未解決問題** (この新しいIssue)
|
||||||
|
- **DebugBox**: Arc<Mutex>→RwLock変換が完全に見落とされている
|
||||||
|
|
||||||
|
### ✅ 変換済みBox型 (PR #91 + PR #93)
|
||||||
|
- **HTTPServerBox**: 7個のArc<Mutex>フィールド → RwLock
|
||||||
|
- **P2PBox**: `Arc<Mutex<P2PBoxData>>`型エイリアスから完全書き換え
|
||||||
|
- **IntentBox**: `Arc<Mutex<IntentBoxData>>`型エイリアスから完全書き換え
|
||||||
|
- **SimpleIntentBox**: listenersハッシュマップ変換
|
||||||
|
- **JSONBox**: serde_json::Value操作
|
||||||
|
- **RandomBox**: seedフィールド変換
|
||||||
|
- **EguiBox**: クロススレッドArc<RwLock>での複雑なGUI状態
|
||||||
|
- **FileBox**: ファイルI/O操作、パス簡素化
|
||||||
|
- **FutureBox**: 非同期状態管理 ✅ **PR #93で解決**
|
||||||
|
- **SocketBox**: TCP操作更新
|
||||||
|
|
||||||
|
### ❌ **未変換Box型**
|
||||||
|
- **DebugBox**: **完全に見落とされている**
|
||||||
|
|
||||||
|
## 🔍 DebugBox問題の技術的分析
|
||||||
|
|
||||||
|
**具体的エラー箇所**: `src/boxes/debug_box.rs`
|
||||||
|
|
||||||
|
### 📊 **特定されたエラー**
|
||||||
|
|
||||||
|
### 1. **DebugBox構造体**: Clone derive問題
|
||||||
|
```rust
|
||||||
|
// ❌ 現在の問題
|
||||||
|
#[derive(Debug, Clone)] // RwLockはCloneを実装していない
|
||||||
|
pub struct DebugBox {
|
||||||
|
tracking_enabled: RwLock<bool>,
|
||||||
|
tracked_boxes: RwLock<HashMap<String, TrackedBoxInfo>>,
|
||||||
|
breakpoints: RwLock<Vec<String>>,
|
||||||
|
call_stack: RwLock<Vec<CallInfo>>,
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. **11箇所の.lock()呼び出し**: メソッド名エラー
|
||||||
|
```bash
|
||||||
|
src/boxes/debug_box.rs:182 instance.fields.lock().unwrap()
|
||||||
|
src/boxes/debug_box.rs:191 self.tracked_boxes.lock().unwrap()
|
||||||
|
src/boxes/debug_box.rs:231 self.tracked_boxes.lock().unwrap()
|
||||||
|
src/boxes/debug_box.rs:251 self.breakpoints.lock().unwrap()
|
||||||
|
src/boxes/debug_box.rs:258 self.call_stack.lock().unwrap()
|
||||||
|
src/boxes/debug_box.rs:274 self.call_stack.lock().unwrap()
|
||||||
|
src/boxes/debug_box.rs:290 self.tracked_boxes.lock().unwrap()
|
||||||
|
src/boxes/debug_box.rs:293 self.call_stack.lock().unwrap()
|
||||||
|
src/boxes/debug_box.rs:306 self.tracked_boxes.lock().unwrap()
|
||||||
|
src/boxes/debug_box.rs:322 self.tracked_boxes.lock().unwrap()
|
||||||
|
src/boxes/debug_box.rs:345 self.tracked_boxes.lock().unwrap()
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. **Clone実装**: 手動実装が必要
|
||||||
|
RwLockはCloneを実装していないため、手動Clone実装が必要。
|
||||||
|
|
||||||
|
## 🎯 目標アーキテクチャ (達成すべき状態)
|
||||||
|
```rust
|
||||||
|
// ✅ 正しい: 単一責務設計
|
||||||
|
struct DebugBox {
|
||||||
|
tracking_enabled: RwLock<bool>, // シンプルな内部可変性
|
||||||
|
tracked_boxes: RwLock<HashMap<String, TrackedBoxInfo>>,
|
||||||
|
breakpoints: RwLock<Vec<String>>,
|
||||||
|
call_stack: RwLock<Vec<CallInfo>>,
|
||||||
|
}
|
||||||
|
// 外部: Arc<Mutex<dyn NyashBox>> (変更なし)
|
||||||
|
|
||||||
|
// ❌ 間違い: 二重ロック問題 (排除済み)
|
||||||
|
struct DebugBox {
|
||||||
|
field: Arc<Mutex<T>>, // 内部ロック - 排除済み
|
||||||
|
}
|
||||||
|
// + 外部: Arc<Mutex<dyn NyashBox>>
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🔍 修正すべきパターン
|
||||||
|
|
||||||
|
### 1. **Clone derive削除 + 手動実装**
|
||||||
|
```rust
|
||||||
|
// ❌ 削除すべき
|
||||||
|
#[derive(Debug, Clone)]
|
||||||
|
|
||||||
|
// ✅ 変更後
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub struct DebugBox {
|
||||||
|
// ... フィールド
|
||||||
|
}
|
||||||
|
|
||||||
|
impl NyashBox for DebugBox {
|
||||||
|
fn clone_box(&self) -> Box<dyn NyashBox> {
|
||||||
|
// 手動Clone実装(PR #87パターン)
|
||||||
|
let tracking_enabled = *self.tracking_enabled.read().unwrap();
|
||||||
|
let tracked_boxes = self.tracked_boxes.read().unwrap().clone();
|
||||||
|
let breakpoints = self.breakpoints.read().unwrap().clone();
|
||||||
|
let call_stack = self.call_stack.read().unwrap().clone();
|
||||||
|
|
||||||
|
Box::new(DebugBox {
|
||||||
|
base: BoxBase::new(),
|
||||||
|
tracking_enabled: RwLock::new(tracking_enabled),
|
||||||
|
tracked_boxes: RwLock::new(tracked_boxes),
|
||||||
|
breakpoints: RwLock::new(breakpoints),
|
||||||
|
call_stack: RwLock::new(call_stack),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. **RwLockパターンの体系的適用**
|
||||||
|
|
||||||
|
**読み取りアクセス**:
|
||||||
|
```rust
|
||||||
|
// ❌ 変更前
|
||||||
|
let tracked = self.tracked_boxes.lock().unwrap();
|
||||||
|
let value = tracked.some_property;
|
||||||
|
|
||||||
|
// ✅ 変更後
|
||||||
|
let tracked = self.tracked_boxes.read().unwrap();
|
||||||
|
let value = tracked.some_property;
|
||||||
|
```
|
||||||
|
|
||||||
|
**書き込みアクセス**:
|
||||||
|
```rust
|
||||||
|
// ❌ 変更前
|
||||||
|
let mut tracked = self.tracked_boxes.lock().unwrap();
|
||||||
|
tracked.insert(key, value);
|
||||||
|
|
||||||
|
// ✅ 変更後
|
||||||
|
let mut tracked = self.tracked_boxes.write().unwrap();
|
||||||
|
tracked.insert(key, value);
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🎯 受け入れ基準 (ゴール)
|
||||||
|
|
||||||
|
### ✅ 主要目標: コンパイル成功
|
||||||
|
```bash
|
||||||
|
$ cargo check --lib
|
||||||
|
Finished `dev` profile [unoptimized + debuginfo] target(s) in X.XXs
|
||||||
|
```
|
||||||
|
|
||||||
|
### ✅ 副次目標: クリーンビルド
|
||||||
|
```bash
|
||||||
|
$ cargo build --release -j32
|
||||||
|
Finished `release` profile [optimized] target(s) in X.XXs
|
||||||
|
```
|
||||||
|
|
||||||
|
### ✅ 検証: DebugBox機能確認
|
||||||
|
```bash
|
||||||
|
# DebugBox基本機能テスト
|
||||||
|
$ ./target/release/nyash test_debug_basic.nyash
|
||||||
|
✅ DebugBoxがRwLockで動作
|
||||||
|
|
||||||
|
# 追跡機能テスト
|
||||||
|
$ ./target/release/nyash test_debug_tracking.nyash
|
||||||
|
✅ メモリ追跡・ブレークポイント機能正常
|
||||||
|
```
|
||||||
|
|
||||||
|
### ✅ 品質保証: パターンの一貫性
|
||||||
|
```bash
|
||||||
|
# DebugBoxでのArc<Mutex>排除確認
|
||||||
|
$ grep -r "Arc<Mutex<" src/boxes/debug_box.rs
|
||||||
|
# 結果: 0件であるべき
|
||||||
|
|
||||||
|
# DebugBoxでのRwLock採用確認
|
||||||
|
$ grep -r "RwLock<" src/boxes/debug_box.rs | wc -l
|
||||||
|
# 結果: 4件 (tracking_enabled, tracked_boxes, breakpoints, call_stack)
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🛠️ 詳細修正手順
|
||||||
|
|
||||||
|
### ステップ1: Clone derive削除
|
||||||
|
```rust
|
||||||
|
// src/boxes/debug_box.rs: line 110
|
||||||
|
// ❌ 削除
|
||||||
|
#[derive(Debug, Clone)]
|
||||||
|
|
||||||
|
// ✅ 変更後
|
||||||
|
#[derive(Debug)]
|
||||||
|
```
|
||||||
|
|
||||||
|
### ステップ2: 11箇所の.lock()変換
|
||||||
|
|
||||||
|
**読み取り専用アクセス (8箇所)**:
|
||||||
|
```rust
|
||||||
|
// Lines: 191, 231, 274, 306, 322, 345
|
||||||
|
self.tracked_boxes.lock().unwrap() → self.tracked_boxes.read().unwrap()
|
||||||
|
|
||||||
|
// Line: 182 (別ファイルのinstance.fields)
|
||||||
|
instance.fields.lock().unwrap() → instance.fields.read().unwrap()
|
||||||
|
|
||||||
|
// Line: 274
|
||||||
|
self.call_stack.lock().unwrap() → self.call_stack.read().unwrap()
|
||||||
|
```
|
||||||
|
|
||||||
|
**書き込みアクセス (3箇所)**:
|
||||||
|
```rust
|
||||||
|
// Lines: 251, 258, 290, 293
|
||||||
|
self.breakpoints.lock().unwrap() → self.breakpoints.write().unwrap()
|
||||||
|
self.call_stack.lock().unwrap() → self.call_stack.write().unwrap()
|
||||||
|
self.tracked_boxes.lock().unwrap() → self.tracked_boxes.write().unwrap()
|
||||||
|
```
|
||||||
|
|
||||||
|
### ステップ3: 手動Clone実装
|
||||||
|
```rust
|
||||||
|
impl NyashBox for DebugBox {
|
||||||
|
fn clone_box(&self) -> Box<dyn NyashBox> {
|
||||||
|
// PR #87確立パターンに従う
|
||||||
|
let tracking_enabled = *self.tracking_enabled.read().unwrap();
|
||||||
|
let tracked_boxes = self.tracked_boxes.read().unwrap().clone();
|
||||||
|
let breakpoints = self.breakpoints.read().unwrap().clone();
|
||||||
|
let call_stack = self.call_stack.read().unwrap().clone();
|
||||||
|
|
||||||
|
Box::new(DebugBox {
|
||||||
|
base: BoxBase::new(), // 新しいユニークID
|
||||||
|
tracking_enabled: RwLock::new(tracking_enabled),
|
||||||
|
tracked_boxes: RwLock::new(tracked_boxes),
|
||||||
|
breakpoints: RwLock::new(breakpoints),
|
||||||
|
call_stack: RwLock::new(call_stack),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🧪 テスト要件
|
||||||
|
|
||||||
|
### 重要なテストケース
|
||||||
|
1. **DebugBox基本機能**: startTracking, stopTracking, trackBox
|
||||||
|
2. **メモリレポート**: memoryReport, dumpAll機能
|
||||||
|
3. **ブレークポイント**: setBreakpoint, traceCall機能
|
||||||
|
4. **並行アクセス**: RwLockによる複数読み取り者対応
|
||||||
|
|
||||||
|
### リグレッション防止
|
||||||
|
- 既存のDebugBox機能は全て変更なく維持されること
|
||||||
|
- Everything is Box哲学が保持されること
|
||||||
|
- パフォーマンスが向上すること (RwLockは並行読み取り可能)
|
||||||
|
|
||||||
|
## 📚 参考資料
|
||||||
|
|
||||||
|
### 成功事例
|
||||||
|
- **PR #87**: ArrayBox、MapBox、TimeBoxでRwLockパターンを確立
|
||||||
|
- **PR #93**: FutureBox二重定義問題の解決例
|
||||||
|
|
||||||
|
### アーキテクチャドキュメント
|
||||||
|
- **Everything is Box哲学**: `docs/説明書/reference/box-design/`
|
||||||
|
- **RwLockパターン**: PR #87で確立されたパターンに従う
|
||||||
|
|
||||||
|
### 関連Issue
|
||||||
|
- **Issue #92**: FutureBox問題 (解決済み)
|
||||||
|
- **PR #93**: FutureBox修正 (完了)
|
||||||
|
|
||||||
|
## 🚀 修正後の期待される影響
|
||||||
|
|
||||||
|
### パフォーマンス向上
|
||||||
|
- **並行読み取りアクセス**: RwLockは複数読み取り者可能 vs Mutex単一アクセス
|
||||||
|
- **デバッグ効率化**: メモリ追跡の並行処理対応
|
||||||
|
- **デッドロック防止**: Arc<Mutex>二重ロックシナリオの完全排除
|
||||||
|
|
||||||
|
### 開発ブロック解除
|
||||||
|
- **Phase 9.5準備完了**: 全Box型がHTTPサーバーテスト対応
|
||||||
|
- **WASM/AOT開発**: 全Box型がコンパイル互換
|
||||||
|
- **デバッグ機能**: 本格運用でのパフォーマンス監視可能
|
||||||
|
- **将来のPhase**: Phase 10+ LLVM作業の堅実な基盤
|
||||||
|
|
||||||
|
## ⚠️ 品質要件
|
||||||
|
|
||||||
|
**これは最後の仕上げです** - 以下を確実に:
|
||||||
|
|
||||||
|
1. **完全なパターン適用**: 全11箇所の.lock() → .read()/.write()変換
|
||||||
|
2. **型安全性**: Clone実装をRwLockに対応した手動実装で解決
|
||||||
|
3. **パフォーマンス検証**: RwLock使用が読み取り/書き込みベストプラクティスに従うこと
|
||||||
|
4. **機能保持**: DebugBoxの全機能を完全に維持すること
|
||||||
|
5. **アーキテクチャ統一**: 他10個のBox型と同じRwLockパターン適用
|
||||||
|
|
||||||
|
目標は、Everything is Box哲学を最適なパフォーマンスで完全に実現する **堅牢で本番レディな実装** です。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**推定作業量**: 1-2時間 (明確に特定された11箇所の修正)
|
||||||
|
**リスクレベル**: 低 (問題箇所特定済み・修正パターン確立済み)
|
||||||
|
**依存関係**: 解決まで全Phase 9.5+開発をブロック
|
||||||
|
**緊急度**: 最高 (他の全Box型は変換完了、DebugBoxのみ残存)
|
||||||
267
docs/予定/native-plan/issues/phase_9_75c_fix_compile_errors_jp.md
Normal file
267
docs/予定/native-plan/issues/phase_9_75c_fix_compile_errors_jp.md
Normal file
@ -0,0 +1,267 @@
|
|||||||
|
# Phase 9.75-C DebugBox修正: 残存する39個のコンパイルエラー解決
|
||||||
|
|
||||||
|
**優先度**: 🔴 **緊急** (全開発ブロック中)
|
||||||
|
**担当者**: @copilot-swe-agent
|
||||||
|
**ステータス**: 未解決
|
||||||
|
**作成日**: 2025-08-15
|
||||||
|
|
||||||
|
## 🚨 問題概要
|
||||||
|
|
||||||
|
**Issue #92とPR #93でFutureBox問題は解決済み**ですが、**DebugBox**のArc<Mutex>→RwLock変換が完全に見落とされており、**39個のコンパイルエラー**が残存しています。
|
||||||
|
|
||||||
|
### 現在の状況
|
||||||
|
```bash
|
||||||
|
$ cargo check --lib
|
||||||
|
error: could not compile `nyash-rust` (lib) due to 39 previous errors; 80 warnings emitted
|
||||||
|
```
|
||||||
|
|
||||||
|
**影響**: 全開発がブロック - ビルド、テスト、Phase 9.5以降の作業継続不可
|
||||||
|
|
||||||
|
## 📋 現在の状況
|
||||||
|
|
||||||
|
### ✅ **解決済み問題** (Issue #92 / PR #93)
|
||||||
|
- **FutureBox二重定義**: 完全解決
|
||||||
|
- **10個のBox型**: HTTPServerBox、P2PBox等はRwLock変換済み
|
||||||
|
|
||||||
|
### ❌ **未解決問題** (この新しいIssue)
|
||||||
|
- **DebugBox**: Arc<Mutex>→RwLock変換が完全に見落とされている
|
||||||
|
|
||||||
|
### ✅ 変換済みBox型 (PR #91)
|
||||||
|
- **HTTPServerBox**: 7個のArc<Mutex>フィールド → RwLock
|
||||||
|
- **P2PBox**: `Arc<Mutex<P2PBoxData>>`型エイリアスから完全書き換え
|
||||||
|
- **IntentBox**: `Arc<Mutex<IntentBoxData>>`型エイリアスから完全書き換え
|
||||||
|
- **SimpleIntentBox**: listenersハッシュマップ変換
|
||||||
|
- **JSONBox**: serde_json::Value操作
|
||||||
|
- **RandomBox**: seedフィールド変換
|
||||||
|
- **EguiBox**: クロススレッドArc<RwLock>での複雑なGUI状態
|
||||||
|
- **FileBox**: ファイルI/O操作、パス簡素化
|
||||||
|
- **FutureBox**: 非同期状態管理
|
||||||
|
- **SocketBox**: TCP操作更新
|
||||||
|
|
||||||
|
### 🎯 目標アーキテクチャ (達成すべき状態)
|
||||||
|
```rust
|
||||||
|
// ✅ 正しい: 単一責務設計
|
||||||
|
struct SomeBox {
|
||||||
|
field: RwLock<T>, // シンプルな内部可変性
|
||||||
|
}
|
||||||
|
// 外部: Arc<Mutex<dyn NyashBox>> (変更なし)
|
||||||
|
|
||||||
|
// ❌ 間違い: 二重ロック問題 (排除済み)
|
||||||
|
struct SomeBox {
|
||||||
|
field: Arc<Mutex<T>>, // 内部ロック - 排除済み
|
||||||
|
}
|
||||||
|
// + 外部: Arc<Mutex<dyn NyashBox>>
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🔍 DebugBox問題の技術的分析
|
||||||
|
|
||||||
|
**具体的エラー箇所**: `src/boxes/debug_box.rs`
|
||||||
|
|
||||||
|
### 📊 **特定されたエラー**
|
||||||
|
|
||||||
|
### 1. **DebugBox構造体**: Clone derive問題
|
||||||
|
```rust
|
||||||
|
// ❌ 現在の問題
|
||||||
|
#[derive(Debug, Clone)] // RwLockはCloneを実装していない
|
||||||
|
pub struct DebugBox {
|
||||||
|
tracking_enabled: RwLock<bool>,
|
||||||
|
tracked_boxes: RwLock<HashMap<String, TrackedBoxInfo>>,
|
||||||
|
// ... 他フィールド
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. **11箇所の.lock()呼び出し**: メソッド名エラー
|
||||||
|
```bash
|
||||||
|
src/boxes/debug_box.rs:182 instance.fields.lock().unwrap()
|
||||||
|
src/boxes/debug_box.rs:191 self.tracked_boxes.lock().unwrap()
|
||||||
|
src/boxes/debug_box.rs:231 self.tracked_boxes.lock().unwrap()
|
||||||
|
src/boxes/debug_box.rs:251 self.breakpoints.lock().unwrap()
|
||||||
|
src/boxes/debug_box.rs:258 self.call_stack.lock().unwrap()
|
||||||
|
src/boxes/debug_box.rs:274 self.call_stack.lock().unwrap()
|
||||||
|
src/boxes/debug_box.rs:290 self.tracked_boxes.lock().unwrap()
|
||||||
|
src/boxes/debug_box.rs:293 self.call_stack.lock().unwrap()
|
||||||
|
src/boxes/debug_box.rs:306 self.tracked_boxes.lock().unwrap()
|
||||||
|
src/boxes/debug_box.rs:322 self.tracked_boxes.lock().unwrap()
|
||||||
|
src/boxes/debug_box.rs:345 self.tracked_boxes.lock().unwrap()
|
||||||
|
```
|
||||||
|
|
||||||
|
**修正すべきパターン**:
|
||||||
|
```rust
|
||||||
|
// ❌ 古いコード (まだ存在)
|
||||||
|
let data = self.field.lock().unwrap();
|
||||||
|
|
||||||
|
// ✅ 正しくは (RwLockパターン)
|
||||||
|
let data = self.field.read().unwrap();
|
||||||
|
// または
|
||||||
|
let mut data = self.field.write().unwrap();
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. **メソッドシグネチャでの型不一致**
|
||||||
|
メソッドの戻り値の型やパラメータ型が`Arc<Mutex<T>>`を期待しているが`RwLock<T>`を受け取っている。
|
||||||
|
|
||||||
|
### 3. **Clone実装の問題**
|
||||||
|
新しいRwLockベースのClone実装で型の不整合が発生している可能性。
|
||||||
|
|
||||||
|
### 4. **import整理が必要**
|
||||||
|
82個の警告は未使用の`Arc`、`Mutex`のimportが多数残っていることを示している。
|
||||||
|
|
||||||
|
## 🎯 受け入れ基準 (ゴール)
|
||||||
|
|
||||||
|
### ✅ 主要目標: コンパイル成功
|
||||||
|
```bash
|
||||||
|
$ cargo check --lib
|
||||||
|
Finished `dev` profile [unoptimized + debuginfo] target(s) in X.XXs
|
||||||
|
```
|
||||||
|
|
||||||
|
### ✅ 副次目標: クリーンビルド
|
||||||
|
```bash
|
||||||
|
$ cargo build --release -j32
|
||||||
|
Finished `release` profile [optimized] target(s) in X.XXs
|
||||||
|
```
|
||||||
|
|
||||||
|
### ✅ 検証: 全Box型の機能確認
|
||||||
|
```bash
|
||||||
|
# 基本機能テスト
|
||||||
|
$ ./target/release/nyash local_tests/test_basic_box_operations.nyash
|
||||||
|
✅ 全Box操作成功
|
||||||
|
|
||||||
|
# HTTPサーバーテスト (Phase 9.5にとって重要)
|
||||||
|
$ ./target/release/nyash local_tests/test_http_server_basic.nyash
|
||||||
|
✅ HTTPServerBoxがRwLockで動作
|
||||||
|
|
||||||
|
# P2Pテスト (将来のPhaseにとって重要)
|
||||||
|
$ ./target/release/nyash local_tests/test_p2p_basic.nyash
|
||||||
|
✅ P2PBoxがRwLockで動作
|
||||||
|
```
|
||||||
|
|
||||||
|
### ✅ 品質保証: パターンの一貫性
|
||||||
|
```bash
|
||||||
|
# Arc<Mutex>排除確認
|
||||||
|
$ grep -r "Arc<Mutex<" src/boxes/
|
||||||
|
# 結果: 0件であるべき
|
||||||
|
|
||||||
|
# RwLock採用確認
|
||||||
|
$ grep -r "RwLock<" src/boxes/ | wc -l
|
||||||
|
# 結果: 10+件 (変換済みBox毎に1つ)
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🛠️ 詳細修正手順
|
||||||
|
|
||||||
|
### ステップ1: 具体的エラーの特定
|
||||||
|
```bash
|
||||||
|
cargo check --lib 2>&1 | grep -A 3 "error\[E"
|
||||||
|
```
|
||||||
|
|
||||||
|
これらのエラータイプに注目:
|
||||||
|
- **E0599**: メソッドが見つからない (おそらく`.lock()` → `.read()`/`.write()`)
|
||||||
|
- **E0308**: 型不一致 (Arc<Mutex<T>> → RwLock<T>)
|
||||||
|
- **E0282**: 型推論 (ジェネリックRwLock使用)
|
||||||
|
|
||||||
|
### ステップ2: RwLockパターンの体系的適用
|
||||||
|
|
||||||
|
**読み取りアクセス**:
|
||||||
|
```rust
|
||||||
|
// ❌ 変更前
|
||||||
|
let data = self.field.lock().unwrap();
|
||||||
|
let value = data.some_property;
|
||||||
|
|
||||||
|
// ✅ 変更後
|
||||||
|
let data = self.field.read().unwrap();
|
||||||
|
let value = data.some_property;
|
||||||
|
```
|
||||||
|
|
||||||
|
**書き込みアクセス**:
|
||||||
|
```rust
|
||||||
|
// ❌ 変更前
|
||||||
|
let mut data = self.field.lock().unwrap();
|
||||||
|
data.some_property = new_value;
|
||||||
|
|
||||||
|
// ✅ 変更後
|
||||||
|
let mut data = self.field.write().unwrap();
|
||||||
|
data.some_property = new_value;
|
||||||
|
```
|
||||||
|
|
||||||
|
**Clone実装**:
|
||||||
|
```rust
|
||||||
|
// ✅ PR #87で確立された標準パターン
|
||||||
|
fn clone(&self) -> Box<dyn NyashBox> {
|
||||||
|
let data = self.field.read().unwrap();
|
||||||
|
Box::new(SomeBox {
|
||||||
|
base: BoxBase::new(), // 新しいユニークID
|
||||||
|
field: RwLock::new(data.clone()),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### ステップ3: import整理
|
||||||
|
警告で特定された未使用importを削除:
|
||||||
|
```rust
|
||||||
|
// ❌ 削除すべき
|
||||||
|
use std::sync::{Arc, Mutex};
|
||||||
|
|
||||||
|
// ✅ 必要なもののみ残す
|
||||||
|
use std::sync::RwLock;
|
||||||
|
```
|
||||||
|
|
||||||
|
### ステップ4: メソッドシグネチャ更新
|
||||||
|
全メソッドシグネチャが新しいRwLock型と一致するように確認:
|
||||||
|
```rust
|
||||||
|
// 例: メソッドがArc<Mutex<T>>を返していた場合、RwLock<T>に更新
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🧪 テスト要件
|
||||||
|
|
||||||
|
### 重要なテストケース
|
||||||
|
1. **HTTPServerBox**: Phase 9.5 HTTPサーバーテスト用に機能必須
|
||||||
|
2. **P2PBox**: NyaMesh P2P機能のコア
|
||||||
|
3. **SocketBox**: ネットワーク操作の依存関係
|
||||||
|
4. **変換済み全10Box型**: 基本インスタンス化とメソッド呼び出し
|
||||||
|
|
||||||
|
### リグレッション防止
|
||||||
|
- 既存のBox機能は全て変更なく維持されること
|
||||||
|
- Everything is Box哲学が保持されること
|
||||||
|
- パフォーマンスが向上すること (RwLockは並行読み取り可能)
|
||||||
|
|
||||||
|
## 📚 参考資料
|
||||||
|
|
||||||
|
### 過去の成功事例
|
||||||
|
- **PR #87**: ArrayBox、MapBox、TimeBoxでRwLockパターンを確立
|
||||||
|
- **Phase 9.75-A/B**: 成功したArc<Mutex>排除の例
|
||||||
|
|
||||||
|
### アーキテクチャドキュメント
|
||||||
|
- **Everything is Box哲学**: `docs/説明書/reference/box-design/`
|
||||||
|
- **RwLockパターン**: PR #87で確立されたパターンに従う
|
||||||
|
|
||||||
|
### 関連Issue
|
||||||
|
- **元のIssue #90**: Arc<Mutex>二重ロック問題の特定
|
||||||
|
- **Phase 9.5依存関係**: HTTPServerBoxが今後の作業にとって重要
|
||||||
|
|
||||||
|
## 🚀 修正後の期待される影響
|
||||||
|
|
||||||
|
### パフォーマンス向上
|
||||||
|
- **並行読み取りアクセス**: RwLockは複数読み取り者可能 vs Mutex単一アクセス
|
||||||
|
- **ロック競合減少**: Box操作のスケーラビリティ向上
|
||||||
|
- **デッドロック防止**: Arc<Mutex>二重ロックシナリオの排除
|
||||||
|
|
||||||
|
### 開発ブロック解除
|
||||||
|
- **Phase 9.5準備完了**: HTTPServerBoxがHTTPサーバーテスト用に機能
|
||||||
|
- **WASM/AOT開発**: 全Box型がコンパイル互換
|
||||||
|
- **将来のPhase**: Phase 10+ LLVM作業の堅実な基盤
|
||||||
|
|
||||||
|
## ⚠️ 品質要件
|
||||||
|
|
||||||
|
**これは簡単な修正ではありません** - 以下を確実に:
|
||||||
|
|
||||||
|
1. **完全なパターン適用**: 全Arc<Mutex> → RwLock変換が適切に実装されること
|
||||||
|
2. **型安全性**: unsafeな回避策なしで全型不一致を解決すること
|
||||||
|
3. **パフォーマンス検証**: RwLock使用が読み取り/書き込みベストプラクティスに従うこと
|
||||||
|
4. **包括的テスト**: 変換済み全Box型の機能を検証すること
|
||||||
|
5. **クリーンなコード**: 可能な限り未使用importと警告を削除すること
|
||||||
|
|
||||||
|
目標は、Everything is Box哲学を最適なパフォーマンスで完全に実現する **堅牢で本番レディな実装** です。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**推定作業量**: 4-6時間 (体系的修正 + テスト)
|
||||||
|
**リスクレベル**: 中 (注意深い型システム作業が必要)
|
||||||
|
**依存関係**: 解決まで全Phase 9.5+開発をブロック
|
||||||
@ -76,7 +76,7 @@ impl NyashInterpreter {
|
|||||||
|
|
||||||
/// nowait文を実行 - 非同期実行(真の非同期実装) - Async execution
|
/// nowait文を実行 - 非同期実行(真の非同期実装) - Async execution
|
||||||
pub(super) fn execute_nowait(&mut self, variable: &str, expression: &ASTNode) -> Result<Box<dyn NyashBox>, RuntimeError> {
|
pub(super) fn execute_nowait(&mut self, variable: &str, expression: &ASTNode) -> Result<Box<dyn NyashBox>, RuntimeError> {
|
||||||
use crate::box_trait::FutureBox;
|
use crate::boxes::FutureBox;
|
||||||
use std::thread;
|
use std::thread;
|
||||||
|
|
||||||
// FutureBoxを作成
|
// FutureBoxを作成
|
||||||
|
|||||||
@ -7,7 +7,8 @@
|
|||||||
|
|
||||||
// Import all necessary dependencies
|
// Import all necessary dependencies
|
||||||
use crate::ast::{ASTNode, BinaryOperator, CatchClause};
|
use crate::ast::{ASTNode, BinaryOperator, CatchClause};
|
||||||
use crate::box_trait::{NyashBox, StringBox, IntegerBox, BoolBox, VoidBox, AddBox, SubtractBox, MultiplyBox, DivideBox, CompareBox, ArrayBox, FileBox, ResultBox, ErrorBox, FutureBox, BoxCore};
|
use crate::box_trait::{NyashBox, StringBox, IntegerBox, BoolBox, VoidBox, AddBox, SubtractBox, MultiplyBox, DivideBox, CompareBox, ArrayBox, FileBox, ResultBox, ErrorBox, BoxCore};
|
||||||
|
use crate::boxes::FutureBox;
|
||||||
use crate::instance::InstanceBox;
|
use crate::instance::InstanceBox;
|
||||||
use crate::channel_box::ChannelBox;
|
use crate::channel_box::ChannelBox;
|
||||||
use crate::boxes::math_box::{MathBox, FloatBox, RangeBox};
|
use crate::boxes::math_box::{MathBox, FloatBox, RangeBox};
|
||||||
|
|||||||
Reference in New Issue
Block a user