Essen Object Management Library #0002
レイヤ構造
- Essen:言語レイヤ
- 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化しているものに関しては、それより下が完全に同じなので中まで比較する必要がない。