#author("2018-04-14T12:30:22+00:00","default:haikikyou","haikikyou")
[[PostgreSQL/開発]]

#contents

* 概要 [#e195b03b]

- SIGALRMによる割り込みを多重化するためのライブラリである。
- 長時間クエリのタイムアウトを監視するStatementCancelHandlerなどの、PostgreSQL本来の機能に加え、ユーザー独自のタイムアウトを設定することも可能である。


&label(warn){参考};[[(utils/timeout.h) enum TimeoutId>https://git.postgresql.org/gitweb/?p=postgresql.git;a=blob;f=src/include/utils/timeout.h;h=5a2efc0dd94fc5daed3844408577f12b9ffa4f15;hb=ad4fb805ad08c86dd6389e6755081dfd7c864416#l23]] - &size(11){&color(gray){https://git.postgresql.org/gitweb/?p=postgresql.git;a=shortlog;h=refs/heads/REL_10_STABLE};};

#ref(./timeout-overview.png,100%)

- 複数のタイマーの管理は、アクティブなタイムアウトの存在と、最も近いタイムアウト時間に合わせてタイマーを設定することで実現している。
- タイムアウト情報は、all_timeoutという配列で管理されている。登録可能なタイマー数には制限がある。PostgreSQL10.0のソースを確認すると16(0~15)となっており、8個(0~7)が予約済みであるため、実質8個(8~15)のタイマーを登録可能である。
- 有効化されたタイムアウト設定は、active_timeoutsという配列に登録される。この配列は、all_timeouts要素の参照を保持する配列である。この配列で管理されるタイムアウト設定は、最もタイムアウト時間が直近のものから昇順に整列されている。つまり、active_timeouts[0]の要素が、最も直近に発火すべきタイマーとなっている。よって、timeoutライブラリは、タイマーの設定においてactive_timeouts[0]のfin_timeを呼べばよく、タイマー設定処理がシンプルになっている。
- タイマーが発火すると、MyLatchのフラグがセットされるため、MyLatchで待ち状態となっている処理は復帰する。また、indicatorというフラグがタイムアウト情報にセットされる。このフラグを見て(&code(){get_timeout_indicator};)、登録したタイマーが発火したか否かを判断できる。
- タイマーの発火で登録していたタイムアウト設定のハンドラーが呼ばれると、そのタイムアウト設定はactive_timeouts配列から削除される。従って、再びタイマースケジュールしたい場合は、enable_timeout_after関数などを呼びアクティブにする必要がある。
* 定義 [#z90736c7]

** 変数,エイリアス [#c2fa847d]

** マクロ [#ffb64d59]

** 列挙型 [#bd396b49]

** 構造体/共用体 [#t10c1dfa]

*** Struct [#k2ab7574]

|~番号|~データ型|~フィールド|~説明|h


** 関数 [#v6487eee]

*** 関数名 [#v629683a]

#geshi(c){{
// 引数1:
extern ForeignServer *GetForeignServer(Oid serverid);
}}

- 説明

* サンプルプログラム [#yb927eb0]

#geshi(c){{
// sample
}}

* 参考・関連 [#tdfd2e8b]

&size(12){&color(white,orange){ 関連 };};

#related
* コメント [#l62c167b]

#comment


トップ   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
目次
ダブルクリックで閉じるTOP | 閉じる
GO TO TOP