[fpc-devel] Re: systemh.inc InterLockedIncrement64 (var Target: int64)
Vinzent Höfler
JeLlyFish.software at gmx.net
Wed Oct 27 23:37:23 CEST 2010
On Wed, 27 Oct 2010 23:26:00 +0200, Andrew Brunner
<andrew.t.brunner at gmail.com> wrote:
> On Wed, Oct 27, 2010 at 4:16 PM, Vinzent Höfler
> <JeLlyFish.software at gmx.net> wrote:
>> Are you counting up only? Then you can use the 32-bit version of the
>> InterlockedIncrement on the lower word only. If this turns out to be
>> zero
>> (the new value is returned) after the operation, you know you also have
>> to
>> increment the high word. Even with 30'000 transactions per second it
>> takes
>> about 9 hours until the lower word will be zero again, so the
>> probability
>> of a race condition happening here is very close to zero.
>
> Yes. Only counting up in this case *but* one of my other stats is
> UPTIME. Meaning we want to brag about how long the application is
> running w/o re-starting :-) So restarting the app every time the
> counter rolls over, just isn't feasible for this application.
I didn't say "restart", I said "lock out the reader for a moment".
Maybe it's easier to grasp if I put it in some pseudo-code:
-- 8< --
Lock_Readers;
if InterlockedIncrement (Lower_32_Bit) = 0 then // Counter just rolled
over.
begin
// !!! Race condition if the counter rolls over twice while doing this.
// But with a 32 bit counter and 30'000 counts per second this
// can only happen if this code needs several /hours/ to execute.
InterlockedIncrement (Upper_32_Bit);
end;
Unlock_Readers;
-- 8< --
So you're updating the value without locking and only need to lock out
the readers once in nine hours or so to ensure they /always/ get a
consistent value.
Vinzent.
More information about the fpc-devel
mailing list