#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-
+#include <limits.h>
#include "private.h"
#include "smpi_mpi_dt_private.h"
#include "mc/mc.h"
XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_mpi_dt, smpi,
"Logging specific to SMPI (datatype)");
+#define INTSIZEDCHAR (sizeof(int)*CHAR_BIT-1)/3 + 3
xbt_dict_t smpi_type_keyvals = NULL;
int type_keyval_id=0;//avoid collisions
int flag;
xbt_dict_foreach((*type)->attributes, cursor, key, value){
smpi_type_key_elem elem = xbt_dict_get_or_null(smpi_type_keyvals, (const char*)key);
- if(elem)
+ if(elem && elem->delete_fn)
elem->delete_fn(*type, atoi((const char*)key), &value, &flag);
}
}
}
int smpi_type_attr_delete(MPI_Datatype type, int keyval){
- char* tmpkey=xbt_malloc(sizeof(int));
+ char* tmpkey=xbt_malloc(INTSIZEDCHAR);
sprintf(tmpkey, "%d", keyval);
smpi_type_key_elem elem = xbt_dict_get_or_null(smpi_type_keyvals, (const char*)tmpkey);
if(!elem)
return MPI_ERR_ARG;
xbt_dict_remove(type->attributes, (const char*)tmpkey);
+ xbt_free(tmpkey);
return MPI_SUCCESS;
}
int smpi_type_attr_get(MPI_Datatype type, int keyval, void* attr_value, int* flag){
- char* tmpkey=xbt_malloc(sizeof(int));
+ char* tmpkey=xbt_malloc(INTSIZEDCHAR);
sprintf(tmpkey, "%d", keyval);
smpi_type_key_elem elem = xbt_dict_get_or_null(smpi_type_keyvals, (const char*)tmpkey);
if(!elem)
return MPI_SUCCESS;
}
TRY {
- char* tmpkey=xbt_malloc(sizeof(int));
+ char* tmpkey=xbt_malloc(INTSIZEDCHAR);
sprintf(tmpkey, "%d", keyval);
*(void**)attr_value = xbt_dict_get(type->attributes, (const char*)tmpkey);
*flag=1;
*flag=0;
xbt_ex_free(ex);
}
+ xbt_free(tmpkey);
return MPI_SUCCESS;
}
int smpi_type_attr_put(MPI_Datatype type, int keyval, void* attr_value){
if(!smpi_type_keyvals)
smpi_type_keyvals = xbt_dict_new();
- char* tmpkey=xbt_malloc(sizeof(int));
+ char* tmpkey=xbt_malloc(INTSIZEDCHAR);
sprintf(tmpkey, "%d", keyval);
smpi_type_key_elem elem = xbt_dict_get_or_null(smpi_type_keyvals, (const char*)tmpkey);
if(!elem )
type->attributes=xbt_dict_new();
xbt_dict_set(type->attributes, (const char*)tmpkey, attr_value, NULL);
+ xbt_free(tmpkey);
return MPI_SUCCESS;
}
value->delete_fn=delete_fn;
*keyval = type_keyval_id;
- char* tmpkey=xbt_malloc(sizeof(int));
+ char* tmpkey=xbt_malloc(INTSIZEDCHAR);
sprintf(tmpkey, "%d", *keyval);
xbt_dict_set(smpi_type_keyvals,(const char*)tmpkey,(void*)value, NULL);
type_keyval_id++;
+ xbt_free(tmpkey);
return MPI_SUCCESS;
}
smpi_type_key_elem elem = xbt_dict_get_or_null(smpi_type_keyvals, (const char*)keyval);
if(!elem)
return MPI_ERR_ARG;
- char* tmpkey=xbt_malloc(sizeof(int));
+ char* tmpkey=xbt_malloc(INTSIZEDCHAR);
sprintf(tmpkey, "%d", *keyval);
xbt_dict_remove(smpi_type_keyvals, (const char*)tmpkey);
xbt_free(elem);
+ xbt_free(tmpkey);
return MPI_SUCCESS;
}