|  | @@ -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 */
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  |  }
 |