1 jls.loader.provide('jls.lang.Signal');
  2 
  3 jls.loader.require('jls.lang.Thread');
  4 jls.loader.require('jls.lang.Monitor');
  5 
  6 /**
  7  * @class This class provides signal support.
  8  * @see jls.lang.Monitor
  9  * @see jls.lang.Thread
 10  */
 11 jls.lang.Signal = jls.lang.Class.create({});
 12 
 13 Object.extend(jls.lang.Signal, /** @lends jls.lang.Signal */
 14 {
 15     _handlers : [],
 16     _thread : null,
 17     _sigMon : null,
 18     _startSignalThread : function() {
 19         if (jls.lang.Signal._thread != null) {
 20             return;
 21         }
 22         jls.lang.Signal._sigMon = new jls.lang.Monitor();
 23         _native.core.registerSignalMonitor(jls.lang.Signal._sigMon._no);
 24         jls.lang.Signal._thread = new jls.lang.Thread(true);
 25         jls.lang.Signal._thread.run = function() {
 26             for (;;) {
 27                 jls.lang.Signal._sigMon.wait();
 28                 var signalCounters = _native.core.getSignalCounters();
 29                 for (var sig = 0; sig < signalCounters.length; sig++) {
 30                     for (var i = 0; i < signalCounters[sig]; i++) {
 31                         _native.core.handleSignal(sig);
 32                         if (jls.lang.Signal._handlers[sig]) {
 33                             try {
 34                                 jls.lang.Signal._handlers[sig]();
 35                             }
 36                             catch (e) {
 37                                 jls.logger.warn('Unexpected exception while handling signal ' + sig + ': ' + e);
 38                             }
 39                         }
 40                     }
 41                 }
 42             }
 43         }
 44         jls.logger.debug('Start signal thread');
 45         jls.lang.Signal._thread.start();
 46         jls.logger.debug('Signal thread Started');
 47     },
 48     SIGINT : _native.core.SIGINT, // Ctrl-C
 49     SIGILL : _native.core.SIGILL,
 50     SIGFPE : _native.core.SIGFPE,
 51     SIGSEGV : _native.core.SIGSEGV,
 52     SIGTERM : _native.core.SIGTERM,
 53     SIGBREAK : _native.core.SIGBREAK, // Ctrl-Break
 54     SIGABRT : _native.core.SIGABRT,
 55     /**
 56      * Registers a signal handler.
 57      * 
 58      * @param {Number} sig The signal number to be handled.
 59      * @param {Function} [handler] The handler to be registered with the given signal.
 60      * @returns {Function} The previous hanlder if any.
 61      */
 62     handle : function(sig, handler) {
 63         handler = handler || null;
 64         var sigHandler = (handler == null) ? _native.core.SIG_DFL : _native.core.SIG_USR;
 65         _native.core.signal(sig, sigHandler);
 66         var previousHandler = jls.lang.Signal._handlers[sig];
 67         jls.lang.Signal._handlers[sig] = handler;
 68         jls.lang.Signal._startSignalThread();
 69         return previousHandler;
 70     },
 71     /**
 72      * Raises a signal.
 73      * 
 74      * @param {Number} sig The signal number to be handled.
 75      */
 76     raise : function(sig) {
 77         _native.core.raise(sig);
 78     }
 79 });
 80 
 81