STATUS freeGstKvsWebRtcPlugin()

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