📄 queue.c
字号:
/* * OpenMODBUS/TCP to RS-232/485 MODBUS RTU gateway * * queue.c - 觨nnections queue management procedures * * Copyright (c) 2002-2003, Victor Antonovich (avmlink@vlink.ru) * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * $Id: queue.c,v 1.1.1.1 2003/09/13 20:38:39 kapyar Exp $ */#include "queue.h"/* * Queue structure initialization */voidqueue_init(queue_t *queue){ queue->beg = NULL; queue->end = NULL; queue->len = 0;}/* * Add new element to queue */conn_t *queue_new_elem(queue_t *queue){ conn_t *newconn = (conn_t *)malloc(sizeof(conn_t)); if (!newconn) { /* Aborting program execution */#ifdef LOG log(0, "queue_new_elem(): out of memory for new element (%s)", strerror(errno));#endif exit(errno); } newconn->next = NULL; if ((newconn->prev = queue->end) != NULL) queue->end->next = newconn; else /* we add first element */ queue->beg = newconn; queue->end = newconn; queue->len++;#ifdef DEBUG log(5, "queue_new_elem(): length now is %d", queue->len);#endif return newconn;}/* * Remove element from queue */voidqueue_delete_elem(queue_t *queue, conn_t *conn){ if (queue->len <= 0) { /* queue is empty */#ifdef LOG log(1, "queue_delete_elem(): queue empty!");#endif return; } if (conn->prev == NULL) { /* deleting first element */ if ((queue->beg = queue->beg->next) != NULL) queue->beg->prev = NULL; } else conn->prev->next = conn->next; if (conn->next == NULL) { /* deleting last element */ if ((queue->end = queue->end->prev) != NULL) queue->end->next = NULL; } else conn->next->prev = conn->prev; queue->len--; free((void *)conn);#ifdef DEBUG log(5, "queue_delete_elem(): length now is %d", queue->len);#endif return;}/* * Obtain pointer to next element in the QUEUE (with wrapping) * Parameters: CONN - pointer to current queue element * Return: pointer to next queue element */conn_t *queue_next_elem(queue_t *queue, conn_t *conn){ return (conn->next == NULL) ? queue->beg : conn->next;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -