+
+}
+
+void smpi_datatype_use(MPI_Datatype type){
+ if(type)type->in_use++;
+
+#ifdef HAVE_MC
+ if(MC_is_active())
+ MC_ignore(&(type->in_use), sizeof(type->in_use));
+#endif
+}
+
+
+void smpi_datatype_unuse(MPI_Datatype type){
+ if(type && type->in_use-- == 0 && (type->flags & DT_FLAG_DESTROYED))
+ smpi_datatype_free(&type);
+
+#ifdef HAVE_MC
+ if(MC_is_active())
+ MC_ignore(&(type->in_use), sizeof(type->in_use));
+#endif
+}
+
+
+
+
+/*
+Contiguous Implementation
+*/
+
+
+/*
+ * Copies noncontiguous data into contiguous memory.
+ * @param contiguous_hvector - output hvector
+ * @param noncontiguous_hvector - input hvector
+ * @param type - pointer contening :
+ * - stride - stride of between noncontiguous data, in bytes
+ * - block_length - the width or height of blocked matrix
+ * - count - the number of rows of matrix
+ */
+void serialize_contiguous( const void *noncontiguous_hvector,
+ void *contiguous_hvector,
+ size_t count,
+ void *type)
+{
+ s_smpi_mpi_contiguous_t* type_c = (s_smpi_mpi_contiguous_t*)type;
+ char* contiguous_vector_char = (char*)contiguous_hvector;
+ char* noncontiguous_vector_char = (char*)noncontiguous_hvector+type_c->lb;
+ memcpy(contiguous_vector_char,
+ noncontiguous_vector_char, count* type_c->block_count * type_c->size_oldtype);
+}
+/*
+ * Copies contiguous data into noncontiguous memory.
+ * @param noncontiguous_vector - output hvector
+ * @param contiguous_vector - input hvector
+ * @param type - pointer contening :
+ * - stride - stride of between noncontiguous data, in bytes
+ * - block_length - the width or height of blocked matrix
+ * - count - the number of rows of matrix
+ */
+void unserialize_contiguous( const void *contiguous_vector,
+ void *noncontiguous_vector,
+ size_t count,
+ void *type)
+{
+ s_smpi_mpi_contiguous_t* type_c = (s_smpi_mpi_contiguous_t*)type;
+ char* contiguous_vector_char = (char*)contiguous_vector;
+ char* noncontiguous_vector_char = (char*)noncontiguous_vector+type_c->lb;
+
+ memcpy(noncontiguous_vector_char,
+ contiguous_vector_char, count* type_c->block_count * type_c->size_oldtype);