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;
}