Free (GPLv2) TCP/IP stack developed by TASS Belgium
Fork of PicoTCP by
include/pico_queue.h@1:cfe8984a32b4, 2013-05-17 (annotated)
- 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?
User | Revision | Line number | New 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 |