summaryrefslogtreecommitdiff
path: root/shmem/unix/mm/mm_core.c
diff options
context:
space:
mode:
Diffstat (limited to 'shmem/unix/mm/mm_core.c')
-rw-r--r--shmem/unix/mm/mm_core.c584
1 files changed, 0 insertions, 584 deletions
diff --git a/shmem/unix/mm/mm_core.c b/shmem/unix/mm/mm_core.c
deleted file mode 100644
index e8e7565d1..000000000
--- a/shmem/unix/mm/mm_core.c
+++ /dev/null
@@ -1,584 +0,0 @@
-/* ====================================================================
- * Copyright (c) 1999 Ralf S. Engelschall. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * 3. All advertising materials mentioning features or use of this
- * software must display the following acknowledgment:
- * "This product includes software developed by
- * Ralf S. Engelschall <rse@engelschall.com>."
- *
- * 4. Redistributions of any form whatsoever must retain the following
- * acknowledgment:
- * "This product includes software developed by
- * Ralf S. Engelschall <rse@engelschall.com>."
- *
- * THIS SOFTWARE IS PROVIDED BY RALF S. ENGELSCHALL ``AS IS'' AND ANY
- * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL RALF S. ENGELSCHALL OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
- * OF THE POSSIBILITY OF SUCH DAMAGE.
- * ====================================================================
- */
-
-/*
-**
-** mm_core.c -- Low-level Shared Memory API
-**
-*/
-
-#define MM_PRIVATE
-#include "mm.h"
-
-/*
- * Some global variables
- */
-
-#if defined(MM_SEMT_FCNTL)
-/* lock/unlock structures for fcntl() */
-static struct flock mm_core_dolock_rd;
-static struct flock mm_core_dolock_rw;
-static struct flock mm_core_dounlock;
-#endif
-
-#if defined(MM_SEMT_IPCSEM)
-/* lock/unlock structures for semop() */
-static union semun mm_core_semctlarg;
-static struct sembuf mm_core_dolock[2];
-static struct sembuf mm_core_dounlock[1];
-#endif
-
-#if defined(MM_SHMT_MMFILE) || defined(MM_SHMT_MMPOSX)
-static size_t mm_core_mapoffset = 0; /* we use own file */
-#elif defined(MM_SHMT_MMZERO)
-static size_t mm_core_mapoffset = 1024*1024*1; /* we share with other apps */
-#endif
-
-static void mm_core_init(void)
-{
- static int initialized = FALSE;
- if (!initialized) {
-#if defined(MM_SEMT_FCNTL)
- mm_core_dolock_rd.l_whence = SEEK_SET; /* from current point */
- mm_core_dolock_rd.l_start = 0; /* -"- */
- mm_core_dolock_rd.l_len = 0; /* until end of file */
- mm_core_dolock_rd.l_type = F_RDLCK; /* set shard/read lock */
- mm_core_dolock_rd.l_pid = 0; /* pid not actually interesting */
- mm_core_dolock_rw.l_whence = SEEK_SET; /* from current point */
- mm_core_dolock_rw.l_start = 0; /* -"- */
- mm_core_dolock_rw.l_len = 0; /* until end of file */
- mm_core_dolock_rw.l_type = F_WRLCK; /* set exclusive/read-write lock */
- mm_core_dolock_rw.l_pid = 0; /* pid not actually interesting */
- mm_core_dounlock.l_whence = SEEK_SET; /* from current point */
- mm_core_dounlock.l_start = 0; /* -"- */
- mm_core_dounlock.l_len = 0; /* until end of file */
- mm_core_dounlock.l_type = F_UNLCK; /* unlock */
- mm_core_dounlock.l_pid = 0; /* pid not actually interesting */
-#endif
-#if defined(MM_SEMT_IPCSEM)
- mm_core_dolock[0].sem_num = 0;
- mm_core_dolock[0].sem_op = 0;
- mm_core_dolock[0].sem_flg = 0;
- mm_core_dolock[1].sem_num = 0;
- mm_core_dolock[1].sem_op = 1;
- mm_core_dolock[1].sem_flg = SEM_UNDO;
- mm_core_dounlock[0].sem_num = 0;
- mm_core_dounlock[0].sem_op = -1;
- mm_core_dounlock[0].sem_flg = SEM_UNDO;
-#endif
- initialized = TRUE;
- }
- return;
-}
-
-#if defined(MM_SEMT_FLOCK)
-/*
- * Determine per-process fd for semaphore
- * (needed only for flock() based semaphore)
- */
-static int mm_core_getfdsem(mem_core *mc)
-{
- int fd = -1;
- pid_t pid;
- int i;
-
- pid = getpid();
- for (i = 0; i < MM_MAXCHILD &&
- mc->mc_fdsem[i].pid != 0 &&
- mc->mc_fdsem[i].fd != -1; i++) {
- if (mc->mc_fdsem[i].pid == pid) {
- fd = mc->mc_fdsem[i].fd;
- break;
- }
- }
- if (fd == -1 && i < MM_MAXCHILD) {
- fd = open(mc->mc_fnsem, O_WRONLY, MM_CORE_FILEMODE);
- mc->mc_fdsem[i].pid = getpid();
- mc->mc_fdsem[i].fd = fd;
- }
- return fd;
-}
-#endif /* MM_SEMT_FLOCK */
-
-/*
- * Determine memory page size of OS
- */
-
-static size_t mm_core_pagesize(void)
-{
- static int pagesize = 0;
- if (pagesize == 0)
-#if defined(MM_VMPS_GETPAGESIZE)
- pagesize = getpagesize();
-#elif defined(MM_VMPS_SYSCONF)
- pagesize = sysconf(_SC_PAGESIZE);
-#else
- pagesize = MM_CORE_DEFAULT_PAGESIZE;
-#endif
- return pagesize;
-}
-
-/*
- * Align a size to the next page or word boundary
- */
-
-size_t mm_core_align2page(size_t size)
-{
- int psize = mm_core_pagesize();
- return ((size)%(psize) > 0 ? ((size)/(psize)+1)*(psize) : (size));
-}
-
-size_t mm_core_align2word(size_t size)
-{
- return ((1+((size-1) / SIZEOF_mem_word)) * SIZEOF_mem_word);
-}
-
-size_t mm_core_maxsegsize(void)
-{
- return mm_core_align2page((MM_SHM_MAXSEGSIZE-SIZEOF_mem_core)-mm_core_pagesize());
-}
-
-/*
- * Create a shared memory area
- */
-
-void *mm_core_create(size_t usersize, const char *file)
-{
- mem_core *mc;
- void *area = ((void *)-1);
- int fdmem = 0;
- int fdsem = 0;
-#if defined(MM_SEMT_IPCSEM)
- int fdsem_rd = 0;
-#endif
-#if defined(MM_SHMT_MMPOSX) || defined(MM_SHMT_MMFILE)
- char *fnmem;
-#endif
-#if defined(MM_SEMT_FLOCK) || defined(MM_SEMT_FCNTL)
- char *fnsem;
-#endif
- size_t size;
-#if defined(MM_SHMT_MMZERO) || defined(MM_SHMT_MMPOSX) || defined(MM_SHMT_MMFILE)
- int zero = 0;
-#endif
-#if defined(MM_SHMT_IPCSHM)
- struct shmid_ds shmbuf;
-#endif
-#if defined(MM_SHMT_MMPOSX) || defined(MM_SHMT_MMFILE)
- char shmfilename[MM_MAXPATH];
-#endif
-#if defined(MM_SEMT_FLOCK) || defined(MM_SEMT_FCNTL)
- char semfilename[MM_MAXPATH];
-#endif
- char filename[MM_MAXPATH];
-
- if (usersize <= 0 || usersize > mm_core_maxsegsize()) {
- errno = EINVAL;
- return NULL;
- }
- if (file == NULL) {
- sprintf(filename, MM_CORE_DEFAULT_FILE, (int)getpid());
- file = filename;
- }
-
- mm_core_init();
- size = mm_core_align2page(usersize+SIZEOF_mem_core);
-
-#if defined(MM_SHMT_MMPOSX) || defined(MM_SHMT_MMFILE)
- sprintf(shmfilename, "%s.mem", file);
- fnmem = shmfilename;
-#endif
-#if defined(MM_SEMT_FLOCK) || defined(MM_SEMT_FCNTL)
- sprintf(semfilename, "%s.sem", file);
- fnsem = semfilename;
-#endif
-
-#if defined(MM_SHMT_MMANON)
- if ((area = (void *)mmap(NULL, size, PROT_READ|PROT_WRITE,
- MAP_ANON|MAP_SHARED, -1, 0)) == MAP_FAILED)
- FAIL(MM_ERR_CORE|MM_ERR_SYSTEM, "failed to memory map anonymous area");
-#endif /* MM_SHMT_MMANON */
-
-#if defined(MM_SHMT_MMPOSX)
- shm_unlink(fnmem); /* Ok when it fails */
- if ((fdmem = shm_open(fnmem, O_RDWR|O_CREAT, MM_CORE_FILEMODE)) == -1)
- FAIL(MM_ERR_CORE|MM_ERR_SYSTEM, "failed to open tempfile");
- if (ftruncate(fdmem, mm_core_mapoffset+size) == -1)
- FAIL(MM_ERR_CORE|MM_ERR_SYSTEM, "failed to truncate tempfile");
- write(fdmem, &zero, sizeof(zero));
- if ((area = (void *)mmap(NULL, size, PROT_READ|PROT_WRITE,
- MAP_SHARED, fdmem, mm_core_mapoffset)) == MAP_FAILED)
- FAIL(MM_ERR_CORE|MM_ERR_SYSTEM, "failed to memory map tempfile");
- shm_unlink(fnmem);
- mm_core_mapoffset += size;
-#endif /* MM_SHMT_MMPOSX */
-
-#if defined(MM_SHMT_MMZERO)
- if ((fdmem = open("/dev/zero", O_RDWR, MM_CORE_FILEMODE)) == -1)
- FAIL(MM_ERR_CORE|MM_ERR_SYSTEM, "failed to open /dev/zero");
- if (lseek(fdmem, mm_core_mapoffset+size, SEEK_SET) == -1)
- FAIL(MM_ERR_CORE|MM_ERR_SYSTEM, "failed to seek in /dev/zero");
- write(fdmem, &zero, sizeof(zero));
- if ((area = (void *)mmap(NULL, size, PROT_READ|PROT_WRITE,
- MAP_SHARED, fdmem, mm_core_mapoffset)) == MAP_FAILED)
- FAIL(MM_ERR_CORE|MM_ERR_SYSTEM, "failed to memory map /dev/zero");
- mm_core_mapoffset += size;
-#endif /* MM_SHMT_MMZERO */
-
-#if defined(MM_SHMT_MMFILE)
- unlink(fnmem);
- if ((fdmem = open(fnmem, O_RDWR|O_CREAT, MM_CORE_FILEMODE)) == -1)
- FAIL(MM_ERR_CORE|MM_ERR_SYSTEM, "failed to open memory file");
- if (ftruncate(fdmem, mm_core_mapoffset+size) == -1)
- FAIL(MM_ERR_CORE|MM_ERR_SYSTEM, "failed to truncate memory file");
- write(fdmem, &zero, sizeof(zero));
- if ((area = (void *)mmap(NULL, size, PROT_READ|PROT_WRITE,
- MAP_SHARED, fdmem, mm_core_mapoffset)) == MAP_FAILED)
- FAIL(MM_ERR_CORE|MM_ERR_SYSTEM, "failed to memory map memory file");
- mm_core_mapoffset += size;
-#endif /* MM_SHMT_MMFILE */
-
-#if defined(MM_SHMT_IPCSHM)
- if ((fdmem = shmget(IPC_PRIVATE, size, (SHM_R|SHM_W|IPC_CREAT))) == -1)
- FAIL(MM_ERR_CORE|MM_ERR_SYSTEM, "failed to acquire shared memory segment");
- if ((area = (void *)shmat(fdmem, NULL, 0)) == ((void *)-1))
- FAIL(MM_ERR_CORE|MM_ERR_SYSTEM, "failed to attach shared memory");
- if (shmctl(fdmem, IPC_STAT, &shmbuf) == -1)
- FAIL(MM_ERR_CORE|MM_ERR_SYSTEM, "failed to get status of shared memory");
- shmbuf.shm_perm.uid = getuid();
- shmbuf.shm_perm.gid = getgid();
- if (shmctl(fdmem, IPC_SET, &shmbuf) == -1)
- FAIL(MM_ERR_CORE|MM_ERR_SYSTEM, "failed to set status of shared memory");
- if (shmctl(fdmem, IPC_RMID, NULL) == -1)
- FAIL(MM_ERR_CORE|MM_ERR_SYSTEM, "failed to remove shared memory in advance");
-#endif /* MM_SHMT_IPCSHM */
-
-#if defined(MM_SEMT_FLOCK)
- unlink(fnsem);
- if ((fdsem = open(fnsem, O_RDWR|O_CREAT, MM_CORE_FILEMODE)) == -1)
- FAIL(MM_ERR_CORE|MM_ERR_SYSTEM, "failed to open semaphore file");
-#endif /* MM_SEMT_FLOCK */
-
-#if defined(MM_SEMT_FCNTL)
- unlink(fnsem);
- if ((fdsem = open(fnsem, O_RDWR|O_CREAT, MM_CORE_FILEMODE)) == -1)
- FAIL(MM_ERR_CORE|MM_ERR_SYSTEM, "failed to open semaphore file");
-#endif /* MM_SEMT_FCNTL */
-
-#if defined(MM_SEMT_IPCSEM)
- fdsem = semget(IPC_PRIVATE, 1, IPC_CREAT|IPC_EXCL|S_IRUSR|S_IWUSR);
- if (fdsem == -1 && errno == EEXIST)
- fdsem = semget(IPC_PRIVATE, 1, IPC_EXCL|S_IRUSR|S_IWUSR);
- if (fdsem == -1)
- FAIL(MM_ERR_CORE|MM_ERR_SYSTEM, "failed to acquire semaphore");
- mm_core_semctlarg.val = 0;
- semctl(fdsem, 0, SETVAL, mm_core_semctlarg);
- fdsem_rd = semget(IPC_PRIVATE, 1, IPC_CREAT|IPC_EXCL|S_IRUSR|S_IWUSR);
- if (fdsem_rd == -1 && errno == EEXIST)
- fdsem_rd = semget(IPC_PRIVATE, 1, IPC_EXCL|S_IRUSR|S_IWUSR);
- if (fdsem_rd == -1)
- FAIL(MM_ERR_CORE|MM_ERR_SYSTEM, "failed to acquire semaphore");
- mm_core_semctlarg.val = 0;
- semctl(fdsem_rd, 0, SETVAL, mm_core_semctlarg);
-#endif /* MM_SEMT_IPCSEM */
-
- /*
- * Configure the memory core parameters
- */
- mc = (mem_core *)area;
- mc->mc_size = size;
- mc->mc_usize = usersize;
- mc->mc_pid = getpid();
- mc->mc_fdmem = fdmem;
-#if defined(MM_SEMT_FLOCK)
- mc->mc_fdsem[0].pid = getpid();
- mc->mc_fdsem[0].fd = fdsem;
- mc->mc_fdsem[1].pid = 0;
- mc->mc_fdsem[1].fd = -1;
-#else
- mc->mc_fdsem = fdsem;
-#endif
-#if defined(MM_SEMT_IPCSEM)
- mc->mc_fdsem_rd = fdsem_rd;
- mc->mc_readers = 0;
-#endif
-#if defined(MM_SHMT_MMFILE)
- memcpy(mc->mc_fnmem, fnmem, MM_MAXPATH);
-#endif
-#if defined(MM_SEMT_FLOCK) || defined(MM_SEMT_FCNTL)
- memcpy(mc->mc_fnsem, fnsem, MM_MAXPATH);
-#endif
-
- /*
- * Return successfully established core
- */
- return ((void *)&(mc->mc_base.mw_cp));
-
- /*
- * clean-up sequence (CUS) for error situation
- */
- BEGIN_FAILURE
-#if defined(MM_SHMT_MMANON) || defined(MM_SHMT_MMZERO) || defined(MM_SHMT_MMPOSX) || defined(MM_SHMT_MMFILE)
- if (area != ((void *)-1))
- munmap((caddr_t)area, size);
-#endif
-#if defined(MM_SHMT_IPCSHM)
- if (area != ((void *)-1))
- shmdt(area);
-#endif
-#if defined(MM_SHMT_MMPOSX) || defined(MM_SHMT_MMFILE)
- if (fdmem != -1)
- close(fdmem);
-#endif
-#if defined(MM_SHMT_IPCSHM)
- if (fdmem != -1)
- shmctl(fdmem, IPC_RMID, NULL);
-#endif
-#if defined(MM_SEMT_FLOCK) || defined(MM_SEMT_FCNTL)
- if (fdsem != -1)
- close(fdsem);
-#endif
-#if defined(MM_SEMT_IPCSEM)
- if (fdsem != -1)
- semctl(fdsem, 0, IPC_RMID, 0);
- if (fdsem_rd != -1)
- semctl(fdsem_rd, 0, IPC_RMID, 0);
-#endif
-#if defined(MM_SHMT_MMFILE)
- unlink(fnmem);
-#endif
-#if defined(MM_SEMT_FLOCK) || defined(MM_SEMT_FCNTL)
- unlink(fnsem);
-#endif
- return NULL;
- END_FAILURE
-}
-
-int mm_core_permission(void *core, mode_t mode, uid_t owner, gid_t group)
-{
- int rc;
- mem_core *mc;
-
- if (core == NULL)
- return -1;
- mc = (mem_core *)((char *)core-SIZEOF_mem_core);
- rc = 0;
-#if defined(MM_SHMT_MMFILE)
- if (rc == 0 && chmod(mc->mc_fnmem, mode) < 0)
- rc = -1;
- if (rc == 0 && chown(mc->mc_fnmem, owner, group) < 0)
- rc = -1;
-#endif
-#if defined(MM_SEMT_FLOCK) || defined(MM_SEMT_FCNTL)
- if (rc == 0 && chmod(mc->mc_fnsem, mode) < 0)
- rc = -1;
- if (rc == 0 && chown(mc->mc_fnsem, owner, group) < 0)
- rc = -1;
-#endif
- return rc;
-}
-
-void mm_core_delete(void *core)
-{
- mem_core *mc;
- int fdmem;
- int fdsem;
-#if defined(MM_SEMT_IPCSEM)
- int fdsem_rd;
-#endif
- size_t size;
-#if defined(MM_SHMT_MMFILE)
- char fnmem[MM_MAXPATH];
-#endif
-#if defined(MM_SEMT_FLOCK) || defined(MM_SEMT_FCNTL)
- char fnsem[MM_MAXPATH];
-#endif
-
- if (core == NULL)
- return;
- mc = (mem_core *)((char *)core-SIZEOF_mem_core);
- size = mc->mc_size;
- fdmem = mc->mc_fdmem;
-#if !defined(MM_SEMT_FLOCK)
- fdsem = mc->mc_fdsem;
-#endif
-#if defined(MM_SEMT_IPCSEM)
- fdsem_rd = mc->mc_fdsem_rd;
-#endif
-#if defined(MM_SEMT_FLOCK)
- fdsem = mm_core_getfdsem(mc);
-#endif
-#if defined(MM_SHMT_MMFILE)
- memcpy(fnmem, mc->mc_fnmem, MM_MAXPATH);
-#endif
-#if defined(MM_SEMT_FLOCK) || defined(MM_SEMT_FCNTL)
- memcpy(fnsem, mc->mc_fnsem, MM_MAXPATH);
-#endif
-
-#if defined(MM_SHMT_MMANON) || defined(MM_SHMT_MMPOSX) || defined(MM_SHMT_MMZERO) || defined(MM_SHMT_MMFILE)
- munmap((caddr_t)mc, size);
-#endif
-#if defined(MM_SHMT_IPCSHM)
- shmdt((void *)mc);
- shmctl(fdmem, IPC_RMID, NULL);
-#endif
-#if defined(MM_SHMT_MMPOSX) || defined(MM_SHMT_MMZERO) || defined(MM_SHMT_MMFILE)
- close(fdmem);
-#endif
-#if defined(MM_SHMT_MMFILE)
- unlink(fnmem);
-#endif
-#if defined(MM_SEMT_FLOCK) || defined(MM_SEMT_FCNTL)
- close(fdsem);
-#endif
-#if defined(MM_SEMT_FLOCK) || defined(MM_SEMT_FCNTL)
- unlink(fnsem);
-#endif
-#if defined(MM_SEMT_IPCSEM)
- semctl(fdsem, 0, IPC_RMID, 0);
- semctl(fdsem_rd, 0, IPC_RMID, 0);
-#endif
- return;
-}
-
-size_t mm_core_size(const void *core)
-{
- mem_core *mc;
-
- if (core == NULL)
- return 0;
- mc = (mem_core *)((char *)core-SIZEOF_mem_core);
- return (mc->mc_usize);
-}
-
-int mm_core_lock(const void *core, mm_lock_mode mode)
-{
- mem_core *mc;
- int rc;
- int fdsem;
-
- if (core == NULL)
- return FALSE;
- mc = (mem_core *)((char *)core-SIZEOF_mem_core);
-#if !defined(MM_SEMT_FLOCK)
- fdsem = mc->mc_fdsem;
-#endif
-#if defined(MM_SEMT_FLOCK)
- fdsem = mm_core_getfdsem(mc);
-#endif
-
-#if defined(MM_SEMT_FCNTL)
- if (mode == MM_LOCK_RD)
- while (((rc = fcntl(fdsem, F_SETLKW, &mm_core_dolock_rd)) < 0) && (errno == EINTR)) ;
- else
- while (((rc = fcntl(fdsem, F_SETLKW, &mm_core_dolock_rw)) < 0) && (errno == EINTR)) ;
-#endif
-#if defined(MM_SEMT_FLOCK)
- if (mode == MM_LOCK_RD)
- while (((rc = flock(fdsem, LOCK_SH)) < 0) && (errno == EINTR)) ;
- else
- while (((rc = flock(fdsem, LOCK_EX)) < 0) && (errno == EINTR)) ;
-#endif
-#if defined(MM_SEMT_IPCSEM)
- if (mode == MM_LOCK_RD) {
- while (((rc = semop(mc->mc_fdsem_rd, mm_core_dolock, 2)) < 0) && (errno == EINTR)) ;
- mc->mc_readers++;
- if (mc->mc_readers == 1)
- while (((rc = semop(fdsem, mm_core_dolock, 2)) < 0) && (errno == EINTR)) ;
- while (((rc = semop(mc->mc_fdsem_rd, mm_core_dounlock, 1)) < 0) && (errno == EINTR)) ;
- }
- else {
- while (((rc = semop(fdsem, mm_core_dolock, 2)) < 0) && (errno == EINTR)) ;
- }
- mc->mc_lockmode = mode;
-#endif
- if (rc < 0) {
- ERR(MM_ERR_CORE|MM_ERR_SYSTEM, "Failed to lock");
- rc = FALSE;
- }
- else
- rc = TRUE;
- return rc;
-}
-
-int mm_core_unlock(const void *core)
-{
- mem_core *mc;
- int rc;
- int fdsem;
-
- if (core == NULL)
- return FALSE;
- mc = (mem_core *)((char *)core-SIZEOF_mem_core);
-#if !defined(MM_SEMT_FLOCK)
- fdsem = mc->mc_fdsem;
-#endif
-#if defined(MM_SEMT_FLOCK)
- fdsem = mm_core_getfdsem(mc);
-#endif
-
-#if defined(MM_SEMT_FCNTL)
- while (((rc = fcntl(fdsem, F_SETLKW, &mm_core_dounlock)) < 0) && (errno == EINTR)) ;
-#endif
-#if defined(MM_SEMT_FLOCK)
- while (((rc = flock(fdsem, LOCK_UN)) < 0) && (errno == EINTR)) ;
-#endif
-#if defined(MM_SEMT_IPCSEM)
- if (mc->mc_lockmode == MM_LOCK_RD) {
- while (((rc = semop(mc->mc_fdsem_rd, mm_core_dolock, 2)) < 0) && (errno == EINTR)) ;
- mc->mc_readers--;
- if (mc->mc_readers == 0)
- while (((rc = semop(fdsem, mm_core_dounlock, 1)) < 0) && (errno == EINTR)) ;
- while (((rc = semop(mc->mc_fdsem_rd, mm_core_dounlock, 1)) < 0) && (errno == EINTR)) ;
- }
- else {
- while (((rc = semop(fdsem, mm_core_dounlock, 1)) < 0) && (errno == EINTR)) ;
- }
-#endif
- if (rc < 0) {
- ERR(MM_ERR_CORE|MM_ERR_SYSTEM, "Failed to unlock");
- rc = FALSE;
- }
- else
- rc = TRUE;
- return rc;
-}
-
-/*EOF*/