mruby Rust バインディングのスレッドセーフ バージョンを実装しようとしています。
mruby には*mut MRState
(のラッパーmrb_state
) があります。*mut MRState
mruby コードを実行するときにこれを渡す必要があります。*mut MRState
mruby コードには、同じ変数を渡す場所で呼び出すことができる Rust コールバックがあります。
これは、スレッドセーフにしようとしている に*mut MRState
ラップされています。MRuby
struct
問題は、 でラップMRuby
するMutex
と、Rust で作成されたコールバック内に再入力できなくなることです。
私は現在ラップMRuby
してRwLock
いますが、あまり役に立ちません。は*mut MRState
、コールバック内で実行できるように、より寛容なロックにする必要があります。
MRuby
コールバックの両方で機能させ、別のスレッドから呼び出された場合に強制的に待機させるにはどうすればよいですか?
これとは別に、&ではない*mut MRState
内部に問題があります。MRuby
Send
Sync
struct MRuby {
mrb: *mut MRState,
...
}
これはコールバックの例です。
// this callback will be run with a mrb_ function with takes
// *mut MRState as an argument, so it would need to lock
extern "C" callback(...) {
// I need to use MRuby here which will make use of
// its inner *mut MRState
...
}
これは、スレッドで mruby を実行する例です。mruby
ここの変数はArc<RwLock<MRuby>>
.
thread::spawn(move || {
mruby.run("*mruby code*"); // should run sequentially with
// with a lock on *mut MRState
});
これを実装したい主な理由は機能ではありません。実際にcatch_panic
は、Rust コールバックから発生する可能性のあるパニックをキャッチするために必要です。別のスレッドで実行されるため、スレッドセーフcatch_panic
にする必要があります。MRuby
Rust は 1.9.0 でのみ安定std::panic
します。それまでは、毎晩 Rust を必要としない実用的なソリューションが必要です。
修正
Rust のドキュメンテーション生成のバグにより、catch_panic
非推奨としてのみマークされ、不安定ではありません。したがって、非常に簡単な解決策はstd::panic
、スレッドセーフを使用して放棄することです。ただし、前述のことを考慮すると、私の個人的な関心は低くなりますが、これに対する良い答えがある場合に備えて、質問を開いたままにします。