|  | @@ -61,14 +61,11 @@ void initialize_resources(void) {
 | 
	
		
			
				|  |  |    gpr_mu_init(&resource_lock);
 | 
	
		
			
				|  |  |    gpr_mu_lock(&resource_lock);
 | 
	
		
			
				|  |  |    GPR_ASSERT(resources == NULL && n_resources == 0 && n_defined_resources == 0);
 | 
	
		
			
				|  |  | -  // 8 seems like a reasonable size for initial number of resources.
 | 
	
		
			
				|  |  | -  n_resources = 8;
 | 
	
		
			
				|  |  | -  resources = gpr_malloc(n_resources * sizeof(resource *));
 | 
	
		
			
				|  |  | -  memset(resources, 0, n_resources * sizeof(resource *));
 | 
	
		
			
				|  |  |    gpr_mu_unlock(&resource_lock);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -// Delete a resource given it's ID. Must be called with resource_lock held.
 | 
	
		
			
				|  |  | +// Delete a resource given it's ID. The ID must be a valid resource ID. Must be
 | 
	
		
			
				|  |  | +// called with resource_lock held.
 | 
	
		
			
				|  |  |  static void delete_resource_locked(size_t rid) {
 | 
	
		
			
				|  |  |    GPR_ASSERT(resources[rid] != NULL);
 | 
	
		
			
				|  |  |    gpr_free(resources[rid]->name);
 | 
	
	
		
			
				|  | @@ -222,12 +219,14 @@ size_t allocate_resource(void) {
 | 
	
		
			
				|  |  |    size_t id = n_resources;  // resource ID - initialize to invalid value.
 | 
	
		
			
				|  |  |    // Expand resources if needed.
 | 
	
		
			
				|  |  |    if (n_resources == n_defined_resources) {
 | 
	
		
			
				|  |  | -    resource **new_resources = gpr_malloc(n_resources * 2 * sizeof(resource *));
 | 
	
		
			
				|  |  | +    size_t new_n_resources = n_resources ? n_resources * 2 : 2;
 | 
	
		
			
				|  |  | +    resource **new_resources = gpr_malloc(new_n_resources * sizeof(resource *));
 | 
	
		
			
				|  |  |      memcpy(new_resources, resources, n_resources * sizeof(resource *));
 | 
	
		
			
				|  |  | -    memset(new_resources + n_resources, 0, n_resources * sizeof(resource *));
 | 
	
		
			
				|  |  | +    memset(new_resources + n_resources, 0,
 | 
	
		
			
				|  |  | +           (new_n_resources - n_resources) * sizeof(resource *));
 | 
	
		
			
				|  |  |      gpr_free(resources);
 | 
	
		
			
				|  |  |      resources = new_resources;
 | 
	
		
			
				|  |  | -    n_resources *= 2;
 | 
	
		
			
				|  |  | +    n_resources = new_n_resources;
 | 
	
		
			
				|  |  |      id = n_defined_resources;
 | 
	
		
			
				|  |  |    } else {
 | 
	
		
			
				|  |  |      GPR_ASSERT(n_defined_resources < n_resources);
 | 
	
	
		
			
				|  | @@ -273,11 +272,9 @@ void census_delete_resource(int32_t rid) {
 | 
	
		
			
				|  |  |  int32_t census_resource_id(const char *name) {
 | 
	
		
			
				|  |  |    gpr_mu_lock(&resource_lock);
 | 
	
		
			
				|  |  |    for (int32_t id = 0; (size_t)id < n_resources; id++) {
 | 
	
		
			
				|  |  | -    if (resources[id] != NULL) {
 | 
	
		
			
				|  |  | -      if (strcmp(resources[id]->name, name) == 0) {
 | 
	
		
			
				|  |  | -        gpr_mu_unlock(&resource_lock);
 | 
	
		
			
				|  |  | -        return id;
 | 
	
		
			
				|  |  | -      }
 | 
	
		
			
				|  |  | +    if (resources[id] != NULL && strcmp(resources[id]->name, name) == 0) {
 | 
	
		
			
				|  |  | +      gpr_mu_unlock(&resource_lock);
 | 
	
		
			
				|  |  | +      return id;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |    gpr_mu_unlock(&resource_lock);
 |