xref: /freebsd/sys/dev/qat/qat_api/common/ctrl/sal_list.c (revision 38a52bd3)
1 /* SPDX-License-Identifier: BSD-3-Clause */
2 /* Copyright(c) 2007-2022 Intel Corporation */
3 /* $FreeBSD$ */
4 /**
5  *****************************************************************************
6  * @file sal_list.c
7  *
8  * @ingroup SalCtrl
9  *
10  * List implementations for SAL
11  *
12  *****************************************************************************/
13 
14 #include "lac_mem.h"
15 #include "lac_list.h"
16 
17 CpaStatus
18 SalList_add(sal_list_t **list, sal_list_t **tail, void *pObj)
19 {
20 	sal_list_t *new_element = NULL;
21 
22 	if (NULL == *list) {
23 		/* First element in list */
24 		*list = malloc(sizeof(sal_list_t), M_QAT, M_WAITOK);
25 		(*list)->next = NULL;
26 		(*list)->pObj = pObj;
27 		*tail = *list;
28 	} else {
29 		/* add to tail of the list */
30 		new_element = malloc(sizeof(sal_list_t), M_QAT, M_WAITOK);
31 		new_element->pObj = pObj;
32 		new_element->next = NULL;
33 
34 		(*tail)->next = new_element;
35 
36 		*tail = new_element;
37 	}
38 
39 	return CPA_STATUS_SUCCESS;
40 }
41 
42 void *
43 SalList_getObject(sal_list_t *list)
44 {
45 	if (list == NULL) {
46 		return NULL;
47 	}
48 
49 	return list->pObj;
50 }
51 
52 void
53 SalList_delObject(sal_list_t **list)
54 {
55 	if (*list == NULL) {
56 		return;
57 	}
58 
59 	(*list)->pObj = NULL;
60 	return;
61 }
62 
63 void *
64 SalList_next(sal_list_t *list)
65 {
66 	return list->next;
67 }
68 
69 void
70 SalList_free(sal_list_t **list)
71 {
72 	sal_list_t *next_element = NULL;
73 	void *pObj = NULL;
74 	while (NULL != (*list)) {
75 		next_element = SalList_next(*list);
76 		pObj = SalList_getObject((*list));
77 		LAC_OS_FREE(pObj);
78 		LAC_OS_FREE(*list);
79 		*list = next_element;
80 	}
81 }
82 
83 void
84 SalList_del(sal_list_t **head_list, sal_list_t **pre_list, sal_list_t *list)
85 {
86 	void *pObj = NULL;
87 	if ((NULL == *head_list) || (NULL == *pre_list) || (NULL == list)) {
88 		return;
89 	}
90 	if (*head_list == list) { /* delete the first node in list */
91 		*head_list = list->next;
92 	} else {
93 		(*pre_list)->next = list->next;
94 	}
95 	pObj = SalList_getObject(list);
96 	LAC_OS_FREE(pObj);
97 	LAC_OS_FREE(list);
98 	return;
99 }
100