[M3devel] idioms for tracking initialization state and raising errors?
    Jay K 
    jay.krell at cornell.edu
       
    Sun Jul 31 11:07:12 CEST 2016
    
    
  
Is this a correct idiom?If so, I think it is fairly reasonable.
That is: be very willing to "early return" put all cleanup in finally raise errors in finally
In particular, I don't want to repeat the cleanup.I don't want to raise before leaving critical sections.
I don't intend this to raise within a raise, but onlyfrom the "normal" exit of the finally block.
I also don't want extra local booleans, i.e. raise: boolean to indicate failure.Just the one to indicate success.
PROCEDURE InitMutex (mutex: Mutex) =  VAR    lock: PCRITICAL_SECTION := NIL;    locked: PCRITICAL_SECTION := NIL;
  BEGIN    IF mutex.initialized THEN RETURN END;
    TRY
      lock := NewCriticalSection();      IF lock = NIL THEN RETURN; END;
      EnterCriticalSection(ADR(initLock));      locked := ADR(initLock);
      IF mutex.initialized THEN RETURN END;
      (* We won the race. *)      RTHeapRep.RegisterFinalCleanup (mutex, CleanMutex);      mutex.lock := lock;      lock := NIL;      mutex.initialized := TRUE;
    FINALLY      IF locked # NIL THEN LeaveCriticalSection(locked); END;      DelCriticalSection(lock);      IF NOT mutex.initialized THEN (* Raise after leaving critical section. *)        RuntimeError.Raise (RuntimeError.T.OutOfMemory);      END;    END;
  END InitMutex;
Thank you, - Jay 		 	   		  
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://m3lists.elegosoft.com/pipermail/m3devel/attachments/20160731/cb15430a/attachment-0001.html>
    
    
More information about the M3devel
mailing list