Skip to content

fix(macOS): Converterを入力セッション間で共有する - #346

Draft
ensan-hcl wants to merge 4 commits into
mainfrom
fix/shared-converter-runtime
Draft

fix(macOS): Converterを入力セッション間で共有する#346
ensan-hcl wants to merge 4 commits into
mainfrom
fix/shared-converter-runtime

Conversation

@ensan-hcl

@ensan-hcl ensan-hcl commented Aug 2, 2026

Copy link
Copy Markdown
Member

概要

ConverterServer 内で KanaKanjiConverter を入力セッションごとに生成せず、全実行レーンから1つの Converter を共有するようにします。入力途中の状態は AZKKC の変換セッションで分離します。

あわせて、XPC の reply 欠落時にクライアントの順序付きキューが永久停止しないための復旧処理と、アプリ切替時の入力待ちを起こしていた学習データ保存処理の遅延・省略を追加します。

原因

  • ConverterServer プロセス自体は共有されていましたが、openSession のたびに KanaKanjiConverter.withDefaultDictionary() を生成していました。
  • そのため新しいアプリの入力セッションごとに辞書・モデル・Converter キャッシュの初期化コストが発生していました。
  • OrderedAsyncCommandQueue は XPC reply が欠落すると先頭処理を完了できず、以降の入力がすべて待ち続ける構造でした。
  • 古い NSXPCConnection を参照から外すだけで明示的に invalidate しておらず、接続が残るケースがありました。
  • アプリ切替時の activateServer が設定同期・言語同期・activateを別々のXPCとしてキー入力より先に直列化していました。
  • 新規アプリの最初の入力は、openSession の応答後に改めてキーを送る2往復になっていました。
  • 旧アプリの deactivate は非同期でServerへ送られますが、Server上では学習データを同期保存していました。クライアント側では切替が完了しているため、新アプリの最初のキーが共有Serverの保存完了を待つ状態になっていました。
  • AZKKCの学習保存は変更がない場合も既存学習辞書をマージし、メモリキャッシュを破棄していました。

変更内容

  • ConverterServer 起動時に KanaKanjiConverter を1回だけ生成
  • 各入力セッションは軽量な AZKKC の変換セッション ID と SegmentsManager のみ保持
  • Converter 操作を MainActor 上で直列化し、処理ごとに対象の変換セッションを選択
  • ユーザー辞書再読込・学習リセットを共有 Converter に1回だけ適用
  • 順序付きコマンドキューへタイムアウトを追加し、遅延 reply を operation ID で無視
  • キーイベントはタイムアウト後も同じ event ID のまま再送し、Server 側の既存重複排除で二重適用を防止
  • タイムアウト時は古い XPC 接続を明示的に invalidate して再接続
  • activationを最初のキーイベントへ同梱し、切替時の先行XPCを削除
  • セッション作成・activation・最初のキー処理を1つのServerコマンドとして原子的に実行
  • deactivate では入力状態だけ即時リセットし、学習データの永続化は入力が2秒途切れるまで遅延
  • 遅延保存が待機中に別コマンドを処理した場合は、保存をそのコマンド完了後まで再延期
  • AZKKC側で未保存の学習変更がない場合は、辞書マージとメモリキャッシュ破棄を省略
  • ConverterServerにもApp Group entitlementを付与し、Group Containers参照時のファイルアクセス確認を防止
  • 左右文脈の取得方法は変更せず、プロセス分離前と同じ入力情報を維持
  • ログにはタイムアウトの事実だけを記録し、キー内容は追加していません

依存 PR

現時点では上記 PR のコミット 67ec8e68d17a534b5b9929b920995ef3811e89fe を参照しています。

テスト

  • swift test --package-path Core(67 tests passed)
  • AZKKC: swift test --filter LearningMemoryTests(5 tests passed)
  • xcodebuild -project azooKeyMac.xcodeproj -scheme azooKeyMac -configuration Debug test CODE_SIGNING_ALLOWED=NO -only-testing:azooKeyMacTests(9 tests passed)
  • swiftlint lint --strict
  • git diff --check
  • ./install.sh --dry-run(archive succeeded)
  • archive内のConverterServerにApp Group entitlementが付与されていることを codesign で確認

実機への再インストールはこの更新では行っていません。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant