10#ifndef CBM_IO_KCOMM_H_
11#define CBM_IO_KCOMM_H_
13#include "crabmeat-common.h"
15#include "io/sink-handle.h"
17#include "kernel/kmount.h"
18#include "kernel/ksched.h"
19#include "kernel/kscratch.h"
20#include "kernel/kcomm.h"
22#include "cpl/cbm_cpl.h"
24#define CBM_Error(obj) !CBM_HandleOk(obj)
27 class input_class_client_base_t;
28 class input_class_srv_base_t;
32 class resources_statistics_t;
38class CBM_API io_kcomm_t :
public client_object_t
40 LDNDC_CLIENT_OBJECT(io_kcomm_t)
43 io_kcomm_t( lid_t
const &);
46 kcomm_t peer_communicator(
47 char const * , lid_t
const & );
48 kmount_t spatial_controller(
50 ksched_t temporal_controller(
54 template <
typename _T >
55 CBM_Handle publish_port(
char const * _name,
char const * _unit,
56 _T * _data,
size_t _data_sz,
int _flags = 0)
57 {
return this->publish_port(
58 _name, _unit, this->object_id(), _data, _data_sz, _flags); }
59 template <
typename _T >
60 CBM_Handle publish_port(
char const * _name,
char const * _unit,
61 lid_t
const & _part_id,
62 _T * _data,
size_t _data_sz,
int _flags = 0)
63 {
return this->publish_port_priv( _name, _unit, _part_id,
64 _data, _data_sz, cbm_type< _T >::type, _flags); }
65 lerr_t unpublish_port( CBM_Handle);
67 CBM_Handle subscribe_port(
char const * _name,
char const * _unit,
68 CBM_Transform * _transform = 0,
int _flags = 0)
69 {
return this->subscribe_port( _name, _unit,
70 this->object_id(), _transform, _flags); }
71 CBM_Handle subscribe_port(
char const * _name,
char const * _unit,
72 lid_t
const & _part_id, CBM_Transform * _transform = 0,
int _flags = 0)
73 {
return this->subscribe_port_priv( _name, _unit,
74 _part_id, _transform, CBM_CallbackNone, _flags); }
75 lerr_t unsubscribe_port( CBM_Handle);
77 char const * port_uri( CBM_Handle)
const;
78 char const * port_unit( CBM_Handle,
79 char * ,
size_t )
const;
81 int ping_port( CBM_Handle , CBM_FieldPingInfo * = NULL);
83 template <
typename _T >
84 size_t send_port( CBM_Handle _handle,
85 _T
const * _data,
size_t _data_sz,
int _flags = 0)
86 {
return this->send_port_priv( _handle, _data,
87 _data_sz, cbm_type< _T >::type, _flags); }
88 template <
typename _T >
89 size_t recv_port( CBM_Handle _handle,
90 _T * _data,
size_t _data_sz,
int _flags = 0)
91 {
return this->recv_port_priv( _handle, _data,
92 _data_sz, cbm_type< _T >::type, _flags); }
93 template <
typename _T >
94 size_t recv_dynport( CBM_Handle _handle,
void ** _data,
int _flags = 0)
95 {
return this->recv_dynport_priv( _handle, _data,
96 cbm_type< _T >::type, _flags); }
97 void free_dyndata(
void *);
100 CBM_Handle publish_port_priv(
char const * ,
101 char const * , lid_t
const & ,
102 void * ,
size_t , CBM_Datatype,
int );
103 CBM_Handle subscribe_port_priv(
char const * ,
104 char const * , lid_t
const & ,
105 CBM_Transform * = 0, CBM_Callback = CBM_CallbackNone,
int = 0 );
106 size_t send_port_priv( CBM_Handle,
107 void const *,
size_t, CBM_Datatype,
int );
108 size_t recv_port_priv( CBM_Handle,
109 void *,
size_t, CBM_Datatype,
int );
110 size_t recv_dynport_priv( CBM_Handle,
111 void ** , CBM_Datatype,
int );
114 CBM_Handle publish_event(
char const * _name,
int _flags = 0)
115 {
return this->publish_port<char>( _name,
116 CBM_NoUnit, NULL, CBM_DynamicSize, _flags); }
117 lerr_t unpublish_event( CBM_Handle _handle)
118 {
return this->unpublish_port( _handle); }
119 CBM_Handle subscribe_event(
char const * _name,
120 CBM_Callback _callback,
int _flags = 0)
121 {
return this->subscribe_port_priv( _name, CBM_NoUnit,
122 this->object_id(), NULL, _callback, _flags); }
123 lerr_t unsubscribe_event( CBM_Handle _handle)
124 {
return this->unsubscribe_port( _handle); }
126 size_t send_event( CBM_Handle _handle,
127 char const * _data,
size_t _data_sz,
int _flags = 0)
128 {
return this->send_port_priv( _handle,
129 _data, _data_sz, CBM_CHAR, _flags); }
134 cbm::source_descriptor_t
const * = NULL );
137 cbm::source_descriptor_t
const * = NULL );
141 template <
typename _I >
142 _I
const * get_input_class();
143 template <
typename _I >
144 _I
const & get_input_class_ref();
146 template <
typename _I >
147 _I
const * acquire_input(
148 cbm::source_descriptor_t
const *);
149 ldndc::input_class_client_base_t
const * acquire_input(
151 cbm::source_descriptor_t
const *);
153 ldndc::input_class_client_base_t
const *)
const;
156 ldndc::input_class_srv_base_t * fetch_input(
157 char const * , cbm::source_descriptor_t
const *);
158 ldndc::input_class_srv_base_t
const * fetch_input(
159 char const * , cbm::source_descriptor_t
const *)
const;
162 lid_t resolve_source(
char const * ,
163 cbm::source_descriptor_t * )
const;
164 template <
typename _I >
165 lid_t get_source_descriptor(
166 cbm::source_descriptor_t * _kd)
const
167 {
return this->resolve_source( _I::iclassname(), _kd); }
168 template <
typename _I >
169 lid_t get_input_class_source_info(
170 cbm::source_descriptor_t * _kd)
const
171 {
return this->get_source_descriptor< _I >( _kd); }
174 ldndc::sink_handle_t sink_handle_acquire(
175 char const * ,
int = 0);
176 lerr_t sink_handle_release(
177 ldndc::sink_handle_t *);
180 void set_scratch( state_scratch_t *);
181 state_scratch_t * get_scratch();
183 cbm::source_descriptor_t
const & cbmdebug__kdesc()
184 const {
return this->m_kdesc; }
188 io_dcomm_t * m_iodcomm;
189 cbm::source_descriptor_t m_kdesc;
195 state_scratch_t * m_scratch;
198 std::vector < ldndc::input_class_client_base_t const * > m_ic;
203template <
typename _I >
205cbm::io_kcomm_t::get_input_class()
206 {
return this->acquire_input< _I >( NULL); }
209template <
typename _I >
211cbm::io_kcomm_t::get_input_class_ref()
213 _I
const * ic = this->acquire_input< _I >( NULL);
215 {
return static_cast< _I
const &
>( *ic); }
216 throw std::runtime_error(
"failed to get input class");
219template <
typename _I >
221cbm::io_kcomm_t::acquire_input(
222 cbm::source_descriptor_t
const * _source_info)
224 return static_cast< _I
const *
>(
225 this->acquire_input( _I::iclassname(), _source_info));
The "Service Registry" holds information about available services (e.g., models, readers,...
Definition Lresources.h:51
declare common types related to air chemistry input
Definition airchemistrytypes.cpp:9