CategoryBSD

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を採用して実装する。 これが一番ベターな感じがするなあ。

BPFとLinuxでのL2IFを扱うネットワークプログラミングでの違いについて

この記事を書こうと思ったきっかけ

OSX上でc言語で書いたパケットキャプチャでパケットをキャプチャしていた時に並行してwiresharkと見比べていたのですが、なんだかwiresharkと比べてパケットを幾つかドロップしていたため、少し調べた(他人に頼った)ところ、BPFでの確保したディスクリプタはLinuxのそれと幾つか動作の違いがあるとのことなので、簡単にまとめることにしました。 今回この記事を書く上で情報を提供してくれた方々にはとても感謝です。

Continue reading

© 2017 Slank Blog

Theme by Anders NorenUp ↑