+ } 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)!!");
+
+ XBT_VERB("GRAS: Finalizing process '%s' (%d)",
+ simcall_process_get_name(SIMIX_process_self()), gras_os_getpid());
+
+ if (!xbt_dynar_is_empty(msg_pd->msg_queue)) {
+ unsigned int cpt;
+ s_gras_msg_t msg;
+ XBT_WARN
+ ("process %d terminated, but %lu messages are still queued. Message list:",
+ gras_os_getpid(), xbt_dynar_length(msg_pd->msg_queue));
+ xbt_dynar_foreach(msg_pd->msg_queue, cpt, msg) {
+ XBT_WARN(" Message %s (%s) from %s@%s:%d", msg.type->name,
+ e_gras_msg_kind_names[msg.kind],
+ xbt_socket_peer_proc(msg.expe),
+ xbt_socket_peer_name(msg.expe),
+ xbt_socket_peer_port(msg.expe));
+ }