forked from KolibriOS/kolibrios
Adding menuetlibc back to its place in /programs/develop/libraries
This version of menuetlibc was taken from revision 4743, right before I made any changes git-svn-id: svn://kolibrios.org@4973 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
143
programs/develop/libraries/menuetlibc/include/menuet/sem.h
Normal file
143
programs/develop/libraries/menuetlibc/include/menuet/sem.h
Normal file
@@ -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
|
Reference in New Issue
Block a user