Vinzent Höfler wrote:

Hmm. So we'd need a mutex inside a mutex. Now I know why they call it recursive. ;) So it'll be something like that:

function Recursive_Mutex.Lock : ...;
begin
   // Lock mutex inside mutex.
   self.Owner_Check_Lock.Lock;

   // Owned by current thread?
   if CurrentThreadId <> self.ThreadId then
   begin
      // Nope! Get the hell outta here.
      self.Owner_Check_Lock.Unlock;
      exit (NOT_OWNED);
   end {if};

   // Now try locking the real mutex.
   if pthread_mutex_lock (self...) = 0 then
   begin
      self.Count := self.Count + 1;
      self.Owner_Check.Unlock;
      exit (SUCCESS);
   end {if};

   self.Owner_Check.Unlock;
   exit (FAILURE);
end {Mutex.Lock};

Something like that. Don't nail me on that, it's quite late and the heat is still killing me. ;)

I knew it. Of course this is wrong. We can only lock the mutex once, because we assume it's non-recursive, that was the whole point. So we should *first* check the count and then may lock/unlock the mutex accordingly.


Vinzent.
_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal

Reply via email to