in gst/gst-kvs-plugin/src/KvsWebRtc.c [348:463]
STATUS freeGstKvsWebRtcPlugin(PGstKvsPlugin pGstKvsPlugin)
{
STATUS retStatus = STATUS_SUCCESS;
UINT32 i;
UINT64 data;
StackQueueIterator iterator;
BOOL locked = FALSE;
CHK(pGstKvsPlugin != NULL, STATUS_NULL_ARG);
if (IS_VALID_SIGNALING_CLIENT_HANDLE(pGstKvsPlugin->kvsContext.signalingHandle)) {
freeSignalingClient(&pGstKvsPlugin->kvsContext.signalingHandle);
}
if (pGstKvsPlugin->pPendingSignalingMessageForRemoteClient != NULL) {
// Iterate and free all the pending queues
stackQueueGetIterator(pGstKvsPlugin->pPendingSignalingMessageForRemoteClient, &iterator);
while (IS_VALID_ITERATOR(iterator)) {
stackQueueIteratorGetItem(iterator, &data);
stackQueueIteratorNext(&iterator);
freeMessageQueue((PPendingMessageQueue) data);
}
stackQueueClear(pGstKvsPlugin->pPendingSignalingMessageForRemoteClient, FALSE);
stackQueueFree(pGstKvsPlugin->pPendingSignalingMessageForRemoteClient);
pGstKvsPlugin->pPendingSignalingMessageForRemoteClient = NULL;
}
if (pGstKvsPlugin->pRtcPeerConnectionForRemoteClient != NULL) {
hashTableClear(pGstKvsPlugin->pRtcPeerConnectionForRemoteClient);
hashTableFree(pGstKvsPlugin->pRtcPeerConnectionForRemoteClient);
pGstKvsPlugin->pRtcPeerConnectionForRemoteClient = NULL;
}
if (IS_VALID_MUTEX_VALUE(pGstKvsPlugin->sessionLock)) {
MUTEX_LOCK(pGstKvsPlugin->sessionLock);
locked = TRUE;
}
for (i = 0; i < pGstKvsPlugin->streamingSessionCount; ++i) {
retStatus = gatherIceServerStats(pGstKvsPlugin->streamingSessionList[i]);
if (STATUS_FAILED(retStatus)) {
DLOGW("Failed to ICE Server Stats for streaming session %d: %08x", i, retStatus);
}
freeWebRtcStreamingSession(&pGstKvsPlugin->streamingSessionList[i]);
}
if (locked) {
MUTEX_UNLOCK(pGstKvsPlugin->sessionLock);
}
deinitKvsWebRtc();
if (IS_VALID_MUTEX_VALUE(pGstKvsPlugin->sessionLock)) {
MUTEX_FREE(pGstKvsPlugin->sessionLock);
pGstKvsPlugin->sessionLock = INVALID_MUTEX_VALUE;
}
if (IS_VALID_MUTEX_VALUE(pGstKvsPlugin->sessionListReadLock)) {
MUTEX_FREE(pGstKvsPlugin->sessionListReadLock);
pGstKvsPlugin->sessionListReadLock = INVALID_MUTEX_VALUE;
}
if (IS_VALID_MUTEX_VALUE(pGstKvsPlugin->signalingLock)) {
MUTEX_FREE(pGstKvsPlugin->signalingLock);
pGstKvsPlugin->signalingLock = INVALID_MUTEX_VALUE;
}
if (IS_VALID_TIMER_QUEUE_HANDLE(pGstKvsPlugin->kvsContext.timerQueueHandle)) {
if (pGstKvsPlugin->iceCandidatePairStatsTimerId != MAX_UINT32) {
retStatus = timerQueueCancelTimer(pGstKvsPlugin->kvsContext.timerQueueHandle, pGstKvsPlugin->iceCandidatePairStatsTimerId,
(UINT64) pGstKvsPlugin);
if (STATUS_FAILED(retStatus)) {
DLOGE("Failed to cancel stats timer with: 0x%08x", retStatus);
}
pGstKvsPlugin->iceCandidatePairStatsTimerId = MAX_UINT32;
}
if (pGstKvsPlugin->pregenerateCertTimerId != MAX_UINT32) {
retStatus =
timerQueueCancelTimer(pGstKvsPlugin->kvsContext.timerQueueHandle, pGstKvsPlugin->pregenerateCertTimerId, (UINT64) pGstKvsPlugin);
if (STATUS_FAILED(retStatus)) {
DLOGE("Failed to cancel certificate pre-generation timer with: 0x%08x", retStatus);
}
pGstKvsPlugin->pregenerateCertTimerId = MAX_UINT32;
}
if (pGstKvsPlugin->serviceRoutineTimerId != MAX_UINT32) {
retStatus =
timerQueueCancelTimer(pGstKvsPlugin->kvsContext.timerQueueHandle, pGstKvsPlugin->serviceRoutineTimerId, (UINT64) pGstKvsPlugin);
if (STATUS_FAILED(retStatus)) {
DLOGE("Failed to cancel service handler routine timer with: 0x%08x", retStatus);
}
pGstKvsPlugin->serviceRoutineTimerId = MAX_UINT32;
}
timerQueueFree(&pGstKvsPlugin->kvsContext.timerQueueHandle);
pGstKvsPlugin->kvsContext.timerQueueHandle = INVALID_TIMER_QUEUE_HANDLE_VALUE;
}
if (pGstKvsPlugin->pregeneratedCertificates != NULL) {
stackQueueGetIterator(pGstKvsPlugin->pregeneratedCertificates, &iterator);
while (IS_VALID_ITERATOR(iterator)) {
stackQueueIteratorGetItem(iterator, &data);
stackQueueIteratorNext(&iterator);
freeRtcCertificate((PRtcCertificate) data);
}
CHK_LOG_ERR(stackQueueClear(pGstKvsPlugin->pregeneratedCertificates, FALSE));
CHK_LOG_ERR(stackQueueFree(pGstKvsPlugin->pregeneratedCertificates));
pGstKvsPlugin->pregeneratedCertificates = NULL;
}
CleanUp:
return retStatus;
}