Michael Van Canneyt schreef:
On Thu, 19 Jun 2008, Boian Mitov wrote:
Here is a code sniped that sows just one example of the problem:
This is a very simple example of how important the order really is:
We have even more crucial problems related with this. This is just a simple
one:
destructor TALBasicAudioOut.Destroy();
var
WriteLock : IOWLockSection;
begin
WriteLock := FLock.StopLock();
FInputPin.Free();
FEnablePin.Free();
FMasterPumping.Free();
WriteLock := NIL;
FLock.Free();
inherited;
end;
You can see that the WriteLock MUST be released before the FLock.Free();,
Maybe Jonas or Florian can comment on this.
When you said function blocks, it made me think of nested procedures.
So I think you write it like:
destructor TALBasicAudioOut.Destroy();
procedure DoWriteProtectedThings;
var
WriteLock : IOWLockSection;
begin
WriteLock := FLock.StopLock();
FInputPin.Free();
FEnablePin.Free();
FMasterPumping.Free();
end;
begin
DoWriteProtectedThings;
FLock.Free();
inherited;
end;
Then you have made it clear that after WriteLock has to be cleared
before freeing the lock. Of course it still fails if a periodic mark and
sweep would be used by the compiler.
Vincent
_______________________________________________
fpc-devel maillist - fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel