Subversion Repositories Kolibri OS

Compare Revisions

No changes between revisions

Regard whitespace Rev 1881 → Rev 1882

/programs/develop/libraries/menuetlibc/include/menuet/sem.h
0,0 → 1,143
#ifndef __MENUETOS_SEM_H
#define __MENUETOS_SEM_H
 
#ifdef __cplusplus
extern "C" {
#endif
 
typedef volatile struct {
unsigned long s_magic;
volatile unsigned long s_value;
volatile unsigned long s_lock;
} semaphore_t;
 
#define SEM_MAGIC 0x1BAD2E20
 
#define SEM_INIT { SEM_MAGIC , 0 , 0 }
 
static inline semaphore_t * get_sem_init(void)
{
static semaphore_t __ret=SEM_INIT;
return &__ret;
}
 
static inline void fill_empty_sem(semaphore_t * sem)
{
if(sem)
{
memcpy((void *)sem,(const void *)get_sem_init(),sizeof(semaphore_t));
}
}
#define DECLARE_SEMAPHORE(name) semaphore_t name = SEM_INIT ;
#define DECLARE_STATIC_SEM(name) static semaphore_t name = SEM_INIT ;
#define DECLARE_SEMAPHORE_S(name) semaphore_t name
 
#define check_sem_magic(s) ((s)->s_magic==SEM_MAGIC)
 
#define SEM_VAL(s) (s)->s_value
#define SEM_LOCK(s) (s)->s_lock
 
#define sem_lock_acquire(sem) \
{ \
LOCKED: \
if(check_sem_magic(sem)) \
{ \
if(SEM_LOCK(sem)) \
{ \
__menuet__delay100(1); \
goto LOCKED; \
} \
} \
}
#define sem_lock(sem) \
{ \
if(check_sem_magic(sem)) \
{ \
sem_lock_acquire(sem); \
SEM_LOCK(sem)++; \
} \
}
#define sem_unlock(sem) \
{ \
if(check_sem_magic(sem)) \
{ \
if(SEM_LOCK(sem)) SEM_LOCK(sem)--; \
} \
}
#define sem_read(sem) \
({ \
volatile unsigned long __ret; \
if(check_sem_magic(sem)) \
{ \
sem_lock(sem); \
__ret=SEM_VAL(sem); \
sem_unlock(sem); \
} else { \
__ret=0; \
} \
__ret; \
})
 
#define sem_write(sem,val) \
{ \
if(check_sem_magic(sem)) \
{ \
sem_lock(sem); \
SEM_VAL(sem)=(val); \
sem_unlock(sem); \
} \
}
#define sem_up(sem) \
{ \
if(check_sem_magic(sem)) \
{ \
sem_lock(sem); \
SEM_VAL(sem)++; \
sem_unlock(sem); \
} \
}
#define sem_down(sem) \
{ \
if(check_sem_magic(sem)) \
{ \
sem_lock(sem); \
if(SEM_VAL(sem)) SEM_VAL(sem)--; \
sem_unlock(sem); \
} \
}
#define sem_isup(sem) \
{ \
int __ret; \
if(check_sem_magic(sem)) \
{ \
sem_lock(sem); \
__ret=SEM_VAL(sem) ? 1 : 0; \
sem_unlock(sem); \
} \
__ret; \
}
#define sem_isdown(sem) \
{ \
int __ret; \
if(check_sem_magic(sem)) \
{ \
sem_lock(sem); \
__ret=SEM_VAL(sem) ? 0 : 1; \
sem_unlock(sem); \
} \
__ret; \
}
 
#ifdef __cplusplus
}
#endif
#endif
Property changes:
Added: svn:executable
+*
\ No newline at end of property