blob: 8f59b960a8619ae7fb39a13806aaee4c2cbc5364 [file] [log] [blame]
/*
* 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 <mturk@jboss.com> *
* Author: Rainer Jung <rjung@apache.org> *
* Version: $Revision$ *
***************************************************************************/
#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 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;
/* 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 */