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