+ /* First process on this host (FIXME: does not work if the SIMIX user contexts are truly parallel) */
+ hd = xbt_new(gras_hostdata_t, 1);
+ hd->refcount = 1;
+ hd->ports = xbt_dynar_new(sizeof(gras_sg_portrec_t), NULL);
+ SIMIX_host_self_set_data((void *) hd);
+ } else {
+ hd->refcount++;
+ }
+
+ SIMIX_process_self_set_data(self, (void *) pd);
+ gras_procdata_init();
+
+ trp_pd = (gras_trp_procdata_t) gras_libdata_by_name("gras_trp");
+ pd->pid = pid;
+
+ if (self != NULL) {
+ pd->ppid = gras_os_getpid();
+ } else
+ pd->ppid = -1;
+
+ trp_pd->msg_selectable_sockets = xbt_queue_new(0, sizeof(xbt_socket_t));
+
+ trp_pd->meas_selectable_sockets =
+ xbt_queue_new(0, sizeof(xbt_socket_t));
+
+ XBT_VERB("Creating process '%s' (%d)", SIMIX_process_self_get_name(),
+ gras_os_getpid());
+}
+
+void gras_process_exit()
+{
+ xbt_dynar_t sockets =
+ ((gras_trp_procdata_t) gras_libdata_by_name("gras_trp"))->sockets;
+ xbt_socket_t sock_iter;
+ unsigned int cursor;
+ gras_hostdata_t *hd =
+ (gras_hostdata_t *) SIMIX_host_self_get_data();
+ gras_procdata_t *pd =
+ (gras_procdata_t *) simcall_process_get_data(SIMIX_process_self());
+
+ gras_msg_procdata_t msg_pd =
+ (gras_msg_procdata_t) gras_libdata_by_name("gras_msg");
+ gras_trp_procdata_t trp_pd =
+ (gras_trp_procdata_t) gras_libdata_by_name("gras_trp");
+
+ xbt_queue_free(&trp_pd->msg_selectable_sockets);
+
+ xbt_queue_free(&trp_pd->meas_selectable_sockets);
+
+
+ xbt_assert(hd, "Run gras_process_init (ie, gras_init)!!");