+ XBT_DEBUG("%s request %p [buf = %p, size = %zu, src = %d, dst = %d, tag = %d, flags = %x]",
+ message, request, request->buf, request->size,
+ request->src, request->dst, request->tag, request->flags);
+}
+
+void smpi_global_init(void)
+{
+ int i;
+ MPI_Group group;
+ char name[MAILBOX_NAME_MAXLEN];
+
+ SIMIX_comm_set_copy_data_callback
+ (&SIMIX_comm_copy_buffer_callback);
+ process_count = SIMIX_process_count();
+ process_data = xbt_new(smpi_process_data_t, process_count);
+ for (i = 0; i < process_count; i++) {
+ process_data[i] = xbt_new(s_smpi_process_data_t, 1);
+ process_data[i]->index = i;
+ process_data[i]->argc = NULL;
+ process_data[i]->argv = NULL;
+ process_data[i]->mailbox = SIMIX_req_rdv_create(get_mailbox_name(name, i));
+ process_data[i]->timer = xbt_os_timer_new();
+ group = smpi_group_new(1);
+ process_data[i]->comm_self = smpi_comm_new(group);
+ smpi_group_set_mapping(group, i, 0);
+ }
+ group = smpi_group_new(process_count);
+ MPI_COMM_WORLD = smpi_comm_new(group);
+ for (i = 0; i < process_count; i++) {
+ smpi_group_set_mapping(group, i, i);
+ }
+}
+
+void smpi_global_destroy(void)
+{
+ int count = smpi_process_count();
+ int i;
+
+ smpi_bench_destroy();
+ smpi_comm_destroy(MPI_COMM_WORLD);
+ MPI_COMM_WORLD = MPI_COMM_NULL;
+ for (i = 0; i < count; i++) {
+ smpi_comm_destroy(process_data[i]->comm_self);
+ xbt_os_timer_free(process_data[i]->timer);
+ SIMIX_req_rdv_destroy(process_data[i]->mailbox);
+ xbt_free(process_data[i]);
+ }
+ xbt_free(process_data);
+ process_data = NULL;
+}
+
+/* Fortran specific stuff */
+/* With smpicc, the following weak symbols are used */
+/* With smpiff, the following weak symbols are replaced by those in libf2c */
+int __attribute__((weak)) xargc;
+char** __attribute__((weak)) xargv;