X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=KernelLand%2FModules%2FInterfaces%2FUDI%2Fudi_lib%2Fcore%2Fcb.c;h=010eed09a51b580034856efda97285094d9c5ee4;hb=3fe3238f90216eeec97778e3ae91f462d27c60ac;hp=ae8c155d11017c46ed89b4c264f05e816472096f;hpb=26904c8992e45a3dbbafae273bef81e90d7d9692;p=tpg%2Facess2.git diff --git a/KernelLand/Modules/Interfaces/UDI/udi_lib/core/cb.c b/KernelLand/Modules/Interfaces/UDI/udi_lib/core/cb.c index ae8c155d..010eed09 100644 --- a/KernelLand/Modules/Interfaces/UDI/udi_lib/core/cb.c +++ b/KernelLand/Modules/Interfaces/UDI/udi_lib/core/cb.c @@ -9,7 +9,22 @@ #include #include // for cUDI_MgmtCbInitList +typedef struct sUDI_CBHeader +{ + tUDI_MetaLang *Metalang; + udi_index_t MetaCBNum; + udi_cb_t cb; +} tUDI_CBHeader; + // === CODE === +tUDI_MetaLang *UDI_int_GetCbType(udi_cb_t *cb, udi_index_t *meta_cb_num) +{ + tUDI_CBHeader *hdr = (void*)cb - offsetof(tUDI_CBHeader, cb); + if(meta_cb_num) + *meta_cb_num = hdr->MetaCBNum; + return hdr->Metalang; +} + 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) { @@ -18,9 +33,12 @@ udi_cb_t *udi_cb_alloc_internal_v(tUDI_MetaLang *Meta, udi_index_t MetaCBNum, ASSERTC(base, >=, sizeof(udi_cb_t)); base -= sizeof(udi_cb_t); LOG("+ %i + %i + %i", base, inline_size, scratch_size); - udi_cb_t *ret = NEW(udi_cb_t, + base + inline_size + scratch_size); + tUDI_CBHeader *cbhdr = NEW(tUDI_CBHeader, + base + inline_size + scratch_size); + cbhdr->Metalang = Meta; + cbhdr->MetaCBNum = MetaCBNum; + udi_cb_t *ret = &cbhdr->cb; ret->channel = channel; - ret->scratch = (void*)ret + sizeof(udi_cb_t) + base + inline_size; + ret->scratch = (void*)(ret + 1) + base + inline_size; return ret; } void *udi_cb_alloc_internal(tUDI_DriverInstance *Inst, udi_ubit8_t bind_cb_idx, udi_channel_t channel) @@ -37,7 +55,7 @@ void *udi_cb_alloc_internal(tUDI_DriverInstance *Inst, udi_ubit8_t bind_cb_idx, if( cb_init->cb_idx == bind_cb_idx ) { // TODO: Get base size using meta/cbnum - tUDI_MetaLang *metalang = UDI_int_GetMetaLang(Inst, cb_init->meta_idx); + tUDI_MetaLang *metalang = UDI_int_GetMetaLang(Inst->Module, cb_init->meta_idx); if( !metalang ) { Log_Warning("UDI", "Metalang referenced in %s CB %i is invalid (%i)", Inst->Module->ModuleName, bind_cb_idx, cb_init->meta_idx); @@ -103,7 +121,9 @@ void udi_cb_alloc_batch( void udi_cb_free(udi_cb_t *cb) { - UNIMPLEMENTED(); + tUDI_CBHeader *hdr = (void*)cb - offsetof(tUDI_CBHeader, cb); + // TODO: Ensure that cb is inactive + free(hdr); } void udi_cancel(udi_cancel_call_t *callback, udi_cb_t *gcb)