Closed manabinohibi closed 1 year ago
なんとなくですが,persistent_ptrは今回の用途には適していない感じがしますね.スマートポインタと言ってはいますが,pmem::obj::poolで確保した領域のトランザクションを介した操作に特化してるだけな感じがします.
どうもありがとうございます.(遅くなってスミマセン…)
ElementHolderでもみたいに管理用の配列を同じく保持して,PMEMを閉じた後も専有状態だけは別途解放できるようにしないとダメっぽいです.
今の実装だと構造体PoolElement
に占有状態を保持するフラグと記述子を持たせて,それをElementHolder
のメンバ変数としていますが,このあたりの実装を変えないとダメということでしょうか…?
もしくは構造体PoolElement
はそのままもたせておいて,管理用の配列を追加する形になるんでしょうか?
すみません,このあたりの構造がまだつかめてないです.
今の実装だと構造体PoolElementに占有状態を保持するフラグと記述子を持たせて,それをElementHolderのメンバ変数としていますが,このあたりの実装を変えないとダメということでしょうか…?
はい,そうなると思います.以下のように,pmempoolのルート領域として使用する型は単なるPMwCASDescriptor
の配列になって,
struct DescPool {
PMwCASDescriptor pool[kDescriptorPoolSize];
};
これとは別に各記述子の専有状態を管理する配列を別途共有ポインタとして保持する感じです.
std::shared_ptr<std::atomic_bool[kDescriptorPoolSize]> reserve_arr_ = std::make_shared<std::atomic_bool[]>(kDescriptorPoolSize);
@baycedar 報告(というよりヘルプ)用のドラフトです. とりあえずこれと同じ方針で実装を進めています.
現状はエラー出ます.
[build] /usr/local/include/libpmemobj++/detail/life.hpp:79:34: error: no matching constructor for initialization of 'dbgroup::atomic::pmwcas::ElementHolder' [clang-diagnostic-error]
そもそもこの方針で正しいかもわかりませんが,記述子ポインタの扱いがわからないなぁといったところです. 今まで通りunique_ptrで良いのか,persistent_ptrを使うのか,はたまたどっちもなのか…
お時間あれば少し見ていただけると嬉しいです.