トップ «前の日記(2018-03-02) 最新 次の日記(2018-04-13)» 編集

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|

2018-03-05 [長年日記]

_ [SAD][EPICS]ValueTypeオプション拡張

  • PVリストに対して、個別の転送型指定が出きるようにList型のValueTypeオプションをサポート
  • DefaultValueTypeオプションの導入
  • ValueType[]・SetValueType[]メソッドによる動的参照・更新のサポート(Countオプションと同じ)
  • ValueType[] = new, Count[] = new構文による動的更新サポート

次は、Constructor拡張?

_ [SAD][EPICS]CaRead2実装用CaMonitor`Constructor案

実装アイデア

  • ClearChannel抑止オプション付きの状態で、専用のCreateChannelを呼び出す
  • 引数列は、修飾付きchidのリストのみを処理する
    • 不正な引数列を受けたときの動作は未定義で良い
  • count/vtypeに関しては、chidへの修飾子から自動設定
  • AutoStartは、False
  • 未接続のchidに関しては無視すると後処理が楽?
  • GetCBの自動発行まで実装するか?
    • WaitValueするコードで駆動するので、そこまで行う自動化する必要は無い
  • CaMonitorで登録済みのchidが渡されるケースで表面化する問題点
    • Fortran backendからCaMonitorへのcallbackが多重登録出来ない
    • ca_get_callbackと subscriptionからのcallbackをSADScript側で識別できない
    • subscriptionされていない場合は、callbackの登録を一時的に改変する余地が有る
      • Destructorで復元する必要が有る
      • Destruction前に、AutoStartや明示的なStart[]が呼び出されると面倒
    • CA接続を一時的に作る場合、失敗する可能性が残る

_ [SAD][EPICS]別解として、ca_get_callbackベースで実装したCaRead3の導入

実装アイデア

  • dbr_time型のバッファへwrite backする専用callback routineを渡したca_get_callbackを発行する
  • timestamp fieldを無効値で初期化して、更新検知する
  • 全てのcallbackが完了するまで、ca_pend_event + pollingでblocking waitをかける

問題点は、timeoutまでに応答しないcallbackが有った場合に、ca_get_callbackをキャンセルするか、書き込み先の消失を指令するメモ領域が必要(メモ領域はcallback routine側で開放する必要がある)

callbackメモの内容

  • 返り値のListオブジェクトの参照と内部インデックスで十分
  • キャンセル時は、参照もしくはインデックスを無効値に書き換える
  • 返り値のListオブジェクトは、Table[\$Failed, {n}]で初期化しておく
    • 更新検知は、タイプの変化で検出(ntfsymbol→ntflist)
  • callback contextが、ca_pend_*に限定されれば、更新競合は避けられる
  • ca_get_callbackは、callback routineと共にメモのアドレスを渡す
  • メモはcallback routine側で開放可能とするために、heapから割り当てる必要あり
    • caの割り込み(callback) contextから安全に開放可能でなければならない
  • 別案として、メモを管理する機構を設けて、安全なcontextから完了済みのメモを回収することも出来る
    • この場合、ca_get_callbackごとにメモを生成し、callback routineは処理完了マークをメモに記入する
    • GCは、安全なcontextから起動し、完了済みのメモを回収する
    • GCと割り当てが同時実行されないのであれば、簡単な単方向リスト構造で足りる
    • GC発動タイミング候補
      • CaRead3起動時、完了時

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