📄 que.h
字号:
/*
* Copyright 2003 by Texas Instruments Incorporated.
* All rights reserved. Property of Texas Instruments Incorporated.
* Restricted rights to use, duplicate or disclose this code are
* granted through contract.
*
*/
/* "@(#) DSP/BIOS 4.90.270 12-18-03 (barracuda-o04)" */
/*
* ======== que.h ========
*
*/
#ifndef QUE_
#define QUE_
#include <fxn.h>
#include <mem.h>
/*
*
*
* QUEUEs
* ======
*
* Queues are doubly linked with dummy node to eliminate special
* cases for speed.
* _______ _______ _______ _______
* ,----->|_______|----->|_______|----->|_______|--->|_______|--//---,
* | ,----|_______|<-----|_______|<-----|_______|<---|_______|<-//-, |
* | | prev queue elem next | |
* | |_____________________________________________________________| |
* |_________________________________________________________________|
*
*/
#ifdef __cplusplus
extern "C" {
#endif
typedef struct QUE_Elem {
struct QUE_Elem *next;
struct QUE_Elem *prev;
} QUE_Elem, *QUE_Handle;
typedef struct QUE_Elem QUE_Obj;
typedef struct QUE_Attrs {
Int dummy;
} QUE_Attrs;
extern QUE_Attrs QUE_ATTRS;
/*
* ======== QUE_create ========
*/
extern QUE_Handle QUE_create(QUE_Attrs *attrs);
/*
* ======== QUE_delete ========
*/
#define QUE_delete(queue) MEM_free(0, (queue), sizeof(QUE_Obj))
/*
* ======== QUE_dequeue ========
*
* get elem from front of "queue".
* This operation is *NOT* atomic. External synchronization must
* be used to protect this queue from simultaneous access by interrupts
* or other tasks.
*
* _______ _______ _______ _______
* Before: |_______|----->|_______|----->|_______|--->|_______|--->
* |_______|<-----|_______|<-----|_______|<---|_______|<---
* prev queue elem next
*
*
* _______ _______ _______
* After: |_______|----->|___*___|----->|_______|--->
* |_______|<-----|_______|<-----|___*___|<---
* prev queue next
* _______
* elem -->|___x___| * = modified
* |___x___| x = undefined
*
*/
#if defined(_2100_) || !defined(_INLINE)
#define QUE_dequeue QUE_get
#else
static __inline Ptr QUE_dequeue(QUE_Handle queue)
{
QUE_Elem *elem = queue->next;
QUE_Elem *next = elem->next;
queue->next = next;
next->prev = queue;
return (elem);
}
#endif
/*
* ======== QUE_empty ========
*/
#define QUE_empty(queue) ((queue)->next == (queue))
/*
* ======== QUE_enqueue ========
*
* put "elem" at end of "queue".
* This operation is *NOT* atomic. External synchronization must
* be used to protect this queue from simultaneous access by interrupts
* or other tasks.
*
* _______ _______ _______
* Before: |_______|----->|_______|----->|_______|--->
* |_______|<-----|_______|<-----|_______|<---
* prev queue next
* _______
* elem -->|___x___| * = modified
* |___x___| x = undefined
*
* _______ _______ _______ _______
* After: |___*___|----->|___*___|----->|_______|--->|_______|--->
* |_______|<-----|___*___|<-----|___*___|<---|_______|<---
* prev elem queue next
*
*/
#if defined(_2100_) || !defined(_INLINE)
#define QUE_enqueue QUE_put
#else
static __inline Void QUE_enqueue(QUE_Handle queue, Ptr elem)
{
QUE_Elem *prev = queue->prev;
((QUE_Elem *)elem)->next = queue;
((QUE_Elem *)elem)->prev = prev;
prev->next = (QUE_Elem *)elem;
queue->prev = (QUE_Elem *)elem;
}
#endif
/*
* ======== QUE_get ========
* disable interrupts and returns the first element in the queue.
*/
extern Ptr QUE_get(QUE_Handle queue);
/*
* ======== QUE_head ========
*/
#define QUE_head(queue) ((Ptr)((queue)->next))
/*
* ======== QUE_init ========
*/
#define QUE_init FXN_F_nop
/*
* ======== QUE_insert ========
*/
#define QUE_insert(qElem, elem) QUE_enqueue((QUE_Handle)qElem, elem)
/*
* ======== QUE_new ========
*/
#if defined(_51_)
#define QUE_new(elem) (elem)->next = (elem); (elem)->prev = (elem)
#else
#define QUE_new(elem) (elem)->next = (elem)->prev = (elem)
#endif
/*
* ======== QUE_next ========
*/
#define QUE_next(elem) ((Ptr)((QUE_Elem *)(elem))->next)
/*
* ======== QUE_prev ========
*/
#define QUE_prev(elem) ((Ptr)((QUE_Elem *)(elem))->prev)
/*
* ======== QUE_print ========
*/
extern Void QUE_print(QUE_Handle queue);
/*
* ======== QUE_put ========
* Disable interrupts and put "elem" at end of "queue".
*/
extern Void QUE_put(QUE_Handle queue, Ptr elem);
/*
* ======== QUE_remove ========
*/
#define QUE_remove(elem) {\
((QUE_Elem *)elem)->prev->next = ((QUE_Elem *)elem)->next; \
((QUE_Elem *)elem)->next->prev = ((QUE_Elem *)elem)->prev; \
}
#ifdef __cplusplus
}
#endif /* extern "C" */
#endif /* QUE_*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -