#include <stdio.h> #include "memlock.h" #ifndef _WIN32 //#include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h> #else #include <stdarg.h> #include <winbase.h> #endif int memLockCreate( int key, MEMLOCK *s) { #ifdef _WIN32 char semname[30]; sprintf( semname, "sem%08x", key); *s = CreateSemaphore( NULL, 1, 1, semname); return (*s != NULL)? 0 : -1; #else *s = semget( key, 1, IPC_CREAT|0600); if (*s > 0) memUnlock( *s); return (*s >= 0)? 0 : -1; #endif } int memLockOpen( int key, MEMLOCK *s) { #ifdef _WIN32 char semname[30]; sprintf( semname, "sem%08x", key); *s = OpenSemaphore( SEMAPHORE_ALL_ACCESS, FALSE, semname); return (*s != NULL)? 0 : -1; #else *s = semget( key, 1, 0); return (*s >= 0)? 0 : -1; #endif } void memLockDestroy( MEMLOCK s) { #ifdef _WIN32 CloseHandle( s); #else semctl( s, 0, IPC_RMID); #endif } int memLock( MEMLOCK s) { #ifdef _WIN32 return (WAIT_FAILED == WaitForSingleObject( s, INFINITE)); #else struct sembuf sop; sop.sem_num = 0; sop.sem_op = -1; sop.sem_flg = 0; return semop( s, &sop, 1); #endif } int memUnlock( MEMLOCK s) { #ifdef _WIN32 return !ReleaseSemaphore ( s, 1, NULL); #else struct sembuf sop; if (semctl( s, 0, GETVAL) > 0) return -1 ; /* already unlocked */ sop.sem_num = 0; sop.sem_op = 1; sop.sem_flg = 0; return semop( s, &sop, 1); #endif }