diff options
author | Igor Sysoev <igor@sysoev.ru> | 2017-01-17 20:00:00 +0300 |
---|---|---|
committer | Igor Sysoev <igor@sysoev.ru> | 2017-01-17 20:00:00 +0300 |
commit | 16cbf3c076a0aca6d47adaf3f719493674cf2363 (patch) | |
tree | e6530480020f62a2bdbf249988ec3e2a751d3927 /src/nxt_cache.h | |
download | unit-16cbf3c076a0aca6d47adaf3f719493674cf2363.tar.gz unit-16cbf3c076a0aca6d47adaf3f719493674cf2363.tar.bz2 |
Initial version.
Diffstat (limited to 'src/nxt_cache.h')
-rw-r--r-- | src/nxt_cache.h | 122 |
1 files changed, 122 insertions, 0 deletions
diff --git a/src/nxt_cache.h b/src/nxt_cache.h new file mode 100644 index 00000000..74cdffb2 --- /dev/null +++ b/src/nxt_cache.h @@ -0,0 +1,122 @@ + +/* + * 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_event_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_ */ |