[fpc-devel] cwstring and threads
Florian Klaempfl
florian at freepascal.org
Sun Apr 16 11:42:41 CEST 2006
Martin Schreiber wrote:
> On Sunday 16 April 2006 10.51, Florian Klaempfl wrote:
>> Martin Schreiber wrote:
>>> Hi,
>>>
>>> Is cwstring threadsave?
>>> I suspect there is a problem.
>> The only problem I could imagine is that the caching of of the iconv_t
>> handles causes problem, since they could be accessed multiple times
>> without lock.
>
> The problems are gone with locking.
Locking or creating this handles locally might have a heavy impact on
performance. Anbody a good idea?
>
> Martin
>
> Index: cwstring.pp
> ===================================================================
> --- cwstring.pp (revision 3190)
> +++ cwstring.pp (working copy)
> @@ -109,7 +109,25 @@
> iconv_ucs42ansi,
> iconv_ansi2wide,
> iconv_wide2ansi : iconv_t;
> +
> + lock_ansi2ucs4,
> + lock_ucs42ansi,
> + lock_ansi2wide,
> + lock_wide2ansi : integer;
>
> +procedure lockiconv(var lockcount: integer);
> +begin
> + while interlockedincrement(lockcount) > 1 do begin
> + interlockeddecrement(lockcount);
> + sleep(0);
> + end;
> +end;
> +
> +procedure unlockiconv(var lockcount: integer);
> +begin
> + interlockeddecrement(lockcount);
> +end;
> +
> procedure Wide2AnsiMove(source:pwidechar;var dest:ansistring;len:SizeInt);
> var
> outlength,
> @@ -130,6 +148,7 @@
> srcpos:=source;
> destpos:=pchar(dest);
> outleft:=outlength;
> + lockiconv(lock_wide2ansi);
> while iconv(iconv_wide2ansi, at srcpos, at srclen, at destpos, at outleft)=size_t(-1)
> do
> begin
> case fpgetCerrno of
> @@ -158,6 +177,7 @@
> raise EConvertError.Create('iconv error '+IntToStr(fpgetCerrno));
> end;
> end;
> + unlockiconv(lock_wide2ansi);
> // truncate string
> setlength(dest,length(dest)-outleft);
> end;
> @@ -182,6 +202,7 @@
> srcpos:=source;
> destpos:=pchar(dest);
> outleft:=outlength*2;
> + lockiconv(lock_ansi2wide);
> while iconv(iconv_ansi2wide, at srcpos, at len, at destpos, at outleft)=size_t(-1) do
> begin
> case fpgetCerrno of
> @@ -209,6 +230,7 @@
> raise EConvertError.Create('iconv error '+IntToStr(fpgetCerrno));
> end;
> end;
> + unlockiconv(lock_ansi2wide);
> // truncate string
> setlength(dest,length(dest)-outleft div 2);
> end;
> @@ -253,6 +275,7 @@
> srcpos:=source;
> destpos:=pchar(dest);
> outleft:=outlength*4;
> + lockiconv(lock_ansi2ucs4);
> while iconv(iconv_ansi2ucs4, at srcpos, at len, at destpos, at outleft)=size_t(-1) do
> begin
> case fpgetCerrno of
> @@ -270,6 +293,7 @@
> raise EConvertError.Create('iconv error '+IntToStr(fpgetCerrno));
> end;
> end;
> + unlockiconv(lock_ansi2ucs4);
> // truncate string
> setlength(dest,length(dest)-outleft div 4);
> end;
> _______________________________________________
> fpc-devel maillist - fpc-devel at lists.freepascal.org
> http://lists.freepascal.org/mailman/listinfo/fpc-devel
>
More information about the fpc-devel
mailing list