ネイティブコードを処理するJavaサーバー(Linux 64ビット)アプリケーションがあります。ネイティブコードでは、すべてのマルチスレッドの問題も処理され、最近ではboost::context
を使用してファイバ交換で強化されています。コンテキスト切り替えネイティブスレッドはJVMにアタッチできません
今直面している問題は、AttachCurrentThread
がファイバ交換スレッドで失敗することです。いくつかの長いデバッグとテストセッションの後、私たちはこれの原因を発見しました.JVMは、作成時に与えられたものとは異なるスタックポインタを持つスレッドを拒否しているようです。
rsp
が変更されたときに変更された(しかし有効な)rsp
を持つpthreadからJVMに接続するだけで、これを確認できました。
可能な修正では、コールバックをファイバ交換スレッドから切り離すための何らかのイベント処理メカニズムが導入される可能性がありますが、これを避けたいと考えています。
誰かがこれに対する回避策を知っていますか?
スタックチェック(Java Java 1.7.0_40,64ビット)を無効にすることはできますか?
正しいスタックフレームを指すようにネイティブpthreadを変更できますか? (スタックフレームはあらかじめ設定することはできません)。
私はそれがあなたの問題に正確に答えていないことを知っていますが、あなたはboost :: contextファイバー(C++で実装されている)をJavaの世界のファイバーの実装に置き換えることができます。この文脈では、多くの場合コルーチンと呼ばれます。 ここにいくつかの既存の実装があります:[Javaで利用可能なコルーチンライブラリ](http://stackoverflow.com/questions/2846428/available-coroutine-libraries-in-java) –
これに対する解決策はありますか?私はBoost.Coroutineを利用しようとしており、そのようなルーチンでJNIからJava空間にコールバックする必要があります。その結果、多くの失敗が発生します... – NuSkooler