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
-#define CREATE_MPI_DATATYPE(name, type) \
- static s_smpi_mpi_datatype_t mpi_##name = { \
+#define CREATE_MPI_DATATYPE(name, type) \
+ static s_smpi_mpi_datatype_t mpi_##name = { \
(char*) # name, \
- sizeof(type), /* size */ \
- 0, /*was 1 has_subtype*/ \
- 0, /* lb */ \
- sizeof(type), /* ub = lb + size */ \
- DT_FLAG_BASIC, /* flags */ \
- NULL, /* attributes */ \
- NULL, /* pointer on extended struct*/ \
- }; \
+ sizeof(type), /* size */ \
+ 0, /*was 1 has_subtype*/ \
+ 0, /* lb */ \
+ sizeof(type), /* ub = lb + size */ \
+ DT_FLAG_BASIC, /* flags */ \
+ NULL, /* attributes */ \
+ NULL, /* pointer on extended struct*/ \
+ 0 /* in_use counter */ \
+ }; \
MPI_Datatype name = &mpi_##name;
-#define CREATE_MPI_DATATYPE_NULL(name) \
- static s_smpi_mpi_datatype_t mpi_##name = { \
+#define CREATE_MPI_DATATYPE_NULL(name) \
+ static s_smpi_mpi_datatype_t mpi_##name = { \
(char*) # name, \
- 0, /* size */ \
- 0, /*was 1 has_subtype*/ \
- 0, /* lb */ \
- 0, /* ub = lb + size */ \
- DT_FLAG_BASIC, /* flags */ \
- NULL, /* attributes */ \
- NULL /* pointer on extended struct*/ \
- }; \
+ 0, /* size */ \
+ 0, /* was 1 has_subtype*/ \
+ 0, /* lb */ \
+ 0, /* ub = lb + size */ \
+ DT_FLAG_BASIC, /* flags */ \
+ NULL, /* attributes */ \
+ NULL, /* pointer on extended struct*/ \
+ 0 /* in_use counter */ \
+ }; \
MPI_Datatype name = &mpi_##name;
//The following are datatypes for the MPI functions MPI_MAXLOC and MPI_MINLOC.
memcpy((*new_t)->substruct, datatype->substruct, sizeof(s_smpi_mpi_struct_t));
}
if(datatype->name)
- (*new_t)->name = strdup(datatype->name);
+ (*new_t)->name = xbt_strdup(datatype->name);
if(datatype->attributes !=NULL){
(*new_t)->attributes=xbt_dict_new();
xbt_dict_cursor_t cursor = NULL;
void* value_in;
void* value_out;
xbt_dict_foreach(datatype->attributes, cursor, key, value_in){
- smpi_type_key_elem elem = xbt_dict_get_or_null(smpi_type_keyvals, (const char*)key);
+ smpi_type_key_elem elem = xbt_dict_get_or_null_ext(smpi_type_keyvals, (const char*)key, sizeof(int));
if(elem && elem->copy_fn!=MPI_NULL_COPY_FN){
- ret = elem->copy_fn(datatype, atoi((const char*)key), NULL, value_in, &value_out, &flag );
+ ret = elem->copy_fn(datatype, *key, NULL, value_in, &value_out, &flag );
if(ret!=MPI_SUCCESS){
*new_t=MPI_DATATYPE_NULL;
return ret;
}
if(flag)
- xbt_dict_set((*new_t)->attributes, (const char*)key,value_out, NULL);
+ xbt_dict_set_ext((*new_t)->attributes, (const char*)key, sizeof(int),value_out, NULL);
}
}
}
}
void smpi_datatype_set_name(MPI_Datatype datatype, char* name){
- datatype->name = strdup(name);;
+ datatype->name = xbt_strdup(name);;
}
int smpi_datatype_copy(void *sendbuf, int sendcount, MPI_Datatype sendtype,
}
void smpi_datatype_free(MPI_Datatype* type){
+ xbt_assert((*type)->in_use >= 0);
if((*type)->attributes !=NULL){
xbt_dict_cursor_t cursor = NULL;
int* key;
void * value;
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);
+ smpi_type_key_elem elem = xbt_dict_get_or_null_ext(smpi_type_keyvals, (const char*)key, sizeof(int));
if(elem && elem->delete_fn)
- elem->delete_fn(*type, atoi((const char*)key), value, &flag);
+ elem->delete_fn(*type,*key, value, &flag);
}
}
void smpi_datatype_unuse(MPI_Datatype type){
- if(type && type->in_use-- == 0 && (type->flags & DT_FLAG_DESTROYED))
+ if (type->in_use > 0)
+ type->in_use--;
+
+ if(type && type->in_use == 0 && (type->flags & DT_FLAG_DESTROYED))
smpi_datatype_free(&type);
#ifdef HAVE_MC
}
int smpi_type_attr_delete(MPI_Datatype type, int keyval){
- 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);
+ smpi_type_key_elem elem = xbt_dict_get_or_null_ext(smpi_type_keyvals, (const char*)&keyval, sizeof(int));
if(!elem)
return MPI_ERR_ARG;
if(elem->delete_fn!=MPI_NULL_DELETE_FN){
if(type->attributes==NULL)
return MPI_ERR_ARG;
- xbt_dict_remove(type->attributes, (const char*)tmpkey);
- xbt_free(tmpkey);
+ xbt_dict_remove_ext(type->attributes, (const char*)&keyval, sizeof(int));
return MPI_SUCCESS;
}
int smpi_type_attr_get(MPI_Datatype type, int keyval, void* attr_value, int* flag){
- 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);
+ smpi_type_key_elem elem = xbt_dict_get_or_null_ext(smpi_type_keyvals, (const char*)&keyval, sizeof(int));
if(!elem)
return MPI_ERR_ARG;
xbt_ex_t ex;
return MPI_SUCCESS;
}
TRY {
- *(void**)attr_value = xbt_dict_get(type->attributes, (const char*)tmpkey);
+ *(void**)attr_value = xbt_dict_get_ext(type->attributes, (const char*)&keyval, sizeof(int));
*flag=1;
}
CATCH(ex) {
*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(INTSIZEDCHAR);
- sprintf(tmpkey, "%d", keyval);
- smpi_type_key_elem elem = xbt_dict_get_or_null(smpi_type_keyvals, (const char*)tmpkey);
+ smpi_type_key_elem elem = xbt_dict_get_or_null_ext(smpi_type_keyvals, (const char*)&keyval, sizeof(int));
if(!elem )
return MPI_ERR_ARG;
int flag;
if(type->attributes==NULL)
type->attributes=xbt_dict_new();
- xbt_dict_set(type->attributes, (const char*)tmpkey, attr_value, NULL);
- xbt_free(tmpkey);
+ xbt_dict_set_ext(type->attributes, (const char*)&keyval, sizeof(int), attr_value, NULL);
return MPI_SUCCESS;
}
value->delete_fn=delete_fn;
*keyval = type_keyval_id;
- char* tmpkey=xbt_malloc(INTSIZEDCHAR);
- sprintf(tmpkey, "%d", *keyval);
- xbt_dict_set(smpi_type_keyvals,(const char*)tmpkey,(void*)value, NULL);
+ xbt_dict_set_ext(smpi_type_keyvals,(const char*)keyval, sizeof(int),(void*)value, NULL);
type_keyval_id++;
- xbt_free(tmpkey);
return MPI_SUCCESS;
}
int smpi_type_keyval_free(int* keyval){
- 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);
+ smpi_type_key_elem elem = xbt_dict_get_or_null_ext(smpi_type_keyvals, (const char*)keyval, sizeof(int));
if(!elem){
- xbt_free(tmpkey);
return MPI_ERR_ARG;
}
- xbt_dict_remove(smpi_type_keyvals, (const char*)tmpkey);
+ xbt_dict_remove_ext(smpi_type_keyvals, (const char*)keyval, sizeof(int));
xbt_free(elem);
- xbt_free(tmpkey);
return MPI_SUCCESS;
}
*position += outcount * size;
return MPI_SUCCESS;
}
-