Compartir a través de


source_block (Clase)

La clase source_block es una clase base abstracta solo para bloques de origen. La clase proporciona funcionalidad de administración de vínculo básico, así como comprobaciones de errores frecuentes.

Sintaxis

template<class _TargetLinkRegistry, class _MessageProcessorType = ordered_message_processor<typename _TargetLinkRegistry::type::type>>
class source_block : public ISource<typename _TargetLinkRegistry::type::type>;

Parámetros

_TargetLinkRegistry
Registro de vínculos que se usará para contener los vínculos de destino.

_MessageProcessorType
Tipo de procesador para el procesamiento de mensajes.

Miembros

Definiciones de tipos públicas

Nombre Descripción
target_iterator El iterador para recorrer los destinos conectados.

Constructores públicos

Nombre Descripción
source_block Construye un objeto source_block.
Destructor ~source_block Destruye el objeto source_block.

Métodos públicos

Nombre Descripción
accept Acepta un mensaje ofrecido por este objeto source_block y transfiere la propiedad al autor de la llamada.
acquire_ref Adquiere un recuento de referencias en este objeto source_block para evitar la eliminación.
consumo Consume un mensaje ofrecido previamente por el objeto source_block y reservado correctamente por el destino, y transfiere la propiedad al autor de la llamada.
link_target Vincula un bloque de destino a este objeto source_block.
release Libera una reserva de mensajes correcta anterior.
release_ref Libera un recuento de referencias en este objeto source_block.
reserve Reserva un mensaje ofrecido anteriormente por este objeto source_block.
unlink_target Desvincula un bloque de destino de este objeto source_block.
unlink_targets Desvincula todos los bloques de destino de este objeto source_block. (Invalida ISource::unlink_targets.)

Métodos protegidos

Nombre Descripción
accept_message Cuando se invalida en una clase derivada, acepta un mensaje ofrecido por el origen. Los bloques de mensajes deben invalidar este método para validar la _MsgId y devolver un mensaje.
async_send Pone en cola los mensajes de forma asincrónica e inicia una tarea de propagación, si aún no se ha realizado.
consume_message Cuando se invalida en una clase derivada, consume un mensaje que se reservó anteriormente.
enable_batched_processing Habilita el procesamiento por lotes para este bloque.
initialize_source Inicializa el message_propagator dentro de este source_block.
link_target_notification Devolución de llamada que notifica que se ha vinculado un nuevo destino a este objeto source_block.
process_input_messages Procesa mensajes de entrada. Esto solo es útil para los bloques propagadores, que derivan de source_block
propagate_output_messages Propague mensajes a destinos.
propagate_to_any_targets Cuando se invalida en una clase derivada, propaga el mensaje dado a cualquiera o todos los destinos vinculados. Esta es la rutina de propagación principal para los bloques de mensajes.
release_message Cuando se invalida en una clase derivada, libera una reserva de mensajes anterior.
remove_targets Quita todos los vínculos de destino de este bloque de origen. Se debe llamar desde el destructor.
reserve_message Cuando se invalida en una clase derivada, reserva un mensaje ofrecido previamente por este objeto source_block.
resume_propagation Cuando se invalida en una clase derivada, reanuda la propagación una vez que se ha liberado una reserva.
sync_send Pone en cola los mensajes de forma sincrónica e inicia una tarea de propagación, si aún no se ha realizado.
unlink_target_notification Una devolución de llamada que notifica que se ha desvinculado un destino a este objeto source_block.
wait_for_outstanding_async_sends Espera a que se completen todas las propagaciones asincrónicas. Una espera de giro específica del propagador que se usa en destructores de bloques de mensajes para asegurarse de que todas las propagaciones asincrónicas tienen tiempo de finalizar antes de destruir el bloque.

Comentarios

Los bloques de mensajes deben derivarse de este bloque para aprovechar la administración de vínculos y la sincronización proporcionadas por esta clase.

Jerarquía de herencia

ISource

source_block

Requisitos

Encabezado: agents.h

Espacio de nombres: simultaneidad

aceptar

Acepta un mensaje ofrecido por este objeto source_block y transfiere la propiedad al autor de la llamada.

virtual message<_Target_type>* accept(
    runtime_object_identity _MsgId,
    _Inout_ ITarget<_Target_type>* _PTarget);

Parámetros

_MsgId
El valor runtime_object_identity del objeto message ofrecido.

_PTarget
Puntero al bloque de destino que está llamando al método accept.

Valor devuelto

Puntero al objeto message del que el autor de la llamada tiene ahora la propiedad.

Comentarios

El método produce una excepción invalid_argument si el parámetro _PTarget es NULL.

Un destino llama al método accept mientras este bloque ISource está ofreciendo un mensaje. El puntero de mensaje devuelto puede ser diferente del que se pasa al método propagate del bloque ITarget, si este origen decide realizar una copia del mensaje.

accept_message

Cuando se invalida en una clase derivada, acepta un mensaje ofrecido por el origen. Los bloques de mensajes deben invalidar este método para validar la _MsgId y devolver un mensaje.

virtual message<_Target_type>* accept_message(runtime_object_identity _MsgId) = 0;

Parámetros

_MsgId
La identidad del objeto en runtime del objeto message.

Valor devuelto

Puntero al mensaje que ahora posee el autor de la llamada.

Comentarios

Para transferir la propiedad, se debe devolver el puntero de mensaje original. Para mantener la propiedad, es necesario realizar y devolver una copia de la carga del mensaje.

acquire_ref

Adquiere un recuento de referencias en este objeto source_block para evitar la eliminación.

virtual void acquire_ref(_Inout_ ITarget<_Target_type> *);

Comentarios

Un objeto ITarget que está vinculado a este origen llama a este método durante el método link_target.

async_send

Pone en cola los mensajes de forma asincrónica e inicia una tarea de propagación, si aún no se ha realizado.

virtual void async_send(_Inout_opt_ message<_Target_type>* _Msg);

Parámetros

_Msg
Un puntero a un objeto message que se enviará de forma asincrónica.

consumir

Consume un mensaje ofrecido previamente por el objeto source_block y reservado correctamente por el destino, y transfiere la propiedad al autor de la llamada.

virtual message<_Target_type>* consume(
    runtime_object_identity _MsgId,
    _Inout_ ITarget<_Target_type>* _PTarget);

Parámetros

_MsgId
runtime_object_identity del objeto message reservado.

_PTarget
Puntero al bloque de destino que está llamando al método consume.

Valor devuelto

Puntero al objeto message del que el autor de la llamada tiene ahora la propiedad.

Comentarios

El método produce una excepción invalid_argument si el parámetro _PTarget es NULL.

El método produce una excepción bad_target si el parámetro _PTarget no representa el destino que llamó a reserve.

El método consume es similar a accept, pero siempre debe ir precedido de una llamada a reserve que haya devuelto true.

consume_message

Cuando se invalida en una clase derivada, consume un mensaje que se reservó anteriormente.

virtual message<_Target_type>* consume_message(runtime_object_identity _MsgId) = 0;

Parámetros

_MsgId
Valor runtime_object_identity del objeto message que se consumirá.

Valor devuelto

Puntero al mensaje que ahora posee el autor de la llamada.

Comentarios

Es similar a accept, pero siempre va precedido de una llamada a reserve.

enable_batched_processing

Habilita el procesamiento por lotes para este bloque.

void enable_batched_processing();

initialize_source

Inicializa el message_propagator dentro de este source_block.

void initialize_source(
    _Inout_opt_ Scheduler* _PScheduler = NULL,
    _Inout_opt_ ScheduleGroup* _PScheduleGroup = NULL);

Parámetros

_PScheduler
El programador que se usará para programar tareas.

_PScheduleGroup
El grupo de programación que se usará para programar tareas.

Vincula un bloque de destino a este objeto source_block.

virtual void link_target(_Inout_ ITarget<_Target_type>* _PTarget);

Parámetros

_PTarget
Un puntero a un bloque ITarget que se va a vincular a este objeto source_block.

Comentarios

El método produce una excepción invalid_argument si el parámetro _PTarget es NULL.

Devolución de llamada que notifica que se ha vinculado un nuevo destino a este objeto source_block.

virtual void link_target_notification(_Inout_ ITarget<_Target_type> *);

process_input_messages

Procesa mensajes de entrada. Esto solo es útil para los bloques propagadores, que derivan de source_block

virtual void process_input_messages(_Inout_ message<_Target_type>* _PMessage);

Parámetros

_PMessage
Un puntero al mensaje que se procesará.

propagate_output_messages

Propague mensajes a destinos.

virtual void propagate_output_messages();

propagate_to_any_targets

Cuando se invalida en una clase derivada, propaga el mensaje dado a cualquiera o todos los destinos vinculados. Esta es la rutina de propagación principal para los bloques de mensajes.

virtual void propagate_to_any_targets(_Inout_opt_ message<_Target_type>* _PMessage);

Parámetros

_PMessage
Un puntero al mensaje que se propagará.

release

Libera una reserva de mensajes correcta anterior.

virtual void release(
    runtime_object_identity _MsgId,
    _Inout_ ITarget<_Target_type>* _PTarget);

Parámetros

_MsgId
runtime_object_identity del objeto message reservado.

_PTarget
Puntero al bloque de destino que está llamando al método release.

Comentarios

El método produce una excepción invalid_argument si el parámetro _PTarget es NULL.

El método produce una excepción bad_target si el parámetro _PTarget no representa el destino que llamó a reserve.

release_message

Cuando se invalida en una clase derivada, libera una reserva de mensajes anterior.

virtual void release_message(runtime_object_identity _MsgId) = 0;

Parámetros

_MsgId
El valor runtime_object_identity del objeto message que se libera.

release_ref

Libera un recuento de referencias en este objeto source_block.

virtual void release_ref(_Inout_ ITarget<_Target_type>* _PTarget);

Parámetros

_PTarget
Puntero al bloque de destino que llama a este método.

Comentarios

Un objeto ITarget que se desenlazará de este origen llama a este método. El bloque de origen se permite para liberar los recursos reservados para el bloque de destino.

remove_targets

Quita todos los vínculos de destino de este bloque de origen. Se debe llamar desde el destructor.

void remove_targets();

reserva

Reserva un mensaje ofrecido anteriormente por este objeto source_block.

virtual bool reserve(
    runtime_object_identity _MsgId,
    _Inout_ ITarget<_Target_type>* _PTarget);

Parámetros

_MsgId
El valor runtime_object_identity del objeto message ofrecido.

_PTarget
Puntero al bloque de destino que está llamando al método reserve.

Valor devuelto

true si se ha reservado correctamente el mensaje; de lo contrario, false. Las reservas pueden producir errores por muchas razones, como que el mensaje ya estaba reservado o aceptado por otro destino, que el origen deniegue reservas, etc.

Comentarios

El método produce una excepción invalid_argument si el parámetro _PTarget es NULL.

Después de llamar a reserve, si no hay errores, debe llamar a consume o release para tomar la posesión del mensaje o renunciar a ella respectivamente.

reserve_message

Cuando se invalida en una clase derivada, reserva un mensaje ofrecido previamente por este objeto source_block.

virtual bool reserve_message(runtime_object_identity _MsgId) = 0;

Parámetros

_MsgId
El runtime_object_identity del objeto message que se está reservando.

Valor devuelto

true si se ha reservado correctamente el mensaje; de lo contrario, false.

Comentarios

Después de llamar a reserve, si devuelve true, se debe llamar a consume o release para aceptar o liberar la propiedad del mensaje.

resume_propagation

Cuando se invalida en una clase derivada, reanuda la propagación una vez que se ha liberado una reserva.

virtual void resume_propagation() = 0;

source_block

Construye un objeto source_block.

source_block();

~source_block

Destruye el objeto source_block.

virtual ~source_block();

sync_send

Pone en cola los mensajes de forma sincrónica e inicia una tarea de propagación, si aún no se ha realizado.

virtual void sync_send(_Inout_opt_ message<_Target_type>* _Msg);

Parámetros

_Msg
Un puntero a un objeto message que se enviará de forma sincrónica.

Desvincula un bloque de destino de este objeto source_block.

virtual void unlink_target(_Inout_ ITarget<_Target_type>* _PTarget);

Parámetros

_PTarget
Un puntero a un bloque ITarget que se desvinculará de este objeto source_block.

Comentarios

El método produce una excepción invalid_argument si el parámetro _PTarget es NULL.

Una devolución de llamada que notifica que se ha desvinculado un destino a este objeto source_block.

virtual void unlink_target_notification(_Inout_ ITarget<_Target_type>* _PTarget);

Parámetros

_PTarget
El bloque ITarget que se desvinculó.

Desvincula todos los bloques de destino de este objeto source_block.

virtual void unlink_targets();

wait_for_outstanding_async_sends

Espera a que se completen todas las propagaciones asincrónicas. Una espera de giro específica del propagador que se usa en destructores de bloques de mensajes para asegurarse de que todas las propagaciones asincrónicas tienen tiempo de finalizar antes de destruir el bloque.

void wait_for_outstanding_async_sends();

Consulte también

concurrency (espacio de nombres)
ISource (clase)