+int smpi_comm_keyval_create(MPI_Comm_copy_attr_function* copy_fn, MPI_Comm_delete_attr_function* delete_fn, int* keyval, void* extra_state){
+
+ if(!smpi_comm_keyvals)
+ smpi_comm_keyvals = xbt_dict_new();
+
+ smpi_comm_key_elem value = (smpi_comm_key_elem) xbt_new0(s_smpi_mpi_comm_key_elem_t,1);
+
+ value->copy_fn=copy_fn;
+ value->delete_fn=delete_fn;
+
+ *keyval = comm_keyval_id;
+ xbt_dict_set_ext(smpi_comm_keyvals, (const char*)keyval, sizeof(int),(void*)value, NULL);
+ comm_keyval_id++;
+ return MPI_SUCCESS;
+}
+
+int smpi_comm_keyval_free(int* keyval){
+ smpi_comm_key_elem elem = xbt_dict_get_or_null_ext(smpi_comm_keyvals, (const char*)keyval, sizeof(int));
+ if(!elem){
+ return MPI_ERR_ARG;
+ }
+ xbt_dict_remove_ext(smpi_comm_keyvals, (const char*)keyval, sizeof(int));
+ xbt_free(elem);
+ return MPI_SUCCESS;
+}