|
|
|
@ -148,44 +148,58 @@ grpc_channel_args *grpc_channel_args_set_compression_algorithm( |
|
|
|
|
return grpc_channel_args_copy_and_add(a, &tmp, 1); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** Returns the compression algorithm's enabled states bitset from \a a. If not
|
|
|
|
|
* found, return a biset with all algorithms enabled */ |
|
|
|
|
static gpr_uint32 find_compression_algorithm_states_bitset( |
|
|
|
|
const grpc_channel_args *a) { |
|
|
|
|
gpr_uint32 states_bitset = (1u << GRPC_COMPRESS_ALGORITHMS_COUNT) - 1; |
|
|
|
|
/** Returns 1 if the argument for compression algorithm's enabled states bitset
|
|
|
|
|
* was found in \a a, returning the arg's value in \a states. Otherwise, returns |
|
|
|
|
* 0. */ |
|
|
|
|
static int find_compression_algorithm_states_bitset( |
|
|
|
|
const grpc_channel_args *a, int **states_arg) { |
|
|
|
|
if (a != NULL) { |
|
|
|
|
size_t i; |
|
|
|
|
for (i = 0; i < a->num_args; ++i) { |
|
|
|
|
if (a->args[i].type == GRPC_ARG_INTEGER && |
|
|
|
|
!strcmp(GRPC_COMPRESSION_ALGORITHM_STATE_ARG, a->args[i].key)) { |
|
|
|
|
states_bitset = a->args[i].value.integer; |
|
|
|
|
break; |
|
|
|
|
*states_arg = &a->args[i].value.integer; |
|
|
|
|
return 1; /* GPR_TRUE */ |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
return states_bitset; |
|
|
|
|
return 0; /* GPR_FALSE */ |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
grpc_channel_args *grpc_channel_args_compression_algorithm_set_state( |
|
|
|
|
grpc_channel_args *a, |
|
|
|
|
grpc_compression_algorithm algorithm, |
|
|
|
|
int state) { |
|
|
|
|
gpr_uint32 states_bitset = find_compression_algorithm_states_bitset(a); |
|
|
|
|
grpc_arg tmp; |
|
|
|
|
int *states_arg; |
|
|
|
|
grpc_channel_args *result = a; |
|
|
|
|
const int states_arg_found = |
|
|
|
|
find_compression_algorithm_states_bitset(a, &states_arg); |
|
|
|
|
|
|
|
|
|
if (!states_arg_found) { |
|
|
|
|
/* create a new arg */ |
|
|
|
|
grpc_arg tmp; |
|
|
|
|
tmp.type = GRPC_ARG_INTEGER; |
|
|
|
|
tmp.key = GRPC_COMPRESSION_ALGORITHM_STATE_ARG; |
|
|
|
|
states_arg = &tmp.value.integer; |
|
|
|
|
result = grpc_channel_args_copy_and_add(a, &tmp, 1); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* update either the new arg's value or the already present one */ |
|
|
|
|
if (state != 0) { |
|
|
|
|
GPR_BITSET(&states_bitset, algorithm); |
|
|
|
|
GPR_BITSET(states_arg, algorithm); |
|
|
|
|
} else { |
|
|
|
|
GPR_BITCLEAR(&states_bitset, algorithm); |
|
|
|
|
GPR_BITCLEAR(states_arg, algorithm); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
tmp.type = GRPC_ARG_INTEGER; |
|
|
|
|
tmp.key = GRPC_COMPRESSION_ALGORITHM_STATE_ARG; |
|
|
|
|
tmp.value.integer = states_bitset; |
|
|
|
|
return grpc_channel_args_copy_and_add(a, &tmp, 1); |
|
|
|
|
return result; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
int grpc_channel_args_compression_algorithm_get_states( |
|
|
|
|
const grpc_channel_args *a) { |
|
|
|
|
return find_compression_algorithm_states_bitset(a); |
|
|
|
|
int *states_arg; |
|
|
|
|
if (find_compression_algorithm_states_bitset(a, &states_arg)) { |
|
|
|
|
return *states_arg; |
|
|
|
|
} else { |
|
|
|
|
return (1u << GRPC_COMPRESS_ALGORITHMS_COUNT) - 1; /* All algs. enabled */ |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|