若干改造

これまで、デストラクタでの資源の解放は行っていませんでした。これは、スタック上に確保したSync系変数が、ブロックから抜けることでデストラクタを呼び、資源を開放すると、それを共有しているかも知れない他のプロセスが動作しなくなるためです。(newで確保した変数の場合は、変数自身が共有メモリ上に置かれ、deleteで変数の解放と資源の解放を同時に行います。この場合はその変数を共有するプロセスのうち、一つだけで行います。)

しかし、資源の解放にデストラクタを使えないことで、継承したクラスでの資源の解放の実装が不自然なものになってしまっていました。すなわち、各クラスでdeleteを再定義し、その中で資源の解放を行っていました。デストラクタは継承元のクラスまで遡りますが、deleteではそれは行われないため、親クラスの資源も子クラスのdelete中で解放していました。

この不自然な実装とそれによる問題を解決するため、変数がスタック上にあるか、共有メモリ上にあるかをコンストラクタで判定することにし(thisのアドレスから判定)、スタック上にある場合はデストラクタで資源を解放しない、という実装にしました。

これまでの実装だと、実は、例えばSyncList* 型の変数にSyncQueue*型の変数を代入してメンバ関数を呼び出すことはサポートしていなかったのですが(deleteはvirtualにできなかったので)、今はそのような利用も可能なはずです。

まだCVSにコミットしただけで、releaseはしていませんが…