// sys/sem.cpp // 2018/10/29 Robin.Rowe@Cinepaint.org // License open source MIT #include #include #include #include #include "sem.h" struct SysSem { HANDLE h; }; struct SysSems { key_t key; semid_ds semid; std::vector sem; SysSems(size_t size) { sem.resize(size); } SysSems() { memset(&semid,0,sizeof(semid)); } }; static std::map semMap; /* The argument nsems can be 0 (a don't care) when a semaphore set is not being created. Otherwise, nsems must be greater than 0 and less than or equal to the maximum number of semaphores per semaphore set (SEMMSL). */ int semget(key_t key, int nsems, int semflg) { auto id = semMap.find(key); if(semflg&IPC_CREAT&IPC_EXCL) { if(id != semMap.end()) { errno = EEXIST; return -1; } } if(key!=IPC_PRIVATE || IPC_CREAT&semflg) { if(id == semMap.end()) { return -1; } return key; } if(nsems <= 0 || nsems > SEMMSL) { return -1; } SysSems sysSems(nsems); LPSECURITY_ATTRIBUTES lpSemaphoreAttributes = 0; for(int i=0;i0) { sems.semval += sems.sem_op); if(SEM_UNDO) { sems.semadj -=sems.sem_op); } continue; } if(0==sem_op) { if(!sems.semval) { if(IPC_NOWAIT&sem_flg) errno = EAGAIN;// none of the operations in sops is performed return -1; } } */ STUB_NEG(semop); }