Open3

Ribbon: GCを実装する

okuokuokuoku

まぁPythonと同様のGCで良いかな。

http://www.narihiro.info/translate/garbage_collection_for_python_jp.html

https://devguide.python.org/internals/garbage-collector/

全ての外部参照を持つ可能性があるオブジェクト(コンテナ)をリンクリストで繋いでおき、

  1. リストを辿って gc_ref をコンテナ自身のリファレンスカウントで初期化
  2. 再度リストを辿って自身が参照しているコンテナの gc_ref を1減算
  3. 再度リストを辿って gc_ref がゼロのコンテナはゴミリストに移動 、同時に、gc_ref がゼロでないコンテナから参照されているコンテナがゴミリストに入っていたらゴミリストから除いてリストの末尾に追加

このアルゴリズムの良いところは 2 や 3 で再帰する必要が無いことで、超深い再帰リストを作っていたとしても問題なくオブジェクトを回収できる。

okuokuokuoku

なんとなく動いた

https://github.com/okuoku/ribbon/commit/8e456b4f90880345fe54f4106084a26757aaf888

リストを修正したらリストのnextを読み直さないといけないのをすっかり忘れていてデバッグにてこずってしまった(初心者かよ)

https://github.com/okuoku/ribbon/blob/8e456b4f90880345fe54f4106084a26757aaf888/c-proto/c-proto.c#L259-L263

あと今気付いたけど、

https://github.com/okuoku/ribbon/blob/8e456b4f90880345fe54f4106084a26757aaf888/c-proto/c-proto.c#L682-L685

こういう風にリファレンスカウントを手動で操作して無理矢理freeするのはダメで、コンテナじゃないオブジェクトのリファレンスカウントを下げつつ、コンテナは問答無用で解放する (トラバースしない) 専用のFreeを用意する必要がある。このGCで解放されるコンテナは常に非ゼロのリファレンスカウントを持つので、どこかから指されている。