モノシステムとヒモノシステム

環境もようやく整って,いよいよ本格的なデバッグの領域に踏み込もうとするところ.ZTシステム構成図は開発支援のためにも十分役に立つということが分かってきたので,遊んでいるVAIO機で開いて常時参照できるようにした.システム構成図は完成にはほど遠いが,「全体図は隠蔽する(見ない)」という方針になったので遠慮なく細部データを書き込んでよい.クラスの(仮想的な)代表オブジェクトの呼び方を決めておこう.一案としてプリミティブという名前を考えてみたが,しっくりこない.オブジェクティブというのはどうだろう?まだましなような気もするが…マスターオブジェクトとか…マスタリィとか?

抽象グラフ検証系では「SIMPLENODEsLINKを廃止@20201019」は一旦放棄してもう一度組み直すしかないと思う.つまり,従来方式を完全復活させそれと並立する形で非オブジェクトも対象とすることができるようなシステムだ.グラフクラスにmonoというフラグを置いて切り替えできるようにする.この値はSIMPLEGRAPHのコンストラクタで設定できるようにすればよい.デフォルトではオンだ.monoがオンとなる対象システムをモノシステム,そうでないものをヒモノシステムと呼ぶ.ヒモノとはオブジェクト(NODULEクラス)ではないようなモノだ.この方式変更に関わるのはほとんどSIMPLENODEに限られているはずだ.今日はまず,ここから入ることにする.

「SIMPLENODEsLINKを廃止@20201019」を撤廃して,「抽象グラフ検証系の複線化@20201103」を導入する.一つ問題がある.ZTシステムではすべてのオブジェクトのリサイクルを実施している.リサイクル時にはコンストラクタが呼び出されるという理解でよいのか?また,仮にそうであったとしても,この場合コンストラクタを引数付きで呼び出すということはできないのではないか?リサイクルシステムの論理は高度に難解なところがあるが,new operatorで生成するようになっているのでコンストラクタの呼び出しは掛かるようになっていると思う.

ただし,CARDLINK, MARGLINK, PARTIALNAMEだけはsetNring でWASHINGというリテラルでnewを実行している.リサイクルは delete されてゴミ箱に入っているオブジェクトだけが再生の対象となるので,システムに常設されているオブジェクトがリサイクルされる可能性はゼロだ.現行論理ではすべてのグラフオブジェクトは一度生成された後は廃棄されることはないので,この意味では安全であるとは言える.いや,仮にリサイクルされたとしてもオブジェクトをnewで生成する位置で引数付きコンストラクタを呼び出しているはずだから,問題ないと思われる.つまり,リサイクルされる場合も新たに生成される場合も完全に同一手順で生成されると考えてよい.ただし,WASHINGという機構についてはあとで検証(して文書化)した方がよい.

SIMPLEGRAPHにはunsigned int atribute グラフ属性というのを持っている.新たにmonoを増設する必要はないのでは?⇒そうすることにしよう.⇒改修は大体終わって動作しているが,「抽象グラフ検証系の複線化@20201103」を止めて元のバージョンが動作することを確認しようとしてMaeHasseDiagram→UpStreamHasseで問題が発生した.ここで使われているグラフのノードは人名カードか連結成分リストと思っていたが,ノードリストが入ってきた.連結リストとノードリストが混在しているというイメージだ.

COMPLISTとNODELISTの違いをシステム図から読み取ろうとしたが,まだ細部が書き込まれていないこともあって比較できない.前者はnlistで後者はNLIST.おそらくnlistは任意のnoduleを要素とし,NLISTは型の決まったノードのリストなのではないかと思う.NLISTにはクラス型を引数として渡しているが,図面からは読み取れない(まだまだ未完成だ).NODELISTはSIMPLENODEをリスト要素としているはずだ.COMPLISTの要素はSIMPLENODEかないしCOMPLISTだったのではないかと思う.どうもどこかで誤動作しているのではないかという気がする.⇒単純ミスだった.

▲UndoChainでソートしてPAIRBOX::repairCommonEndPointで(CheckSamePoint())により停止した.RepairCommonEndPointでも同じ理由で停止する.サンプルはモジュール構成図 TEST.ZEL.

▲ファイル→プロパティ→場所でファイル名が表示されていない.ファイル名にスペースが入っているためだろうか?

▲かなりまずい.非参照カウントの残留が発生している.UNDOCHAINで立ち上げたあと,undochainで起きた.COUPLING:TopologicalSortの入口でResetExperimentを実行して初期化しているところで起きている.まだかなりの不備があるようだ.これは直しておかないと命取りになる.まず,SIMPLENODEのデストラクタを見てみよう.いや,そうではない.参照が残っているのはCOMPLISTだ.構成図 TEST.ZELを開いて閉じるだけで起きる.今度はPAIRBOXに移った.PAIRBOX #653だ.どうもどこかでxpand(NODULEの静的変数)をリセットしているようだ.

new (NULL, XPAND_ANCHOR) LIST(sizeof(long));

を実行してもxpandに値が設定されない.extraを使っているのではないか?いや,extraにも入ってこない.暫定的に強制的にxpandを設定するようにした.これで一応nodule::ReferenceListは動作するようになったが,非参照カウントの残留は残っている.障害ノードはPAIRBOX #653で変わらない.残留が4 もある.すべてSIMPLENODEからの参照と思われる.SIMPLENODE→PAIRBOXの参照はGENEBOX::CheckInverseCycle(危険対枝グラフの循環検定)で実施されている.参照カウントの残留はTOPOLOGYのデストラクタでCleanSlotを実施する中で起きている.

CleanSlotはCOMMONHEADERSHORTマクロで定義され,すべてのクラスに備わった常備関数になっている.CleanSlotは個別スロットごとにclearslotを呼び出してスロットを解体する.この解体処理はスロット並びに従って実施されるので,解体が最下層から逐次実施されることを予定することはできないので,自ノードを参照する可能性があるノードを探索してあらかじめ参照解除を実施する必要がある.つまり,あるノードは自分がどこから参照されているかを知っている必要がある.

CleanSlotはマクロの中で定義されているが,NODULEないしnoduleのクラスメンバとして一つだけ作るということはできないのだろうか?⇒そうするためには仮想化する必要があり,仮想化した場合にはクラスごとに実装が必要になる.この構成は避けられない.Disposeの中でCleanSansyoを実行するというマナーだ.PAIRBOXのDisposeではgraph1に対してrelease(this)を実行している.

解決した.修正に抜けがあった.一つだけ不審な点がある.OUTPUTLOG_SANSYOがオンのときアプリ終了しても画面が残ってしまう.⇒CallSetCouplingPtrで無限ループしている.仮修正で入れた不正規なリンクがそのまま残っているためだ.xpandに関わる仕様を整理する必要がある.xpandは現在NODULEの静的変数としてシステムに1個だけ存在しているが,これを個別にもたせて包括的に参照リストを管理してみたい.この仕掛けは基本的にデバッグ支援のためだが,もし時間効率がそれほど悪くなければリリース版で採用される可能性もある.

いずれにしても,改変はまず現在の仕様できちんと動くようにしてから取り掛かるべきだろう.ここまでの修正もかなり大きいので一度バックアップを取るのが賢明だろう.⇒枝番号にXPAND_ANCHORを指定したとき,無動作で抜けている.nodule::insert_nodeにはそれらしき処理がはいっているが,motoが空の場合がある@20181014でスルーするようになっている.この修正は明らかに誤りと思われる.⇒無条件に実行するように修正して動作するようになった.この版を改めて保存しておこう.直前に保存した版と差し替えておく.

その前にEXTRA_ANCHRという特殊スロットの扱い方を見ておこう.これは普通の枝番号と同様にスロット配列番号として使えるリテラルだが,多分実際にはNODULEのextraスロッを使っているものと思われる.用途は2つあり,PAIRBOXでは「端点共有ノード対接続チェーン」のアンカーとして,MARGBOXでは「SymmetricActionでブロック移動実行時に使われるリストを一時的に接続する」ために使われる.これらはすべて一時的にしか使われないものなのでそれ専用のスロットをクラスに設けることはムダと考えられたためと思われる.

今回予定している「完全参照リスト」は恒常的に使われるものだが,すべてのノードに割り当てられるものなのでNODULEクラスに設置する.アクセスはEXTRA_ANCHORのやり方に準ずるものとなる.このスロット番号には別の名前を割り当てることにしよう.参照リスト専用なのでREFERLISTでよいのではないか?REFERISTとしてみよう.スロット名はreferistとしておく.@20201103@でマーキングしておこう.この仕組みは既存システムをまったく改変しないで上から乗り込むだけとし,従前システムとの切り替えスイッチは設けない.

コメントを残す

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

CAPTCHA