Difference between revisions of "Watchdog"

From Second Life Wiki
Jump to navigation Jump to search
Line 5: Line 5:
'''Design Principle'''
'''Design Principle'''


First and foremost, a watchdog needs to be very robust. Small and simple is better. Performance is not a high priority and a watchdog does not need to run at a high rate of speed. For these reasons, these code examples have been written with timed self-resets, to keep the heap space clean. No fancy tricks that could lead to potential problems (more parts to break) have been left out.
First and foremost, a watchdog needs to be very robust. Small and simple is better. Performance is not a high priority and a watchdog does not need to run at a high rate of speed. For these reasons, these code examples have been written with timed self-resets, to keep the heap space clean. No fancy tricks that could lead to potential problems (more parts to break) have been included in these examples.


'''BASIC LSL WATCHDOG FOR A SINGLE PRIMARY SCRIPT'''
'''BASIC LSL WATCHDOG FOR A SINGLE PRIMARY SCRIPT'''

Revision as of 03:54, 17 January 2012

LSL WATCHDOG

These are some simple scripts that watch other scripts in the same prim and restarts them if they crash.

Design Principle

First and foremost, a watchdog needs to be very robust. Small and simple is better. Performance is not a high priority and a watchdog does not need to run at a high rate of speed. For these reasons, these code examples have been written with timed self-resets, to keep the heap space clean. No fancy tricks that could lead to potential problems (more parts to break) have been included in these examples.

BASIC LSL WATCHDOG FOR A SINGLE PRIMARY SCRIPT <lsl> // Basic LSL Watchdog Script to watch a single script // 2012-01-17 By Tika Oberueng // Released to the public domain. // You break it, you get to keep both pieces. // string watchee = "Test"; // Set this to the name of a script in prim inventory to watch float interval = 60.0; // Number of seconds between watchdog checks. Probably best to keep this above >= 10

default {

   state_entry() {
       llSetTimerEvent(interval);
   }
   on_rez(integer param) {
       llResetScript();
   }
   timer() {
       llSetTimerEvent(0);
       if (!llGetScriptState(watchee)) {
           llResetOtherScript(watchee);
           llSetScriptState(watchee, TRUE);
           llRegionSay(DEBUG_CHANNEL, "Watchdog Trip: The script ["+watchee+"] has crashed and has been restarted.");
       }
       llSleep(1);
       llResetScript(); // Reset this script to keep it clean
   }

} </lsl>

BASIC LSL WATCHDOG FOR MULTIPLE SCRIPTS <lsl> // Basic LSL Watchdog Script to watch multiple scripts // 2012-01-17 By Tika Oberueng // Released to the public domain. // You break it, you get to keep both pieces. // float interval = 60.0; // Number of seconds between watchdog checks. Probably best to keep this above >= 10

default {

   state_entry() {
       llSetTimerEvent(interval);
   }
   on_rez(integer param) {
       llResetScript();
   }
   timer() {
       integer loop;
       string watchee;
       llSetTimerEvent(0);
       for (loop = llGetInventoryNumber(INVENTORY_SCRIPT) -1; loop > -1; --loop) {
           watchee = llGetInventoryName(INVENTORY_SCRIPT,loop);
           if (!llGetScriptState(watchee)) {
               if (watchee != llGetScriptName()) {
                   llResetOtherScript(watchee);
                   llSetScriptState(watchee, TRUE);
                   llRegionSay(DEBUG_CHANNEL, "Multiple Watchdog Trip: The script ["+watchee+"] has crashed and has been restarted.");
               }
           }
       }
       llSleep(1);
       llResetScript(); // Reset this script to keep it clean
   }

} </lsl>