#include #include #include #include #include #include #include #define STRINGIFY(x) #x #define TOSTRING(x) STRINGIFY(x) #define HERE __FILE__ "(" TOSTRING(__LINE__) "): " //Macro for automatic perror/throw inside a class #define CLERROR(cmd, x) \ { \ if ((int)(x) == -1) \ { \ perror(HERE cmd); \ throw HERE cmd; \ } \ } //Macro for automatic perror/return inside a function #define FNERROR(cmd, x, retVal) \ { \ if ((int)(x) == -1) \ { \ perror(HERE cmd); \ return retVal; \ } \ } //Macro for automatic perror/exit #define ERROR(cmd, x) \ { \ if ((int)(x) == -1) \ { \ perror(HERE cmd); \ return -1; \ } \ } #define SEM_MUTEX 0 #define SEM_WRITE 1 #define SEM_QUEUE 2 #define SHM_SIZE 1024+sizeof(int) void milliSleep(int millisecs); union semun { int val; struct semid_ds *buf; unsigned short int *array; struct seminfo *__buf; }; class SysSemaphores { int sem_id; struct sembuf wait_buf; struct sembuf signal_buf; public: SysSemaphores(int number, int flags) { CLERROR("SysSemaphores(): semget", sem_id = semget(IPC_PRIVATE, number, flags)); wait_buf.sem_op = -1; wait_buf.sem_flg = 0; signal_buf.sem_op = 1; signal_buf.sem_flg = 0; } int getId() { return sem_id; } int SetVal(ushort semnum, int value) { union semun theSemun; theSemun.val = value; return semctl(sem_id, semnum, SETVAL, theSemun); } int Wait(ushort semnum) { wait_buf.sem_num = semnum; return semop(sem_id, &wait_buf, 1); } int Signal(ushort semnum) { signal_buf.sem_num = semnum; return semop(sem_id, &signal_buf, 1); } ~SysSemaphores() { if (sem_id != -1) { semctl(sem_id, 0, IPC_RMID, 0); sem_id = -1; } } }; class SysSharedMem { int shm_id; public: SysSharedMem(int size, int flags) { CLERROR("SysSharedMem(): shmget", shm_id = shmget(IPC_PRIVATE, size, flags)); } int getId() { return shm_id; } void *Attach(int flags) { return shmat(shm_id, NULL, flags); } int Detach(void* addr) { return shmdt(addr); } ~SysSharedMem() { if (shm_id != -1) { shmctl(shm_id, IPC_RMID, 0); shm_id = -1; } } }; void WriterFunction(SysSemaphores *pSems, char *shmPtr); void ReaderFunction(SysSemaphores *pSems, char *shmPtr); long getTime();