root/sys/dev/qat/qat_api/common/ctrl/sal_list.c
/* SPDX-License-Identifier: BSD-3-Clause */
/* Copyright(c) 2007-2022 Intel Corporation */
/**
 *****************************************************************************
 * @file sal_list.c
 *
 * @ingroup SalCtrl
 *
 * List implementations for SAL
 *
 *****************************************************************************/

#include "lac_mem.h"
#include "lac_list.h"

CpaStatus
SalList_add(sal_list_t **list, sal_list_t **tail, void *pObj)
{
        sal_list_t *new_element = NULL;

        if (NULL == *list) {
                /* First element in list */
                *list = malloc(sizeof(sal_list_t), M_QAT, M_WAITOK);
                (*list)->next = NULL;
                (*list)->pObj = pObj;
                *tail = *list;
        } else {
                /* add to tail of the list */
                new_element = malloc(sizeof(sal_list_t), M_QAT, M_WAITOK);
                new_element->pObj = pObj;
                new_element->next = NULL;

                (*tail)->next = new_element;

                *tail = new_element;
        }

        return CPA_STATUS_SUCCESS;
}

void *
SalList_getObject(sal_list_t *list)
{
        if (list == NULL) {
                return NULL;
        }

        return list->pObj;
}

void
SalList_delObject(sal_list_t **list)
{
        if (*list == NULL) {
                return;
        }

        (*list)->pObj = NULL;
        return;
}

void *
SalList_next(sal_list_t *list)
{
        return list->next;
}

void
SalList_free(sal_list_t **list)
{
        sal_list_t *next_element = NULL;
        void *pObj = NULL;
        while (NULL != (*list)) {
                next_element = SalList_next(*list);
                pObj = SalList_getObject((*list));
                LAC_OS_FREE(pObj);
                LAC_OS_FREE(*list);
                *list = next_element;
        }
}

void
SalList_del(sal_list_t **head_list, sal_list_t **pre_list, sal_list_t *list)
{
        void *pObj = NULL;
        if ((NULL == *head_list) || (NULL == *pre_list) || (NULL == list)) {
                return;
        }
        if (*head_list == list) { /* delete the first node in list */
                *head_list = list->next;
        } else {
                (*pre_list)->next = list->next;
        }
        pObj = SalList_getObject(list);
        LAC_OS_FREE(pObj);
        LAC_OS_FREE(list);
        return;
}