7d05768cb1a65f2bf68130135288826d5b6b421c
[tpg/acess2.git] / KernelLand / Modules / Interfaces / UDI / udi_lib / cb.c
1 /**
2  * \file cb.c
3  * \author John Hodge (thePowersGang)
4  * \brief Control block code
5  */
6 #define DEBUG   1
7 #include <udi.h>
8 #include <acess.h>
9 #include "../udi_internal.h"
10 #include "../udi_ma.h"  // for cUDI_MgmtCbInitList
11
12 // === CODE ===
13 void *udi_cb_alloc_internal(tUDI_DriverInstance *Inst, udi_ubit8_t bind_cb_idx, udi_channel_t channel)
14 {
15         const udi_cb_init_t     *cb_init;
16         LOG("Inst=%p, bind_cb_idx=%i, channel=%p", Inst, bind_cb_idx, channel);
17         if(Inst) {
18                 ASSERT(Inst->Module);
19                 ASSERT(Inst->Module->InitInfo);
20                 ASSERT(Inst->Module->InitInfo->cb_init_list);
21         }
22         cb_init = Inst ? Inst->Module->InitInfo->cb_init_list : cUDI_MgmtCbInitList;
23         for( ; cb_init->cb_idx; cb_init ++ )
24         {
25                 if( cb_init->cb_idx == bind_cb_idx )
26                 {
27                         // TODO: Get base size using meta/cbnum
28                         tUDI_MetaLang *metalang = UDI_int_GetMetaLang(Inst, cb_init->meta_idx);
29                         if( !metalang ) {
30                                 Log_Warning("UDI", "Metalang referenced in %s CB %i is invalid (%i)",
31                                         Inst->Module->ModuleName, bind_cb_idx, cb_init->meta_idx);
32                                 return NULL;
33                         }
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;
42                         return ret;
43                 }
44         }
45         Log_Warning("UDI", "Cannot find CB init def %i for '%s'",
46                 bind_cb_idx, Inst->Module->ModuleName);
47         return NULL;
48 }
49
50 void udi_cb_alloc (
51         udi_cb_alloc_call_t     *callback,      //!< Function to be called when the CB is allocated
52         udi_cb_t        *gcb,   //!< Parent Control Block
53         udi_index_t     cb_idx,
54         udi_channel_t   default_channel
55         )
56 {
57         tUDI_DriverInstance *inst = UDI_int_ChannelGetInstance(gcb, false, NULL);
58         void *ret = udi_cb_alloc_internal(inst, cb_idx, default_channel);
59         callback(gcb, ret);
60 }
61
62 void udi_cb_alloc_dynamic(
63         udi_cb_alloc_call_t     *callback,
64         udi_cb_t        *gcb,
65         udi_index_t     cb_idx,
66         udi_channel_t   default_channel,
67         udi_size_t      inline_size,
68         udi_layout_t    *inline_layout
69         )
70 {
71         UNIMPLEMENTED();
72 }
73
74 void udi_cb_alloc_batch(
75         udi_cb_alloc_batch_call_t       *callback,      //!< 
76         udi_cb_t        *gcb,   //!< 
77         udi_index_t     cb_idx,
78         udi_index_t     count,
79         udi_boolean_t   with_buf,
80         udi_size_t      buf_size,
81         udi_buf_path_t  path_handle
82         )
83 {
84         UNIMPLEMENTED();
85 }
86
87 void udi_cb_free(udi_cb_t *cb)
88 {
89         UNIMPLEMENTED();
90 }
91
92 void udi_cancel(udi_cancel_call_t *callback, udi_cb_t *gcb)
93 {
94         UNIMPLEMENTED();
95 }
96
97 // === EXPORTS ===
98 EXPORT(udi_cb_alloc);
99 EXPORT(udi_cb_alloc_dynamic);
100 EXPORT(udi_cb_alloc_batch);
101 EXPORT(udi_cb_free);
102 EXPORT(udi_cancel);

UCC git Repository :: git.ucc.asn.au