www.pudn.com > r&s1.10°æ±¾£«Îĵµ.rar > queue.h
/*
===============================================================================
| Copyright (C) 2004 RuanHaiShen, All rights reserved.
| SUMMARY:
| Internal common queue interfaces.
|
| DESCRIPTION:
| See http://www.01s.org for documentation, latest information, license
| and contact details.
| email:ruanhaishen@01s.org
=============================================================================*/
#ifndef __QUEUE_H__
#define __QUEUE_H__
/*===========================================================================*/
#define __CLR_QB(prio, q) \
if( (prio) < ARCH_CPU_BITS ) \
{ q &= ~( 1 << (prio) ); goto __clr_done; }
#define __CLR_Q(prio, q, a) \
if( (prio) < ( a + 1) * ARCH_CPU_BITS ) \
{ q &= ~( 1 << ( (prio) - a * ARCH_CPU_BITS ) ); goto __clr_done; }
#define __CLR_QE(prio, q, a) \
q &= ~( 1 << ( (prio) - a * ARCH_CPU_BITS ) )
#define __SET_QB(prio, q) \
if( (prio) < ARCH_CPU_BITS ) \
{ q |= ( 1 << (prio) ); goto __set_done; }
#define __SET_Q(prio, q, a) \
if( (prio) < ( a + 1) * ARCH_CPU_BITS ) \
{ q |= ( 1 << ( (prio) - a * ARCH_CPU_BITS ) ); goto __set_done; }
#define __SET_QE(prio, q, a) \
q |= ( 1 << ( (prio) - a * ARCH_CPU_BITS ) )
/*------------------------------------------*/
#define __GET_Q_8BIT(next, q) \
next = _task_map[q]
#define __GET_Q_POS0(next, q) \
next = _task_map[q & 0xff]
#define __GET_Q_POS(next, q, offset) \
next = _task_map[(q>>offset) & 0xff]
#define __G_ADJUST(next, a, offset) \
next += a * ARCH_CPU_BITS + offset
#define __G_IFGO0(next) \
if(next != 0xff){ goto __get_done;}
#define __G_IFGO(next, a, offset) \
if(next != 0xff){ __G_ADJUST(next,a,offset); goto __get_done;}
/*------------------------------------------*/
#if ARCH_CPU_BITS == 64
#define __GET_QB(next, q) \
__GET_Q_POS0(next, q); __G_IFGO0(next) \
__GET_Q_POS(next, q, 8); __G_IFGO(next,0, 8) \
__GET_Q_POS(next, q, 16);__G_IFGO(next,0,16) \
__GET_Q_POS(next, q, 24);__G_IFGO(next,0,24) \
__GET_Q_POS(next, q, 32);__G_IFGO(next,0,32) \
__GET_Q_POS(next, q, 40);__G_IFGO(next,0,40) \
__GET_Q_POS(next, q, 48);__G_IFGO(next,0,48) \
__GET_Q_POS(next, q, 56);__G_IFGO(next,0,56)
#define __GET_Q(next, q, a) \
__GET_Q_POS0(next, q); __G_IFGO(next,a, 0) \
__GET_Q_POS(next, q, 8); __G_IFGO(next,a, 8) \
__GET_Q_POS(next, q, 16);__G_IFGO(next,a,16) \
__GET_Q_POS(next, q, 24);__G_IFGO(next,a,24) \
__GET_Q_POS(next, q, 32);__G_IFGO(next,a,32) \
__GET_Q_POS(next, q, 40);__G_IFGO(next,a,40) \
__GET_Q_POS(next, q, 48);__G_IFGO(next,a,48) \
__GET_Q_POS(next, q, 56);__G_IFGO(next,a,56)
#define __GET_QE(next, q, a) \
__GET_Q_POS0(next, q); __G_IFGO(next,a, 0) \
__GET_Q_POS(next, q, 8); __G_IFGO(next,a, 8) \
__GET_Q_POS(next, q, 16);__G_IFGO(next,a,16) \
__GET_Q_POS(next, q, 24);__G_IFGO(next,a,24) \
__GET_Q_POS(next, q, 32);__G_IFGO(next,a,32) \
__GET_Q_POS(next, q, 40);__G_IFGO(next,a,40) \
__GET_Q_POS(next, q, 48);__G_IFGO(next,a,48) \
__GET_Q_POS(next, q, 56);__G_ADJUST(next,a,56)
#define __GET_QBE(next, q) \
__GET_Q_POS0(next, q); __G_IFGO0(next) \
__GET_Q_POS(next, q, 8); __G_IFGO(next,0, 8) \
__GET_Q_POS(next, q, 16);__G_IFGO(next,0,16) \
__GET_Q_POS(next, q, 24);__G_IFGO(next,0,24) \
__GET_Q_POS(next, q, 32);__G_IFGO(next,0,32) \
__GET_Q_POS(next, q, 40);__G_IFGO(next,0,40) \
__GET_Q_POS(next, q, 48);__G_IFGO(next,0,48) \
__GET_Q_POS(next, q, 56);__G_ADJUST(next,0,56)
#elif ARCH_CPU_BITS == 32
#define __GET_QB(next, q) \
__GET_Q_POS0(next, q); __G_IFGO0(next) \
__GET_Q_POS(next, q, 8); __G_IFGO(next,0, 8) \
__GET_Q_POS(next, q, 16);__G_IFGO(next,0,16) \
__GET_Q_POS(next, q, 24);__G_IFGO(next,0,24)
#define __GET_Q(next, q, a) \
__GET_Q_POS0(next, q); __G_IFGO(next,a, 0) \
__GET_Q_POS(next, q, 8); __G_IFGO(next,a, 8) \
__GET_Q_POS(next, q, 16);__G_IFGO(next,a,16) \
__GET_Q_POS(next, q, 24);__G_IFGO(next,a,24)
#define __GET_QE(next, q, a) \
__GET_Q_POS0(next, q); __G_IFGO(next,a, 0) \
__GET_Q_POS(next, q, 8); __G_IFGO(next,a, 8) \
__GET_Q_POS(next, q, 16);__G_IFGO(next,a,16) \
__GET_Q_POS(next, q, 24);__G_ADJUST(next,a,24)
#define __GET_QBE(next, q) \
__GET_Q_POS0(next, q); __G_IFGO0(next) \
__GET_Q_POS(next, q, 8); __G_IFGO(next,0, 8) \
__GET_Q_POS(next, q, 16);__G_IFGO(next,0,16) \
__GET_Q_POS(next, q, 24);__G_ADJUST(next,0,24)
#elif ARCH_CPU_BITS == 16
#define __GET_QB(next, q) \
__GET_Q_POS0(next, q); __G_IFGO0(next) \
__GET_Q_POS(next, q, 8);__G_IFGO(next,0, 8)
#define __GET_Q(next, q, a) \
__GET_Q_POS0(next, q); __G_IFGO(next,a, 0) \
__GET_Q_POS(next, q, 8);__G_IFGO(next,a, 8)
#define __GET_QE(next, q, a) \
__GET_Q_POS0(next, q); __G_IFGO(next,a, 0) \
__GET_Q_POS(next, q, 8);__G_ADJUST(next,a, 8)
#define __GET_QBE(next, q) \
__GET_Q_POS0(next, q); __G_IFGO0(next) \
__GET_Q_POS(next, q, 8);__G_ADJUST(next,0, 8)
#elif ARCH_CPU_BITS == 8
#define __GET_QB(next, q) \
__GET_Q_8BIT(next, q); __G_IFGO0(next)
#define __GET_Q(next, q, a) \
__GET_Q_8BIT(next, q); __G_IFGO(next,a, 0)
#define __GET_QE(next, q, a) \
__GET_Q_8BIT(next, q); __G_ADJUST(next,a, 0)
#define __GET_QBE(next, q) \
__GET_Q_8BIT(next, q)
#endif
/*------------------------------------------*/
#if TASK_QUE_SIZE == 1
#define __CLR_ALL(Q) Q = 0
#else
#define __CLR_ALL(Q) \
do { \
register uint iii; \
for(iii = 0; iii < TASK_QUE_SIZE; iii++) \
Q[iii] = 0; \
} while (0)
#endif
/*------------------------------------------*/
#define __NQB(a) (__q[a] != Q[a])
#if TASK_QUE_SIZE == 1
#define __IF1(Q) (Q)
#define __CLR(prio, Q) Q &= ~(1<<(prio))
#define __SET(prio, Q) Q |= (1<<(prio))
#define __GET(next, Q) __GET_QBE(next, Q)
#define __SAVEQ(Q) uint __q = Q
#define __NQ(Q) __q != Q
#elif TASK_QUE_SIZE == 2
#define __IF1(Q) (Q[0]|Q[1])
#define __CLR(prio, Q) \
__CLR_QB(prio, Q[0]) \
__CLR_QE(prio, Q[1],1)
#define __SET(prio, Q) \
__SET_QB(prio, Q[0]) \
__SET_QE(prio, Q[1],1)
#define __GET(next, Q) \
__GET_QB(next, Q[0]) \
__GET_QE(next, Q[1],1)
#define __SAVEQ(Q) \
uint __q[2]; \
__q[0] = Q[0]; \
__q[1] = Q[1]
#define __NQ(Q) \
__q[0] != Q[0] || \
__q[1] != Q[1]
#elif TASK_QUE_SIZE == 3
#define __IF1(Q) (Q[0]|Q[1]|Q[2])
#define __CLR(prio, Q) \
__CLR_QB(prio, Q[0]) \
__CLR_Q (prio, Q[1],1) \
__CLR_QE(prio,Q[2],2)
#define __SET(prio, Q) \
__SET_QB(prio, Q[0]) \
__SET_Q (prio, Q[1],1) \
__SET_QE(prio, Q[2],2)
#define __GET(next, Q) \
__GET_QB(next, Q[0]) \
__GET_Q (next, Q[1],1) \
__GET_QE(next, Q[2],2)
#define __SAVEQ(Q) \
uint __q[3]; \
__q[0] = Q[0]; \
__q[1] = Q[1]; \
__q[2] = Q[2]
#define __NQ(Q) \
__q[0] != Q[0] || \
__q[1] != Q[1] || \
__q[2] != Q[2]
#elif TASK_QUE_SIZE == 4
#define __IF1(Q) (Q[0]|Q[1]|Q[2]|Q[3])
#define __CLR(prio, Q) \
__CLR_QB(prio, Q[0]) \
__CLR_Q (prio, Q[1],1) \
__CLR_Q (prio, Q[2],2) \
__CLR_QE(prio,Q[3],3)
#define __SET(prio, Q) \
__SET_QB(prio, Q[0]) \
__SET_Q (prio, Q[1],1) \
__SET_Q (prio, Q[2],2) \
__SET_QE(prio, Q[3],3)
#define __GET(next, Q) \
__GET_QB(next, Q[0]) \
__GET_Q (next, Q[1],1) \
__GET_Q (next, Q[2],2) \
__GET_QE(next, Q[3],3)
#define __SAVEQ(Q) \
uint __q[4]; \
__q[0] = Q[0]; \
__q[1] = Q[1]; \
__q[2] = Q[2]; \
__q[3] = Q[3]
#define __NQ(Q) \
__q[0] != Q[0] || \
__q[1] != Q[1] || \
__q[2] != Q[2] || \
__q[3] != Q[3]
#elif TASK_QUE_SIZE == 5
#define __IF1(Q) (Q[0]|Q[1]|Q[2]|Q[3]|Q[4])
#define __CLR(prio, Q) \
__CLR_QB(prio, Q[0]) \
__CLR_Q (prio, Q[1],1) \
__CLR_Q (prio, Q[2],2) \
__CLR_Q (prio, Q[3],3) \
__CLR_QE(prio,Q[4],4)
#define __SET(prio, Q) \
__SET_QB(prio, Q[0]) \
__SET_Q (prio, Q[1],1) \
__SET_Q (prio, Q[2],2) \
__SET_Q (prio, Q[3],3) \
__SET_QE(prio, Q[4],4)
#define __GET(next, Q) \
__GET_QB(next, Q[0]) \
__GET_Q (next, Q[1],1) \
__GET_Q (next, Q[2],2) \
__GET_Q (next, Q[3],3) \
__GET_QE(next, Q[4],4)
#define __SAVEQ(Q) \
uint __q[5]; \
__q[0] = Q[0]; \
__q[1] = Q[1]; \
__q[2] = Q[2]; \
__q[3] = Q[3]; \
__q[4] = Q[4]
#define __NQ(Q) \
__q[0] != Q[0] || \
__q[1] != Q[1] || \
__q[2] != Q[2] || \
__q[3] != Q[3] || \
__q[4] != Q[4]
#elif TASK_QUE_SIZE == 6
#define __IF1(Q) (Q[0]|Q[1]|Q[2]|Q[3]|Q[4]|Q[5])
#define __CLR(prio, Q) \
__CLR_QB(prio, Q[0]) \
__CLR_Q (prio, Q[1],1) \
__CLR_Q (prio, Q[2],2) \
__CLR_Q (prio, Q[3],3) \
__CLR_Q (prio, Q[4],4) \
__CLR_QE(prio,Q[5],5)
#define __SET(prio, Q) \
__SET_QB(prio, Q[0]) \
__SET_Q (prio, Q[1],1) \
__SET_Q (prio, Q[2],2) \
__SET_Q (prio, Q[3],3) \
__SET_Q (prio, Q[4],4) \
__SET_QE(prio, Q[5],5)
#define __GET(next, Q) \
__GET_QB(next, Q[0]) \
__GET_Q (next, Q[1],1) \
__GET_Q (next, Q[2],2) \
__GET_Q (next, Q[3],3) \
__GET_Q (next, Q[4],4) \
__GET_QE(next, Q[5],5)
#define __SAVEQ(Q) \
uint __q[6]; \
__q[0] = Q[0]; \
__q[1] = Q[1]; \
__q[2] = Q[2]; \
__q[3] = Q[3]; \
__q[4] = Q[4]; \
__q[5] = Q[5]
#define __NQ(Q) \
__q[0] != Q[0] || \
__q[1] != Q[1] || \
__q[2] != Q[2] || \
__q[3] != Q[3] || \
__q[4] != Q[4] || \
__q[5] != Q[5]
#elif TASK_QUE_SIZE == 7
#define __IF1(Q) (Q[0]|Q[1]|Q[2]|Q[3]|Q[4]|Q[5]|Q[6])
#define __CLR(prio, Q) \
__CLR_QB(prio, Q[0]) \
__CLR_Q (prio, Q[1],1) \
__CLR_Q (prio, Q[2],2) \
__CLR_Q (prio, Q[3],3) \
__CLR_Q (prio, Q[4],4) \
__CLR_Q (prio, Q[5],5) \
__CLR_QE(prio,Q[6],6)
#define __SET(prio, Q) \
__SET_QB(prio, Q[0]) \
__SET_Q (prio, Q[1],1) \
__SET_Q (prio, Q[2],2) \
__SET_Q (prio, Q[3],3) \
__SET_Q (prio, Q[4],4) \
__SET_Q (prio, Q[5],5) \
__SET_QE(prio, Q[6],6)
#define __GET(next, Q) \
__GET_QB(next, Q[0]) \
__GET_Q (next, Q[1],1) \
__GET_Q (next, Q[2],2) \
__GET_Q (next, Q[3],3) \
__GET_Q (next, Q[4],4) \
__GET_Q (next, Q[5],5) \
__GET_QE(next, Q[6],6)
#define __SAVEQ(Q) \
uint __q[7]; \
__q[0] = Q[0]; \
__q[1] = Q[1]; \
__q[2] = Q[2]; \
__q[3] = Q[3]; \
__q[4] = Q[4]; \
__q[5] = Q[5]; \
__q[6] = Q[6]
#define __NQ(Q) \
__q[0] != Q[0] || \
__q[1] != Q[1] || \
__q[2] != Q[2] || \
__q[3] != Q[3] || \
__q[4] != Q[4] || \
__q[5] != Q[5] || \
__q[6] != Q[6]
#elif TASK_QUE_SIZE == 8
#define __IF1(Q) (Q[0]|Q[1]|Q[2]|Q[3]|Q[4]|Q[5]|Q[6]|Q[7])
#define __CLR(prio, Q) \
__CLR_QB(prio, Q[0]) \
__CLR_Q (prio, Q[1],1) \
__CLR_Q (prio, Q[2],2) \
__CLR_Q (prio, Q[3],3) \
__CLR_Q (prio, Q[4],4) \
__CLR_Q (prio, Q[5],5) \
__CLR_Q (prio, Q[6],6) \
__CLR_QE(prio,Q[7],7)
#define __SET(prio, Q) \
__SET_QB(prio, Q[0]) \
__SET_Q (prio, Q[1],1) \
__SET_Q (prio, Q[2],2) \
__SET_Q (prio, Q[3],3) \
__SET_Q (prio, Q[4],4) \
__SET_Q (prio, Q[5],5) \
__SET_Q (prio, Q[6],6) \
__SET_QE(prio, Q[7],7)
#define __GET(next, Q) \
__GET_QB(next, Q[0]) \
__GET_Q (next, Q[1],1) \
__GET_Q (next, Q[2],2) \
__GET_Q (next, Q[3],3) \
__GET_Q (next, Q[4],4) \
__GET_Q (next, Q[5],5) \
__GET_Q (next, Q[6],6) \
__GET_QE(next, Q[7],7)
#define __SAVEQ(Q) \
uint __q[8]; \
__q[0] = Q[0]; \
__q[1] = Q[1]; \
__q[2] = Q[2]; \
__q[3] = Q[3]; \
__q[4] = Q[4]; \
__q[5] = Q[5]; \
__q[6] = Q[6]; \
__q[7] = Q[7]
#define __NQ(Q) \
__q[0] != Q[0] || \
__q[1] != Q[1] || \
__q[2] != Q[2] || \
__q[3] != Q[3] || \
__q[4] != Q[4] || \
__q[5] != Q[5] || \
__q[6] != Q[6] || \
__q[7] != Q[7]
#endif
/*------------------------------------------*/
#define __queue_init(q) \
do { \
__CLR_ALL(q.que); \
} while (0)
#if TASK_QUE_SIZE == 1
# define __queue_remove(q, prio) \
do { \
__CLR(prio, q.que); \
} while (0)
# define __queue_add(q, prio) \
do { \
__SET(prio, q.que); \
} while (0)
#else
# define __queue_remove(q, prio) \
do { \
__CLR(prio, q.que); \
__clr_done: \
__MPT; \
} while (0)
# define __queue_add(q, prio) \
do { \
__SET(prio, q.que); \
__set_done: \
__MPT; \
} while (0)
#endif
#if TASK_QUE_SIZE == 1 && ARCH_CPU_BITS == 8
# define __queue_get(q, next) \
do { \
__GET(next, q.que); \
} while (0)
#else
# define __queue_get(q, next) \
do { \
__GET(next, q.que); \
__get_done: \
__MPT; \
} while (0)
#endif
#define __queue_move(q, from, to) \
do { \
__SAVEQ(q.que); \
__queue_remove(q, from); \
if (__NQ(q.que)) { \
__queue_add(q, to); \
} \
} while (0)
#define __queue_susremove(q, prio, state) \
do { \
__SAVEQ(q.que); \
__queue_remove(q, prio); \
if (__NQ(q.que)) { \
state |= STATE_PREREADY; \
} \
} while (0)
#define queue_if1(q) __IF1(q.que)
#define queue_if0(q) (__IF1(q.que) == 0)
/*===========================================================================*/
#endif