+void *smpi_request_new()
+{
+ smpi_mpi_request_t *request = xbt_new(smpi_mpi_request_t, 1);
+
+ request->completed = 0;
+ request->mutex = SIMIX_mutex_init();
+ request->cond = SIMIX_cond_init();
+
+ return request;
+}
+
+void smpi_request_free(void *pointer) {
+
+ smpi_mpi_request_t *request = pointer;
+
+ if (NULL != request) {
+ SIMIX_cond_destroy(request->cond);
+ SIMIX_mutex_destroy(request->mutex);
+ xbt_free(request);
+ }
+
+ return;
+}
+
+void smpi_request_reset(void *pointer) {
+ return;
+}
+
+
+void *smpi_message_new()
+{
+ return xbt_new(smpi_received_message_t, 1);
+}
+
+void smpi_message_free(void *pointer)
+{
+ if (NULL != pointer) {
+ xbt_free(pointer);
+ }
+
+ return;
+}
+
+void smpi_message_reset(void *pointer)
+{
+ return;
+}
+
+void smpi_global_init()
+{
+ int i;
+
+ int size = SIMIX_host_get_number();
+
+ smpi_global = xbt_new(s_SMPI_Global_t, 1);
+
+ // config variable
+ smpi_global->reference_speed = SMPI_DEFAULT_SPEED;
+
+ smpi_global->root_ready = 0;
+ smpi_global->ready_process_count = 0;
+
+ // start/stop
+ smpi_global->start_stop_mutex = SIMIX_mutex_init();
+ smpi_global->start_stop_cond = SIMIX_cond_init();
+
+ // processes
+ smpi_global->sender_processes = xbt_new(smx_process_t, size);
+ smpi_global->receiver_processes = xbt_new(smx_process_t, size);
+
+ // running hosts
+ smpi_global->running_hosts_count_mutex = SIMIX_mutex_init();
+ smpi_global->running_hosts_count = 0;
+
+ // mallocators
+ smpi_global->request_mallocator = xbt_mallocator_new(SMPI_REQUEST_MALLOCATOR_SIZE,
+ smpi_request_new, smpi_request_free, smpi_request_reset);
+ smpi_global->message_mallocator = xbt_mallocator_new(SMPI_MESSAGE_MALLOCATOR_SIZE,
+ smpi_message_new, smpi_message_free, smpi_message_reset);
+
+ //
+ smpi_global->pending_send_request_queues = xbt_new(xbt_fifo_t, size);
+ smpi_global->pending_send_request_queues_mutexes = xbt_new(smx_mutex_t, size);
+ smpi_global->pending_recv_request_queues = xbt_new(xbt_fifo_t, size);
+ smpi_global->pending_recv_request_queues_mutexes = xbt_new(smx_mutex_t, size);
+ smpi_global->received_message_queues = xbt_new(xbt_fifo_t, size);
+ smpi_global->received_message_queues_mutexes = xbt_new(smx_mutex_t, size);
+ smpi_global->timers = xbt_new(xbt_os_timer_t, size);
+ smpi_global->timers_mutexes = xbt_new(smx_mutex_t, size);
+
+ for(i = 0; i < size; i++) {
+ smpi_global->pending_send_request_queues[i] = xbt_fifo_new();
+ smpi_global->pending_send_request_queues_mutexes[i] = SIMIX_mutex_init();
+ smpi_global->pending_recv_request_queues[i] = xbt_fifo_new();
+ smpi_global->pending_recv_request_queues_mutexes[i] = SIMIX_mutex_init();
+ smpi_global->received_message_queues[i] = xbt_fifo_new();
+ smpi_global->received_message_queues_mutexes[i] = SIMIX_mutex_init();
+ smpi_global->timers[i] = xbt_os_timer_new();
+ smpi_global->timers_mutexes[i] = SIMIX_mutex_init();
+ }
+
+}
+
+void smpi_global_destroy()
+{
+ int i;
+
+ int size = SIMIX_host_get_number();
+
+ // start/stop
+ SIMIX_mutex_destroy(smpi_global->start_stop_mutex);
+ SIMIX_cond_destroy(smpi_global->start_stop_cond);
+
+ // processes
+ xbt_free(smpi_global->sender_processes);
+ xbt_free(smpi_global->receiver_processes);
+
+ // running hosts
+ SIMIX_mutex_destroy(smpi_global->running_hosts_count_mutex);
+
+ // mallocators
+ xbt_mallocator_free(smpi_global->request_mallocator);
+ xbt_mallocator_free(smpi_global->message_mallocator);
+
+ for(i = 0; i < size; i++) {
+ xbt_fifo_free(smpi_global->pending_send_request_queues[i]);
+ SIMIX_mutex_destroy(smpi_global->pending_send_request_queues_mutexes[i]);
+ xbt_fifo_free(smpi_global->pending_recv_request_queues[i]);
+ SIMIX_mutex_destroy(smpi_global->pending_recv_request_queues_mutexes[i]);
+ xbt_fifo_free(smpi_global->received_message_queues[i]);
+ SIMIX_mutex_destroy(smpi_global->received_message_queues_mutexes[i]);
+ xbt_os_timer_free(smpi_global->timers[i]);
+ SIMIX_mutex_destroy(smpi_global->timers_mutexes[i]);
+ }
+
+ xbt_free(smpi_global->pending_send_request_queues);
+ xbt_free(smpi_global->pending_send_request_queues_mutexes);
+ xbt_free(smpi_global->pending_recv_request_queues);
+ xbt_free(smpi_global->pending_recv_request_queues_mutexes);
+ xbt_free(smpi_global->received_message_queues);
+ xbt_free(smpi_global->received_message_queues_mutexes);
+ xbt_free(smpi_global->timers);
+ xbt_free(smpi_global->timers_mutexes);
+
+ xbt_free(smpi_global);
+}
+