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