xref: /unit/src/nxt_cache.h (revision 6:6b3ce47b7663)
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