Mark3 Realtime Kernel
ll.cpp
Go to the documentation of this file.
1 /*===========================================================================
2  _____ _____ _____ _____
3  ___| _|__ __|_ |__ __|__ |__ __| __ |__ ______
4 | \ / | || \ || | || |/ / ||___ |
5 | \/ | || \ || \ || \ ||___ |
6 |__/\__/|__|_||__|\__\ __||__|\__\ __||__|\__\ __||______|
7  |_____| |_____| |_____| |_____|
8 
9 --[Mark3 Realtime Platform]--------------------------------------------------
10 
11 Copyright (c) 2012 - 2019 m0slevin, all rights reserved.
12 See license.txt for more information
13 ===========================================================================*/
22 #include "mark3.h"
23 
24 namespace Mark3
25 {
26 //---------------------------------------------------------------------------
28 {
29  next = nullptr;
30  prev = nullptr;
31 }
32 
33 //---------------------------------------------------------------------------
35 {
36  KERNEL_ASSERT(nullptr != node_);
37 
38  node_->prev = m_pclTail;
39  node_->next = nullptr;
40 
41  // If the list is empty, initilize the head
42  if (nullptr == m_pclHead) {
43  m_pclHead = node_;
44  }
45  // Otherwise, adjust the tail's next pointer
46  else {
47  m_pclTail->next = node_;
48  }
49 
50  // Move the tail node, and assign it to the new node just passed in
51  m_pclTail = node_;
52 }
53 
54 //---------------------------------------------------------------------------
56 {
57  KERNEL_ASSERT(nullptr != node_);
58 
59  if (nullptr != node_->prev) {
60  if (node_->prev->next != node_) {
62  }
63  node_->prev->next = node_->next;
64  }
65  if (nullptr != node_->next) {
66  if (node_->next->prev != node_) {
68  }
69  node_->next->prev = node_->prev;
70  }
71  if (node_ == m_pclHead) {
72  m_pclHead = node_->next;
73  }
74  if (node_ == m_pclTail) {
75  m_pclTail = node_->prev;
76  }
77  node_->ClearNode();
78 }
79 
80 //---------------------------------------------------------------------------
82 {
83  KERNEL_ASSERT(nullptr != node_);
84 
85  if (nullptr == m_pclHead) {
86  // If the list is empty, initilize the nodes
87  m_pclHead = node_;
88  m_pclTail = node_;
89  } else {
90  // Move the tail node, and assign it to the new node just passed in
91  m_pclTail->next = node_;
92  }
93 
94  // Add a node to the end of the linked list.
95  node_->prev = m_pclTail;
96  node_->next = m_pclHead;
97 
98  m_pclTail = node_;
99  m_pclHead->prev = node_;
100 }
101 
102 //---------------------------------------------------------------------------
104 {
105  KERNEL_ASSERT(nullptr != node_);
106 
107  // Check to see if this is the head of the list...
108  if ((node_ == m_pclHead) && (m_pclHead == m_pclTail)) {
109  // Clear the head and tail pointers - nothing else left.
110  m_pclHead = nullptr;
111  m_pclTail = nullptr;
112  return;
113  }
114 
115  // Verify that all nodes are properly connected
116  if ((node_->prev->next != node_) || (node_->next->prev != node_)) {
118  }
119 
120  // This is a circularly linked list - no need to check for connection,
121  // just remove the node.
122  node_->next->prev = node_->prev;
123  node_->prev->next = node_->next;
124 
125  if (node_ == m_pclHead) {
126  m_pclHead = m_pclHead->next;
127  }
128  if (node_ == m_pclTail) {
129  m_pclTail = m_pclTail->prev;
130  }
131  node_->ClearNode();
132 }
133 
134 //---------------------------------------------------------------------------
136 {
137  if (nullptr != m_pclHead) {
138  m_pclHead = m_pclHead->next;
139  m_pclTail = m_pclTail->next;
140  }
141 }
142 
143 //---------------------------------------------------------------------------
145 {
146  if (nullptr != m_pclHead) {
147  m_pclHead = m_pclHead->prev;
148  m_pclTail = m_pclTail->prev;
149  }
150 }
151 
152 //---------------------------------------------------------------------------
154 {
155  KERNEL_ASSERT(nullptr != node_);
156  KERNEL_ASSERT(nullptr != insert_);
157 
158  node_->next = insert_;
159  node_->prev = insert_->prev;
160 
161  if (nullptr != insert_->prev) {
162  insert_->prev->next = node_;
163  }
164  insert_->prev = node_;
165 }
166 } // namespace Mark3
#define KERNEL_ASSERT(x)
Definition: kerneldebug.h:36
#define PANIC_LIST_UNLINK_FAILED
Definition: paniccodes.h:23
Definition: atomic.cpp:23
Single include file given to users of the Mark3 Kernel API.
static void Panic(uint16_t u16Cause_)
Panic Cause the kernel to enter its panic state.
Definition: kernel.cpp:70