Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. #ifndef __QUEUE_H
  2. #define __QUEUE_H
  3.  
  4. #include<menuet/os.h>
  5. #include<menuet/sem.h>
  6.  
  7. typedef struct
  8. {
  9.  int in_ptr,out_ptr,size;
  10.  unsigned char * databuf;
  11.  DECLARE_SEMAPHORE_S(q_lock);
  12. } __oe_queue_t;
  13.  
  14. #define DECL_EMPTY_Q(n,sz,buf)  __oe_queue_t n = {0,0,sz,buf,SEM_INIT}
  15.  
  16. #define __OE_QUEUE_INQ(x,c) \
  17.     ({ \
  18.         register int __ret,temp; \
  19.         sem_lock(&(x)->q_lock); \
  20.         temp=(x)->in_ptr+1; \
  21.         if(temp>=(x)->size) temp=0; \
  22.         if(temp==(x)->out_ptr) { __ret=-1; goto __OEQI_D; } \
  23.         (x)->databuf[(x)->in_ptr]=(c)&0xFF; \
  24.         (x)->in_ptr=temp; \
  25.         __ret=0; \
  26. __OEQI_D: \
  27.         sem_unlock(&(x)->q_lock); \
  28.         __ret; })
  29.        
  30. #define __OE_QUEUE_DEQ(x,c) \
  31.     ({ \
  32.         register int __ret; \
  33.         register unsigned char __tmp; \
  34.         sem_lock(&(x)->q_lock); \
  35.         if((x)->out_ptr==(x)->in_ptr) { __ret=-1; goto __OEQD_D; } \
  36.         __tmp=(x)->databuf[(x)->out_ptr++]; \
  37.         if((x)->out_ptr>=(x)->size) (x)->out_ptr=0; \
  38.         __ret=0; \
  39.         (c)=__tmp; \
  40. __OEQD_D: \
  41.         sem_unlock(&(x)->q_lock); \
  42.         __ret; })
  43.        
  44. #endif
  45.