jk_shm.c
来自「以便Apache与其他服务进行整合 Mod_JK安装」· C语言 代码 · 共 670 行 · 第 1/2 页
C
670 行
/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. *//*************************************************************************** * Description: Shared Memory support * * Author: Mladen Turk <mturk@jboss.com> * * Author: Rainer Jung <rjung@apache.org> * * Version: $Revision: 551893 $ * ***************************************************************************/#include "jk_global.h"#include "jk_pool.h"#include "jk_util.h"#include "jk_mt.h"#include "jk_shm.h"/** jk shm header core data structure */struct jk_shm_header_data{ /* Shared memory magic JK_SHM_MAGIC */ char magic[JK_SHM_MAGIC_SIZ]; size_t size; size_t pos; unsigned int childs; unsigned int workers; time_t modified;};typedef struct jk_shm_header_data jk_shm_header_data_t;/** jk shm header record structure */struct jk_shm_header{ union { jk_shm_header_data_t data; char alignbuf[JK_SHM_ALIGN(sizeof(jk_shm_header_data_t))]; } h; char buf[1];};typedef struct jk_shm_header jk_shm_header_t;/** jk shm structure */struct jk_shm{ size_t size; char *filename; char *lockname; int fd; int fd_lock; int attached; jk_shm_header_t *hdr; JK_CRIT_SEC cs;};typedef struct jk_shm jk_shm_t;static const char shm_signature[] = { JK_SHM_MAGIC };static jk_shm_t jk_shmem = { 0, NULL, NULL, -1, -1, 0, NULL};static time_t jk_workers_modified_time = 0;static time_t jk_workers_access_time = 0;#if defined (WIN32)static HANDLE jk_shm_map = NULL;#endif#if defined (WIN32) || defined(NETWARE)/* Use plain memory */int jk_shm_open(const char *fname, size_t sz, jk_logger_t *l){ int rc; int attached = 0; JK_TRACE_ENTER(l); if (jk_shmem.hdr) { if (JK_IS_DEBUG_LEVEL(l)) jk_log(l, JK_LOG_DEBUG, "Shared memory is already opened"); JK_TRACE_EXIT(l); return 0; } jk_shmem.size = JK_SHM_ALIGN(sizeof(jk_shm_header_t) + sz);#if defined (WIN32) if (fname) { jk_shm_map = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, (DWORD)(sizeof(jk_shm_header_t) + sz), fname); if (GetLastError() == ERROR_ALREADY_EXISTS) { attached = 1; if (jk_shm_map == NULL || jk_shm_map == INVALID_HANDLE_VALUE) { jk_shm_map = OpenFileMapping(PAGE_READWRITE, FALSE, fname); } } if (jk_shm_map == NULL || jk_shm_map == INVALID_HANDLE_VALUE) { JK_TRACE_EXIT(l); return -1; } jk_shmem.hdr = (jk_shm_header_t *)MapViewOfFile(jk_shm_map, FILE_MAP_ALL_ACCESS, 0, 0, 0); } else#endif jk_shmem.hdr = (jk_shm_header_t *)calloc(1, jk_shmem.size); if (!jk_shmem.hdr) {#if defined (WIN32) if (jk_shm_map) { CloseHandle(jk_shm_map); jk_shm_map = NULL; }#endif JK_TRACE_EXIT(l); return -1; } if (!jk_shmem.filename) { if (fname) jk_shmem.filename = strdup(fname); else jk_shmem.filename = strdup("memory"); } jk_shmem.fd = 0; jk_shmem.attached = attached; if (!attached) { 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; } else { jk_shmem.hdr->h.data.childs++; /* * 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 (jk_shmem.hdr->h.data.childs > 1) { if (JK_IS_DEBUG_LEVEL(l)) { jk_log(l, JK_LOG_DEBUG, "Reseting the shared memory for child %d", jk_shmem.hdr->h.data.childs); } } jk_shmem.hdr->h.data.pos = 0; jk_shmem.hdr->h.data.workers = 0; } JK_INIT_CS(&(jk_shmem.cs), rc); if (JK_IS_DEBUG_LEVEL(l)) jk_log(l, JK_LOG_DEBUG, "%s shared memory size=%u free=%u addr=%#lx", attached ? "Attached" : "Initialized", jk_shmem.size, jk_shmem.hdr->h.data.size, jk_shmem.hdr); JK_TRACE_EXIT(l); return 0;}int jk_shm_attach(const char *fname, size_t sz, jk_logger_t *l){ JK_TRACE_ENTER(l); if (!jk_shm_open(fname, sz, l)) { if (!jk_shmem.attached) { jk_shmem.attached = 1; if (JK_IS_DEBUG_LEVEL(l)) { jk_log(l, JK_LOG_DEBUG, "Attached shared memory [%d] size=%u free=%u addr=%#lx", jk_shmem.hdr->h.data.childs, jk_shmem.hdr->h.data.size, jk_shmem.hdr->h.data.size - jk_shmem.hdr->h.data.pos, jk_shmem.hdr); } } JK_TRACE_EXIT(l); return 0; } else { JK_TRACE_EXIT(l); return -1; }}void jk_shm_close(){ if (jk_shmem.hdr) { int rc;#if defined (WIN32) if (jk_shm_map) { --jk_shmem.hdr->h.data.childs; UnmapViewOfFile(jk_shmem.hdr); CloseHandle(jk_shm_map); jk_shm_map = NULL; } else#endif free(jk_shmem.hdr); JK_DELETE_CS(&(jk_shmem.cs), rc); } jk_shmem.hdr = NULL; if (jk_shmem.filename) { free(jk_shmem.filename); jk_shmem.filename = NULL; }}#else#include <unistd.h>#include <fcntl.h>#include <errno.h>#include <sys/stat.h>#include <sys/mman.h>#include <sys/uio.h>#ifndef MAP_FAILED#define MAP_FAILED (-1)#endif#ifndef MAP_FILE#define MAP_FILE (0)#endifstatic int do_shm_open_lock(const char *fname, int attached, jk_logger_t *l){ int rc; char flkname[256];#ifdef AS400_UTF8 char *wptr;#endif JK_TRACE_ENTER(l); if (attached && jk_shmem.lockname) {#ifdef JK_SHM_LOCK_REOPEN jk_shmem.fd_lock = open(jk_shmem.lockname, O_RDWR, 0666);#else errno = EINVAL;#endif if (jk_shmem.fd_lock == -1) { rc = errno; JK_TRACE_EXIT(l); return rc; } if (JK_IS_DEBUG_LEVEL(l)) jk_log(l, JK_LOG_DEBUG, "Duplicated shared memory lock %s", jk_shmem.lockname); JK_TRACE_EXIT(l); return 0; } if (!jk_shmem.lockname) {#ifdef JK_SHM_LOCK_REOPEN int i; jk_shmem.fd_lock = -1; mode_t mask = umask(0); for (i = 0; i < 8; i++) { strcpy(flkname, "/tmp/jkshmlock.XXXXXX"); if (mktemp(flkname)) { jk_shmem.fd_lock = open(flkname, O_RDWR|O_CREAT|O_TRUNC, 0666); if (jk_shmem.fd_lock >= 0) break; } } umask(mask);#else strcpy(flkname, fname); strcat(flkname, ".lock");#ifdef AS400_UTF8 wptr = (char *)malloc(strlen(flkname) + 1); jk_ascii2ebcdic((char *)flkname, wptr); jk_shmem.fd_lock = open(wptr, O_RDWR|O_CREAT|O_TRUNC, 0666); free(wptr);#else jk_shmem.fd_lock = open(flkname, O_RDWR|O_CREAT|O_TRUNC, 0666);#endif#endif if (jk_shmem.fd_lock == -1) { rc = errno; JK_TRACE_EXIT(l); return rc; } jk_shmem.lockname = strdup(flkname); } else { /* Nothing to do */ JK_TRACE_EXIT(l); return 0; } if (ftruncate(jk_shmem.fd_lock, 1)) { rc = errno; close(jk_shmem.fd_lock); jk_shmem.fd_lock = -1; JK_TRACE_EXIT(l); return rc; } if (lseek(jk_shmem.fd_lock, 0, SEEK_SET) != 0) { rc = errno; close(jk_shmem.fd_lock); jk_shmem.fd_lock = -1; return rc; } if (JK_IS_DEBUG_LEVEL(l)) jk_log(l, JK_LOG_DEBUG, "Opened shared memory lock %s", jk_shmem.lockname); JK_TRACE_EXIT(l); return 0;}static int do_shm_open(const char *fname, int attached, size_t sz, jk_logger_t *l){ int rc; int fd; void *base;#ifdef AS400_UTF8 char *wptr;#endif
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?