From f32b1ccbe00d2399ed9ca4829a23b9f2ccff2ea2 Mon Sep 17 00:00:00 2001 From: florian Date: Sun, 25 Jun 2006 20:17:32 +0000 Subject: [PATCH] + cwstring multithreading safe, fixes #6873 git-svn-id: trunk@3948 - --- rtl/unix/cwstring.pp | 34 +++++++++++++++++++++++++++++----- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/rtl/unix/cwstring.pp b/rtl/unix/cwstring.pp index 0322320253..a405e22e7d 100644 --- a/rtl/unix/cwstring.pp +++ b/rtl/unix/cwstring.pp @@ -126,7 +126,13 @@ procedure Wide2AnsiMove(source:pwidechar;var dest:ansistring;len:SizeInt); destpos: pchar; mynil : pchar; my0 : size_t; + iconv : iconv_t; begin + { conversion descriptors aren't thread safe } + if IsMultithreaded then + iconv:=iconv_open(nl_langinfo(CODESET),unicode_encoding) + else + iconv:=iconv_wide2ansi; mynil:=nil; my0:=0; { rought estimation } @@ -136,7 +142,7 @@ procedure Wide2AnsiMove(source:pwidechar;var dest:ansistring;len:SizeInt); srcpos:=source; destpos:=pchar(dest); outleft:=outlength; - while iconv(iconv_wide2ansi,@srcpos,@srclen,@destpos,@outleft)=size_t(-1) do + while iconv(iconv,@srcpos,@srclen,@destpos,@outleft)=size_t(-1) do begin case fpgetCerrno of ESysEILSEQ: @@ -148,7 +154,7 @@ procedure Wide2AnsiMove(source:pwidechar;var dest:ansistring;len:SizeInt); inc(destpos); dec(outleft); { reset } - iconv(iconv_wide2ansi,@mynil,@my0,@mynil,@my0); + iconv(iconv,@mynil,@my0,@mynil,@my0); end; ESysE2BIG: begin @@ -166,6 +172,8 @@ procedure Wide2AnsiMove(source:pwidechar;var dest:ansistring;len:SizeInt); end; // truncate string setlength(dest,length(dest)-outleft); + if IsMultithreaded then + iconv_close(iconv); end; @@ -178,7 +186,13 @@ procedure Ansi2WideMove(source:pchar;var dest:widestring;len:SizeInt); destpos: pchar; mynil : pchar; my0 : size_t; + iconv : iconv_t; begin + { conversion descriptors aren't thread safe } + if IsMultithreaded then + iconv:=iconv_open(unicode_encoding,nl_langinfo(CODESET)); + else + iconv:=iconv_ansi2wide; mynil:=nil; my0:=0; // extra space @@ -188,7 +202,7 @@ procedure Ansi2WideMove(source:pchar;var dest:widestring;len:SizeInt); srcpos:=source; destpos:=pchar(dest); outleft:=outlength*2; - while iconv(iconv_ansi2wide,@srcpos,@len,@destpos,@outleft)=size_t(-1) do + while iconv(iconv,@srcpos,@len,@destpos,@outleft)=size_t(-1) do begin case fpgetCerrno of ESysEILSEQ: @@ -199,7 +213,7 @@ procedure Ansi2WideMove(source:pchar;var dest:widestring;len:SizeInt); inc(destpos,2); dec(outleft,2); { reset } - iconv(iconv_wide2ansi,@mynil,@my0,@mynil,@my0); + iconv(iconv,@mynil,@my0,@mynil,@my0); end; ESysE2BIG: begin @@ -217,6 +231,8 @@ procedure Ansi2WideMove(source:pchar;var dest:widestring;len:SizeInt); end; // truncate string setlength(dest,length(dest)-outleft div 2); + if IsMultithreaded then + iconv_close(iconv); end; @@ -249,7 +265,13 @@ procedure Ansi2UCS4Move(source:pchar;var dest:UCS4String;len:SizeInt); destpos: pchar; mynil : pchar; my0 : size_t; + iconv : iconv_t; begin + { conversion descriptors aren't thread safe } + if IsMultithreaded then + iconv:=iconv_open('UCS4',nl_langinfo(CODESET)); + else + iconv:=iconv_ansi2ucs4; mynil:=nil; my0:=0; // extra space @@ -259,7 +281,7 @@ procedure Ansi2UCS4Move(source:pchar;var dest:UCS4String;len:SizeInt); srcpos:=source; destpos:=pchar(dest); outleft:=outlength*4; - while iconv(iconv_ansi2ucs4,@srcpos,@len,@destpos,@outleft)=size_t(-1) do + while iconv(iconv,@srcpos,@len,@destpos,@outleft)=size_t(-1) do begin case fpgetCerrno of ESysE2BIG: @@ -278,6 +300,8 @@ procedure Ansi2UCS4Move(source:pchar;var dest:UCS4String;len:SizeInt); end; // truncate string setlength(dest,length(dest)-outleft div 4); + if IsMultithreaded then + iconv_close(iconv); end;