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 + -
显示快捷键?