PreviousUpNext

15.4.1495  src/lib/x-kit/xclient/pkg/wire/socket-closer-imp.pkg

## 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.sublib


stipulate
    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.pkg
herein


    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.


Comments and suggestions to: bugs@mythryl.org

PreviousUpNext