1 /*
2 * Copyright (c) 2014, Mentor Graphics Corporation
3 * Copyright 2019 NXP
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions are met:
8 *
9 * 1. Redistributions of source code must retain the above copyright notice,
10 * this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright notice,
12 * this list of conditions and the following disclaimer in the documentation
13 * and/or other materials provided with the distribution.
14 * 3. Neither the name of Mentor Graphics Corporation nor the names of its
15 * contributors may be used to endorse or promote products derived from this
16 * software without specific prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
22 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28 * POSSIBILITY OF SUCH DAMAGE.
29 */
30
31 /**************************************************************************
32 * FILE NAME
33 *
34 * llist.c
35 *
36 * COMPONENT
37 *
38 * OpenAMP stack.
39 *
40 * DESCRIPTION
41 *
42 * Source file for basic linked list service.
43 *
44 **************************************************************************/
45 #include "llist.h"
46
47 #define LIST_NULL ((void *)0)
48 /*!
49 * add_to_list
50 *
51 * Places new element at the start of the list.
52 *
53 * @param head - list head
54 * @param node - new element to add
55 *
56 */
add_to_list(struct llist ** head,struct llist * node)57 void add_to_list(struct llist **head, struct llist *node)
58 {
59 if (node == LIST_NULL)
60 {
61 return; /* coco validated: line never reached, add_to_list() is called from rpmsg_lite_create_ept() only and the
62 node parameter not being null check is done before passing the parameter */
63 }
64
65 if (*head != LIST_NULL)
66 {
67 /* Place the new element at the start of list. */
68 node->next = *head;
69 node->prev = LIST_NULL;
70 (*head)->prev = node;
71 *head = node;
72 }
73 else
74 {
75 /* List is empty - assign new element to list head. */
76 *head = node;
77 (*head)->next = LIST_NULL;
78 (*head)->prev = LIST_NULL;
79 }
80 }
81
82 /*!
83 * remove_from_list
84 *
85 * Removes the given element from the list.
86 *
87 * @param head - list head
88 * @param element - element to remove from list
89 *
90 */
remove_from_list(struct llist ** head,struct llist * node)91 void remove_from_list(struct llist **head, struct llist *node)
92 {
93 if ((*head == LIST_NULL) || (node == LIST_NULL))
94 {
95 return; /* coco validated: line never reached, remove_from_list() is called from rpmsg_lite_destroy_ept() only,
96 the head and node parameters not being null check is done before passing these parameters */
97 }
98
99 if (node == *head)
100 {
101 /* First element has to be removed. */
102 *head = (*head)->next;
103 }
104 else if (node->next == LIST_NULL)
105 {
106 /* Last element has to be removed. */
107 node->prev->next = node->next;
108 }
109 else
110 {
111 /* Intermediate element has to be removed. */
112 node->prev->next = node->next;
113 node->next->prev = node->prev;
114 }
115 }
116