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;
}
