Tcl Source Code

Hex Artifact Content
Login

Artifact dd247811e9f1c6cdbc811787596f3772598ece2b5a2793083769ecde2fc6f9a4:

Attachment "tcl9.1.0-locale-init-lock.patch" to ticket [c35e347c6f] added by gustafn3 2026-10-07 09:22:20.
0000: 2d 2d 2d 20 61 2f 75 6e 69 78 2f 74 63 6c 55 6e  --- a/unix/tclUn
0010: 69 78 49 6e 69 74 2e 63 0a 2b 2b 2b 20 62 2f 75  ixInit.c.+++ b/u
0020: 6e 69 78 2f 74 63 6c 55 6e 69 78 49 6e 69 74 2e  nix/tclUnixInit.
0030: 63 0a 40 40 20 2d 35 38 34 2c 32 35 20 2b 35 38  c.@@ -584,25 +58
0040: 34 2c 34 33 20 40 40 0a 20 20 20 20 20 20 2a 2f  4,43 @@.      */
0050: 0a 20 0a 20 23 69 66 64 65 66 20 48 41 56 45 5f  . . #ifdef HAVE_
0060: 4c 41 4e 47 49 4e 46 4f 0a 2d 20 20 20 20 69 66  LANGINFO.-    if
0070: 20 28 0a 2b 20 20 20 20 7b 0a 2b 09 54 63 6c 5f   (.+    {.+.Tcl_
0080: 44 53 74 72 69 6e 67 20 64 73 3b 0a 2b 09 69 6e  DString ds;.+.in
0090: 74 20 68 61 76 65 4c 6f 63 61 6c 65 3b 0a 2b 0a  t haveLocale;.+.
00a0: 2b 09 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69  +.Tcl_DStringIni
00b0: 74 28 26 64 73 29 3b 0a 2b 0a 2b 09 2f 2a 0a 2b  t(&ds);.+.+./*.+
00c0: 09 20 2a 20 73 65 74 6c 6f 63 61 6c 65 28 29 20  . * setlocale() 
00d0: 63 68 61 6e 67 65 73 20 70 72 6f 63 65 73 73 2d  changes process-
00e0: 67 6c 6f 62 61 6c 20 73 74 61 74 65 20 61 6e 64  global state and
00f0: 20 6e 65 65 64 20 6e 6f 74 20 62 65 20 74 68 72   need not be thr
0100: 65 61 64 2d 73 61 66 65 2e 0a 2b 09 20 2a 20 55  ead-safe..+. * U
0110: 73 65 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a  se the initializ
0120: 61 74 69 6f 6e 20 6c 6f 63 6b 2c 20 77 68 69 63  ation lock, whic
0130: 68 20 61 6c 73 6f 20 70 72 6f 74 65 63 74 73 20  h also protects 
0140: 74 68 65 20 69 6e 69 74 69 61 6c 20 6c 6f 63 61  the initial loca
0150: 6c 65 0a 2b 09 20 2a 20 73 65 74 75 70 20 69 6e  le.+. * setup in
0160: 20 54 63 6c 5f 49 6e 69 74 53 75 62 73 79 73 74   Tcl_InitSubsyst
0170: 65 6d 73 28 29 2e 20 43 6f 70 79 20 74 68 65 20  ems(). Copy the 
0180: 63 6f 64 65 73 65 74 20 77 68 69 6c 65 20 68 6f  codeset while ho
0190: 6c 64 69 6e 67 20 74 68 65 0a 2b 09 20 2a 20 6c  lding the.+. * l
01a0: 6f 63 6b 2c 20 73 69 6e 63 65 20 6e 6c 5f 6c 61  ock, since nl_la
01b0: 6e 67 69 6e 66 6f 28 29 20 63 61 6e 20 72 65 74  nginfo() can ret
01c0: 75 72 6e 20 73 74 6f 72 61 67 65 20 6f 77 6e 65  urn storage owne
01d0: 64 20 62 79 20 6c 69 62 63 2e 0a 2b 09 20 2a 2f  d by libc..+. */
01e0: 0a 2b 0a 2b 09 54 63 6c 70 49 6e 69 74 4c 6f 63  .+.+.TclpInitLoc
01f0: 6b 28 29 3b 0a 2b 09 68 61 76 65 4c 6f 63 61 6c  k();.+.haveLocal
0200: 65 20 3d 0a 20 23 69 66 64 65 66 20 57 45 41 4b  e =. #ifdef WEAK
0210: 5f 49 4d 50 4f 52 54 5f 4e 4c 5f 4c 41 4e 47 49  _IMPORT_NL_LANGI
0220: 4e 46 4f 0a 2d 09 20 20 20 20 6e 6c 5f 6c 61 6e  NFO.-.    nl_lan
0230: 67 69 6e 66 6f 20 21 3d 20 4e 55 4c 4c 20 26 26  ginfo != NULL &&
0240: 0a 2b 09 09 6e 6c 5f 6c 61 6e 67 69 6e 66 6f 20  .+..nl_langinfo 
0250: 21 3d 20 4e 55 4c 4c 20 26 26 0a 20 23 65 6e 64  != NULL &&. #end
0260: 69 66 0a 2d 09 20 20 20 20 73 65 74 6c 6f 63 61  if.-.    setloca
0270: 6c 65 28 4c 43 5f 43 54 59 50 45 2c 20 22 22 29  le(LC_CTYPE, "")
0280: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 2d 09 54 63   != NULL) {.-.Tc
0290: 6c 5f 44 53 74 72 69 6e 67 20 64 73 3b 0a 2b 09  l_DString ds;.+.
02a0: 09 73 65 74 6c 6f 63 61 6c 65 28 4c 43 5f 43 54  .setlocale(LC_CT
02b0: 59 50 45 2c 20 22 22 29 20 21 3d 20 4e 55 4c 4c  YPE, "") != NULL
02c0: 3b 0a 2b 09 69 66 20 28 68 61 76 65 4c 6f 63 61  ;.+.if (haveLoca
02d0: 6c 65 29 20 7b 0a 2b 09 20 20 20 20 54 63 6c 5f  le) {.+.    Tcl_
02e0: 44 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26 64  DStringAppend(&d
02f0: 73 2c 20 6e 6c 5f 6c 61 6e 67 69 6e 66 6f 28 43  s, nl_langinfo(C
0300: 4f 44 45 53 45 54 29 2c 20 54 43 4c 5f 49 4e 44  ODESET), TCL_IND
0310: 45 58 5f 4e 4f 4e 45 29 3b 0a 2b 09 7d 0a 2b 09  EX_NONE);.+.}.+.
0320: 54 63 6c 70 49 6e 69 74 55 6e 6c 6f 63 6b 28 29  TclpInitUnlock()
0330: 3b 0a 20 0a 20 09 2f 2a 0a 2d 09 20 2a 20 55 73  ;. . ./*.-. * Us
0340: 65 20 61 20 44 53 74 72 69 6e 67 20 73 6f 20 77  e a DString so w
0350: 65 20 63 61 6e 20 6d 6f 64 69 66 79 20 63 61 73  e can modify cas
0360: 65 2e 0a 2b 09 20 2a 20 52 65 73 6f 6c 76 65 20  e..+. * Resolve 
0370: 74 68 65 20 63 6f 70 69 65 64 20 65 6e 63 6f 64  the copied encod
0380: 69 6e 67 20 6e 61 6d 65 20 61 66 74 65 72 20 72  ing name after r
0390: 65 6c 65 61 73 69 6e 67 20 74 68 65 20 6c 6f 63  eleasing the loc
03a0: 61 6c 65 20 6c 6f 63 6b 2e 0a 20 09 20 2a 2f 0a  ale lock.. . */.
03b0: 20 0a 2d 09 54 63 6c 5f 44 53 74 72 69 6e 67 49   .-.Tcl_DStringI
03c0: 6e 69 74 28 26 64 73 29 3b 0a 2d 09 65 6e 63 6f  nit(&ds);.-.enco
03d0: 64 69 6e 67 20 3d 20 54 63 6c 5f 44 53 74 72 69  ding = Tcl_DStri
03e0: 6e 67 41 70 70 65 6e 64 28 26 64 73 2c 20 6e 6c  ngAppend(&ds, nl
03f0: 5f 6c 61 6e 67 69 6e 66 6f 28 43 4f 44 45 53 45  _langinfo(CODESE
0400: 54 29 2c 20 54 43 4c 5f 49 4e 44 45 58 5f 4e 4f  T), TCL_INDEX_NO
0410: 4e 45 29 3b 0a 2d 09 54 63 6c 5f 55 74 66 54 6f  NE);.-.Tcl_UtfTo
0420: 4c 6f 77 65 72 28 54 63 6c 5f 44 53 74 72 69 6e  Lower(Tcl_DStrin
0430: 67 56 61 6c 75 65 28 26 64 73 29 29 3b 0a 2d 09  gValue(&ds));.-.
0440: 6b 6e 6f 77 6e 45 6e 63 6f 64 69 6e 67 20 3d 20  knownEncoding = 
0450: 53 65 61 72 63 68 4b 6e 6f 77 6e 45 6e 63 6f 64  SearchKnownEncod
0460: 69 6e 67 73 28 65 6e 63 6f 64 69 6e 67 29 3b 0a  ings(encoding);.
0470: 2d 09 69 66 20 28 6b 6e 6f 77 6e 45 6e 63 6f 64  -.if (knownEncod
0480: 69 6e 67 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 2d  ing != NULL) {.-
0490: 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
04a0: 41 70 70 65 6e 64 28 62 75 66 50 74 72 2c 20 6b  Append(bufPtr, k
04b0: 6e 6f 77 6e 45 6e 63 6f 64 69 6e 67 2c 20 54 43  nownEncoding, TC
04c0: 4c 5f 49 4e 44 45 58 5f 4e 4f 4e 45 29 3b 0a 2d  L_INDEX_NONE);.-
04d0: 09 7d 20 65 6c 73 65 20 69 66 20 28 4e 55 4c 4c  .} else if (NULL
04e0: 20 21 3d 20 54 63 6c 5f 47 65 74 45 6e 63 6f 64   != Tcl_GetEncod
04f0: 69 6e 67 28 4e 55 4c 4c 2c 20 65 6e 63 6f 64 69  ing(NULL, encodi
0500: 6e 67 29 29 20 7b 0a 2d 09 20 20 20 20 54 63 6c  ng)) {.-.    Tcl
0510: 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 28 62  _DStringAppend(b
0520: 75 66 50 74 72 2c 20 65 6e 63 6f 64 69 6e 67 2c  ufPtr, encoding,
0530: 20 54 43 4c 5f 49 4e 44 45 58 5f 4e 4f 4e 45 29   TCL_INDEX_NONE)
0540: 3b 0a 2b 09 69 66 20 28 68 61 76 65 4c 6f 63 61  ;.+.if (haveLoca
0550: 6c 65 29 20 7b 0a 2b 09 20 20 20 20 65 6e 63 6f  le) {.+.    enco
0560: 64 69 6e 67 20 3d 20 54 63 6c 5f 44 53 74 72 69  ding = Tcl_DStri
0570: 6e 67 56 61 6c 75 65 28 26 64 73 29 3b 0a 2b 09  ngValue(&ds);.+.
0580: 20 20 20 20 54 63 6c 5f 55 74 66 54 6f 4c 6f 77      Tcl_UtfToLow
0590: 65 72 28 54 63 6c 5f 44 53 74 72 69 6e 67 56 61  er(Tcl_DStringVa
05a0: 6c 75 65 28 26 64 73 29 29 3b 0a 2b 09 20 20 20  lue(&ds));.+.   
05b0: 20 6b 6e 6f 77 6e 45 6e 63 6f 64 69 6e 67 20 3d   knownEncoding =
05c0: 20 53 65 61 72 63 68 4b 6e 6f 77 6e 45 6e 63 6f   SearchKnownEnco
05d0: 64 69 6e 67 73 28 65 6e 63 6f 64 69 6e 67 29 3b  dings(encoding);
05e0: 0a 2b 09 20 20 20 20 69 66 20 28 6b 6e 6f 77 6e  .+.    if (known
05f0: 45 6e 63 6f 64 69 6e 67 20 21 3d 20 4e 55 4c 4c  Encoding != NULL
0600: 29 20 7b 0a 2b 09 09 54 63 6c 5f 44 53 74 72 69  ) {.+..Tcl_DStri
0610: 6e 67 41 70 70 65 6e 64 28 62 75 66 50 74 72 2c  ngAppend(bufPtr,
0620: 20 6b 6e 6f 77 6e 45 6e 63 6f 64 69 6e 67 2c 20   knownEncoding, 
0630: 54 43 4c 5f 49 4e 44 45 58 5f 4e 4f 4e 45 29 3b  TCL_INDEX_NONE);
0640: 0a 2b 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66  .+.    } else if
0650: 20 28 4e 55 4c 4c 20 21 3d 20 54 63 6c 5f 47 65   (NULL != Tcl_Ge
0660: 74 45 6e 63 6f 64 69 6e 67 28 4e 55 4c 4c 2c 20  tEncoding(NULL, 
0670: 65 6e 63 6f 64 69 6e 67 29 29 20 7b 0a 2b 09 09  encoding)) {.+..
0680: 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e  Tcl_DStringAppen
0690: 64 28 62 75 66 50 74 72 2c 20 65 6e 63 6f 64 69  d(bufPtr, encodi
06a0: 6e 67 2c 20 54 43 4c 5f 49 4e 44 45 58 5f 4e 4f  ng, TCL_INDEX_NO
06b0: 4e 45 29 3b 0a 2b 09 20 20 20 20 7d 0a 20 09 7d  NE);.+.    }. .}
06c0: 0a 20 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72  . .Tcl_DStringFr
06d0: 65 65 28 26 64 73 29 3b 0a 20 09 69 66 20 28 54  ee(&ds);. .if (T
06e0: 63 6c 5f 44 53 74 72 69 6e 67 4c 65 6e 67 74 68  cl_DStringLength
06f0: 28 62 75 66 50 74 72 29 29 20 7b 0a              (bufPtr)) {.