ui/src/picture/Completion.i3


 Copyright (C) 1992, Digital Equipment Corporation         
 All rights reserved.                                      
 See the file COPYRIGHT for a full description.            
                                                           
 Last modified on Fri Oct 28 17:20:28 PDT 1994 by kalsow   
      modified on Wed Oct  6 09:17:22 PDT 1993 by sfreeman 

INTERFACE Completion;

IMPORT Picture, Thread;
a Completion is a mechanism for notifying the caller when an Image has been processed. Each user of the image should increment the Completion when it starts using the image and decrement when it has finished. When the count returns to 0, if /freeProc/ # NIL then the Completion.T will be put on a queue for /freeProc/ to be called and those threads blocked in /waitUntilFree/ to be signalled to continue. /Dispose/ will be called on the T after /freeProc/ has returned. If /freeProc/ = NIL, then the threads blocked in /waitForFree/ will be signalled immediately

CONST
  Brand = "Completion";

TYPE
  T <: Public;
  Public = MUTEX OBJECT
           METHODS
             init (initialCount                   := 1;
                   freeProc    : Picture.FreeProc := NIL;
                   freeParam   : REFANY           := NIL  ): T;
             id  (): CARDINAL;
             inc ();
             dec ();

             isFree (): BOOLEAN;
             (* non-blocking check to see if Completion is free *)
             waitUntilFree () RAISES {Thread.Alerted};
             (* block thread until Completion is freed *)
           END;
get T from free list. do not forget to call t.init() and Dispose(t) on Ts got from this procedure
PROCEDURE New (): T;
PROCEDURE Dispose (t: T);        (* return to the free list *)

END Completion.