Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. #ifndef __MENUETOS_SEM_H
  2. #define __MENUETOS_SEM_H
  3.  
  4. #ifdef __cplusplus
  5. extern "C" {
  6. #endif
  7.  
  8. typedef volatile struct {
  9.  unsigned long s_magic;
  10.  volatile unsigned long s_value;
  11.  volatile unsigned long s_lock;
  12. } semaphore_t;
  13.  
  14. #define SEM_MAGIC       0x1BAD2E20
  15.  
  16. #define SEM_INIT        { SEM_MAGIC , 0 , 0 }
  17.  
  18. static inline semaphore_t * get_sem_init(void)
  19. {
  20.  static semaphore_t __ret=SEM_INIT;
  21.  return &__ret;
  22. }
  23.  
  24. static inline void fill_empty_sem(semaphore_t * sem)
  25. {
  26.  if(sem)
  27.  {
  28.   memcpy((void *)sem,(const void *)get_sem_init(),sizeof(semaphore_t));
  29.  }
  30. }
  31.  
  32. #define DECLARE_SEMAPHORE(name)   semaphore_t name = SEM_INIT ;
  33. #define DECLARE_STATIC_SEM(name)  static semaphore_t name = SEM_INIT ;
  34. #define DECLARE_SEMAPHORE_S(name) semaphore_t name
  35.  
  36. #define check_sem_magic(s)      ((s)->s_magic==SEM_MAGIC)
  37.  
  38. #define SEM_VAL(s)      (s)->s_value
  39. #define SEM_LOCK(s)     (s)->s_lock
  40.  
  41. #define sem_lock_acquire(sem) \
  42.     { \
  43. LOCKED: \
  44.         if(check_sem_magic(sem)) \
  45.         { \
  46.             if(SEM_LOCK(sem)) \
  47.             { \
  48.                 __menuet__delay100(1); \
  49.                 goto LOCKED; \
  50.             } \
  51.         } \
  52.     }
  53.    
  54. #define sem_lock(sem) \
  55.     { \
  56.         if(check_sem_magic(sem)) \
  57.         { \
  58.             sem_lock_acquire(sem); \
  59.             SEM_LOCK(sem)++; \
  60.         } \
  61.     }
  62.    
  63. #define sem_unlock(sem) \
  64.     { \
  65.         if(check_sem_magic(sem)) \
  66.         { \
  67.             if(SEM_LOCK(sem)) SEM_LOCK(sem)--; \
  68.         } \
  69.     }
  70.    
  71. #define sem_read(sem) \
  72.     ({ \
  73.         volatile unsigned long __ret; \
  74.         if(check_sem_magic(sem)) \
  75.         { \
  76.             sem_lock(sem); \
  77.             __ret=SEM_VAL(sem); \
  78.             sem_unlock(sem); \
  79.         } else { \
  80.             __ret=0; \
  81.         } \
  82.         __ret; \
  83.     })
  84.  
  85. #define sem_write(sem,val) \
  86.     { \
  87.         if(check_sem_magic(sem)) \
  88.         { \
  89.             sem_lock(sem); \
  90.             SEM_VAL(sem)=(val); \
  91.             sem_unlock(sem); \
  92.         } \
  93.     }
  94.    
  95. #define sem_up(sem) \
  96.     { \
  97.         if(check_sem_magic(sem)) \
  98.         { \
  99.             sem_lock(sem); \
  100.             SEM_VAL(sem)++; \
  101.             sem_unlock(sem); \
  102.         } \
  103.     }
  104.    
  105. #define sem_down(sem) \
  106.     { \
  107.         if(check_sem_magic(sem)) \
  108.         { \
  109.             sem_lock(sem); \
  110.             if(SEM_VAL(sem)) SEM_VAL(sem)--; \
  111.             sem_unlock(sem); \
  112.         } \
  113.     }
  114.    
  115. #define sem_isup(sem) \
  116.     { \
  117.         int __ret; \
  118.         if(check_sem_magic(sem)) \
  119.         { \
  120.             sem_lock(sem); \
  121.             __ret=SEM_VAL(sem) ? 1 : 0; \
  122.             sem_unlock(sem); \
  123.         } \
  124.         __ret; \
  125.     }
  126.    
  127. #define sem_isdown(sem) \
  128.     { \
  129.         int __ret; \
  130.         if(check_sem_magic(sem)) \
  131.         { \
  132.             sem_lock(sem); \
  133.             __ret=SEM_VAL(sem) ? 0 : 1; \
  134.             sem_unlock(sem); \
  135.         } \
  136.         __ret; \
  137.     }
  138.  
  139. #ifdef __cplusplus
  140. }
  141. #endif
  142.    
  143. #endif
  144.