Преглед изворни кода

Merged revisions 3470,3948-3949 via svnmerge from
http://[email protected]/svn/fpc/trunk

........
r3470 | daniel | 2006-05-10 18:26:37 +0200 (Wed, 10 May 2006) | 2 lines

* Prevent range check error when compiling with -Cr

........
r3948 | florian | 2006-06-25 22:17:32 +0200 (Sun, 25 Jun 2006) | 2 lines

+ cwstring multithreading safe, fixes #6873

........
r3949 | florian | 2006-06-25 22:37:14 +0200 (Sun, 25 Jun 2006) | 2 lines

* fixed previous commit

........

git-svn-id: branches/fixes_2_0@3954 -

peter пре 19 година
родитељ
комит
b0e8ef8b5d
2 измењених фајлова са 30 додато и 6 уклоњено
  1. 29 5
      rtl/unix/cwstring.pp
  2. 1 1
      rtl/unix/gensigset.inc

+ 29 - 5
rtl/unix/cwstring.pp

@@ -120,7 +120,13 @@ procedure Wide2AnsiMove(source:pwidechar;var dest:ansistring;len:SizeInt);
     destpos: pchar;
     mynil : pchar;
     my0 : size_t;
+    conv : iconv_t;
   begin
+    { conversion descriptors aren't thread safe }
+    if IsMultithread then
+      conv:=iconv_open(nl_langinfo(CODESET),unicode_encoding)
+    else
+      conv:=iconv_wide2ansi;
     mynil:=nil;
     my0:=0;
     { rought estimation }
@@ -130,7 +136,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(conv,@srcpos,@srclen,@destpos,@outleft)=size_t(-1) do
       begin
         case fpgetCerrno of
           ESysEILSEQ:
@@ -142,7 +148,7 @@ procedure Wide2AnsiMove(source:pwidechar;var dest:ansistring;len:SizeInt);
               inc(destpos);
               dec(outleft);
               { reset }
-              iconv(iconv_wide2ansi,@mynil,@my0,@mynil,@my0);
+              iconv(conv,@mynil,@my0,@mynil,@my0);
             end;
           ESysE2BIG:
             begin
@@ -160,6 +166,8 @@ procedure Wide2AnsiMove(source:pwidechar;var dest:ansistring;len:SizeInt);
       end;
     // truncate string
     setlength(dest,length(dest)-outleft);
+    if IsMultithread then
+      iconv_close(conv);
   end;
 
 
@@ -172,7 +180,13 @@ procedure Ansi2WideMove(source:pchar;var dest:widestring;len:SizeInt);
     destpos: pchar;
     mynil : pchar;
     my0 : size_t;
+    conv : iconv_t;
   begin
+    { conversion descriptors aren't thread safe }
+    if IsMultithread then
+      conv:=iconv_open(unicode_encoding,nl_langinfo(CODESET))
+    else
+      conv:=iconv_ansi2wide;
     mynil:=nil;
     my0:=0;
     // extra space
@@ -182,7 +196,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(conv,@srcpos,@len,@destpos,@outleft)=size_t(-1) do
       begin
         case fpgetCerrno of
          ESysEILSEQ:
@@ -193,7 +207,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(conv,@mynil,@my0,@mynil,@my0);
             end;
           ESysE2BIG:
             begin
@@ -211,6 +225,8 @@ procedure Ansi2WideMove(source:pchar;var dest:widestring;len:SizeInt);
       end;
     // truncate string
     setlength(dest,length(dest)-outleft div 2);
+    if IsMultithread then
+      iconv_close(conv);
   end;
 
 
@@ -243,7 +259,13 @@ procedure Ansi2UCS4Move(source:pchar;var dest:UCS4String;len:SizeInt);
     destpos: pchar;
     mynil : pchar;
     my0 : size_t;
+    conv : iconv_t;
   begin
+    { conversion descriptors aren't thread safe }
+    if IsMultithread then
+      conv:=iconv_open('UCS4',nl_langinfo(CODESET))
+    else
+      conv:=iconv_ansi2ucs4;
     mynil:=nil;
     my0:=0;
     // extra space
@@ -253,7 +275,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(conv,@srcpos,@len,@destpos,@outleft)=size_t(-1) do
       begin
         case fpgetCerrno of
           ESysE2BIG:
@@ -272,6 +294,8 @@ procedure Ansi2UCS4Move(source:pchar;var dest:UCS4String;len:SizeInt);
       end;
     // truncate string
     setlength(dest,length(dest)-outleft div 4);
+    if IsMultithread then
+      iconv_close(conv);
   end;
 
 

+ 1 - 1
rtl/unix/gensigset.inc

@@ -52,7 +52,7 @@ function fpsigfillset(var nset : tsigset):cint;
 var i :longint;
 
 Begin
-  for i:=0 to wordsinsigset-1 DO nset[i]:=NOT 0;
+  for i:=0 to wordsinsigset-1 DO nset[i]:=high(nset[i]);
   fpsigfillset:=0;
 End;