/* * 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 object header file * * Author: Mladen Turk * * Author: Rainer Jung * * Version: $Revision: 550272 $ * ***************************************************************************/ #ifndef _JK_SHM_H #define _JK_SHM_H #include "jk_global.h" #include "jk_pool.h" #include "jk_util.h" #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ /** * @file jk_shm.h * @brief Jk shared memory management * * */ #define JK_SHM_MAJOR '1' #define JK_SHM_MINOR '2' #define JK_SHM_STR_SIZ 63 #define JK_SHM_URI_SIZ 127 #define JK_SHM_DYNAMIC 16 #define JK_SHM_MAGIC '!', 'J', 'K', 'S', 'H', 'M', JK_SHM_MAJOR, JK_SHM_MINOR #define JK_SHM_MAGIC_SIZ 8 /* Really huge numbers, but 64 workers should be enough */ #define JK_SHM_MAX_WORKERS 64 #define JK_SHM_WORKER_SIZE JK_SHM_ALIGN(sizeof(jk_shm_worker_t)) #define JK_SHM_DEF_SIZE (JK_SHM_MAX_WORKERS * JK_SHM_WORKER_SIZE) #define JK_SHM_ALIGNMENT 64 #define JK_SHM_ALIGN(x) JK_ALIGN(x, JK_SHM_ALIGNMENT) /** jk shm worker record structure */ struct jk_shm_worker { int id; /* Sequence counter starting at 0 and increasing * every time we change the config */ volatile unsigned int sequence; /* Number of currently busy channels */ volatile int busy; /* Maximum number of busy channels */ volatile int max_busy; /* Number of currently connected channels */ volatile int connected; /* worker name */ char name[JK_SHM_STR_SIZ+1]; /* route */ char route[JK_SHM_STR_SIZ+1]; /* worker domain */ char domain[JK_SHM_STR_SIZ+1]; /* worker redirect route */ char redirect[JK_SHM_STR_SIZ+1]; /* worker distance */ volatile int distance; /* current activation state (config) of the worker */ volatile int activation; /* current error state (runtime) of the worker */ volatile int state; /* Current lb factor */ volatile int lb_factor; /* Current lb reciprocal factor */ volatile jk_uint64_t lb_mult; /* Current lb value */ volatile jk_uint64_t lb_value; int sticky_session; int sticky_session_force; int recover_wait_time; int max_reply_timeouts; int retries; int lbmethod; int lblock; unsigned int max_packet_size; /* Statistical data */ volatile time_t error_time; /* Service transfer rate time */ volatile time_t last_maintain_time; /* Number of bytes read from remote */ volatile jk_uint64_t readed; /* Number of bytes transferred to remote */ volatile jk_uint64_t transferred; /* Number of times the worker was elected */ volatile jk_uint64_t elected; /* Number of times the worker was elected - snapshot during maintenance */ volatile jk_uint64_t elected_snapshot; /* Number of non 200 responses */ volatile jk_uint32_t errors; /* Number of recovery attempts */ volatile jk_uint32_t recoveries; /* Number of recovery failures */ volatile jk_uint32_t recovery_errors; /* Decayed number of reply_timeout errors */ volatile jk_uint32_t reply_timeouts; /* Number of client errors */ volatile jk_uint32_t client_errors; }; typedef struct jk_shm_worker jk_shm_worker_t; const char *jk_shm_name(void); /* Open the shared memory creating file if needed */ int jk_shm_open(const char *fname, size_t sz, jk_logger_t *l); /* Close the shared memory */ void jk_shm_close(void); /* Attach the shared memory in child process. * File has to be opened in parent. */ int jk_shm_attach(const char *fname, size_t sz, jk_logger_t *l); /* allocate shm memory * If there is no shm present the pool will be used instead */ void *jk_shm_alloc(jk_pool_t *p, size_t size); /* allocate shm worker record * If there is no shm present the pool will be used instead */ jk_shm_worker_t *jk_shm_alloc_worker(jk_pool_t *p); /* Return workers.properties last modified time */ time_t jk_shm_get_workers_time(void); /* Set workers.properties last modified time */ void jk_shm_set_workers_time(time_t t); /* Check if the shared memory has been modified * by some other process. */ int jk_shm_is_modified(void); /* Synchronize access and modification time. * This function should be called when the shared memory * is modified and after we update the config acording * to the current shared memory data. */ void jk_shm_sync_access_time(void); /* Lock shared memory for thread safe access */ int jk_shm_lock(void); /* Unlock shared memory for thread safe access */ int jk_shm_unlock(void); #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* _JK_SHM_H */