トップ «前の日記(2017-12-04) 最新 次の日記(2017-12-07)» 編集

Orz日記 by Akio Morita

ToDo:

  • 15 SAD Fit[]回りの障害事例の解析
  • 10 smart pointer版PEGクラスの再実装(Left Recursionまわり)
2006|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|06|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|07|08|09|10|11|12|
2013|01|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|06|07|08|10|12|
2016|01|02|03|05|06|08|10|11|
2017|01|02|03|04|05|06|07|09|10|11|12|
2018|01|02|03|04|06|07|08|09|10|11|12|
2019|01|03|04|05|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|12|
2024|01|02|03|04|05|06|07|08|09|10|11|

2017-12-06 [長年日記]

_ [SAD]CaMonitorバックエンドのオーバーホール

  • ポインタ型のchid/evidをintptr_tへキャストしてdoubleへ放り込む実装をid登録テーブルとそのハンドルに置き換え
  • PutCBで呼び出すEPICS\$PutCB[]をFortranで再実装
  • ValueCBでのdbr_*_t型のvalue取り出し部を再実装
    • マクロによるコード生成に移行
    • 型変換をFortran側へ移譲(void *渡し・call C_F_POINTER)

現状、CaMonitorのValueCB経由の読み出しは、フル実装になったはず

残っているのは、

  • EPICS\$CaPut, EPICS\$CaPutCBの再実装
    • 現状、DBF_STRINGと DBF_DOUBLEしか使えない
  • src/tfefun2.f側の実装
    • CaOpen2にて、chidのリソースリーク
    • CaRead2にて、issueパートとretireパート間でwriteback bufferポインタをintptr_tキャストしてdoubleに放り込んで渡している
      • 生成したList要素をスタックに積み上げているので、vstk側の隙間にktastk経由(integer64 == intptr_t)で詰め込めるはず
      • さもなくば、Native型で追加のstack frameを確保して積み込むべし
  • evidテーブルリソースリーク
    • EPICS\$CaClearEventを行わず、EPICS\$CaClearChannelされるとchidテーブルは開放されるが、evidテーブルが開放されない
    • ca_clear_channelのマニュアルを読む限り、chidに紐付けされたevidは開放されるっぽぃ
      • 従って、今回導入したevidテーブルエントリー(8byte)のリーク
    • EPICS CA APIに、ca_evid_to_chidという関数が有るので、evidテーブルをスキャンして、chidとヒットをとることは出来る
      • evid → chid → chid-slot-numberは定数時間でたどれるが、逆にたどるテーブルは用意されていないので、真面目にやると線形スキャン
      • 最善のケースでは、evidが開放済みなので検索が無駄になる。特に、登録数が多いときにもったいない
      • chidに対して、evidの割り当ての有無が分かると効率化出来る
        • 線形スキャン中に全数回収した時点で終了出来る
        • CaMonitorクラスの実装では、基本的にchid辺りのevidはたかだか1個なので、ポインタ型のアライメントによる空き領域に埋め込めるが…
        • 呼び出し元を限定出来ないので、カウンタを設けるべきであろう
        • chid_tableの実装を構造体にするか2テーブルにするかは選択の余地あり
          • アライメントの厳しいマシンでは、構造体にするとパディングロスが増える
          • 2テーブルだとreallocationのコードでのエラーチェックで面倒が増える

カテゴリー: Admin | Emacs | EPICS | Fortran | FreeBSD | GCC | hgsubversion | IPv6 | KEKB | LHC | Lisp | LLVM | MADX | Ryzen | SAD | samba | tDiary | unix | WWW | YaSAI | お仕事 | イベント | 出張 | 宴会 | 数学 | 艦これ | 買いもの | 追記 | 雑記