123 lines
3.4 KiB
C
123 lines
3.4 KiB
C
|
|
/*
|
|
* Copyright (C) Igor Sysoev
|
|
* Copyright (C) NGINX, Inc.
|
|
*/
|
|
|
|
#ifndef _NXT_CACHE_INCLUDED_
|
|
#define _NXT_CACHE_INCLUDED_
|
|
|
|
|
|
typedef struct nxt_cache_query_s nxt_cache_query_t;
|
|
typedef struct nxt_cache_query_wait_s nxt_cache_query_wait_t;
|
|
|
|
|
|
typedef struct {
|
|
uint32_t shared; /* 1 bit */
|
|
nxt_thread_spinlock_t lock;
|
|
|
|
nxt_lvlhsh_t lvlhsh;
|
|
const nxt_lvlhsh_proto_t *proto;
|
|
void *pool;
|
|
|
|
nxt_queue_t expiry_queue;
|
|
|
|
nxt_queue_t free_nodes;
|
|
uint32_t nfree_nodes;
|
|
|
|
uint32_t nfree_query_wait;
|
|
nxt_cache_query_wait_t *free_query_wait;
|
|
|
|
uint64_t start_time;
|
|
|
|
/* STUB: use nxt_lvlhsh_proto_t */
|
|
void *(*alloc)(void *data, size_t size);
|
|
void (*free)(void *data, void *p);
|
|
void *data;
|
|
|
|
nxt_work_handler_t delete_handler;
|
|
} nxt_cache_t;
|
|
|
|
|
|
typedef struct {
|
|
u_char *key_data;
|
|
|
|
uint16_t key_len; /* 16 bits */
|
|
uint8_t uses; /* 8 bits */
|
|
uint8_t updating:1;
|
|
uint8_t deleted:1;
|
|
|
|
uint32_t count;
|
|
|
|
/* Times relative to the cache->start_time. */
|
|
uint32_t expiry;
|
|
uint32_t accessed;
|
|
|
|
nxt_off_t size;
|
|
|
|
nxt_queue_link_t link;
|
|
|
|
nxt_cache_query_wait_t *waiting;
|
|
} nxt_cache_node_t;
|
|
|
|
|
|
struct nxt_cache_query_wait_s {
|
|
nxt_cache_query_t *query;
|
|
nxt_cache_query_wait_t *next;
|
|
|
|
uint8_t busy; /* 1 bit */
|
|
uint8_t deleted; /* 1 bit */
|
|
|
|
nxt_pid_t pid;
|
|
nxt_event_engine_t *engine;
|
|
nxt_work_handler_t handler;
|
|
nxt_cache_t *cache;
|
|
};
|
|
|
|
|
|
typedef struct {
|
|
nxt_work_handler_t nocache_handler;
|
|
nxt_work_handler_t ready_handler;
|
|
nxt_work_handler_t stale_handler;
|
|
nxt_work_handler_t update_stale_handler;
|
|
nxt_work_handler_t update_handler;
|
|
nxt_work_handler_t timeout_handler;
|
|
nxt_work_handler_t error_handler;
|
|
} nxt_cache_query_state_t;
|
|
|
|
|
|
struct nxt_cache_query_s {
|
|
u_char *key_data;
|
|
|
|
uint16_t key_len; /* 16 bits */
|
|
#if (NXT_64_BIT)
|
|
uint8_t hold; /* 1 bit */
|
|
uint8_t use_stale; /* 1 bit */
|
|
uint8_t update_stale; /* 1 bit */
|
|
uint8_t stale; /* 1 bit */
|
|
#else
|
|
uint8_t hold:1;
|
|
uint8_t use_stale:1;
|
|
uint8_t update_stale:1;
|
|
uint8_t stale:1;
|
|
#endif
|
|
|
|
nxt_cache_node_t *node;
|
|
nxt_cache_query_t *next;
|
|
nxt_cache_query_state_t *state;
|
|
|
|
nxt_time_t now;
|
|
|
|
nxt_msec_t timeout;
|
|
nxt_timer_t timer;
|
|
};
|
|
|
|
|
|
NXT_EXPORT void nxt_cache_init(nxt_cache_t *cache);
|
|
NXT_EXPORT void nxt_cache_query(nxt_cache_t *cache, nxt_cache_query_t *q);
|
|
NXT_EXPORT void nxt_cache_release(nxt_cache_t *cache, nxt_cache_query_t *q);
|
|
NXT_EXPORT nxt_int_t nxt_cache_update(nxt_cache_t *cache, nxt_cache_query_t *q);
|
|
|
|
|
|
#endif /* _NXT_CACHE_INCLUDED_ */
|