[openfirmware] r1595 - ofw/core

svn at openfirmware.info svn at openfirmware.info
Mon Dec 14 10:48:18 CET 2009


Author: wmb
Date: 2009-12-14 10:48:18 +0100 (Mon, 14 Dec 2009)
New Revision: 1595

Modified:
   ofw/core/ofwcore.fth
Log:
OFW core - changed the implementation of the alarm list scanner
so that an alarm handler can safely remove itself from the list
from inside the handler.


Modified: ofw/core/ofwcore.fth
===================================================================
--- ofw/core/ofwcore.fth	2009-12-13 20:22:36 UTC (rev 1594)
+++ ofw/core/ofwcore.fth	2009-12-14 09:48:18 UTC (rev 1595)
@@ -3898,18 +3898,29 @@
 \ then check to see if the time is expired (time-remain = 0).
 \ If time is not expired, decrement the time-remain.
 
-: time-expired? 	( node -- flag )
+: run-alarm 	( node -- )
    dup  >time-remain @  1- dup 0<=  if  ( node time-remain )
       drop  dup >time-out @  over       ( node time-out node )
       dup >acf @  swap >ihandle @       ( node time-out acf ihandle )
       ['] call-package  catch  if       ( node time-out acf ihandle )
 	 2drop                          ( node time-out )
       then                              ( node time-out )
-   then  swap >time-remain ! false      ( false )
+   then  swap >time-remain !            ( )
 ;
 
 headers
-: check-alarm  ( -- )  alarm-list ['] time-expired? find-node  2drop  ;
+\ We do this manually instead of using find-node because we need
+\ to do >next-node before calling time-expired? in case the alarm
+\ routine uninstalls itself, which could cause a crash if the
+\ pointer to the next node were overwritten while being freed.
+: check-alarm  ( -- )
+   alarm-list  >next-node      ( node )
+   begin  ?dup  while          ( node )
+      dup >next-node  swap     ( next node )
+      run-alarm                ( next )
+   repeat                      ( )
+;
+
 : alarm 	( acf n -- )
    my-self -rot                 ( ihandle acf n )
    ?dup if  set-alarm-node  else  turn-off-alarm  then




More information about the openfirmware mailing list