📄 mm_core.c
字号:
#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_BEOS) mc->mc_semid = create_sem(0, "mm_semid"); mc->mc_ben = 0;#endif#if defined(MM_SHMT_BEOS) mc->mc_areaid = temparea;#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_SEMT_BEOS) delete_sem(mc->mc_semid);#endif#if defined(MM_SHMT_BEOS) delete_area(mc->mc_areaid);#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 defined(MM_SEMT_BEOS) rc = 0; if (atomic_add(&mc->mc_ben, 1) > 0) { /* someone already in lock... acquire sem and wait */ if (acquire_sem(mc->mc_semid) != B_NO_ERROR) { atomic_add(&mc->mc_ben, -1); rc = -1; } }#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 defined(MM_SEMT_BEOS) rc = 0; if (atomic_add(&mc->mc_ben, -1) > 1) release_sem(mc->mc_semid);#endif if (rc < 0) { ERR(MM_ERR_CORE|MM_ERR_SYSTEM, "Failed to unlock"); rc = FALSE; } else rc = TRUE; return rc;}/*EOF*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -