jk_shm.c

来自「以便Apache与其他服务进行整合 Mod_JK安装」· C语言 代码 · 共 670 行 · 第 1/2 页

C
670
字号
    JK_TRACE_ENTER(l);    if (jk_shmem.hdr) {        /* Probably a call from vhost */        if (!attached)            attached = 1;    }    else if (attached) {        /* We should already have a header         * Use memory if we don't         */        JK_TRACE_EXIT(l);        return 0;    }    jk_shmem.size = JK_SHM_ALIGN(sizeof(jk_shm_header_t) + sz);    if (!fname) {        /* Use plain memory in case there is no file name */        if (!jk_shmem.filename)            jk_shmem.filename  = strdup("memory");        if (JK_IS_DEBUG_LEVEL(l))            jk_log(l, JK_LOG_DEBUG,                   "Using process memory as shared memory");        JK_TRACE_EXIT(l);        return 0;    }    if (!jk_shmem.filename) {        jk_shmem.filename = (char *)malloc(strlen(fname) + 32);        sprintf(jk_shmem.filename, "%s.%" JK_PID_T_FMT, fname, getpid());    }    if (!attached) {        size_t size;        jk_shmem.attached = 0;#ifdef AS400_UTF8        wptr = (char *)malloc(strlen(jk_shmem.filename) + 1);        jk_ascii2ebcdic((char *)jk_shmem.filename, wptr);        fd = open(wptr, O_RDWR|O_CREAT|O_TRUNC, 0666);        free(wptr);#else        fd = open(jk_shmem.filename, O_RDWR|O_CREAT|O_TRUNC, 0666);#endif        if (fd == -1) {            jk_shmem.size = 0;            JK_TRACE_EXIT(l);            return errno;        }        size = lseek(fd, 0, SEEK_END);        if (size < jk_shmem.size) {            size = jk_shmem.size;            if (ftruncate(fd, jk_shmem.size)) {                rc = errno;                close(fd);#ifdef  AS400_UTF8                wptr = (char *)malloc(strlen(jk_shmem.filename) + 1);                jk_ascii2ebcdic((char *)jk_shmem.filename, wptr);                unlink(wptr);                free(wptr);#else                unlink(jk_shmem.filename);#endif                jk_shmem.size = 0;                JK_TRACE_EXIT(l);                return rc;            }            if (JK_IS_DEBUG_LEVEL(l))                jk_log(l, JK_LOG_DEBUG,                       "Truncated shared memory to %u", size);        }        if (lseek(fd, 0, SEEK_SET) != 0) {            rc = errno;            close(fd);#ifdef  AS400_UTF8            wptr = (char *)malloc(strlen(jk_shmem.filename) + 1);            jk_ascii2ebcdic((char *)jk_shmem.filename, wptr);            unlink(wptr);            free(wptr);#else            unlink(jk_shmem.filename);#endif            jk_shmem.size = 0;            JK_TRACE_EXIT(l);            return rc;        }        base = mmap((caddr_t)0, jk_shmem.size,                    PROT_READ | PROT_WRITE,                    MAP_FILE | MAP_SHARED,                    fd, 0);        if (base == (caddr_t)MAP_FAILED || base == (caddr_t)0) {            rc = errno;            close(fd);#ifdef  AS400_UTF8            wptr = (char *)malloc(strlen(jk_shmem.filename) + 1);            jk_ascii2ebcdic((char *)jk_shmem.filename, wptr);            unlink(wptr);            free(wptr);#else            unlink(jk_shmem.filename);#endif            jk_shmem.size = 0;            JK_TRACE_EXIT(l);            return rc;        }        jk_shmem.hdr = base;        jk_shmem.fd  = fd;        memset(jk_shmem.hdr, 0, jk_shmem.size);        memcpy(jk_shmem.hdr->h.data.magic, shm_signature, JK_SHM_MAGIC_SIZ);        jk_shmem.hdr->h.data.size = sz;        jk_shmem.hdr->h.data.childs = 1;        if (JK_IS_DEBUG_LEVEL(l))            jk_log(l, JK_LOG_DEBUG,                   "Initialized shared memory size=%u free=%u addr=%#lx",                   jk_shmem.size, jk_shmem.hdr->h.data.size, jk_shmem.hdr);    }    else {        unsigned int nchild;        jk_shmem.hdr->h.data.childs++;        jk_shmem.attached = (int)getpid();        nchild = jk_shmem.hdr->h.data.childs;        if (JK_IS_DEBUG_LEVEL(l))            jk_log(l, JK_LOG_DEBUG,                   "Attached shared memory [%d] size=%u free=%u addr=%#lx",                   nchild, jk_shmem.hdr->h.data.size,                   jk_shmem.hdr->h.data.size - jk_shmem.hdr->h.data.pos,                   jk_shmem.hdr);        /*         * Reset the shared memory so that         * alloc works even for attached memory.         * XXX: This might break already used memory         * if the number of workers change between         * open and attach or between two attach operations.         */        if (nchild > 1) {            if (JK_IS_DEBUG_LEVEL(l)) {                jk_log(l, JK_LOG_DEBUG,                       "Reseting the shared memory for child %d",                       nchild);            }        }        jk_shmem.hdr->h.data.pos     = 0;        jk_shmem.hdr->h.data.workers = 0;    }    JK_INIT_CS(&(jk_shmem.cs), rc);    if ((rc = do_shm_open_lock(jk_shmem.filename, attached, l))) {        if (!attached) {            munmap((void *)jk_shmem.hdr, jk_shmem.size);            close(jk_shmem.fd);#ifdef  AS400_UTF8            wptr = (char *)malloc(strlen(jk_shmem.filename) + 1);            jk_ascii2ebcdic((char *)jk_shmem.filename, wptr);            unlink(wptr);            free(wptr);#else            unlink(jk_shmem.filename);#endif        }        jk_shmem.hdr = NULL;        jk_shmem.fd  = -1;        JK_TRACE_EXIT(l);        return rc;    }    JK_TRACE_EXIT(l);    return 0;}int jk_shm_open(const char *fname, size_t sz, jk_logger_t *l){    return do_shm_open(fname, 0, sz, l);}int jk_shm_attach(const char *fname, size_t sz, jk_logger_t *l){    return do_shm_open(fname, 1, sz, l);}void jk_shm_close(){    int rc;#ifdef AS400_UTF8    char *wptr;#endif    if (jk_shmem.hdr) {        --jk_shmem.hdr->h.data.childs;#ifdef JK_SHM_LOCK_REOPEN        if (jk_shmem.fd_lock >= 0) {            close(jk_shmem.fd_lock);            jk_shmem.fd_lock = -1;        }#endif        JK_DELETE_CS(&(jk_shmem.cs), rc);        if (jk_shmem.attached) {            int p = (int)getpid();            if (p == jk_shmem.attached) {                /* In case this is a forked child                 * do not close the shared memory.                 * It will be closed by the parent.                 */                jk_shmem.size = 0;                jk_shmem.hdr  = NULL;                jk_shmem.fd   = -1;                return;            }        }        if (jk_shmem.fd >= 0) {            munmap((void *)jk_shmem.hdr, jk_shmem.size);            close(jk_shmem.fd);        }        if (jk_shmem.fd_lock >= 0)            close(jk_shmem.fd_lock);        if (jk_shmem.lockname) {#ifdef  AS400_UTF8            wptr = (char *)malloc(strlen(jk_shmem.lockname) + 1);            jk_ascii2ebcdic((char *)jk_shmem.lockname, wptr);            unlink(wptr);            free(wptr);#else            unlink(jk_shmem.lockname);#endif            free(jk_shmem.lockname);            jk_shmem.lockname = NULL;        }        if (jk_shmem.filename) {#ifdef  AS400_UTF8            wptr = (char *)malloc(strlen(jk_shmem.filename) + 1);            jk_ascii2ebcdic((char *)jk_shmem.filename, wptr);            unlink(wptr);            free(wptr);#else            unlink(jk_shmem.filename);#endif            free(jk_shmem.filename);            jk_shmem.filename = NULL;        }    }    jk_shmem.size    = 0;    jk_shmem.hdr     = NULL;    jk_shmem.fd      = -1;    jk_shmem.fd_lock = -1;}#endifvoid *jk_shm_alloc(jk_pool_t *p, size_t size){    void *rc = NULL;    if (jk_shmem.hdr) {        size = JK_ALIGN_DEFAULT(size);        if ((jk_shmem.hdr->h.data.size - jk_shmem.hdr->h.data.pos) >= size) {            rc = &(jk_shmem.hdr->buf[jk_shmem.hdr->h.data.pos]);            jk_shmem.hdr->h.data.pos += size;        }    }    else if (p)        rc = jk_pool_alloc(p, size);    return rc;}const char *jk_shm_name(){    return jk_shmem.filename;}time_t jk_shm_get_workers_time(){    if (jk_shmem.hdr)        return jk_shmem.hdr->h.data.modified;    else        return jk_workers_modified_time;}void jk_shm_set_workers_time(time_t t){    if (jk_shmem.hdr)        jk_shmem.hdr->h.data.modified = t;    else        jk_workers_modified_time = t;    jk_workers_access_time = t;}int jk_shm_is_modified(){    time_t m = jk_shm_get_workers_time();    if (m != jk_workers_access_time)        return 1;    else        return 0;}void jk_shm_sync_access_time(){    jk_workers_access_time = jk_shm_get_workers_time();}int jk_shm_lock(){    int rc;    JK_ENTER_CS(&(jk_shmem.cs), rc);    if (rc == JK_TRUE && jk_shmem.fd_lock != -1) {        JK_ENTER_LOCK(jk_shmem.fd_lock, rc);    }    return rc;}int jk_shm_unlock(){    int rc;    JK_LEAVE_CS(&(jk_shmem.cs), rc);    if (rc == JK_TRUE && jk_shmem.fd_lock != -1) {        JK_LEAVE_LOCK(jk_shmem.fd_lock, rc);    }    return rc;}jk_shm_worker_t *jk_shm_alloc_worker(jk_pool_t *p){    jk_shm_worker_t *w = (jk_shm_worker_t *)jk_shm_alloc(p, sizeof(jk_shm_worker_t));    if (w) {        memset(w, 0, sizeof(jk_shm_worker_t));        if (jk_shmem.hdr) {            jk_shmem.hdr->h.data.workers++;            w->id = jk_shmem.hdr->h.data.workers;        }        else            w->id = -1;    }    return w;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?