- trp_pd = (gras_trp_procdata_t)gras_libdata_by_name("gras_trp");
- pd->pid = PID++;
-
- if (SIMIX_process_self() != NULL ) {
- pd->ppid = gras_os_getpid();
- }
- else pd->ppid = -1;
-
- trp_pd->mutex = SIMIX_mutex_init();
- trp_pd->cond = SIMIX_cond_init();
- trp_pd->mutex_meas = SIMIX_mutex_init();
- trp_pd->cond_meas = SIMIX_cond_init();
- trp_pd->active_socket = xbt_fifo_new();
- trp_pd->active_socket_meas = xbt_fifo_new();
-
- VERB2("Creating process '%s' (%d)",
- SIMIX_process_get_name(SIMIX_process_self()),
- gras_os_getpid());
-}
-
-void
-gras_process_exit() {
- xbt_dynar_t sockets = ((gras_trp_procdata_t) gras_libdata_by_name("gras_trp"))->sockets;
- gras_socket_t sock_iter;
- int cursor;
- gras_hostdata_t *hd=(gras_hostdata_t *)SIMIX_host_get_data(SIMIX_host_self());
- gras_procdata_t *pd=(gras_procdata_t*)SIMIX_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");
-
- SIMIX_mutex_destroy(trp_pd->mutex);
- SIMIX_cond_destroy(trp_pd->cond);
- xbt_fifo_free(trp_pd->active_socket);
- SIMIX_mutex_destroy(trp_pd->mutex_meas);
- SIMIX_cond_destroy(trp_pd->cond_meas);
- xbt_fifo_free(trp_pd->active_socket_meas);
-
-
- xbt_assert0(hd,"Run gras_process_init (ie, gras_init)!!");
-
- VERB2("GRAS: Finalizing process '%s' (%d)",
- SIMIX_process_get_name(SIMIX_process_self()),gras_os_getpid());
-
- if (xbt_dynar_length(msg_pd->msg_queue))
- WARN1("process %d terminated, but some messages are still queued",
- gras_os_getpid());
-
- /* if each process has its sockets list, we need to close them when the process finish */
- xbt_dynar_foreach(sockets,cursor,sock_iter) {
- VERB1("Closing the socket %p left open on exit. Maybe a socket leak?",
- sock_iter);
- gras_socket_close(sock_iter);
- }
- if ( ! --(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)!!");
+
+ 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));
+ }
+ }
+
+ /* if each process has its sockets list, we need to close them when the
+ process finish */
+ xbt_dynar_foreach(sockets, cursor, sock_iter) {
+ XBT_VERB("Closing the socket %p left open on exit. Maybe a socket leak?",
+ sock_iter);
+ gras_socket_close(sock_iter);
+ }
+ if (!--(hd->refcount)) {