注意点
このページは、dotnet/runtimeリポジトリにマージされたPull Requestを自動的に収集し、その内容をAIが要約した内容を表示しています。そのため、必ずしも正確な要約ではない場合があります。
目次
- #122753 Fix debug build
- #122571 Refactor lock upgrade logic
- #122466 Resolve dllimport.cpp runtimeasync todos
#122753 Fix debug build
- 作成者: @am11
- 作成日時: 2025年12月27日 12:52:41(UTC)
- マージ日時: 2025年12月27日 16:18:03(UTC)
- ラベル: area-System.Threading community-contribution
概要
デバッグビルドで発生していたコード分析エラー(IDE0036)を修正するPR。System.Threading.Interlocked.CoreCLR.csの149行目でmodifiersの順序が正しくなかったため、修飾子の順序を統一してビルドエラーを解決しました。
変更内容
- ファイル:
src/coreclr/System.Private.CoreLib/src/System/Threading/Interlocked.CoreCLR.cs - 変更: +1/-1(1行の修正)
- 内容: メソッドまたはプロパティの修飾子の順序を規約に合わせて修正
IDE0036ルールでは、修飾子の順序がpublic staticやinternal asyncなど標準的な順序に従う必要があります。
パフォーマンスへの影響
影響なし
関連Issue
Issue #122753(デバッグビルドの失敗)
その他
- このPRはコード分析スタイル規約の違反を修正するもので、機能的な変更はありません
dotnet-policy-service[bot]により、area-ownersのsubscriberへ自動で通知されています- .NETの開発環境でビルドを成功させるためには、修飾子の順序の統一が重要です
#122571 Refactor lock upgrade logic
- 作成者: @jkoritzinsky
- 作成日時: 2025年12月16日 00:23:24(UTC)
- マージ日時: 2025年12月27日 01:37:17(UTC)
- ラベル: area-VM-coreclr
概要
ロック(Monitor)のアップグレード処理におけるGCホール問題を修正するPR。NativeAOTで使用されているポインタオーバーロード版のCompareExchangeをCoreClrに適用し、ARM32プラットフォームで完全に形成されたrefが報告されることによるクラッシュを防止。
変更内容
- Interlocked.CoreCLR.cs: ポインタオーバーロード版
CompareExchangeを追加実装 - syncblk.cpp/h/inl: ロックアップグレードロジックをネイティブコード内で実装し、マネージドコードでのref生成を回避
- nativeaot/Interlocked.cs: 既存のポインタオーバーロード実装を調整
- ecalllist.h: 新規ネイティブメソッドのエクスポート
パフォーマンスへの影響
ほぼ同等。ローカルベンチマーク結果:
- PR版: 37.33 µs
- main版: 36.97 µs
- Ratio: 1.01(測定誤差範囲内)
ネイティブ実装により、マネージド版で必要だったスタックフレーム生成によるペナルティを回避。
関連Issue
- #122275
- #122482
その他
根本原因はARM32においてCompareExchangeがmust-expand intrinsicでないため、完全に形成されたrefがFCall時に報告され、オブジェクトヘッダアドレスを含む不正なヒープポインタ参照が生じていた点。NativeAOTではポインタオーバーロードで既に対応済み。
#122466 Resolve dllimport.cpp runtimeasync todos
- 作成者: @jkoritzinsky
- 作成日時: 2025年12月11日 21:16:00(UTC)
- マージ日時: 2025年12月27日 02:16:15(UTC)
- ラベル: area-Interop-coreclr runtime-async
概要
P/Invoke(DllImport)メソッドとデリゲートのInvokeメソッドに対して、asyncメソッドフラグが設定されるシナリオを防ぐための改善。Roslynはこれらのメソッドにasyncマークを付けないため、不正な組み合わせの検出と エラーハンドリングを強化しました。例えば以下のような不正なコードはロード時に失敗します:
[DllImport("kernel32.dll")]
private static extern Task QueryPerformanceFrequency(out long frequency);
変更内容
- dllimport.cpp: asyncビット設定のメソッド検出時にアサート追加
- methodtablebuilder.cpp: P/Invoke/COM Interop/UnmanagedCallersOnlyメソッドのasyncビット検証強化
- PInvokeILProvider.cs・NativeAotILProvider.cs: async設定メソッドへの例外処理追加
- comdelegate.cpp: COM delegateのasync検証追加
- UnmanagedCallingConventions.cs: UnmanagedCallersOnlyのasync検証強化
- テスト追加: RuntimeAsyncおよびInvalidCallbacks.ilでテストカバレッジ拡充
パフォーマンスへの影響
影響なし。主にバリデーション段階での検出であり、正常系のパスに影響はありません。
関連Issue
#121758(dllimport.cpp runtimeasync todos)
その他
レビュアーのVSadovから、Task/ValueTask戻り値のP/Invokeに関する既存シナリオのテスト追加提案があります。これは回帰テストとしての価値が高く、将来的な検討対象となります。MethodImplOptions.Synchronizedと同様に、MethodImplOptions.Asyncの不正な使用時にはTypeLoadExceptionが発生するようになりました。