[fpc-devel] ref count types / threadsave question
Jonas Maebe
jonas at freepascal.org
Wed Jan 2 21:44:39 CET 2019
On 02/01/19 21:22, Benito van der Zander wrote:
> but if another core can do anything to the string, the refcount should
> already be 2, one for this core and one for the other core, should it not?
The problem is that the different cores may see different values. Core 1
could see that the refcount is 1 (wrong) while core 2 could see that is
2 (correct) unless you add memory barriers (directly, or indirectly by
using atomic read-modify-write instructions).
> UniqueString has such a test:
>
> Function fpc_ansistr_Unique(Var S : Pointer): Pointer; [Public,Alias :
> 'FPC_ANSISTR_UNIQUE']; compilerproc; inline;
> {
> Make sure reference count of S is 1,
> using copy-on-write semantics.
> }
> begin
> pointer(result) := pointer(s);
> If Pointer(S)=Nil then
> exit;
> if PAnsiRec(Pointer(S)-AnsiFirstOff)^.Ref<>1 then
> result:=fpc_truely_ansistr_unique(s);
> end;
This function is indeed not threadsafe (and it cannot be made 100%
threadsafe, although it could be made a bit safer —and slower— by
changing the check into an atomic inc/decrement with 0 and checking that
the result is 1).
Jonas
More information about the fpc-devel
mailing list