nodule::operator deleteで参照残留

ZTシステム構成図7.ZELを起動してSIMPLEGRAPH:DecompConnectedComponentの冒頭でCOMPLISTリストのキャンセルを実行しているところでnodule::operator deleteが(nptr->refcnt && PHASE != CLEARTABLE)というエラーを出している このリストはCOMPLIST#23242で要素数40個,cancelの冒頭ではパラメータは整合している cancel動作そのものはDATALIST::cancellにゆだねているが,事後bottomlistとcurnodを参照解除している

削除されているのはREFLINK#23399で残留カウントは1,PHASEはSAMEGENEMARRIAGE(重婚同類グラフを生成).このオブジェクトはcancel対象リストの末尾ノードだ.参照リストを見ると空になっているので,参照カウントが残っていること自体誤りと思われる.これはどういうことだろう?⇒間違っているのは参照リスト管理の方だ.#23242COMPLIST[3]からの参照が残っている.先に参照リスト管理の方を見ておこう.REFLINK#23399が空になっている.その直前には,#23242COMPLIST[3]からの参照を処理していたのだが…

~NODULEでREFERISTスロットをクリーンアップしていた.参照/接続関係はノードの生死に関わりなく有効でなくてはならないから,参照リストもパーマネントオブジェクトでなくてはならない.⇒そもそも,定数定義でREFERISTとEXTRA_ANCHORの順位が逆転していた.よくこれで動いていたものだ…※ これで参照リスト管理の問題は解決した.

※これは不思議でも偶然でもない.このシステムでは(必ずしもすべてはないがほとんどの)スロットが仮想化されているためだ.少なくともアクセス関数によってしか読み書きされないスロットは原理的に仮想化されたスロットと言っても間違いではない.

curnodからの参照が残る問題は,LIST::dataCountDownの論理ミスだった.論理ミスというより,見落としというべきかもしれない.Sansyo(LISTsCURNOD, lower)でcurnodを次ノードに移動しているが,終端の場合は空になるので,toplistに付け替えていた.しかし,このタイミングではtoplistにはまだ現在の値が残っているため,Sansyo(LISTsCURNOD, toplist)が残ってしまう.間違いのない方法として,Sansyo(LISTsCURNOD, upper)で一つ前のノードを指すようにした.これで問題は解決し,エラーなしでアプリを起動して終了できるようになった.整理する前にバックアップを取っておこう.

アプリ終了時のnodule::resetNringでNODEREFLISTが大量に残留している.1296個もある.どうしたのだろう?そもそもこれらはどこで使われているのだろう?⇒分かった.完全参照リスト管理だ.参照リストが置かれているスロットは圏外(永続オブジェクト)として削除しないようにしたためだ.従来論理では~NODULEで参照リスト管理用スロットまで削除していたのを残すように変更している.フェーズがBEGINNINGS以下ではすべて削除するように修正した.現行ではCOUPLING::EraseFamilyTreeでBEGINNINGS状態に戻る.

リスト検査関数CheckAllListの対象リストをLISTからDATALISTの範囲に拡張して,エラーが出た.COUPLING::CloseFamilyBaseの入口で3つのNODEREFLISTでエラーが検出される.⇒checkdatacountは仮想関数でNODEREFLISTも固有関数を持っているが,checkdatacountの戻り値がerrcountを返すように仕様変更されているのに対応していなかった.⇒エラーを返すように修正した.

アプリ終了時CallSetCouplingPtrでCouplingを削除した後,ゴミ箱の中にはオブジェクトが8036個,Nリングに584個,合計8620個のオブジェクトが計数されている.Nリングに入っている584個のうち一つを除いてすべてNODEREFLISTだ.残る一つはゴミ箱そのもの.ゴミ箱の中には別に713個のNODEREFLISTが入っている.ゴミ箱を投棄するとNリングの中身まで空になってしまうのはなぜか?⇒NODEREFLIST(参照リスト)はゴミ箱に入っているオブジェクトに付帯しているため,ゴミを焼却処分したとき一緒に処理される.

EraseTreeViewはクローズファイルで実行されているが,ここでPHASEをBEGINNINGSではなくINITIALSTATEに留めるようにすると,1296個生成された参照リストはすべてNリングに移ってゴミ箱には一つも残らない状態になる.NODEREFLIST(参照リスト)はBEGINNINGSより上のフェーズでは(永続オブジェクトとして保護されているため)自動的に削除されないようになっているからだ.

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA