


## socket-closer-imp.pkg
#
# Track sockets open to X-servers
# and close them all at application exit.
# Compiled by:
# src/lib/x-kit/xclient/xclient-internals.sublibstipulate
include threadkit; # threadkit is from src/lib/src/lib/thread-kit/src/core-thread-kit/threadkit.pkg #
package xok = xsocket; # xsocket is from src/lib/x-kit/xclient/pkg/wire/xsocket.pkgherein
package socket_closer_imp
: (weak) Socket_Closer_Imp # Socket_Closer_Imp is from src/lib/x-kit/xclient/pkg/wire/socket-closer-imp.api {
stipulate
Plea_Mail
= NOTE_XSOCKET xok::Xsocket
| FORGET_XSOCKET xok::Xsocket
| SHUTDOWN
;
my plea_slot: Mailslot( Plea_Mail ) = make_mailslot ();
my reply_slot: Mailslot( Void ) = make_mailslot ();
fun start_imp ()
=
{ make_thread "socket_closer_imp" .{ loop []; };
();
}
where
fun loop xsockets
=
case (take plea_slot)
#
NOTE_XSOCKET arg
=>
loop (arg ! xsockets);
FORGET_XSOCKET xsocket
=>
{ fun remove [] => [];
remove (c ! r)
=>
xok::same_xsocket (c, xsocket)
##
?? r
:: c ! (remove r);
end;
loop (remove xsockets);
};
SHUTDOWN
=>
{
{ thread = get_current_thread ();
logger::log_if xlogger::lib_logging .{ cat [thread_to_string thread, " ***** shutdown *****"]; };
};
apply xok::close_xsocket
xsockets;
give (reply_slot, ());
};
esac;
end;
fun shutdown ()
=
{ give (plea_slot, SHUTDOWN);
take reply_slot;
};
my _ =
thread_scheduler_control::note_mailslot("x-kit-shutdown: plea_slot", plea_slot); my _ =
thread_scheduler_control::note_mailslot("x-kit-shutdown: reply_slot", reply_slot); my _ =
thread_scheduler_control::note_imp { name => "x-kit-shutdown", at_startup => start_imp, at_shutdown => shutdown };
herein
fun note_xsocket arg = give (plea_slot, NOTE_XSOCKET arg );
fun forget_xsocket socket = give (plea_slot, FORGET_XSOCKET socket);
end;
}; # package socket_closer_imp
end; # stipulate
## COPYRIGHT (c) 1990, 1991 by John H. Reppy. See COPYRIGHT file for details.
## Subsequent changes by Jeff Prothero Copyright (c) 2010-2012,
## released under Gnu Public Licence version 3.


