source_block クラス
source_block
クラスは、ソースのみのブロックの抽象基底クラスです。 このクラスには、基本的なリンク管理機能および一般的なエラー チェック機能が用意されています。
構文
template<class _TargetLinkRegistry, class _MessageProcessorType = ordered_message_processor<typename _TargetLinkRegistry::type::type>>
class source_block : public ISource<typename _TargetLinkRegistry::type::type>;
パラメーター
_TargetLinkRegistry
ターゲット リンクを保持するために使用されるリンク レジストリ。
_MessageProcessorType
メッセージ処理用のプロセッサの種類。
メンバー
パブリック typedef
名前 | 説明 |
---|---|
target_iterator |
接続されているターゲットを動かすための反復子。 |
パブリック コンストラクター
名前 | 説明 |
---|---|
source_block | source_block オブジェクトを構築します。 |
~source_block Destructor | source_block オブジェクトを破棄します。 |
パブリック メソッド
名前 | 説明 |
---|---|
accept | この source_block オブジェクトから提供されたメッセージを受け入れ、所有権を呼び出し元に譲渡します。 |
acquire_ref | 削除を防ぐために、この source_block オブジェクトの参照カウントを取得します。 |
使用 | この source_block オブジェクトから過去に提供され、ターゲットによって正常に予約されているメッセージを使用して、所有権を呼び出し元に譲渡します。 |
link_target | ターゲット ブロックをこの source_block オブジェクトにリンクします。 |
release | 以前に成功したメッセージの予約を解除します。 |
release_ref | この source_block オブジェクトの参照カウントを解放します。 |
reserve | この source_block オブジェクトから以前に提供されたメッセージを予約します。 |
unlink_target | この source_block オブジェクトからターゲット ブロックのリンクを解除します。 |
unlink_targets | この source_block オブジェクトからすべてのターゲット ブロックのリンクを解除します。 (ISource::unlink_targets をオーバーライドします) |
保護メソッド
名前 | 説明 |
---|---|
accept_message | 派生クラスでオーバーライドされる際、ソースによって提供されるメッセージを受け入れます。 メッセージ ブロックは、このメソッドをオーバーライドして _MsgId を検証し、メッセージを返す必要があります。 |
async_send | メッセージを非同期的にキューに入れ、伝達タスクを開始します (まだ実行されていない場合) |
consume_message | 派生クラスでオーバーライドされると、以前に予約されたメッセージを使用します。 |
enable_batched_processing | このブロックのバッチ処理を有効にします。 |
initialize_source | この source_block 内の message_propagator を初期化します。 |
link_target_notification | この source_block オブジェクトに新しいターゲットがリンクされたことを通知するコールバック。 |
process_input_messages | 入力メッセージを処理します。 これは、source_block から派生した伝達子ブロックにのみ有効です |
propagate_output_messages | メッセージをターゲットに伝達します。 |
propagate_to_any_targets | 派生クラスでオーバーライドされると、指定されたメッセージをリンク先の一部またはすべてのターゲットに伝達します。 これは、メッセージ ブロックの主要な伝達ルーチンです。 |
release_message | 派生クラスでオーバーライドされると、以前のメッセージ予約を解放します。 |
remove_targets | このソース ブロックのすべてのターゲット リンクを削除します。 これはデストラクターから呼び出す必要があります。 |
reserve_message | 派生クラスでオーバーライドされると、この source_block オブジェクトによって以前に提供されたメッセージを予約します。 |
resume_propagation | 派生クラスでオーバーライドされると、予約が解放された後に伝達を再開します。 |
sync_send | メッセージを非同期的にキューに入れ、伝達タスクを開始します。 (まだ実行されていない場合) |
unlink_target_notification | この source_block オブジェクトに新しいターゲットがリンクされたことを通知するコールバック。 |
wait_for_outstanding_async_sends | すべての非同期伝達が完了するまで待機します。 この伝達子固有のスピン待機は、メッセージ ブロックのデストラクターで使用され、すべての非同期伝達がブロックを破棄する前に完了する時間を持てるようにします。 |
解説
このクラスによって提供されるリンク管理と同期を利用するには、メッセージ ブロックをこのブロックから派生させる必要があります。
継承階層
source_block
要件
ヘッダー: agents.h
名前空間: concurrency
accept
この source_block
オブジェクトから提供されたメッセージを受け入れ、所有権を呼び出し元に譲渡します。
virtual message<_Target_type>* accept(
runtime_object_identity _MsgId,
_Inout_ ITarget<_Target_type>* _PTarget);
パラメーター
_MsgId
提供された message
オブジェクトの runtime_object_identity
。
_PTarget
accept
メソッドを呼び出しているターゲット ブロックへのポインター。
戻り値
現在呼び出し元が所有権を持っている message
オブジェクトへのポインター。
解説
パラメーター _PTarget
が NULL
である場合に、メソッドは invalid_argument 例外をスローします。
この ISource
ブロックによってメッセージが提供されている間に、accept
メソッドがターゲットによって呼び出されます。 このソースがメッセージのコピーを作成する場合、返されるメッセージ ポインターは、ITarget
ブロックの propagate
メソッドに渡されるメッセージ ポインターとは異なる場合があります。
accept_message
派生クラスでオーバーライドされる際、ソースによって提供されるメッセージを受け入れます。 メッセージ ブロックは、このメソッドをオーバーライドして _MsgId
を検証し、メッセージを返す必要があります。
virtual message<_Target_type>* accept_message(runtime_object_identity _MsgId) = 0;
パラメーター
_MsgId
message
オブジェクトのランタイム オブジェクト ID。
戻り値
現在呼び出し元が所有権を持っているメッセージへのポインター。
解説
所有権を譲渡するには、元のメッセージ ポインターを返す必要があります。 所有権を維持するには、メッセージ ペイロードのコピーを作成して返す必要があります。
acquire_ref
削除を防ぐために、この source_block
オブジェクトの参照カウントを取得します。
virtual void acquire_ref(_Inout_ ITarget<_Target_type> *);
解説
このメソッドは、link_target
メソッドの実行中にこのソースにリンクされる ITarget
オブジェクトによって呼び出されます。
async_send
メッセージを非同期的にキューに入れ、伝達タスクを開始します (まだ実行されていない場合)
virtual void async_send(_Inout_opt_ message<_Target_type>* _Msg);
パラメーター
_Msg
非同期的に送信する message
オブジェクトへのポインター。
消費
この source_block
オブジェクトから過去に提供され、ターゲットによって正常に予約されているメッセージを使用して、所有権を呼び出し元に譲渡します。
virtual message<_Target_type>* consume(
runtime_object_identity _MsgId,
_Inout_ ITarget<_Target_type>* _PTarget);
パラメーター
_MsgId
予約された message
オブジェクトの runtime_object_identity
。
_PTarget
consume
メソッドを呼び出しているターゲット ブロックへのポインター。
戻り値
現在呼び出し元が所有権を持っている message
オブジェクトへのポインター。
解説
パラメーター _PTarget
が NULL
である場合に、メソッドは invalid_argument 例外をスローします。
パラメーター _PTarget
が reserve
を呼び出していない場合、メソッドは bad_target 例外をスローします。
consume
メソッドは accept
に似ていますが、必ず、このメソッドの前に reserve
の呼び出しで true
が返されている必要があります。
consume_message
派生クラスでオーバーライドされると、以前に予約されたメッセージを使用します。
virtual message<_Target_type>* consume_message(runtime_object_identity _MsgId) = 0;
パラメーター
_MsgId
使用されている message
オブジェクトの runtime_object_identity
。
戻り値
現在呼び出し元が所有権を持っているメッセージへのポインター。
解説
accept
に似ていますが、常に reserve
の呼び出しが先に行われます。
enable_batched_processing
このブロックのバッチ処理を有効にします。
void enable_batched_processing();
initialize_source
この source_block
内の message_propagator
を初期化します。
void initialize_source(
_Inout_opt_ Scheduler* _PScheduler = NULL,
_Inout_opt_ ScheduleGroup* _PScheduleGroup = NULL);
パラメーター
_PScheduler
タスクをスケジュールするために使用されるスケジューラ。
_PScheduleGroup
タスクをスケジュールするために使用されるスケジューラ グループ。
link_target
ターゲット ブロックをこの source_block
オブジェクトにリンクします。
virtual void link_target(_Inout_ ITarget<_Target_type>* _PTarget);
パラメーター
_PTarget
この source_block
オブジェクトにリンクする ITarget
ブロックへのポインター。
解説
パラメーター _PTarget
が NULL
である場合に、メソッドは invalid_argument 例外をスローします。
link_target_notification
この source_block
オブジェクトに新しいターゲットがリンクされたことを通知するコールバック。
virtual void link_target_notification(_Inout_ ITarget<_Target_type> *);
process_input_messages
入力メッセージを処理します。 これは、source_block から派生した伝達子ブロックにのみ有効です
virtual void process_input_messages(_Inout_ message<_Target_type>* _PMessage);
パラメーター
_PMessage
処理するメッセージへのポインター。
propagate_output_messages
メッセージをターゲットに伝達します。
virtual void propagate_output_messages();
propagate_to_any_targets
派生クラスでオーバーライドされると、指定されたメッセージをリンク先の一部またはすべてのターゲットに伝達します。 これは、メッセージ ブロックの主要な伝達ルーチンです。
virtual void propagate_to_any_targets(_Inout_opt_ message<_Target_type>* _PMessage);
パラメーター
_PMessage
伝達するメッセージへのポインター。
release
以前に成功したメッセージの予約を解除します。
virtual void release(
runtime_object_identity _MsgId,
_Inout_ ITarget<_Target_type>* _PTarget);
パラメーター
_MsgId
予約された message
オブジェクトの runtime_object_identity
。
_PTarget
release
メソッドを呼び出しているターゲット ブロックへのポインター。
解説
パラメーター _PTarget
が NULL
である場合に、メソッドは invalid_argument 例外をスローします。
パラメーター _PTarget
が reserve
を呼び出していない場合、メソッドは bad_target 例外をスローします。
release_message
派生クラスでオーバーライドされると、以前のメッセージ予約を解放します。
virtual void release_message(runtime_object_identity _MsgId) = 0;
パラメーター
_MsgId
解放する message
オブジェクトの runtime_object_identity
。
release_ref
この source_block
オブジェクトの参照カウントを解放します。
virtual void release_ref(_Inout_ ITarget<_Target_type>* _PTarget);
パラメーター
_PTarget
このメソッドを呼び出しているターゲット ブロックへのポインター。
解説
このメソッドは、このソースからリンク解除されている ITarget
オブジェクトによって呼び出されます。 ソース ブロックは、ターゲット ブロック用に予約されたすべてのリソースを解放できます。
remove_targets
このソース ブロックのすべてのターゲット リンクを削除します。 これはデストラクターから呼び出す必要があります。
void remove_targets();
予約
この source_block
オブジェクトから以前に提供されたメッセージを予約します。
virtual bool reserve(
runtime_object_identity _MsgId,
_Inout_ ITarget<_Target_type>* _PTarget);
パラメーター
_MsgId
提供された message
オブジェクトの runtime_object_identity
。
_PTarget
reserve
メソッドを呼び出しているターゲット ブロックへのポインター。
戻り値
メッセージが正常に予約された場合は true
、それ以外の場合は false
。 予約は、さまざまな理由で失敗する可能性があります。たとえば、メッセージが別のターゲットによって既に予約されているか受け入れられている場合や、ソースが予約を拒否できる場合などです。
解説
パラメーター _PTarget
が NULL
である場合に、メソッドは invalid_argument 例外をスローします。
reserve
を呼び出し、それが成功したら、consume
または release
のどちらかを呼び出して、メッセージの所有権を取得または放棄する必要があります。
reserve_message
派生クラスでオーバーライドされると、この source_block
オブジェクトによって以前に提供されたメッセージを予約します。
virtual bool reserve_message(runtime_object_identity _MsgId) = 0;
パラメーター
_MsgId
予約する message
オブジェクトの runtime_object_identity
。
戻り値
メッセージが正常に予約された場合は true
、それ以外の場合は false
。
解説
reserve
が呼び出された後、true
が返された場合は、consume
または release
を呼び出して、メッセージの所有権を取得または解放する必要があります。
resume_propagation
派生クラスでオーバーライドされると、予約が解放された後に伝達を再開します。
virtual void resume_propagation() = 0;
source_block
source_block
オブジェクトを構築します。
source_block();
~source_block
source_block
オブジェクトを破棄します。
virtual ~source_block();
sync_send
メッセージを非同期的にキューに入れ、伝達タスクを開始します。 (まだ実行されていない場合)
virtual void sync_send(_Inout_opt_ message<_Target_type>* _Msg);
パラメーター
_Msg
同期して送信する message
オブジェクトへのポインター。
unlink_target
この source_block
オブジェクトからターゲット ブロックのリンクを解除します。
virtual void unlink_target(_Inout_ ITarget<_Target_type>* _PTarget);
パラメーター
_PTarget
この source_block
オブジェクトからリンク解除する ITarget
ブロックへのポインター。
解説
パラメーター _PTarget
が NULL
である場合に、メソッドは invalid_argument 例外をスローします。
unlink_target_notification
この source_block
オブジェクトに新しいターゲットがリンクされたことを通知するコールバック。
virtual void unlink_target_notification(_Inout_ ITarget<_Target_type>* _PTarget);
パラメーター
_PTarget
リンク解除された ITarget
ブロック。
unlink_targets
この source_block
オブジェクトからすべてのターゲット ブロックのリンクを解除します。
virtual void unlink_targets();
wait_for_outstanding_async_sends
すべての非同期伝達が完了するまで待機します。 この伝達子固有のスピン待機は、メッセージ ブロックのデストラクターで使用され、すべての非同期伝達がブロックを破棄する前に完了する時間を持てるようにします。
void wait_for_outstanding_async_sends();