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
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.
link_target
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
.
link_target_notification
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.
unlink_target
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
.
unlink_target_notification
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ó.
unlink_targets
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();