STATUS freeApp()

in main/AppCommon.c [840:937]


STATUS freeApp(PAppConfiguration* ppAppConfiguration)
{
    ENTERS();
    STATUS retStatus = STATUS_SUCCESS;
    PAppConfiguration pAppConfiguration = NULL;
    UINT32 i;
    BOOL locked = FALSE;

    CHK(ppAppConfiguration != NULL, STATUS_APP_COMMON_NULL_ARG);
    pAppConfiguration = *ppAppConfiguration;
    CHK(pAppConfiguration != NULL, STATUS_APP_COMMON_NULL_ARG);

    // Kick of the termination sequence
    ATOMIC_STORE_BOOL(&pAppConfiguration->terminateApp, TRUE);

    if (pAppConfiguration->mediaSenderTid != INVALID_TID_VALUE) {
        THREAD_JOIN(pAppConfiguration->mediaSenderTid, NULL);
    }

    freeAppSignaling(&pAppConfiguration->appSignaling);
    freeConnectionMsgQ(&pAppConfiguration->pRemotePeerPendingSignalingMessages);

    hashTableClear(pAppConfiguration->pRemoteRtcPeerConnections);
    hashTableFree(pAppConfiguration->pRemoteRtcPeerConnections);

    if (IS_VALID_MUTEX_VALUE(pAppConfiguration->appConfigurationObjLock)) {
        MUTEX_LOCK(pAppConfiguration->appConfigurationObjLock);
        locked = TRUE;
    }

    for (i = 0; i < pAppConfiguration->streamingSessionCount; ++i) {
        retStatus = gatherIceServerStats(pAppConfiguration->streamingSessionList[i]);
        if (STATUS_FAILED(retStatus)) {
            DLOGW("Failed to ICE Server Stats for streaming session %d: %08x", i, retStatus);
        }
        freeStreamingSession(&pAppConfiguration->streamingSessionList[i]);
    }

    if (locked) {
        MUTEX_UNLOCK(pAppConfiguration->appConfigurationObjLock);
    }
    deinitWebRtc(pAppConfiguration);
    detroyMediaSource(&pAppConfiguration->pMediaContext);

    if (IS_VALID_CVAR_VALUE(pAppConfiguration->cvar) && IS_VALID_MUTEX_VALUE(pAppConfiguration->appConfigurationObjLock)) {
        CVAR_BROADCAST(pAppConfiguration->cvar);
        MUTEX_LOCK(pAppConfiguration->appConfigurationObjLock);
        MUTEX_UNLOCK(pAppConfiguration->appConfigurationObjLock);
    }

    if (IS_VALID_MUTEX_VALUE(pAppConfiguration->appConfigurationObjLock)) {
        MUTEX_FREE(pAppConfiguration->appConfigurationObjLock);
    }

    if (IS_VALID_MUTEX_VALUE(pAppConfiguration->streamingSessionListReadLock)) {
        MUTEX_FREE(pAppConfiguration->streamingSessionListReadLock);
    }

    if (IS_VALID_CVAR_VALUE(pAppConfiguration->cvar)) {
        CVAR_FREE(pAppConfiguration->cvar);
    }

    if (IS_VALID_TIMER_QUEUE_HANDLE(pAppConfiguration->timerQueueHandle)) {
        if (pAppConfiguration->iceCandidatePairStatsTimerId != MAX_UINT32) {
            retStatus =
                timerQueueCancelTimer(pAppConfiguration->timerQueueHandle, pAppConfiguration->iceCandidatePairStatsTimerId, (UINT64) pAppConfiguration);
            if (STATUS_FAILED(retStatus)) {
                DLOGE("Failed to cancel stats timer with: 0x%08x", retStatus);
            }
            pAppConfiguration->iceCandidatePairStatsTimerId = MAX_UINT32;
        }

        if (pAppConfiguration->pregenerateCertTimerId != MAX_UINT32) {
            retStatus =
                timerQueueCancelTimer(pAppConfiguration->timerQueueHandle, pAppConfiguration->pregenerateCertTimerId, (UINT64) pAppConfiguration);
            if (STATUS_FAILED(retStatus)) {
                DLOGE("Failed to cancel certificate pre-generation timer with: 0x%08x", retStatus);
            }
            pAppConfiguration->pregenerateCertTimerId = MAX_UINT32;
        }

        timerQueueFree(&pAppConfiguration->timerQueueHandle);
    }

    destroyCredential(&pAppConfiguration->appCredential);

    if (pAppConfiguration->enableFileLogging) {
        closeFileLogging();
    }

    MEMFREE(*ppAppConfiguration);
    *ppAppConfiguration = NULL;

CleanUp:

    LEAVES();
    return retStatus;
}