ToDo:
POSIX semaphores(sem(4))の実装で使われる kernel semaphore資源 (SEE ALSO ksem_* system call)が、FreeBSD 7.1ではリークするようです。
pthread時には、sem_init(3)等の関数は、プロセス間共有でなければ posix thread library側に有る semaphoreコードに委譲される訳ですが、 -pthread付きでコンパイルして-pthread無しでリンクして 出来た変なC++実行ファイルを何度も実行しているとsem_init(3)に 失敗して abortするようになります。 おそらく、static object生成時の排他制御のために最初にsem_init(3)するが、 途中からPOSIX thread libraryがロードされて、sem_*が thread library側に 切り替わり終了時の sem_destroy(3)がksem_* system callを呼び出さない ためと思われるが、sem_init(3)で生成した名前無しセマフォが 関与するプロセスがすべて死んだ後に生き残っているのは、 カーネルのリソースリークな気がする。 (名前無しなので、アタッチしているプロセスが無くなると 開放手段(sem_destroy)で使うsem_t構造体が無くなる)
AutoLoadの設定は、各Packages/*.nの提供するシンボルに基づいている訳で、 各パッケージライブラリの更新と同期してinit.nを変更する用に管理するのは 構成ファイル間の同期管理を人間がやる訳で効率が悪い気がする。 特に、ブランチ間でのパッチ適用時に init.nのリビジョン違いによる パッチの衝突を手動で解決する必要が有るのがNG
解決策としては、各パッケージライブラリのコードから提供される シンボルを抽出してAutoLoadの設定を自動生成する仕組みを作って、 インストール時にinit-autoloads.n見たいなファイルを生成して 実行時にそれを読み込ませるとか...
コードをパースして外部リンケージなシンボルを探すことも技術的には 可能だが、内部インターフェース用のシンボルも有るので、 コード内に外部公開するシンボルを記述して、それを自動で収集する 辺りが落としどころかな?
記述法としては、
ExportVariables[foo, bar]; ExportSymbols[hoge, hige];
みたいに関数形式で記述する(実行時には、関数がNullを返す)か、
! AutoLoadSymbols: foo bar ! AutoLoadSetSymbols: hoge hige
みたいにコメントブロック内にマジックストリングで埋め込む形式の 2種類が考えられる。
どちらがいいだろう?
関数記法だと回りくどう記述をされると、公開するシンボルがスクリプト 実行時まで決定しないので、インタプリタに読み込ませる必要が有るのが 難かな?
Copy on Writeを実現するためには、Object側に参照カウンタを持たせ、 書き込み時に共有を検知したら複製を作るという動作を行う訳だが、 Multi-Threadと組み合わせると考慮すべきケースが増えるわけで...
辺りまでは考えて実装していたが、コンテナを参照して その一部を返す(例えば、リストのリストのcarを返す動作)際に、 参照メソッドがポインタ(内側のリストコンテナのポインタ)を返した後に、 先行する参照メソッドが返したポインタが指すObjectの参照カウントが 加算される前に、同一コンテナの更新が発生すると... 最悪のケースではポインタの指すObjectが消滅するケースがありえる。 保守的なGCを使う限り、ポインタが指すObjectは消えたりしないが、 参照した時とは違う状態になっている可能性が有る。これは、 条件と一致するObjectをコンテナから拾ってくる動作を行う際に 致命的な問題にある。
したがって、受け渡しに使う一時ポインタがObjectを指している間も 参照カウントを増やす必要が出てくる。 これは、Objectの参照カウンタを操作するスマートポインタの出番ですよね?
ということで、作るべきものに スマートObjectポインタを追加 Orz
さらに、コンテナ操作ではすべてスマートポインタ経由で操作しなければ ならない。まあ、参照カウンタの操作が自動化するので使用側のコード量は 削減になるのかな...
なわけで、やっと container manipulatorの実装に移れます。
今まで実装したのは、
次は、ユーザー側のコンテナ操作コード記述用の container manipulatorを 実装して、PEG classを新しい Objects frameworkで書き直す。
これで、RefInc()/RefDec()メソッドでいちいち参照カウンタを 操作する手間から開放される予定。
コンテナの格納効率を優先すると
辺りを実装すると良さげかも
Cons cellコンテナ一個で、5ワード消費する(仮想関数テーブルポインタ、 オブジェクト型情報、参照カウンタ、car/cdrスマートポインタ)での、 連結が長くなると格納効率がかなり悪化する模様...
カテゴリー: Admin | Emacs | EPICS | Fortran | FreeBSD | GCC | hgsubversion | IPv6 | KEKB | LHC | Lisp | LLVM | MADX | Ryzen | SAD | samba | tDiary | unix | WWW | YaSAI | お仕事 | イベント | 出張 | 宴会 | 数学 | 艦これ | 買いもの | 追記 | 雑記
_ Y氏 [復活したかな。 コンソールは全く無反応で、特にエラーメッセージはなかったよ。]