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;
}
Beispiel #2
0
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;
}
Beispiel #3
0
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;
                }
            }
        }
    }
}