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=39822aa6b829d79198e013b314b1eb491a6074df;hpb=fb13a50bc14688a20dc37acbbbbe23f56bf63c41;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 39822aa6..010eed09 100644 --- a/KernelLand/Modules/Interfaces/UDI/udi_lib/core/cb.c +++ b/KernelLand/Modules/Interfaces/UDI/udi_lib/core/cb.c @@ -9,28 +9,61 @@ #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) +{ + ASSERTC(MetaCBNum, <, Meta->nCbTypes); + size_t base = Meta->CbTypes[MetaCBNum].Size; + ASSERTC(base, >=, sizeof(udi_cb_t)); + base -= sizeof(udi_cb_t); + LOG("+ %i + %i + %i", 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 + 1) + base + inline_size; + return ret; +} void *udi_cb_alloc_internal(tUDI_DriverInstance *Inst, udi_ubit8_t bind_cb_idx, udi_channel_t channel) { const udi_cb_init_t *cb_init; LOG("Inst=%p, bind_cb_idx=%i, channel=%p", Inst, bind_cb_idx, channel); - if(Inst) { - ASSERT(Inst->Module); - ASSERT(Inst->Module->InitInfo); - ASSERT(Inst->Module->InitInfo->cb_init_list); - } - cb_init = Inst ? Inst->Module->InitInfo->cb_init_list : cUDI_MgmtCbInitList; - for( ; cb_init->cb_idx; cb_init ++ ) + ASSERT(Inst); + ASSERT(Inst->Module); + ASSERT(Inst->Module->InitInfo); + ASSERT(Inst->Module->InitInfo->cb_init_list); + + for( cb_init = Inst->Module->InitInfo->cb_init_list; cb_init->cb_idx; cb_init ++ ) { 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); return NULL; } + return udi_cb_alloc_internal_v(metalang, cb_init->meta_cb_num, + cb_init->inline_size, cb_init->scratch_requirement, channel); + #if 0 ASSERTC(cb_init->meta_cb_num, <, metalang->nCbTypes); size_t base = metalang->CbTypes[cb_init->meta_cb_num].Size; ASSERTC(base, >=, sizeof(udi_cb_t)); @@ -39,7 +72,9 @@ void *udi_cb_alloc_internal(tUDI_DriverInstance *Inst, udi_ubit8_t bind_cb_idx, udi_cb_t *ret = NEW(udi_cb_t, + base + cb_init->inline_size + cb_init->scratch_requirement); ret->channel = channel; + ret->scratch = (void*)ret + sizeof(udi_cb_t) + base + cb_init->inline_size; return ret; + #endif } } Log_Warning("UDI", "Cannot find CB init def %i for '%s'", @@ -86,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)