#ifndef __DY_SHM_H
#define __DY_SHM_h

/* SHM ID 必须是偶数 SHM_ID+1将作为对应的sem ID */
#define DY_NODES_CFG_SHM_ID 0x010000
#define DY_VGW_SHM_ID    0x020000
#define DEMO_SHM_SEM_ID 0x030001

#define DY_SHM_MODE  0666
#define DY_SEM_MODE  0666

#define SHM_INIT_DONE_MAGIC 0xD0D0D0D0

#define dy_atomic_inc(x) __sync_add_and_fetch(&(x), 1)
#define dy_atomic_dec(x) __sync_add_and_fetch(&(x), -1)
#define dy_atomic_add(x, a)  __sync_add_and_fetch(&(x), (a))
#define dy_atomic_cas(ptr, is, tobe) __sync_bool_compare_and_swap(ptr, is, tobe)

typedef int dy_shm_t;
typedef int dy_shm_key_t;
typedef int dy_sem_t;
typedef int dy_sem_key_t;

typedef struct {
	unsigned int counter;
} dy_shm_header_t;

typedef enum { FALSE = 0, TRUE = 1 } Boolean;

#define SHM_HEADER_SIZE sizeof(dy_shm_header_t)

extern void *dy_shm_create(dy_shm_t *shmid, dy_shm_key_t key, size_t size, dy_sem_t* sem_id);
extern void dy_shm_destroy(dy_shm_t shmid, void *in_addr, dy_sem_t sem_id);
extern dy_sem_t dy_sem_create(dy_sem_key_t key, int count);
extern void dy_sem_wait(dy_sem_t sem_id);
extern void dy_sem_signal(dy_sem_t sem_id);
extern void dy_sem_destroy(dy_sem_t sem_id);

#endif
