------------------------->  GNU Sather - sourcefile  <-------------------------
-- Copyright (C) 199x by International Computer Science Institute            --
-- This file is part of the GNU Sather library. It is free software; you may --
-- redistribute  and/or modify it under the terms of the GNU Library General --
-- Public  License (LGPL)  as published  by the  Free  Software  Foundation; --
-- either version 2 of the license, or (at your option) any later version.   --
-- This  library  is distributed  in the  hope that it will  be  useful, but --
-- WITHOUT ANY WARRANTY without even the implied warranty of MERCHANTABILITY --
-- or FITNESS FOR A PARTICULAR PURPOSE. See Doc/LGPL for more details.       --
-- The license text is also available from:  Free Software Foundation, Inc., --
-- 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA                     --
-------------->  Please email comments to <bug-sather@gnu.org>  <--------------

-- When creating this lock you have to pass a container of $ELTP{$LOCK}
-- It will read it and store it separatly. You will be able to lock
-- the 
-- lock 
class CONTAINER_LOCK < $MUTEX is
   include LOCK_INCLUDE;
  
   private attr locked_by:THREAD_ID;
   private attr locked:INT;
   is_locked:BOOL is return locked>0; end;
   
   create(c:$ELT{$LOCK}}:SAME is return new; end;

   reservable(tid:THREAD_ID):BOOL is
      return locked=0 or locked_by=tid;
   end;

   reserve(tid:THREAD_ID) 
   pre locked=0 or locked_by=tid 
   is
      locked:=locked+1;
      locked_by:=tid;
   end;

   free(tid:THREAD_ID) 
   pre locked>0 and locked_by=tid
   is
      locked:=locked-1;
      if locked=0 then locked_by:=THREAD_ID::nil; end;
   end;

   wait_for(tid:THREAD_ID):ARRAY{THREAD_ID} is
      if locked>0 and tid/=locked_by then
	 return |locked_by|;
      end;
      return void;
   end;
end;
   
-- vim:sw=3:nosmartindent
