PUBLIC EXPORT_SHARED t_cm_error CM_ENGINE_UnbindComponent( const t_cm_instance_handle clientInstance, const char* requiredItfClientName, t_nmf_client_id clientId) { t_interface_require_description itfRequire; t_interface_provide_description itfProvide; t_bf_info_ID bfInfoID; t_cm_error error; t_component_instance *client; OSAL_LOCK_API(); client = cm_lookupComponent(clientInstance); // Sanity check if((error = cm_checkValidUnbinding(client, requiredItfClientName, &itfRequire, &itfProvide)) != CM_OK) goto out; // Check if this is a Primitive binding bfInfoID = itfRequire.client->interfaceReferences[itfRequire.requireIndex][itfRequire.collectionIndex].bfInfoID; if(bfInfoID != BF_SYNCHRONOUS && bfInfoID != BF_TRACE) { error = CM_ILLEGAL_UNBINDING; goto out; } // Check if we really need to unbind if(cm_unregisterSingletonBinding(client, &itfRequire, &itfProvide, clientId)) { (void)cm_EEM_ForceWakeup(itfRequire.client->Template->dspId); if(bfInfoID == BF_SYNCHRONOUS) cm_unbindInterface(&itfRequire); else cm_unbindInterfaceTrace( &itfRequire, (t_trace_bf_info*)itfRequire.client->interfaceReferences[itfRequire.requireIndex][itfRequire.collectionIndex].bfInfo); cm_EEM_AllowSleep(itfRequire.client->Template->dspId); error = CM_OK; } out: OSAL_UNLOCK_API(); return error; }
t_cm_error cm_unbindInterfaceStaticInterrupt( const t_nmf_core_id coreId, const int interruptLine ) { char requiredItfClientName[CM_IT_NAME_MAX_LENGTH]; t_component_instance *client = cm_EEM_getExecutiveEngine(coreId)->instance; t_interface_require_description itfRequire; t_cm_error error; //build it[%d] name if (interruptLine < 0 || interruptLine > 255) {return CM_OUT_OF_LIMITS;} cm_fillItName(interruptLine, requiredItfClientName); //do unbinding if ((error = cm_getRequiredInterface(client,requiredItfClientName,&itfRequire)) != CM_OK) {return error;} cm_unbindInterface(&itfRequire); return CM_OK; }
void cm_destroyRequireInterface(t_component_instance* component, t_nmf_client_id clientId) { int i, j; /* * Special code for SINGLETON handling */ if(component->Template->classe == SINGLETON) { if(getNumberOfBind(component) > 0) return; } for(i = 0; i < component->Template->requireNumber; i++) { int nb = component->Template->requires[i].collectionSize; for(j = 0; j < nb; j++) { if(component->interfaceReferences[i][j].instance != NULL) { t_interface_reference* itfRef = &component->interfaceReferences[i][j]; t_interface_require_description itfRequire; itfRequire.client = component; itfRequire.requireIndex = i; itfRequire.collectionIndex = j; itfRequire.origName = component->Template->requires[i].name; switch (itfRef->bfInfoID) { case BF_SYNCHRONOUS: /* Error ignored as it is always OK */ cm_unbindInterface(&itfRequire); break; case BF_TRACE: cm_unbindInterfaceTrace(&itfRequire, (t_trace_bf_info*)itfRequire.client->interfaceReferences[itfRequire.requireIndex][itfRequire.collectionIndex].bfInfo); break; case BF_ASYNCHRONOUS: cm_unbindInterfaceAsynchronous(&itfRequire, (t_async_bf_info*)itfRequire.client->interfaceReferences[itfRequire.requireIndex][itfRequire.collectionIndex].bfInfo); break; case BF_DSP2HOST: /* This 'mpc2host handle' is provided by the host at OS Integration level. It must then be handled and released in OS specific part. */ cm_unbindComponentToCMCore(&itfRequire, (t_mpc2host_bf_info*)itfRequire.client->interfaceReferences[itfRequire.requireIndex][itfRequire.collectionIndex].bfInfo); break; case BF_HOST2DSP: /* These bindings are from CM Core to DSP, they are not listed here and must be handled/freed by host at OS Integration level */ break; case BF_DSP2DSP: cm_unbindInterfaceDistributed(&itfRequire, (t_mpc2mpc_bf_info*)itfRequire.client->interfaceReferences[itfRequire.requireIndex][itfRequire.collectionIndex].bfInfo); break; default: break; } } } } }