Classe source_block
A classe source_block
é uma classe base abstrata para blocos somente de origem. A classe fornece funcionalidade básica de gerenciamento de link, bem como verificações de erros comuns.
Sintaxe
template<class _TargetLinkRegistry, class _MessageProcessorType = ordered_message_processor<typename _TargetLinkRegistry::type::type>>
class source_block : public ISource<typename _TargetLinkRegistry::type::type>;
Parâmetros
_TargetLinkRegistry
Vincula o registro a ser usado para manter os links de destino.
_MessageProcessorType
Tipo de processador para processamento de mensagens.
Membros
Typedefs públicos
Nome | Descrição |
---|---|
target_iterator |
O iterador para percorrer os destinos conectados. |
Construtores públicos
Nome | Descrição |
---|---|
source_block | Constrói um objeto source_block . |
Destruidor de ~source_block | Destrói o objeto source_block . |
Métodos públicos
Nome | Descrição |
---|---|
accept | Aceita uma mensagem que foi oferecida por esse objeto source_block , transferindo a propriedade para o chamador. |
acquire_ref | Adquire uma contagem de referências nesse objeto source_block para evitar a exclusão. |
consumir | Consome uma mensagem oferecida anteriormente por esse objeto source_block e reservada com êxito pelo destino, transferindo a propriedade para o chamador. |
link_target | Vincula um bloco de destino a esse objeto source_block . |
release | Libera uma reserva de mensagem anterior bem-sucedida. |
release_ref | Libera uma contagem de referências nesse objeto source_block . |
reserve | Reserva uma mensagem anteriormente oferecida por este objeto source_block . |
unlink_target | Desvincula um bloco de destino desse objeto source_block . |
unlink_targets | Desvincula todos os blocos de destino desse objeto source_block . (Substitui ISource::unlink_targets.) |
Métodos protegidos
Nome | Descrição |
---|---|
accept_message | Quando substituído em uma classe derivada, aceita uma mensagem oferecida pela origem. Os blocos de mensagens devem substituir esse método para validar o _MsgId e retornar uma mensagem. |
async_send | Enfileira as mensagens de forma assíncrona e inicia uma tarefa de propagação, se isso ainda não tiver sido feito |
consume_message | Quando substituído em uma classe derivada, consome uma mensagem que foi anteriormente reservada. |
enable_batched_processing | Habilita o processamento em lote para esse bloco. |
initialize_source | Inicializa o message_propagator dentro deste source_block . |
link_target_notification | Um retorno de chamada que notifica que um novo destino foi vinculado a esse objeto source_block . |
process_input_messages | Processa mensagens de entrada. Isso só é útil para blocos propagadores que derivam de source_block |
propagate_output_messages | Propaga mensagens para destinos. |
propagate_to_any_targets | Quando substituído em uma classe derivada, propaga a mensagem fornecida para qualquer um dos destinos vinculados ou para todos eles. Essa é a principal rotina de propagação para blocos de mensagens. |
release_message | Quando substituído em uma classe derivada, libera uma reserva de mensagem anterior. |
remove_targets | Remove todos os links de destino para esse bloco de origem. Isso deve ser chamado do destruidor. |
reserve_message | Quando substituído em uma classe derivada, reserva uma mensagem oferecida anteriormente por esse objeto source_block . |
resume_propagation | Quando substituído em uma classe derivada, retoma a propagação após a liberação de uma reserva. |
sync_send | Enfileira mensagens de forma síncrona e inicia uma tarefa de propagação, se isso ainda não tiver sido feito. |
unlink_target_notification | Um retorno de chamada que notifica que um destino foi desvinculado desse objeto source_block . |
wait_for_outstanding_async_sends | Aguarda a conclusão de todas as propagações assíncronas. Essa espera de rotação específica do propagador é usada em destruidores de blocos de mensagem para garantir que todas as propagações assíncronas tenham tempo para serem concluídas antes da destruição do bloco. |
Comentários
Os blocos de mensagens devem derivar desse bloco para aproveitar o gerenciamento de link e a sincronização fornecidos por essa classe.
Hierarquia de herança
source_block
Requisitos
Cabeçalho: agents.h
Namespace: concurrency
accept
Aceita uma mensagem que foi oferecida por esse objeto source_block
, transferindo a propriedade para o chamador.
virtual message<_Target_type>* accept(
runtime_object_identity _MsgId,
_Inout_ ITarget<_Target_type>* _PTarget);
Parâmetros
_MsgId
O runtime_object_identity
do objeto message
oferecido.
_PTarget
Um ponteiro para o bloco de destino que está chamando o método accept
.
Valor de retorno
Um ponteiro para o objeto message
do qual o chamador agora tem propriedade.
Comentários
O método gera uma exceção invalid_argument se o parâmetro _PTarget
for NULL
.
O método accept
é chamado por um destino enquanto uma mensagem está sendo oferecida por esse bloco ISource
. O ponteiro de mensagem retornado pode ser diferente do passado para o método propagate
do bloco ITarget
, se essa fonte decidir fazer uma cópia da mensagem.
accept_message
Quando substituído em uma classe derivada, aceita uma mensagem oferecida pela origem. Os blocos de mensagens devem substituir esse método para validar o _MsgId
e retornar uma mensagem.
virtual message<_Target_type>* accept_message(runtime_object_identity _MsgId) = 0;
Parâmetros
_MsgId
A identidade do objeto de runtime do objeto message
.
Valor de retorno
Um ponteiro para a mensagem da qual o chamador agora tem propriedade.
Comentários
Para transferir a propriedade, o ponteiro da mensagem original deve ser retornado. Para manter a propriedade, uma cópia do conteúdo da mensagem precisa ser feita e retornada.
acquire_ref
Adquire uma contagem de referências nesse objeto source_block
para evitar a exclusão.
virtual void acquire_ref(_Inout_ ITarget<_Target_type> *);
Comentários
Esse método é chamado por um objeto ITarget
que está sendo vinculado a essa fonte durante o método link_target
.
async_send
Enfileira as mensagens de forma assíncrona e inicia uma tarefa de propagação, se isso ainda não tiver sido feito
virtual void async_send(_Inout_opt_ message<_Target_type>* _Msg);
Parâmetros
_Msg
Um ponteiro para um objeto message
a ser enviado de forma assíncrona.
consumir
Consome uma mensagem oferecida anteriormente por esse objeto source_block
e reservada com êxito pelo destino, transferindo a propriedade para o chamador.
virtual message<_Target_type>* consume(
runtime_object_identity _MsgId,
_Inout_ ITarget<_Target_type>* _PTarget);
Parâmetros
_MsgId
O runtime_object_identity
do objeto reservado message
.
_PTarget
Um ponteiro para o bloco de destino que está chamando o método consume
.
Valor de retorno
Um ponteiro para o objeto message
do qual o chamador agora tem propriedade.
Comentários
O método gera uma exceção invalid_argument se o parâmetro _PTarget
for NULL
.
O método gera uma exceção bad_target se o parâmetro _PTarget
não representar o destino que chamou reserve
.
O consume
método é semelhante a accept
, mas deve ser sempre precedido por uma chamada para reserve
o retornado true
.
consume_message
Quando substituído em uma classe derivada, consome uma mensagem que foi anteriormente reservada.
virtual message<_Target_type>* consume_message(runtime_object_identity _MsgId) = 0;
Parâmetros
_MsgId
O runtime_object_identity
do objeto message
que está sendo consumido.
Valor de retorno
Um ponteiro para a mensagem da qual o chamador agora tem propriedade.
Comentários
Semelhante a accept
, mas é sempre precedido por uma chamada para reserve
.
enable_batched_processing
Habilita o processamento em lote para esse bloco.
void enable_batched_processing();
initialize_source
Inicializa o message_propagator
dentro deste source_block
.
void initialize_source(
_Inout_opt_ Scheduler* _PScheduler = NULL,
_Inout_opt_ ScheduleGroup* _PScheduleGroup = NULL);
Parâmetros
_PScheduler
O agendador a ser usado para tarefas de agendamento.
_PScheduleGroup
O grupo agendado a ser usado para tarefas de agendamento.
link_target
Vincula um bloco de destino a esse objeto source_block
.
virtual void link_target(_Inout_ ITarget<_Target_type>* _PTarget);
Parâmetros
_PTarget
Um ponteiro para um bloco ITarget
para vincular a esse objeto source_block
.
Comentários
O método gera uma exceção invalid_argument se o parâmetro _PTarget
for NULL
.
link_target_notification
Um retorno de chamada que notifica que um novo destino foi vinculado a esse objeto source_block
.
virtual void link_target_notification(_Inout_ ITarget<_Target_type> *);
process_input_messages
Processa mensagens de entrada. Isso só é útil para blocos propagadores que derivam de source_block
virtual void process_input_messages(_Inout_ message<_Target_type>* _PMessage);
Parâmetros
_PMessage
Um ponteiro para a mensagem que deve ser processada.
propagate_output_messages
Propaga mensagens para destinos.
virtual void propagate_output_messages();
propagate_to_any_targets
Quando substituído em uma classe derivada, propaga a mensagem fornecida para qualquer um dos destinos vinculados ou para todos eles. Essa é a principal rotina de propagação para blocos de mensagens.
virtual void propagate_to_any_targets(_Inout_opt_ message<_Target_type>* _PMessage);
Parâmetros
_PMessage
Um ponteiro para a mensagem que deve ser propagada.
release
Libera uma reserva de mensagem anterior bem-sucedida.
virtual void release(
runtime_object_identity _MsgId,
_Inout_ ITarget<_Target_type>* _PTarget);
Parâmetros
_MsgId
O runtime_object_identity
do objeto reservado message
.
_PTarget
Um ponteiro para o bloco de destino que está chamando o método release
.
Comentários
O método gera uma exceção invalid_argument se o parâmetro _PTarget
for NULL
.
O método gera uma exceção bad_target se o parâmetro _PTarget
não representar o destino que chamou reserve
.
release_message
Quando substituído em uma classe derivada, libera uma reserva de mensagem anterior.
virtual void release_message(runtime_object_identity _MsgId) = 0;
Parâmetros
_MsgId
O runtime_object_identity
do objeto message
que está sendo liberado.
release_ref
Libera uma contagem de referências nesse objeto source_block
.
virtual void release_ref(_Inout_ ITarget<_Target_type>* _PTarget);
Parâmetros
_PTarget
Um ponteiro para o bloco de destino que está chamando esse método.
Comentários
Esse método é chamado por um objeto ITarget
que está sendo desvinculado dessa fonte. O bloco de origem tem permissão para liberar todos os recursos reservados para o bloco de destino.
remove_targets
Remove todos os links de destino para esse bloco de origem. Isso deve ser chamado do destruidor.
void remove_targets();
reserve
Reserva uma mensagem anteriormente oferecida por este objeto source_block
.
virtual bool reserve(
runtime_object_identity _MsgId,
_Inout_ ITarget<_Target_type>* _PTarget);
Parâmetros
_MsgId
O runtime_object_identity
do objeto message
oferecido.
_PTarget
Um ponteiro para o bloco de destino que está chamando o método reserve
.
Valor de retorno
true
se a mensagem foi reservada com êxito; caso contrário, false
. As reservas podem falhar por muitos motivos, incluindo: a mensagem já foi reservada ou aceita por outro destino, a origem pode negar reservas etc.
Comentários
O método gera uma exceção invalid_argument se o parâmetro _PTarget
for NULL
.
Depois de chamar reserve
, se tiver êxito, você deverá chamar consume
ou release
para assumir ou conceder a posse da mensagem, respectivamente.
reserve_message
Quando substituído em uma classe derivada, reserva uma mensagem oferecida anteriormente por esse objeto source_block
.
virtual bool reserve_message(runtime_object_identity _MsgId) = 0;
Parâmetros
_MsgId
O runtime_object_identity
do objeto message
que está sendo reservado.
Valor de retorno
true
se a mensagem foi reservada com êxito; caso contrário, false
.
Comentários
Depois de reserve
ser chamado, se ele retornar true
, consume
ou release
deverá ser chamado para assumir ou liberar a propriedade da mensagem.
resume_propagation
Quando substituído em uma classe derivada, retoma a propagação após a liberação de uma reserva.
virtual void resume_propagation() = 0;
source_block
Constrói um objeto source_block
.
source_block();
~ source_block
Destrói o objeto source_block
.
virtual ~source_block();
sync_send
Enfileira mensagens de forma síncrona e inicia uma tarefa de propagação, se isso ainda não tiver sido feito.
virtual void sync_send(_Inout_opt_ message<_Target_type>* _Msg);
Parâmetros
_Msg
Um ponteiro para um objeto message
a ser enviado de forma síncrona.
unlink_target
Desvincula um bloco de destino desse objeto source_block
.
virtual void unlink_target(_Inout_ ITarget<_Target_type>* _PTarget);
Parâmetros
_PTarget
Um ponteiro para um bloco ITarget
a ser desvinculado desse objeto source_block
.
Comentários
O método gera uma exceção invalid_argument se o parâmetro _PTarget
for NULL
.
unlink_target_notification
Um retorno de chamada que notifica que um destino foi desvinculado desse objeto source_block
.
virtual void unlink_target_notification(_Inout_ ITarget<_Target_type>* _PTarget);
Parâmetros
_PTarget
O bloco ITarget
que foi desvinculado.
unlink_targets
Desvincula todos os blocos de destino desse objeto source_block
.
virtual void unlink_targets();
wait_for_outstanding_async_sends
Aguarda a conclusão de todas as propagações assíncronas. Essa espera de rotação específica do propagador é usada em destruidores de blocos de mensagem para garantir que todas as propagações assíncronas tenham tempo para serem concluídas antes da destruição do bloco.
void wait_for_outstanding_async_sends();