高速通信計算研究所

slankdevの報告

DPDKでremote_core_launchした処理が例外を投げた時の挙動について

上記について実際に動かして調べました。

パターン1: remote_core_launchをtryに囲む 

void func() /* user implementation */
{
    throw exception;
}

int main() /* developer implementation */
{
    dpdk_init();
    try {
        remote_core_launch(func);
    } catch (e) {
        printf(e.what());
    }
}

これでは例外をキャッチできないが、一応普段どおりに terminate called after throwing an instance of ‘hogehoge’ してくれるので壊れたり(余談参照)しなかった。

余談: DPDK使ってるときに極まれにDPDKの秘孔をついてNICが使えなくなることが セキュリティキャンプであったので。(本当にDPDKの秘孔が原因か解らないけど。。)

パターン2: すべての処理の一番上からtryで囲む

void func() /* user implementation */
{
    throw exception;
}

int main() /* developer implementation */
{
    try {
        dpdk_init();
        remote_core_launch(func);
    } catch (e) {
        printf(e.what());
    }
}

これでも例外はキャッチできない。 なおterminate called after throwing an instance of ‘hogehoge'はしてくれる

パターン3: remote_core_launchする関数をラップする

void func() /* user implementation */
{
    throw exception;
}

void wrap_func() /* developer implementation */
{
    try {
        func();
    } catch (e) {
        printf(e.what());
    }
}

int main() /* developer implementation */
{
    dpdk_init();
    remote_core_launch(wrap_func);
}

これで例外をしっかりキャッチできる

まとめ

STCPではパターン3を採用して実装する。 これが一番ベターな感じがするなあ。