创建相关节点:
#include <stdio.h>
#include <linux/mutex.h>
struct fifo_node
{
int some_data;
struct fifo_node *next;
};
struct fifo_queue
{
struct mutex lock;
struct fifo_node *head;
struct fifo_node *tail;
};
static fifo_queue *g_fifo_queue = NULL;
/* 插入节点 */
int fifo_enqueue(struct fifo_node *node)
{
if (!node)
{
return -1;
}
node->next = NULL;
mutex_lock(&g_fifo_queue->lock);
if (!g_fifo_queue->head)
{
/* first node */
g_fifo_queue->head = node;
g_fifo_queue->tail = node;
goto out;
}
g_fifo_queue->tail->next = node;
g_fifo_queue->tail = node;
out:
mutex_unlock(&g_fifo_queue->lock);
return 0;
}
/* 删除第一个节点 */
int fifo_dequeue(void)
{
struct fifo_node *node = NULL;
mutex_lock(&g_fifo_queue->lock);
if (!g_fifo_queue->head)
{
/* queue is null */
goto out;
}
node = g_fifo_queue->head;
g_fifo_queue->head = node->next;
if (!g_fifo_queue->head)
{
/* queue is null after delete first node */
g_fifo_queue->tail = NULL;
}
node->next = NULL;
out:
mutex_unlock(&g_fifo_queue->lock);
return 0;
}
/* 删除一个节点并返回该节点 */
struct fifo_node *fifo_getnode_and_dequeue(void)
{
struct fifo_node *node = NULL;
mutex_lock(&g_fifo_queue->lock);
if (!g_fifo_queue->head)
{
/* queue is null */
goto out;
}
node = g_fifo_queue->head;
g_fifo_queue->head = node->next;
if (!g_fifo_queue->head)
{
/* queue is null after delete first node */
g_fifo_queue->tail = NULL;
}
node->next = NULL;
out:
mutex_unlock(&g_fifo_queue->lock);
return 0;
}
/* 计算链表长度 */
int get_fifo_queue_len(void)
{
int queue_len=0;
struct fifo_node *node = NULL;
mutex_lock(&g_fifo_queue->lock);
if (!g_fifo_queue->head)
{
/* queue is null */
goto out;
}
node = g_fifo_queue->head;
while (node != NULL)
{
queue_len += 1;
node = node->next;
}
out:
mutex_unlock(&g_fifo_queue->lock);
return queue_len;
}