示例#1
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;
                }
            }
        }
    }
}
PUBLIC EXPORT_SHARED t_cm_error CM_ENGINE_UnbindComponentAsynchronous(
        const t_cm_instance_handle instance,
        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(instance);
    // Sanity check
    if((error = cm_checkValidUnbinding(client, requiredItfClientName,
				       &itfRequire, &itfProvide)) != CM_OK)
        goto out;

    bfInfoID = itfRequire.client->interfaceReferences[itfRequire.requireIndex][itfRequire.collectionIndex].bfInfoID;

    // Check if we really need to unbind
    if(cm_unregisterSingletonBinding(client, &itfRequire, &itfProvide, clientId))
    {
        // Check if this is a Asynchronous binding
        if(bfInfoID == BF_DSP2DSP)
        {
            t_nmf_core_id clientDsp = itfRequire.client->Template->dspId;
            t_nmf_core_id serverDsp = itfProvide.server->Template->dspId;

            (void)cm_EEM_ForceWakeup(clientDsp);
            (void)cm_EEM_ForceWakeup(serverDsp);

            cm_unbindInterfaceDistributed(
                    &itfRequire,
                    (t_mpc2mpc_bf_info*)itfRequire.client->interfaceReferences[itfRequire.requireIndex][itfRequire.collectionIndex].bfInfo);

            cm_EEM_AllowSleep(clientDsp);
            cm_EEM_AllowSleep(serverDsp);

            error = CM_OK;
        }
        else if(bfInfoID == BF_ASYNCHRONOUS)
        {
            t_nmf_core_id clientDsp = itfRequire.client->Template->dspId;

            (void)cm_EEM_ForceWakeup(clientDsp);

            cm_unbindInterfaceAsynchronous(
                    &itfRequire,
                    (t_async_bf_info*)itfRequire.client->interfaceReferences[itfRequire.requireIndex][itfRequire.collectionIndex].bfInfo);

            cm_EEM_AllowSleep(clientDsp);

            error = CM_OK;
        }
        else
            error = CM_ILLEGAL_UNBINDING;
    }

 out:
    OSAL_UNLOCK_API();
    return error;
}