3 * \author John Hodge (thePowersGang)
4 * \brief Control block code
9 #include "../udi_internal.h"
10 #include "../udi_ma.h" // for cUDI_MgmtCbInitList
13 void *udi_cb_alloc_internal(tUDI_DriverInstance *Inst, udi_ubit8_t bind_cb_idx, udi_channel_t channel)
15 const udi_cb_init_t *cb_init;
16 LOG("Inst=%p, bind_cb_idx=%i, channel=%p", Inst, bind_cb_idx, channel);
19 ASSERT(Inst->Module->InitInfo);
20 ASSERT(Inst->Module->InitInfo->cb_init_list);
22 cb_init = Inst ? Inst->Module->InitInfo->cb_init_list : cUDI_MgmtCbInitList;
23 for( ; cb_init->cb_idx; cb_init ++ )
25 if( cb_init->cb_idx == bind_cb_idx )
27 // TODO: Get base size using meta/cbnum
28 tUDI_MetaLang *metalang = UDI_int_GetMetaLang(Inst, cb_init->meta_idx);
30 Log_Warning("UDI", "Metalang referenced in %s CB %i is invalid (%i)",
31 Inst->Module->ModuleName, bind_cb_idx, cb_init->meta_idx);
34 ASSERTC(cb_init->meta_cb_num, <, metalang->nCbTypes);
35 size_t base = metalang->CbTypes[cb_init->meta_cb_num].Size;
36 ASSERTC(base, >=, sizeof(udi_cb_t));
37 base -= sizeof(udi_cb_t);
38 LOG("+ %i + %i + %i", base, cb_init->inline_size, cb_init->scratch_requirement);
39 udi_cb_t *ret = NEW(udi_cb_t, + base
40 + cb_init->inline_size + cb_init->scratch_requirement);
41 ret->channel = channel;
45 Log_Warning("UDI", "Cannot find CB init def %i for '%s'",
46 bind_cb_idx, Inst->Module->ModuleName);
51 udi_cb_alloc_call_t *callback, //!< Function to be called when the CB is allocated
52 udi_cb_t *gcb, //!< Parent Control Block
54 udi_channel_t default_channel
57 tUDI_DriverInstance *inst = UDI_int_ChannelGetInstance(gcb, false, NULL);
58 void *ret = udi_cb_alloc_internal(inst, cb_idx, default_channel);
62 void udi_cb_alloc_dynamic(
63 udi_cb_alloc_call_t *callback,
66 udi_channel_t default_channel,
67 udi_size_t inline_size,
68 udi_layout_t *inline_layout
74 void udi_cb_alloc_batch(
75 udi_cb_alloc_batch_call_t *callback, //!<
79 udi_boolean_t with_buf,
81 udi_buf_path_t path_handle
87 void udi_cb_free(udi_cb_t *cb)
92 void udi_cancel(udi_cancel_call_t *callback, udi_cb_t *gcb)
99 EXPORT(udi_cb_alloc_dynamic);
100 EXPORT(udi_cb_alloc_batch);