int Copy_fn(MPI_Datatype datatype, int key, void *extra_state,
	    void *attr_val_in, void *attr_val_out, int *flag)
{
  ((flat_struct *) attr_val_in)->ref_count += 1;
  *((flat_struct **) attr_val_out) = (flat_struct *) attr_val_in;
  *flag = 1;
  return MPI_SUCCESS;
}

int Delete_fn(MPI_Datatype datatype, int key, void *attr_val, 
	      void *extra_state)
{
  flat_struct *flat_dtype;

  flat_dtype = (flat_struct *) attr_val;
  flat_dtype->ref_count -= 1;
  if (flat_dtype->ref_count == 0) {
    free(flat_dtype->offsets);
    free(flat_dtype->lengths);
    free(flat_dtype);
  }
  return MPI_SUCCESS;
}