void Ref::retain()
{
CCASSERT(_referenceCount > 0, "reference count should greater than 0");
++_referenceCount;
}
class Ref は、cocos2d-xのメモリ管理、retain、releaseをする基底クラスで
Node等 ほとんどのクラスは、ここから派生していますが
この参照カウンタでは、マルチスレッド環境にて不具合が発生するので
ミューテックス、あるいはロックフリーで、スレッドセーフにする必要があります
今回はパフォーマンス的に ロックフリーが妥当で、さほどパフォーマンスに影響でないと思いますので
下記のように アトミック操作を使い ロックフリーを実現したいと思います
++_referenceCount;
--_referenceCount;
を
__sync_add_and_fetch(&_referenceCount, 1);
__sync_add_and_fetch(&_referenceCount, -1);
こう変更すれば、だいたいスレッドフリーになるのではないでしょうか。
現在 PullRequest してますが Jenkins設定がおかしくなってるのか
しばらくビルドが出来てないようで
PRトオレバイイナ・・・
ちなみに、上記 class Refは、Appleのcocosライブラリの模倣で
C++としては 許しがたいコード (標準のスマートポインタ shared_ptrあるのに使わない)
なので、はやくshared_ptr に修正して欲しいな・・・
もちろん shared_ptrは アトミック操作をし、スレッドフリーになってますし
release せずとも、スコープ外で自動的に参照カウンタをデクリメントするので
使い勝手も良いです
あと、Refだと STLコンテナに入れ辛いため(vector::remove 時に参照カウンタがデクリメントされず リークする)
cocos2d-xでは cocos2d::Vector を作って、pushBack、remove時に retain、release を呼んでますね・・・
全然標準じゃない!!
はやく cocoaライブラリ色を完全に除去し、C++として標準的なコードになってほしいですね。