VOICEVOX / voicevox_core

無料で使える中品質なテキスト読み上げソフトウェア、VOICEVOXのコア
https://voicevox.hiroshiba.jp/
MIT License
859 stars 115 forks source link

アイデア:C APIで、stderr以外からログを受け取れるようにする #556

Open sevenc-nanashi opened 1 year ago

sevenc-nanashi commented 1 year ago

内容

タイトル通りです。

Pros 良くなる点

C FFIのラッパーがそれぞれの言語にあった形(Loggerなど)でログを出せるようになる

Cons 悪くなる点

ないはず?

実現方法

struct VoicevoxLogObject {
    VoicevoxLogLevel level;
    char*            message;
}

typedef void (*voicevox_log_callback)(VoicevoxLogObject);

void voicevox_set_log_callback(voicevox_log_callback callback);

VOICEVOXのバージョン

0.15.0(vvm-async-api)

OSの種類/ディストリ/バージョン

その他

(なし)

qryxip commented 1 year ago

気付いたのですがこれをやるためには #541 を、少なくとも「panic=abortのまますべてをextern "C-unwind"にする」という形でやらないといけませんね。やらない場合、「絶対にコールバックからunwindするな」という注意書きを書くことになります。

541 で以下の表を引用しましたが、extern "C"からC++の例外を発射することは例えpanic=abort下であってもUBです。これを防ぐにはコールバックが呼ばれうるすべての関数をextern "C-unwind"にする他ありません。

panic runtime ABI panic-unwind Unforced foreign unwind
panic=unwind "C-unwind" unwind unwind
panic=unwind "C"-like abort UB
panic=abort "C-unwind" panic! aborts abort
panic=abort "C"-like panic! aborts (no unwinding occurs) UB

2945-c-unwind-abi - The Rust RFC Book

qryxip commented 11 months ago

このissueですが、 #545 から一旦外しました。 (後で入れてもおそらくbreaking changeではないので)