Free (GPLv2) TCP/IP stack developed by TASS Belgium

Fork of PicoTCP by Daniele Lacamera

Committer:
tass
Date:
Fri May 17 12:09:59 2013 +0000
Revision:
1:cfe8984a32b4
Parent:
libraries/picotcp/include/pico_queue.h@0:d7f2341ab245
Update for smaller SOCKETQ

Who changed what in which revision?

UserRevisionLine numberNew contents of line
daniele 0:d7f2341ab245 1 /*********************************************************************
daniele 0:d7f2341ab245 2 PicoTCP. Copyright (c) 2012 TASS Belgium NV. Some rights reserved.
daniele 0:d7f2341ab245 3 See LICENSE and COPYING for usage.
daniele 0:d7f2341ab245 4
daniele 0:d7f2341ab245 5 *********************************************************************/
daniele 0:d7f2341ab245 6 #ifndef _INCLUDE_PICO_QUEUE
daniele 0:d7f2341ab245 7 #define _INCLUDE_PICO_QUEUE
daniele 0:d7f2341ab245 8 #include <stdint.h>
daniele 0:d7f2341ab245 9 #include "pico_config.h"
daniele 0:d7f2341ab245 10 #include "pico_frame.h"
daniele 0:d7f2341ab245 11
daniele 0:d7f2341ab245 12 #ifndef NULL
daniele 0:d7f2341ab245 13 #define NULL ((void *)0)
daniele 0:d7f2341ab245 14 #endif
daniele 0:d7f2341ab245 15
daniele 0:d7f2341ab245 16 struct pico_queue {
daniele 0:d7f2341ab245 17 uint32_t frames;
daniele 0:d7f2341ab245 18 uint32_t size;
daniele 0:d7f2341ab245 19 uint32_t max_frames;
daniele 0:d7f2341ab245 20 uint32_t max_size;
daniele 0:d7f2341ab245 21 struct pico_frame *head;
daniele 0:d7f2341ab245 22 struct pico_frame *tail;
daniele 0:d7f2341ab245 23 #ifdef PICO_RTOS_SUPPORT
daniele 0:d7f2341ab245 24 void * mutex;
daniele 0:d7f2341ab245 25 #endif
daniele 0:d7f2341ab245 26 };
daniele 0:d7f2341ab245 27
daniele 0:d7f2341ab245 28 #ifdef PICO_RTOS_SUPPORT
daniele 0:d7f2341ab245 29 extern void waitAndTakeMutex(void ** mutex);
daniele 0:d7f2341ab245 30 extern void giveMutexBack(void * mutex);
daniele 0:d7f2341ab245 31 #endif
daniele 0:d7f2341ab245 32
daniele 0:d7f2341ab245 33 #ifdef PICO_SUPPORT_DEBUG_TOOLS
daniele 0:d7f2341ab245 34 static void debug_q(struct pico_queue *q)
daniele 0:d7f2341ab245 35 {
daniele 0:d7f2341ab245 36 struct pico_frame *p = q->head;
daniele 0:d7f2341ab245 37 dbg("%d: ", q->frames);
daniele 0:d7f2341ab245 38 while(p) {
daniele 0:d7f2341ab245 39 dbg("(%p)-->", p);
daniele 0:d7f2341ab245 40 p = p->next;
daniele 0:d7f2341ab245 41 }
daniele 0:d7f2341ab245 42 dbg("X\n");
daniele 0:d7f2341ab245 43 }
daniele 0:d7f2341ab245 44 #endif
daniele 0:d7f2341ab245 45
daniele 0:d7f2341ab245 46 static inline int pico_enqueue(struct pico_queue *q, struct pico_frame *p)
daniele 0:d7f2341ab245 47 {
daniele 0:d7f2341ab245 48 if ((q->max_frames) && (q->max_frames <= q->frames))
daniele 0:d7f2341ab245 49 return -1;
daniele 0:d7f2341ab245 50
daniele 0:d7f2341ab245 51 if ((q->max_size) && (q->max_size < (p->buffer_len + q->size)))
daniele 0:d7f2341ab245 52 return -1;
daniele 0:d7f2341ab245 53
daniele 0:d7f2341ab245 54 #ifdef PICO_RTOS_SUPPORT
daniele 0:d7f2341ab245 55 waitAndTakeMutex(&q->mutex);
daniele 0:d7f2341ab245 56 #endif
daniele 0:d7f2341ab245 57
daniele 0:d7f2341ab245 58 p->next = NULL;
daniele 0:d7f2341ab245 59 if (!q->head) {
daniele 0:d7f2341ab245 60 q->head = p;
daniele 0:d7f2341ab245 61 q->tail = p;
daniele 0:d7f2341ab245 62 q->size = 0;
daniele 0:d7f2341ab245 63 q->frames = 0;
daniele 0:d7f2341ab245 64 } else {
daniele 0:d7f2341ab245 65 q->tail->next = p;
daniele 0:d7f2341ab245 66 q->tail = p;
daniele 0:d7f2341ab245 67 }
daniele 0:d7f2341ab245 68 q->size += p->buffer_len;
daniele 0:d7f2341ab245 69 q->frames++;
daniele 0:d7f2341ab245 70 #ifdef PICO_SUPPORT_DEBUG_TOOLS
daniele 0:d7f2341ab245 71 debug_q(q);
daniele 0:d7f2341ab245 72 #endif
daniele 0:d7f2341ab245 73
daniele 0:d7f2341ab245 74 #ifdef PICO_RTOS_SUPPORT
daniele 0:d7f2341ab245 75 giveMutexBack(q->mutex);
daniele 0:d7f2341ab245 76 #endif
daniele 0:d7f2341ab245 77
daniele 0:d7f2341ab245 78 return q->size;
daniele 0:d7f2341ab245 79 }
daniele 0:d7f2341ab245 80
daniele 0:d7f2341ab245 81 static inline struct pico_frame *pico_dequeue(struct pico_queue *q)
daniele 0:d7f2341ab245 82 {
daniele 0:d7f2341ab245 83 struct pico_frame *p = q->head;
daniele 0:d7f2341ab245 84 if (q->frames < 1)
daniele 0:d7f2341ab245 85 return NULL;
daniele 0:d7f2341ab245 86 #ifdef PICO_RTOS_SUPPORT
daniele 0:d7f2341ab245 87 waitAndTakeMutex(&q->mutex);
daniele 0:d7f2341ab245 88 #endif
daniele 0:d7f2341ab245 89
daniele 0:d7f2341ab245 90 q->head = p->next;
daniele 0:d7f2341ab245 91 q->frames--;
daniele 0:d7f2341ab245 92 q->size -= p->buffer_len;
daniele 0:d7f2341ab245 93 if (q->head == NULL)
daniele 0:d7f2341ab245 94 q->tail = NULL;
daniele 0:d7f2341ab245 95 #ifdef PICO_SUPPORT_DEBUG_TOOLS
daniele 0:d7f2341ab245 96 debug_q(q);
daniele 0:d7f2341ab245 97 #endif
daniele 0:d7f2341ab245 98 p->next = NULL;
daniele 0:d7f2341ab245 99
daniele 0:d7f2341ab245 100 #ifdef PICO_RTOS_SUPPORT
daniele 0:d7f2341ab245 101 giveMutexBack(q->mutex);
daniele 0:d7f2341ab245 102 #endif
daniele 0:d7f2341ab245 103
daniele 0:d7f2341ab245 104 return p;
daniele 0:d7f2341ab245 105 }
daniele 0:d7f2341ab245 106
daniele 0:d7f2341ab245 107 static inline struct pico_frame *pico_queue_peek(struct pico_queue *q)
daniele 0:d7f2341ab245 108 {
daniele 0:d7f2341ab245 109 struct pico_frame *p = q->head;
daniele 0:d7f2341ab245 110 if (q->frames < 1)
daniele 0:d7f2341ab245 111 return NULL;
daniele 0:d7f2341ab245 112 #ifdef PICO_SUPPORT_DEBUG_TOOLS
daniele 0:d7f2341ab245 113 debug_q(q);
daniele 0:d7f2341ab245 114 #endif
daniele 0:d7f2341ab245 115 return p;
daniele 0:d7f2341ab245 116 }
daniele 0:d7f2341ab245 117
daniele 0:d7f2341ab245 118 static inline void pico_queue_empty(struct pico_queue *q)
daniele 0:d7f2341ab245 119 {
daniele 0:d7f2341ab245 120 struct pico_frame *p = pico_dequeue(q);
daniele 0:d7f2341ab245 121 while(p) {
daniele 0:d7f2341ab245 122 pico_free(p);
daniele 0:d7f2341ab245 123 p = pico_dequeue(q);
daniele 0:d7f2341ab245 124 }
daniele 0:d7f2341ab245 125 }
daniele 0:d7f2341ab245 126
daniele 0:d7f2341ab245 127 #endif