10Sigor@sysoev.ru 20Sigor@sysoev.ru /* 30Sigor@sysoev.ru * Copyright (C) Igor Sysoev 40Sigor@sysoev.ru * Copyright (C) NGINX, Inc. 50Sigor@sysoev.ru */ 60Sigor@sysoev.ru 70Sigor@sysoev.ru #ifndef _NXT_CACHE_INCLUDED_ 80Sigor@sysoev.ru #define _NXT_CACHE_INCLUDED_ 90Sigor@sysoev.ru 100Sigor@sysoev.ru 110Sigor@sysoev.ru typedef struct nxt_cache_query_s nxt_cache_query_t; 120Sigor@sysoev.ru typedef struct nxt_cache_query_wait_s nxt_cache_query_wait_t; 130Sigor@sysoev.ru 140Sigor@sysoev.ru 150Sigor@sysoev.ru typedef struct { 160Sigor@sysoev.ru uint32_t shared; /* 1 bit */ 170Sigor@sysoev.ru nxt_thread_spinlock_t lock; 180Sigor@sysoev.ru 190Sigor@sysoev.ru nxt_lvlhsh_t lvlhsh; 200Sigor@sysoev.ru const nxt_lvlhsh_proto_t *proto; 210Sigor@sysoev.ru void *pool; 220Sigor@sysoev.ru 230Sigor@sysoev.ru nxt_queue_t expiry_queue; 240Sigor@sysoev.ru 250Sigor@sysoev.ru nxt_queue_t free_nodes; 260Sigor@sysoev.ru uint32_t nfree_nodes; 270Sigor@sysoev.ru 280Sigor@sysoev.ru uint32_t nfree_query_wait; 290Sigor@sysoev.ru nxt_cache_query_wait_t *free_query_wait; 300Sigor@sysoev.ru 310Sigor@sysoev.ru uint64_t start_time; 320Sigor@sysoev.ru 330Sigor@sysoev.ru /* STUB: use nxt_lvlhsh_proto_t */ 340Sigor@sysoev.ru void *(*alloc)(void *data, size_t size); 350Sigor@sysoev.ru void (*free)(void *data, void *p); 360Sigor@sysoev.ru void *data; 370Sigor@sysoev.ru 380Sigor@sysoev.ru nxt_work_handler_t delete_handler; 390Sigor@sysoev.ru } nxt_cache_t; 400Sigor@sysoev.ru 410Sigor@sysoev.ru 420Sigor@sysoev.ru typedef struct { 430Sigor@sysoev.ru u_char *key_data; 440Sigor@sysoev.ru 450Sigor@sysoev.ru uint16_t key_len; /* 16 bits */ 460Sigor@sysoev.ru uint8_t uses; /* 8 bits */ 470Sigor@sysoev.ru uint8_t updating:1; 480Sigor@sysoev.ru uint8_t deleted:1; 490Sigor@sysoev.ru 500Sigor@sysoev.ru uint32_t count; 510Sigor@sysoev.ru 520Sigor@sysoev.ru /* Times relative to the cache->start_time. */ 530Sigor@sysoev.ru uint32_t expiry; 540Sigor@sysoev.ru uint32_t accessed; 550Sigor@sysoev.ru 560Sigor@sysoev.ru nxt_off_t size; 570Sigor@sysoev.ru 580Sigor@sysoev.ru nxt_queue_link_t link; 590Sigor@sysoev.ru 600Sigor@sysoev.ru nxt_cache_query_wait_t *waiting; 610Sigor@sysoev.ru } nxt_cache_node_t; 620Sigor@sysoev.ru 630Sigor@sysoev.ru 640Sigor@sysoev.ru struct nxt_cache_query_wait_s { 650Sigor@sysoev.ru nxt_cache_query_t *query; 660Sigor@sysoev.ru nxt_cache_query_wait_t *next; 670Sigor@sysoev.ru 680Sigor@sysoev.ru uint8_t busy; /* 1 bit */ 690Sigor@sysoev.ru uint8_t deleted; /* 1 bit */ 700Sigor@sysoev.ru 710Sigor@sysoev.ru nxt_pid_t pid; 720Sigor@sysoev.ru nxt_event_engine_t *engine; 730Sigor@sysoev.ru nxt_work_handler_t handler; 740Sigor@sysoev.ru nxt_cache_t *cache; 750Sigor@sysoev.ru }; 760Sigor@sysoev.ru 770Sigor@sysoev.ru 780Sigor@sysoev.ru typedef struct { 790Sigor@sysoev.ru nxt_work_handler_t nocache_handler; 800Sigor@sysoev.ru nxt_work_handler_t ready_handler; 810Sigor@sysoev.ru nxt_work_handler_t stale_handler; 820Sigor@sysoev.ru nxt_work_handler_t update_stale_handler; 830Sigor@sysoev.ru nxt_work_handler_t update_handler; 840Sigor@sysoev.ru nxt_work_handler_t timeout_handler; 850Sigor@sysoev.ru nxt_work_handler_t error_handler; 860Sigor@sysoev.ru } nxt_cache_query_state_t; 870Sigor@sysoev.ru 880Sigor@sysoev.ru 890Sigor@sysoev.ru struct nxt_cache_query_s { 900Sigor@sysoev.ru u_char *key_data; 910Sigor@sysoev.ru 920Sigor@sysoev.ru uint16_t key_len; /* 16 bits */ 930Sigor@sysoev.ru #if (NXT_64_BIT) 940Sigor@sysoev.ru uint8_t hold; /* 1 bit */ 950Sigor@sysoev.ru uint8_t use_stale; /* 1 bit */ 960Sigor@sysoev.ru uint8_t update_stale; /* 1 bit */ 970Sigor@sysoev.ru uint8_t stale; /* 1 bit */ 980Sigor@sysoev.ru #else 990Sigor@sysoev.ru uint8_t hold:1; 1000Sigor@sysoev.ru uint8_t use_stale:1; 1010Sigor@sysoev.ru uint8_t update_stale:1; 1020Sigor@sysoev.ru uint8_t stale:1; 1030Sigor@sysoev.ru #endif 1040Sigor@sysoev.ru 1050Sigor@sysoev.ru nxt_cache_node_t *node; 1060Sigor@sysoev.ru nxt_cache_query_t *next; 1070Sigor@sysoev.ru nxt_cache_query_state_t *state; 1080Sigor@sysoev.ru 1090Sigor@sysoev.ru nxt_time_t now; 1100Sigor@sysoev.ru 1110Sigor@sysoev.ru nxt_msec_t timeout; 112*6Sigor@sysoev.ru nxt_timer_t timer; 1130Sigor@sysoev.ru }; 1140Sigor@sysoev.ru 1150Sigor@sysoev.ru 1160Sigor@sysoev.ru NXT_EXPORT void nxt_cache_init(nxt_cache_t *cache); 1170Sigor@sysoev.ru NXT_EXPORT void nxt_cache_query(nxt_cache_t *cache, nxt_cache_query_t *q); 1180Sigor@sysoev.ru NXT_EXPORT void nxt_cache_release(nxt_cache_t *cache, nxt_cache_query_t *q); 1190Sigor@sysoev.ru NXT_EXPORT nxt_int_t nxt_cache_update(nxt_cache_t *cache, nxt_cache_query_t *q); 1200Sigor@sysoev.ru 1210Sigor@sysoev.ru 1220Sigor@sysoev.ru #endif /* _NXT_CACHE_INCLUDED_ */ 123