Essen Object Management Library #0002

  • (by K, 2017.02.20)

レイヤ構造

  • Essen:言語レイヤ
    • EOMLの範囲外
  • ObjSys(OS) : オブジェクトの管理をするレイヤ
    • 階層構造など
  • ValSys(VS) : 値の管理をするレイヤ
    • 可変長なデータを扱いやすくする&メモリ管理&重複管理

基本型

  • 通常データ:
    • intとかdoubleとか文字列型とか、まあなんでも。
    • サイズが規定できればよい。型のタイプも記述する。
    • 可変長でもあってもいい。
  • メタデータ:
    • 通常データと似た扱いを受けるが、多少の追加サポートがある。
    • (dir) (memberTable) (namelessDir)

ValSys

typedef struct Val_ {
    unsigned int linkCount; // プライベートの時は常に1
    unsigned int hash;
    unsigned int flags;
    unsigned int siz, siz1; // siz1まではとりあえずメモリを確保してある
    unsigned int mini[4];
    struct Val_ *typ;
    struct Val_ *link[2]; // 内部管理用であって、ObjSysやEssenはこれを使えない
    void *p;
} Val;
  • flags:
    • VS_F_PUB : パブリック
    • VS_F_MAL : pはmallocで確保した領域を指している(=解放時にはfreeしてほしい)
    • VS_F_VHS : hashの値はvalidである
    • VS_F_EXT : pは外部のメモリ域を指している(ValSysは寿命を管理しない)
    • VS_F_RDO : リードオンリー属性
  • データの状態にはpriとpubがある。プライベートとパブリック。
    • プライベートの時は、データを共有しないので値を直接書き換えてよい。最初にアロケートした時はプライベートになる。
    • パブリックの時は書き換えてはいけない。書き換えたければプライベートに戻してから書きかえる。書き換え後にパブリックに戻してよい。
    • プライベートだったデータをパブリックに切り替えるとき、Valのアドレスが変化する可能性がある。またパブリックだったデータをプライベートに切り替えるときも、Valのアドレスが変化する可能性がある。しかしそれ以外の操作でアドレスが変化することはない。

ObjSys

typedef struct Obj_ {
    Val *val;
    Val *parent;
    unsigned int flags;
    unsigned int sign; // シグネチャ  これがあるから消されて再利用されたときに気付くことができる  常に非零
    unsigned int linkCount; // 自分の子がこのObjを指している回数(子以外でもここを参照しているものがあれば数える)
    unsigend int psign; // parentのsign
} Obj;
  • flags:
    • OS_F_DTY : データは改変された(これは必要だろうか?)
  • Valはプライべートにするかパブリックにするかでアドレスが変わるので、それを解消するために用意されるレイヤがObjSys。Objのアドレスはその変数をdelするまでずっと変わらずに存在する。
    • 変数名を変更しても、変数のパスを変更しても(変数を別のフォルダに移動させても)、Objのアドレスは一切変わらない。
  • ルート以外のObjは一つの親を必ず持つ。
  • リンクカウントが0になってもObjを消さないほうが高速だろうと思われる。
    • Objのメモリを節約する観点では、こまめに消したほうがいいのだが、Objを消す最大の目的はパブリックにさせるためなので、Objのメモリを節約することは考えなくていいと思う。

dir

(dir) {
    [p(Val:typ)]
    [n]
    [p(Obj), sign]
    [p(Obj), sign]
    [p(Obj), sign]
    ...
}
  • それぞれのsignが0のときは、ObjではなくValへのポインタになる。
  • nはsignが0ではない個数。
    • nが0になったら、パブリックにできる
    • パブリックにしたら、親に対して「signを0にできますよ」と伝える。
  • フラグがtyp側にあるといいかもしれない。
    • メンバ名ソート済みフラグ、メンバ名ソート推奨フラグ、メンバ名のユニークを強制するフラグ

メモ

  • [1] 高速にdirをコピーしたい
    • dirのポインタをすべてVal化してコピーすればよさそう(再帰的に)
    • プライベートが含まれている部分についてはObjのままにして頑張って比較する
  • [2] できるだけ高速にdirを比較したい
    • Val化しているものに関しては、それより下が完全に同じなので中まで比較する必要がない。

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2017-02-21 (火) 18:01:19 (2621d)