@ -212,10 +212,6 @@ static uint32_t prepare_space_for_new_elem(grpc_chttp2_hpack_compressor* c,
return new_index ;
}
/* dummy function */
static void add_nothing ( grpc_chttp2_hpack_compressor * c , grpc_mdelem elem ,
size_t elem_size ) { }
// Add a key to the dynamic table. Both key and value will be added to table at
// the decoder.
static void add_key_with_index ( grpc_chttp2_hpack_compressor * c ,
@ -524,17 +520,22 @@ static void hpack_enc(grpc_chttp2_hpack_compressor* c, grpc_mdelem elem,
uint32_t indices_key ;
/* should this elem be in the table? */
size_t decoder_space_usage =
const size_t decoder_space_usage =
grpc_chttp2_get_size_in_hpack_table ( elem , st - > use_true_binary_metadata ) ;
bool should_add_elem = elem_interned & &
decoder_space_usage < MAX_DECODER_SPACE_USAGE & &
c - > filter_elems [ HASH_FRAGMENT_1 ( elem_hash ) ] > =
c - > filter_elems_sum / ONE_ON_ADD_PROBABILITY ;
void ( * maybe_add ) ( grpc_chttp2_hpack_compressor * , grpc_mdelem , size_t ) =
should_add_elem ? add_elem : add_nothing ;
void ( * emit ) ( grpc_chttp2_hpack_compressor * , uint32_t , grpc_mdelem ,
framer_state * ) =
should_add_elem ? emit_lithdr_incidx : emit_lithdr_noidx ;
const bool should_add_elem = elem_interned & &
decoder_space_usage < MAX_DECODER_SPACE_USAGE & &
c - > filter_elems [ HASH_FRAGMENT_1 ( elem_hash ) ] > =
c - > filter_elems_sum / ONE_ON_ADD_PROBABILITY ;
auto emit_maybe_add = [ & should_add_elem , & elem , & st , & c , & indices_key ,
& decoder_space_usage ] {
if ( should_add_elem ) {
emit_lithdr_incidx ( c , dynidx ( c , indices_key ) , elem , st ) ;
add_elem ( c , elem , decoder_space_usage ) ;
} else {
emit_lithdr_noidx ( c , dynidx ( c , indices_key ) , elem , st ) ;
}
} ;
/* no hits for the elem... maybe there's a key? */
indices_key = c - > indices_keys [ HASH_FRAGMENT_2 ( key_hash ) ] ;
@ -542,8 +543,7 @@ static void hpack_enc(grpc_chttp2_hpack_compressor* c, grpc_mdelem elem,
GRPC_MDKEY ( elem ) ) & &
indices_key > c - > tail_remote_index ) {
/* HIT: key (first cuckoo hash) */
emit ( c , dynidx ( c , indices_key ) , elem , st ) ;
maybe_add ( c , elem , decoder_space_usage ) ;
emit_maybe_add ( ) ;
return ;
}
@ -552,20 +552,23 @@ static void hpack_enc(grpc_chttp2_hpack_compressor* c, grpc_mdelem elem,
GRPC_MDKEY ( elem ) ) & &
indices_key > c - > tail_remote_index ) {
/* HIT: key (first cuckoo hash) */
emit ( c , dynidx ( c , indices_key ) , elem , st ) ;
maybe_add ( c , elem , decoder_space_usage ) ;
emit_maybe_add ( ) ;
return ;
}
/* no elem, key in the table... fall back to literal emission */
bool should_add_key =
const bool should_add_key =
! elem_interned & & decoder_space_usage < MAX_DECODER_SPACE_USAGE ;
emit = ( should_add_elem | | should_add_key ) ? emit_lithdr_incidx_v
: emit_lithdr_noidx_v ;
maybe_add =
should_add_elem ? add_elem : ( should_add_key ? add_key : add_nothing ) ;
emit ( c , 0 , elem , st ) ;
maybe_add ( c , elem , decoder_space_usage ) ;
if ( should_add_elem | | should_add_key ) {
emit_lithdr_incidx_v ( c , 0 , elem , st ) ;
} else {
emit_lithdr_noidx_v ( c , 0 , elem , st ) ;
}
if ( should_add_elem ) {
add_elem ( c , elem , decoder_space_usage ) ;
} else if ( should_add_key ) {
add_key ( c , elem , decoder_space_usage ) ;
}
}
# define STRLEN_LIT(x) (sizeof(x) - 1)