-void gras_msg_listener_shutdown(gras_msg_listener_t l) {
- xbt_thread_cancel(l->listener);
- xbt_queue_free(&l->incomming_messages);
- xbt_free(l);
+#include "gras/Virtu/virtu_private.h" /* procdata_t content */
+void gras_msg_listener_shutdown()
+{
+ gras_procdata_t *pd = gras_procdata_get();
+ char kill = '0';
+ DEBUG0("Listener quit");
+
+ if (pd->listener)
+ gras_msg_send(pd->listener->wakeup_sock_master_side, "_wakeup_listener",
+ &kill);
+
+ xbt_thread_join(pd->listener->listener);
+
+ // gras_socket_close(pd->listener->wakeup_sock_master_side); FIXME: uncommenting this leads to deadlock at terminaison
+ xbt_queue_free(&pd->listener->incomming_messages);
+ xbt_queue_free(&pd->listener->socks_to_close);
+ xbt_free(pd->listener);
+}
+
+void gras_msg_listener_awake()
+{
+ gras_procdata_t *pd;
+ char c = '1';
+
+ DEBUG0("Awaking the listener");
+ pd = gras_procdata_get();
+ if (pd->listener) {
+ gras_msg_send(pd->listener->wakeup_sock_master_side, "_wakeup_listener",
+ &c);
+ }
+}
+
+void gras_msg_listener_close_socket(int sd)
+{
+ gras_procdata_t *pd = gras_procdata_get();
+ if (pd->listener) {
+ xbt_queue_push(pd->listener->socks_to_close, &sd);
+ gras_msg_listener_awake();
+ } else {
+ /* do it myself */
+ tcp_close(sd);
+ }