⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mm_core.c

📁 Apache V2.0.15 Alpha For Linuxhttpd-2_0_15-alpha.tar.Z
💻 C
📖 第 1 页 / 共 2 页
字号:
#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 + -