nghtp2_hd: Calculate hash values once
This commit is contained in:
parent
49e3fd6862
commit
6ccf06c6da
|
@ -126,7 +126,8 @@ static uint32_t hash(const uint8_t *s, size_t n)
|
||||||
|
|
||||||
int nghttp2_hd_entry_init(nghttp2_hd_entry *ent, uint8_t flags,
|
int nghttp2_hd_entry_init(nghttp2_hd_entry *ent, uint8_t flags,
|
||||||
uint8_t *name, size_t namelen,
|
uint8_t *name, size_t namelen,
|
||||||
uint8_t *value, size_t valuelen)
|
uint8_t *value, size_t valuelen,
|
||||||
|
uint32_t name_hash, uint32_t value_hash)
|
||||||
{
|
{
|
||||||
int rv = 0;
|
int rv = 0;
|
||||||
|
|
||||||
|
@ -167,16 +168,10 @@ int nghttp2_hd_entry_init(nghttp2_hd_entry *ent, uint8_t flags,
|
||||||
ent->nv.valuelen = valuelen;
|
ent->nv.valuelen = valuelen;
|
||||||
ent->ref = 1;
|
ent->ref = 1;
|
||||||
ent->flags = flags;
|
ent->flags = flags;
|
||||||
if(ent->nv.name) {
|
|
||||||
ent->name_hash = hash(ent->nv.name, ent->nv.namelen);
|
ent->name_hash = name_hash;
|
||||||
} else {
|
ent->value_hash = value_hash;
|
||||||
ent->name_hash = 0;
|
|
||||||
}
|
|
||||||
if(ent->nv.value) {
|
|
||||||
ent->value_hash = hash(ent->nv.value, ent->nv.valuelen);
|
|
||||||
} else {
|
|
||||||
ent->value_hash = 0;
|
|
||||||
}
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
fail2:
|
fail2:
|
||||||
|
@ -753,6 +748,8 @@ static int emit_newname_block(nghttp2_bufs *bufs, const nghttp2_nv *nv,
|
||||||
|
|
||||||
static nghttp2_hd_entry* add_hd_table_incremental(nghttp2_hd_context *context,
|
static nghttp2_hd_entry* add_hd_table_incremental(nghttp2_hd_context *context,
|
||||||
const nghttp2_nv *nv,
|
const nghttp2_nv *nv,
|
||||||
|
uint32_t name_hash,
|
||||||
|
uint32_t value_hash,
|
||||||
uint8_t entry_flags)
|
uint8_t entry_flags)
|
||||||
{
|
{
|
||||||
int rv;
|
int rv;
|
||||||
|
@ -787,7 +784,8 @@ static nghttp2_hd_entry* add_hd_table_incremental(nghttp2_hd_context *context,
|
||||||
}
|
}
|
||||||
|
|
||||||
rv = nghttp2_hd_entry_init(new_ent, entry_flags,
|
rv = nghttp2_hd_entry_init(new_ent, entry_flags,
|
||||||
nv->name, nv->namelen, nv->value, nv->valuelen);
|
nv->name, nv->namelen, nv->value, nv->valuelen,
|
||||||
|
name_hash, value_hash);
|
||||||
if(rv != 0) {
|
if(rv != 0) {
|
||||||
free(new_ent);
|
free(new_ent);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -837,12 +835,11 @@ typedef struct {
|
||||||
} search_result;
|
} search_result;
|
||||||
|
|
||||||
static search_result search_hd_table(nghttp2_hd_context *context,
|
static search_result search_hd_table(nghttp2_hd_context *context,
|
||||||
const nghttp2_nv *nv)
|
const nghttp2_nv *nv,
|
||||||
|
uint32_t name_hash, uint32_t value_hash)
|
||||||
{
|
{
|
||||||
search_result res = { -1, 0 };
|
search_result res = { -1, 0 };
|
||||||
size_t i;
|
size_t i;
|
||||||
uint32_t name_hash = hash(nv->name, nv->namelen);
|
|
||||||
uint32_t value_hash = hash(nv->value, nv->valuelen);
|
|
||||||
int use_index = (nv->flags & NGHTTP2_NV_FLAG_NO_INDEX) == 0;
|
int use_index = (nv->flags & NGHTTP2_NV_FLAG_NO_INDEX) == 0;
|
||||||
|
|
||||||
for(i = 0; i < NGHTTP2_STATIC_TABLE_LENGTH; ++i) {
|
for(i = 0; i < NGHTTP2_STATIC_TABLE_LENGTH; ++i) {
|
||||||
|
@ -977,6 +974,8 @@ static int deflate_nv(nghttp2_hd_deflater *deflater,
|
||||||
search_result res;
|
search_result res;
|
||||||
ssize_t idx = -1;
|
ssize_t idx = -1;
|
||||||
int incidx = 0;
|
int incidx = 0;
|
||||||
|
uint32_t name_hash = hash(nv->name, nv->namelen);
|
||||||
|
uint32_t value_hash = hash(nv->value, nv->valuelen);
|
||||||
|
|
||||||
DEBUGF(fprintf(stderr, "deflatehd: deflating "));
|
DEBUGF(fprintf(stderr, "deflatehd: deflating "));
|
||||||
DEBUGF(fwrite(nv->name, nv->namelen, 1, stderr));
|
DEBUGF(fwrite(nv->name, nv->namelen, 1, stderr));
|
||||||
|
@ -984,7 +983,8 @@ static int deflate_nv(nghttp2_hd_deflater *deflater,
|
||||||
DEBUGF(fwrite(nv->value, nv->valuelen, 1, stderr));
|
DEBUGF(fwrite(nv->value, nv->valuelen, 1, stderr));
|
||||||
DEBUGF(fprintf(stderr, "\n"));
|
DEBUGF(fprintf(stderr, "\n"));
|
||||||
|
|
||||||
res = search_hd_table(&deflater->ctx, nv);
|
|
||||||
|
res = search_hd_table(&deflater->ctx, nv, name_hash, value_hash);
|
||||||
|
|
||||||
idx = res.index;
|
idx = res.index;
|
||||||
|
|
||||||
|
@ -1012,9 +1012,11 @@ static int deflate_nv(nghttp2_hd_deflater *deflater,
|
||||||
nv_indname = *nv;
|
nv_indname = *nv;
|
||||||
nv_indname.name = nghttp2_hd_table_get(&deflater->ctx, idx)->nv.name;
|
nv_indname.name = nghttp2_hd_table_get(&deflater->ctx, idx)->nv.name;
|
||||||
new_ent = add_hd_table_incremental(&deflater->ctx, &nv_indname,
|
new_ent = add_hd_table_incremental(&deflater->ctx, &nv_indname,
|
||||||
|
name_hash, value_hash,
|
||||||
NGHTTP2_HD_FLAG_VALUE_ALLOC);
|
NGHTTP2_HD_FLAG_VALUE_ALLOC);
|
||||||
} else {
|
} else {
|
||||||
new_ent = add_hd_table_incremental(&deflater->ctx, nv,
|
new_ent = add_hd_table_incremental(&deflater->ctx, nv,
|
||||||
|
name_hash, value_hash,
|
||||||
NGHTTP2_HD_FLAG_NAME_ALLOC |
|
NGHTTP2_HD_FLAG_NAME_ALLOC |
|
||||||
NGHTTP2_HD_FLAG_VALUE_ALLOC);
|
NGHTTP2_HD_FLAG_VALUE_ALLOC);
|
||||||
}
|
}
|
||||||
|
@ -1383,7 +1385,10 @@ static int hd_inflate_commit_newname(nghttp2_hd_inflater *inflater,
|
||||||
management. */
|
management. */
|
||||||
ent_flags = NGHTTP2_HD_FLAG_NAME_ALLOC | NGHTTP2_HD_FLAG_NAME_GIFT;
|
ent_flags = NGHTTP2_HD_FLAG_NAME_ALLOC | NGHTTP2_HD_FLAG_NAME_GIFT;
|
||||||
|
|
||||||
new_ent = add_hd_table_incremental(&inflater->ctx, &nv, ent_flags);
|
new_ent = add_hd_table_incremental(&inflater->ctx, &nv,
|
||||||
|
hash(nv.name, nv.namelen),
|
||||||
|
hash(nv.value, nv.valuelen),
|
||||||
|
ent_flags);
|
||||||
|
|
||||||
if(new_ent) {
|
if(new_ent) {
|
||||||
emit_indexed_header(nv_out, new_ent);
|
emit_indexed_header(nv_out, new_ent);
|
||||||
|
@ -1453,7 +1458,10 @@ static int hd_inflate_commit_indname(nghttp2_hd_inflater *inflater,
|
||||||
++ent_name->ref;
|
++ent_name->ref;
|
||||||
}
|
}
|
||||||
|
|
||||||
new_ent = add_hd_table_incremental(&inflater->ctx, &nv, ent_flags);
|
new_ent = add_hd_table_incremental(&inflater->ctx, &nv,
|
||||||
|
ent_name->name_hash,
|
||||||
|
hash(nv.value, nv.valuelen),
|
||||||
|
ent_flags);
|
||||||
|
|
||||||
if(!static_name && --ent_name->ref == 0) {
|
if(!static_name && --ent_name->ref == 0) {
|
||||||
nghttp2_hd_entry_free(ent_name);
|
nghttp2_hd_entry_free(ent_name);
|
||||||
|
|
|
@ -168,7 +168,9 @@ struct nghttp2_hd_inflater {
|
||||||
* set in the |flags|, the content pointed by the |name| with length
|
* set in the |flags|, the content pointed by the |name| with length
|
||||||
* |namelen| is copied. Likewise, if NGHTTP2_HD_FLAG_VALUE_ALLOC bit
|
* |namelen| is copied. Likewise, if NGHTTP2_HD_FLAG_VALUE_ALLOC bit
|
||||||
* set in the |flags|, the content pointed by the |value| with length
|
* set in the |flags|, the content pointed by the |value| with length
|
||||||
* |valuelen| is copied.
|
* |valuelen| is copied. The |name_hash| and |value_hash| are hash
|
||||||
|
* value for |name| and |value| respectively. The hash function is
|
||||||
|
* defined in nghttp2_hd.c.
|
||||||
*
|
*
|
||||||
* This function returns 0 if it succeeds, or one of the following
|
* This function returns 0 if it succeeds, or one of the following
|
||||||
* negative error codes:
|
* negative error codes:
|
||||||
|
@ -178,7 +180,8 @@ struct nghttp2_hd_inflater {
|
||||||
*/
|
*/
|
||||||
int nghttp2_hd_entry_init(nghttp2_hd_entry *ent, uint8_t flags,
|
int nghttp2_hd_entry_init(nghttp2_hd_entry *ent, uint8_t flags,
|
||||||
uint8_t *name, size_t namelen,
|
uint8_t *name, size_t namelen,
|
||||||
uint8_t *value, size_t valuelen);
|
uint8_t *value, size_t valuelen,
|
||||||
|
uint32_t name_hash, uint32_t value_hash);
|
||||||
|
|
||||||
void nghttp2_hd_entry_free(nghttp2_hd_entry *ent);
|
void nghttp2_hd_entry_free(nghttp2_hd_entry *ent);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue