3 * - By John Hodge (thePowersGang)
6 * - Definitions for opaque structures
8 #ifndef _UDI_INTERNAL_H_
9 #define _UDI_INTERNAL_H_
14 #define NEW(type,extra) (type*)calloc(sizeof(type)extra,1)
15 #define NEW_wA(type,fld,cnt) NEW(type,+(sizeof(((type*)NULL)->fld[0])*cnt))
17 typedef struct sUDI_PropMessage tUDI_PropMessage;
18 typedef struct sUDI_PropRegion tUDI_PropRegion;
19 typedef struct sUDI_PropDevSpec tUDI_PropDevSpec;
21 typedef const struct sUDI_MetaLang tUDI_MetaLang;
23 typedef struct sUDI_MetaLangRef tUDI_MetaLangRef;
24 typedef struct sUDI_BindOps tUDI_BindOps;
26 typedef struct sUDI_DriverModule tUDI_DriverModule;
27 typedef struct sUDI_DriverInstance tUDI_DriverInstance;
28 typedef struct sUDI_DriverRegion tUDI_DriverRegion;
30 typedef struct sUDI_ChildBinding tUDI_ChildBinding;
32 struct sUDI_PropMessage
39 struct sUDI_PropRegion
41 udi_index_t RegionIdx;
43 UDI_REGIONTYPE_NORMAL,
47 UDI_REGIONBINDING_STATIC,
48 UDI_REGIONBINDING_DYNAMIC,
56 UDI_REGIONLATENCY_NONOVERRRUNABLE,
57 UDI_REGIONLATENCY_POWERFAIL,
58 UDI_REGIONLATENCY_OVERRUNNABLE,
59 UDI_REGIONLATENCY_RETRYABLE,
61 UDI_REGIONLATENCY_NONCTRITICAL,
63 udi_ubit32_t OverrunTime;
66 udi_index_t PriBindOps;
67 udi_index_t SecBindOps;
83 struct sUDI_MetaLangRef
86 const char *interface_name;
87 tUDI_MetaLang *metalang;
88 // TODO: pointer to metalanguage structure
94 udi_ubit8_t region_idx;
96 udi_ubit8_t bind_cb_idx;
99 struct sUDI_PropDevSpec
103 tUDI_MetaLang *Metalang;
105 udi_instance_attr_list_t Attribs[];
108 struct sUDI_DriverModule
110 tUDI_DriverModule *Next;
113 const udi_init_t *InitInfo;
115 // Counts of arrays in InitInfo
119 const char *ModuleName;
121 tUDI_PropMessage *Messages; // Sorted list
124 tUDI_PropRegion *RegionTypes;
127 tUDI_MetaLangRef *MetaLangs;
130 tUDI_BindOps *Parents;
133 tUDI_BindOps *ChildBindOps;
136 tUDI_PropDevSpec **Devices;
141 struct sUDI_DriverInstance
143 struct sUDI_DriverInstance *Next;
144 tUDI_DriverModule *Module;
145 udi_channel_t ManagementChannel;
146 tUDI_DriverInstance *Parent;
147 tUDI_ChildBinding *ParentChildBinding;
149 int CurState; // Current MA state
151 tUDI_ChildBinding *FirstChild;
152 tUDI_DriverRegion *Regions[];
155 struct sUDI_DriverRegion
157 udi_init_context_t *InitContext;
160 struct sUDI_ChildBinding
162 tUDI_ChildBinding *Next;
164 udi_ubit32_t ChildID;
165 tUDI_MetaLang *Metalang;
166 tUDI_BindOps *BindOps;
169 tUDI_DriverInstance *BoundInstance;
172 udi_instance_attr_list_t Attribs[];
175 // --- Metalanguages ---
176 extern tUDI_MetaLang cMetaLang_Management;
178 // --- Index to pointer translation ---
179 extern udi_ops_init_t *UDI_int_GetOps(tUDI_DriverInstance *Inst, udi_index_t index);
180 extern tUDI_MetaLang *UDI_int_GetMetaLang(tUDI_DriverModule *Inst, udi_index_t meta_idx);
183 extern udi_channel_t UDI_CreateChannel_Blank(tUDI_MetaLang *metalang);
184 extern udi_channel_t UDI_CreateChannel_Linked(udi_channel_t orig, udi_ubit8_t spawn_idx);
185 extern int UDI_BindChannel_Raw(udi_channel_t channel, bool other_side, tUDI_DriverInstance *inst, udi_index_t region_idx, udi_index_t meta_ops_num, void *context, const void *ops);
186 extern int UDI_BindChannel(udi_channel_t channel, bool other_side, tUDI_DriverInstance *inst, udi_index_t ops, udi_index_t region, void *context, bool is_child_bind, udi_ubit32_t child_ID);
187 extern tUDI_DriverInstance *UDI_int_ChannelGetInstance(udi_cb_t *gcb, bool other_side, udi_index_t *region_idx);
188 extern void UDI_int_ChannelSetContext(udi_channel_t channel, void *context);
189 extern const void *UDI_int_ChannelPrepForCall(udi_cb_t *gcb, tUDI_MetaLang *metalang, udi_index_t meta_ops_num);
190 extern void UDI_int_ChannelFlip(udi_cb_t *gcb);
191 extern void UDI_int_ChannelReleaseFromCall(udi_cb_t *gcb);
193 // --- Async Calls ---
194 typedef struct sUDI_DeferredCall tUDI_DeferredCall;
195 typedef void tUDI_DeferredUnmarshal(tUDI_DeferredCall *Call);
196 struct sUDI_DeferredCall
198 struct sUDI_DeferredCall *Next;
199 tUDI_DeferredUnmarshal *Unmarshal;
204 extern void UDI_int_DeferredThread(void *unused); // Worker started by main.c
205 extern void UDI_int_AddDeferred(tUDI_DeferredCall *Call);
206 extern void UDI_int_MakeDeferredCb(udi_cb_t *cb, udi_op_t *handler);
208 extern void UDI_int_MakeDeferredCbU8(udi_cb_t *cb, udi_op_t *handler, udi_ubit8_t arg1);
209 extern void UDI_int_MakeDeferredCbS(udi_cb_t *cb, udi_op_t *handler, udi_status_t status);
212 extern void *udi_cb_alloc_internal(tUDI_DriverInstance *Inst, udi_ubit8_t bind_cb_idx, udi_channel_t channel);
213 extern udi_cb_t *udi_cb_alloc_internal_v(tUDI_MetaLang *Meta, udi_index_t MetaCBNum, size_t inline_size, size_t scratch_size, udi_channel_t channel);
214 extern tUDI_MetaLang *UDI_int_GetCbType(udi_cb_t *gcb, udi_index_t *meta_cb_num);
216 // --- Attribute Management ---
217 extern udi_instance_attr_type_t udi_instance_attr_get_internal(udi_cb_t *gcb, const char *attr_name, udi_ubit32_t child_ID, void *attr_value, udi_size_t attr_length, udi_size_t *actual_length);
220 extern size_t _udi_marshal_step(void *buf, size_t cur_ofs, udi_layout_t **layoutp, va_list *values);
221 extern size_t _udi_marshal_values(void *buf, udi_layout_t *layout, va_list values);
224 extern udi_buf_t *_udi_buf_allocate(const void *data, udi_size_t length, udi_buf_path_t path_handle);