Commit 230b1f92 authored by Tatsuhiro Tsujikawa's avatar Tatsuhiro Tsujikawa

Use hash table for dynamic table lookup

parent 4ac8edfe
This diff is collapsed.
...@@ -126,15 +126,25 @@ typedef enum { ...@@ -126,15 +126,25 @@ typedef enum {
NGHTTP2_HD_FLAG_VALUE_GIFT = 1 << 3 NGHTTP2_HD_FLAG_VALUE_GIFT = 1 << 3
} nghttp2_hd_flags; } nghttp2_hd_flags;
typedef struct { struct nghttp2_hd_entry;
typedef struct nghttp2_hd_entry nghttp2_hd_entry;
struct nghttp2_hd_entry {
nghttp2_nv nv; nghttp2_nv nv;
/* The next entry which shares same bucket in hash table. */
nghttp2_hd_entry *next;
/* The sequence number. We will increment it by one whenever we
store nghttp2_hd_entry to dynamic header table. */
uint32_t seq;
/* The hash value for header name (nv.name). */
uint32_t hash;
/* nghttp2_token value for nv.name. It could be -1 if we have no /* nghttp2_token value for nv.name. It could be -1 if we have no
token for that header field name. */ token for that header field name. */
int token; int token;
/* Reference count */ /* Reference count */
uint8_t ref; uint8_t ref;
uint8_t flags; uint8_t flags;
} nghttp2_hd_entry; };
typedef struct { typedef struct {
nghttp2_hd_entry **buffer; nghttp2_hd_entry **buffer;
...@@ -183,14 +193,21 @@ typedef struct { ...@@ -183,14 +193,21 @@ typedef struct {
size_t hd_table_bufsize; size_t hd_table_bufsize;
/* The effective header table size. */ /* The effective header table size. */
size_t hd_table_bufsize_max; size_t hd_table_bufsize_max;
/* Next sequence number for nghttp2_hd_entry */
uint32_t next_seq;
/* If inflate/deflate error occurred, this value is set to 1 and /* If inflate/deflate error occurred, this value is set to 1 and
further invocation of inflate/deflate will fail with further invocation of inflate/deflate will fail with
NGHTTP2_ERR_HEADER_COMP. */ NGHTTP2_ERR_HEADER_COMP. */
uint8_t bad; uint8_t bad;
} nghttp2_hd_context; } nghttp2_hd_context;
#define HD_MAP_SIZE 128
typedef struct { nghttp2_hd_entry *table[HD_MAP_SIZE]; } nghttp2_hd_map;
struct nghttp2_hd_deflater { struct nghttp2_hd_deflater {
nghttp2_hd_context ctx; nghttp2_hd_context ctx;
nghttp2_hd_map map;
/* The upper limit of the header table size the deflater accepts. */ /* The upper limit of the header table size the deflater accepts. */
size_t deflate_hd_table_bufsize_max; size_t deflate_hd_table_bufsize_max;
/* Minimum header table size notified in the next context update */ /* Minimum header table size notified in the next context update */
......
...@@ -10,6 +10,17 @@ ...@@ -10,6 +10,17 @@
from __future__ import unicode_literals from __future__ import unicode_literals
import re, sys import re, sys
def hd_map_hash(name):
h = 2166136261
# FNV hash variant: http://isthe.com/chongo/tech/comp/fnv/
for c in name:
h ^= ord(c)
h *= 16777619
h &= 0xffffffff
return h
entries = [] entries = []
for line in sys.stdin: for line in sys.stdin:
m = re.match(r'(\d+)\s+(\S+)\s+(\S.*)?', line) m = re.match(r'(\d+)\s+(\S+)\s+(\S.*)?', line)
...@@ -21,6 +32,6 @@ idx = 0 ...@@ -21,6 +32,6 @@ idx = 0
for i, ent in enumerate(entries): for i, ent in enumerate(entries):
if entries[idx][1] != ent[1]: if entries[idx][1] != ent[1]:
idx = i idx = i
print 'MAKE_STATIC_ENT("{}", "{}", {}),'\ print 'MAKE_STATIC_ENT("{}", "{}", {}, {}u),'\
.format(ent[1], ent[2], entries[idx][0] - 1) .format(ent[1], ent[2], entries[idx][0] - 1, hd_map_hash(ent[1]))
print '};' print '};'
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment