Tcl Source Code

Hex Artifact Content
Login

Artifact 9ef20b7ecb14f10b87a0c8becb72d54a7577ffe2:

Attachment "tcl8.5_all_003.diff" to ticket [875701ffff] added by andreas_kupries 2005-01-27 06:43:32.
0000: 49 6e 64 65 78 3a 20 64 6f 63 2f 43 72 74 43 68  Index: doc/CrtCh
0010: 61 6e 6e 65 6c 2e 33 0a 3d 3d 3d 3d 3d 3d 3d 3d  annel.3.========
0020: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0030: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0040: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0050: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 52 43 53 20  ===========.RCS 
0060: 66 69 6c 65 3a 20 2f 63 76 73 72 6f 6f 74 2f 74  file: /cvsroot/t
0070: 63 6c 2f 74 63 6c 2f 64 6f 63 2f 43 72 74 43 68  cl/tcl/doc/CrtCh
0080: 61 6e 6e 65 6c 2e 33 2c 76 0a 72 65 74 72 69 65  annel.3,v.retrie
0090: 76 69 6e 67 20 72 65 76 69 73 69 6f 6e 20 31 2e  ving revision 1.
00a0: 32 34 0a 64 69 66 66 20 2d 77 20 2d 75 20 2d 72  24.diff -w -u -r
00b0: 31 2e 32 34 20 43 72 74 43 68 61 6e 6e 65 6c 2e  1.24 CrtChannel.
00c0: 33 0a 2d 2d 2d 20 64 6f 63 2f 43 72 74 43 68 61  3.--- doc/CrtCha
00d0: 6e 6e 65 6c 2e 33 09 31 32 20 4e 6f 76 20 32 30  nnel.3.12 Nov 20
00e0: 30 34 20 30 39 3a 30 31 3a 32 35 20 2d 30 30 30  04 09:01:25 -000
00f0: 30 09 31 2e 32 34 0a 2b 2b 2b 20 64 6f 63 2f 43  0.1.24.+++ doc/C
0100: 72 74 43 68 61 6e 6e 65 6c 2e 33 09 32 36 20 4a  rtChannel.3.26 J
0110: 61 6e 20 32 30 30 35 20 32 33 3a 33 36 3a 35 30  an 2005 23:36:50
0120: 20 2d 30 30 30 30 0a 40 40 20 2d 37 2c 31 31 20   -0000.@@ -7,11 
0130: 2b 37 2c 31 31 20 40 40 0a 20 27 5c 22 0a 20 27  +7,11 @@. '\". '
0140: 5c 22 20 52 43 53 3a 20 40 28 23 29 20 24 49 64  \" RCS: @(#) $Id
0150: 3a 20 43 72 74 43 68 61 6e 6e 65 6c 2e 33 2c 76  : CrtChannel.3,v
0160: 20 31 2e 32 34 20 32 30 30 34 2f 31 31 2f 31 32   1.24 2004/11/12
0170: 20 30 39 3a 30 31 3a 32 35 20 64 61 73 20 45 78   09:01:25 das Ex
0180: 70 20 24 0a 20 2e 73 6f 20 6d 61 6e 2e 6d 61 63  p $. .so man.mac
0190: 72 6f 73 0a 2d 2e 54 48 20 54 63 6c 5f 43 72 65  ros.-.TH Tcl_Cre
01a0: 61 74 65 43 68 61 6e 6e 65 6c 20 33 20 38 2e 33  ateChannel 3 8.3
01b0: 20 54 63 6c 20 22 54 63 6c 20 4c 69 62 72 61 72   Tcl "Tcl Librar
01c0: 79 20 50 72 6f 63 65 64 75 72 65 73 22 0a 2b 2e  y Procedures".+.
01d0: 54 48 20 54 63 6c 5f 43 72 65 61 74 65 43 68 61  TH Tcl_CreateCha
01e0: 6e 6e 65 6c 20 33 20 38 2e 34 20 54 63 6c 20 22  nnel 3 8.4 Tcl "
01f0: 54 63 6c 20 4c 69 62 72 61 72 79 20 50 72 6f 63  Tcl Library Proc
0200: 65 64 75 72 65 73 22 0a 20 2e 42 53 0a 20 27 5c  edures". .BS. '\
0210: 22 20 4e 6f 74 65 3a 20 20 64 6f 20 6e 6f 74 20  " Note:  do not 
0220: 6d 6f 64 69 66 79 20 74 68 65 20 2e 53 48 20 4e  modify the .SH N
0230: 41 4d 45 20 6c 69 6e 65 20 69 6d 6d 65 64 69 61  AME line immedia
0240: 74 65 6c 79 20 62 65 6c 6f 77 21 0a 20 2e 53 48  tely below!. .SH
0250: 20 4e 41 4d 45 0a 2d 54 63 6c 5f 43 72 65 61 74   NAME.-Tcl_Creat
0260: 65 43 68 61 6e 6e 65 6c 2c 20 54 63 6c 5f 47 65  eChannel, Tcl_Ge
0270: 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65  tChannelInstance
0280: 44 61 74 61 2c 20 54 63 6c 5f 47 65 74 43 68 61  Data, Tcl_GetCha
0290: 6e 6e 65 6c 54 79 70 65 2c 20 54 63 6c 5f 47 65  nnelType, Tcl_Ge
02a0: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 2c 20 54 63  tChannelName, Tc
02b0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 48 61 6e 64  l_GetChannelHand
02c0: 6c 65 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e  le, Tcl_GetChann
02d0: 65 6c 4d 6f 64 65 2c 20 54 63 6c 5f 47 65 74 43  elMode, Tcl_GetC
02e0: 68 61 6e 6e 65 6c 42 75 66 66 65 72 53 69 7a 65  hannelBufferSize
02f0: 2c 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c  , Tcl_SetChannel
0300: 42 75 66 66 65 72 53 69 7a 65 2c 20 54 63 6c 5f  BufferSize, Tcl_
0310: 4e 6f 74 69 66 79 43 68 61 6e 6e 65 6c 2c 20 54  NotifyChannel, T
0320: 63 6c 5f 42 61 64 43 68 61 6e 6e 65 6c 4f 70 74  cl_BadChannelOpt
0330: 69 6f 6e 2c 20 54 63 6c 5f 43 68 61 6e 6e 65 6c  ion, Tcl_Channel
0340: 4e 61 6d 65 2c 20 54 63 6c 5f 43 68 61 6e 6e 65  Name, Tcl_Channe
0350: 6c 56 65 72 73 69 6f 6e 2c 20 54 63 6c 5f 43 68  lVersion, Tcl_Ch
0360: 61 6e 6e 65 6c 42 6c 6f 63 6b 4d 6f 64 65 50 72  annelBlockModePr
0370: 6f 63 2c 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 43  oc, Tcl_ChannelC
0380: 6c 6f 73 65 50 72 6f 63 2c 20 54 63 6c 5f 43 68  loseProc, Tcl_Ch
0390: 61 6e 6e 65 6c 43 6c 6f 73 65 32 50 72 6f 63 2c  annelClose2Proc,
03a0: 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 49 6e 70 75   Tcl_ChannelInpu
03b0: 74 50 72 6f 63 2c 20 54 63 6c 5f 43 68 61 6e 6e  tProc, Tcl_Chann
03c0: 65 6c 4f 75 74 70 75 74 50 72 6f 63 2c 20 54 63  elOutputProc, Tc
03d0: 6c 5f 43 68 61 6e 6e 65 6c 53 65 65 6b 50 72 6f  l_ChannelSeekPro
03e0: 63 2c 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 57 69  c, Tcl_ChannelWi
03f0: 64 65 53 65 65 6b 50 72 6f 63 2c 20 54 63 6c 5f  deSeekProc, Tcl_
0400: 43 68 61 6e 6e 65 6c 53 65 74 4f 70 74 69 6f 6e  ChannelSetOption
0410: 50 72 6f 63 2c 20 54 63 6c 5f 43 68 61 6e 6e 65  Proc, Tcl_Channe
0420: 6c 47 65 74 4f 70 74 69 6f 6e 50 72 6f 63 2c 20  lGetOptionProc, 
0430: 54 63 6c 5f 43 68 61 6e 6e 65 6c 57 61 74 63 68  Tcl_ChannelWatch
0440: 50 72 6f 63 2c 20 54 63 6c 5f 43 68 61 6e 6e 65  Proc, Tcl_Channe
0450: 6c 47 65 74 48 61 6e 64 6c 65 50 72 6f 63 2c 20  lGetHandleProc, 
0460: 54 63 6c 5f 43 68 61 6e 6e 65 6c 46 6c 75 73 68  Tcl_ChannelFlush
0470: 50 72 6f 63 2c 20 54 63 6c 5f 43 68 61 6e 6e 65  Proc, Tcl_Channe
0480: 6c 48 61 6e 64 6c 65 72 50 72 6f 63 2c 20 54 63  lHandlerProc, Tc
0490: 6c 5f 49 73 43 68 61 6e 6e 65 6c 53 68 61 72 65  l_IsChannelShare
04a0: 64 2c 20 54 63 6c 5f 49 73 43 68 61 6e 6e 65 6c  d, Tcl_IsChannel
04b0: 52 65 67 69 73 74 65 72 65 64 2c 20 54 63 6c 5f  Registered, Tcl_
04c0: 43 75 74 43 68 61 6e 6e 65 6c 2c 20 54 63 6c 5f  CutChannel, Tcl_
04d0: 53 70 6c 69 63 65 43 68 61 6e 6e 65 6c 2c 20 54  SpliceChannel, T
04e0: 63 6c 5f 49 73 43 68 61 6e 6e 65 6c 45 78 69 73  cl_IsChannelExis
04f0: 74 69 6e 67 2c 20 54 63 6c 5f 43 6c 65 61 72 43  ting, Tcl_ClearC
0500: 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 72 73 2c 20  hannelHandlers, 
0510: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 68  Tcl_GetChannelTh
0520: 72 65 61 64 2c 20 54 63 6c 5f 43 68 61 6e 6e 65  read, Tcl_Channe
0530: 6c 42 75 66 66 65 72 65 64 20 5c 2d 20 70 72 6f  lBuffered \- pro
0540: 63 65 64 75 72 65 73 20 66 6f 72 20 63 72 65 61  cedures for crea
0550: 74 69 6e 67 20 61 6e 64 20 6d 61 6e 69 70 75 6c  ting and manipul
0560: 61 74 69 6e 67 20 63 68 61 6e 6e 65 6c 73 0a 2b  ating channels.+
0570: 54 63 6c 5f 43 72 65 61 74 65 43 68 61 6e 6e 65  Tcl_CreateChanne
0580: 6c 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  l, Tcl_GetChanne
0590: 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 54  lInstanceData, T
05a0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70  cl_GetChannelTyp
05b0: 65 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  e, Tcl_GetChanne
05c0: 6c 4e 61 6d 65 2c 20 54 63 6c 5f 47 65 74 43 68  lName, Tcl_GetCh
05d0: 61 6e 6e 65 6c 48 61 6e 64 6c 65 2c 20 54 63 6c  annelHandle, Tcl
05e0: 5f 47 65 74 43 68 61 6e 6e 65 6c 4d 6f 64 65 2c  _GetChannelMode,
05f0: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 42   Tcl_GetChannelB
0600: 75 66 66 65 72 53 69 7a 65 2c 20 54 63 6c 5f 53  ufferSize, Tcl_S
0610: 65 74 43 68 61 6e 6e 65 6c 42 75 66 66 65 72 53  etChannelBufferS
0620: 69 7a 65 2c 20 54 63 6c 5f 4e 6f 74 69 66 79 43  ize, Tcl_NotifyC
0630: 68 61 6e 6e 65 6c 2c 20 54 63 6c 5f 42 61 64 43  hannel, Tcl_BadC
0640: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 2c 20 54 63  hannelOption, Tc
0650: 6c 5f 43 68 61 6e 6e 65 6c 4e 61 6d 65 2c 20 54  l_ChannelName, T
0660: 63 6c 5f 43 68 61 6e 6e 65 6c 56 65 72 73 69 6f  cl_ChannelVersio
0670: 6e 2c 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 42 6c  n, Tcl_ChannelBl
0680: 6f 63 6b 4d 6f 64 65 50 72 6f 63 2c 20 54 63 6c  ockModeProc, Tcl
0690: 5f 43 68 61 6e 6e 65 6c 43 6c 6f 73 65 50 72 6f  _ChannelClosePro
06a0: 63 2c 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 43 6c  c, Tcl_ChannelCl
06b0: 6f 73 65 32 50 72 6f 63 2c 20 54 63 6c 5f 43 68  ose2Proc, Tcl_Ch
06c0: 61 6e 6e 65 6c 49 6e 70 75 74 50 72 6f 63 2c 20  annelInputProc, 
06d0: 54 63 6c 5f 43 68 61 6e 6e 65 6c 4f 75 74 70 75  Tcl_ChannelOutpu
06e0: 74 50 72 6f 63 2c 20 54 63 6c 5f 43 68 61 6e 6e  tProc, Tcl_Chann
06f0: 65 6c 53 65 65 6b 50 72 6f 63 2c 20 54 63 6c 5f  elSeekProc, Tcl_
0700: 43 68 61 6e 6e 65 6c 57 69 64 65 53 65 65 6b 50  ChannelWideSeekP
0710: 72 6f 63 2c 20 54 63 6c 5f 43 68 61 6e 6e 65 6c  roc, Tcl_Channel
0720: 53 65 74 4f 70 74 69 6f 6e 50 72 6f 63 2c 20 54  SetOptionProc, T
0730: 63 6c 5f 43 68 61 6e 6e 65 6c 47 65 74 4f 70 74  cl_ChannelGetOpt
0740: 69 6f 6e 50 72 6f 63 2c 20 54 63 6c 5f 43 68 61  ionProc, Tcl_Cha
0750: 6e 6e 65 6c 57 61 74 63 68 50 72 6f 63 2c 20 54  nnelWatchProc, T
0760: 63 6c 5f 43 68 61 6e 6e 65 6c 47 65 74 48 61 6e  cl_ChannelGetHan
0770: 64 6c 65 50 72 6f 63 2c 20 54 63 6c 5f 43 68 61  dleProc, Tcl_Cha
0780: 6e 6e 65 6c 46 6c 75 73 68 50 72 6f 63 2c 20 54  nnelFlushProc, T
0790: 63 6c 5f 43 68 61 6e 6e 65 6c 48 61 6e 64 6c 65  cl_ChannelHandle
07a0: 72 50 72 6f 63 2c 20 54 63 6c 5f 43 68 61 6e 6e  rProc, Tcl_Chann
07b0: 65 6c 54 68 72 65 61 64 41 63 74 69 6f 6e 50 72  elThreadActionPr
07c0: 6f 63 2c 20 54 63 6c 5f 49 73 43 68 61 6e 6e 65  oc, Tcl_IsChanne
07d0: 6c 53 68 61 72 65 64 2c 20 54 63 6c 5f 49 73 43  lShared, Tcl_IsC
07e0: 68 61 6e 6e 65 6c 52 65 67 69 73 74 65 72 65 64  hannelRegistered
07f0: 2c 20 54 63 6c 5f 43 75 74 43 68 61 6e 6e 65 6c  , Tcl_CutChannel
0800: 2c 20 54 63 6c 5f 53 70 6c 69 63 65 43 68 61 6e  , Tcl_SpliceChan
0810: 6e 65 6c 2c 20 54 63 6c 5f 49 73 43 68 61 6e 6e  nel, Tcl_IsChann
0820: 65 6c 45 78 69 73 74 69 6e 67 2c 20 54 63 6c 5f  elExisting, Tcl_
0830: 43 6c 65 61 72 43 68 61 6e 6e 65 6c 48 61 6e 64  ClearChannelHand
0840: 6c 65 72 73 2c 20 54 63 6c 5f 47 65 74 43 68 61  lers, Tcl_GetCha
0850: 6e 6e 65 6c 54 68 72 65 61 64 2c 20 54 63 6c 5f  nnelThread, Tcl_
0860: 43 68 61 6e 6e 65 6c 42 75 66 66 65 72 65 64 20  ChannelBuffered 
0870: 5c 2d 20 70 72 6f 63 65 64 75 72 65 73 20 66 6f  \- procedures fo
0880: 72 20 63 72 65 61 74 69 6e 67 20 61 6e 64 20 6d  r creating and m
0890: 61 6e 69 70 75 6c 61 74 69 6e 67 20 63 68 61 6e  anipulating chan
08a0: 6e 65 6c 73 0a 20 2e 53 48 20 53 59 4e 4f 50 53  nels. .SH SYNOPS
08b0: 49 53 0a 20 2e 6e 66 0a 20 5c 66 42 23 69 6e 63  IS. .nf. \fB#inc
08c0: 6c 75 64 65 20 3c 74 63 6c 2e 68 3e 5c 66 52 0a  lude <tcl.h>\fR.
08d0: 40 40 20 2d 39 39 2c 36 20 2b 39 39 2c 39 20 40  @@ -99,6 +99,9 @
08e0: 40 0a 20 2e 56 53 20 38 2e 34 0a 20 54 63 6c 5f  @. .VS 8.4. Tcl_
08f0: 44 72 69 76 65 72 57 69 64 65 53 65 65 6b 50 72  DriverWideSeekPr
0900: 6f 63 20 2a 0a 20 5c 66 42 54 63 6c 5f 43 68 61  oc *. \fBTcl_Cha
0910: 6e 6e 65 6c 57 69 64 65 53 65 65 6b 50 72 6f 63  nnelWideSeekProc
0920: 5c 66 52 28 5c 66 49 74 79 70 65 50 74 72 5c 66  \fR(\fItypePtr\f
0930: 52 29 0a 2b 2e 73 70 0a 2b 54 63 6c 5f 44 72 69  R).+.sp.+Tcl_Dri
0940: 76 65 72 54 68 72 65 61 64 41 63 74 69 6f 6e 50  verThreadActionP
0950: 72 6f 63 20 2a 0a 2b 5c 66 42 54 63 6c 5f 43 68  roc *.+\fBTcl_Ch
0960: 61 6e 6e 65 6c 54 68 72 65 61 64 41 63 74 69 6f  annelThreadActio
0970: 6e 50 72 6f 63 5c 66 52 28 5c 66 49 74 79 70 65  nProc\fR(\fItype
0980: 50 74 72 5c 66 52 29 0a 20 2e 56 45 20 38 2e 34  Ptr\fR). .VE 8.4
0990: 0a 20 2e 73 70 0a 20 54 63 6c 5f 44 72 69 76 65  . .sp. Tcl_Drive
09a0: 72 53 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 2a  rSetOptionProc *
09b0: 0a 40 40 20 2d 32 39 30 2c 31 30 20 2b 32 39 33  .@@ -290,10 +293
09c0: 2c 32 30 20 40 40 0a 20 28 74 68 72 65 61 64 29  ,20 @@. (thread)
09d0: 67 6c 6f 62 61 6c 20 6c 69 73 74 20 6f 66 20 61  global list of a
09e0: 6c 6c 20 63 68 61 6e 6e 65 6c 73 20 28 6f 66 20  ll channels (of 
09f0: 74 68 65 20 63 75 72 72 65 6e 74 20 74 68 72 65  the current thre
0a00: 61 64 29 2e 0a 20 41 70 70 6c 69 63 61 74 69 6f  ad).. Applicatio
0a10: 6e 20 74 6f 20 61 20 63 68 61 6e 6e 65 6c 20 73  n to a channel s
0a20: 74 69 6c 6c 20 72 65 67 69 73 74 65 72 65 64 20  till registered 
0a30: 69 6e 20 73 6f 6d 65 20 69 6e 74 65 72 70 72 65  in some interpre
0a40: 74 65 72 0a 20 69 73 20 6e 6f 74 20 61 6c 6c 6f  ter. is not allo
0a50: 77 65 64 2e 0a 2b 2e 56 53 20 38 2e 35 0a 2b 41  wed..+.VS 8.5.+A
0a60: 6c 73 6f 20 6e 6f 74 69 66 69 65 73 20 74 68 65  lso notifies the
0a70: 20 64 72 69 76 65 72 20 69 66 20 74 68 65 20 5c   driver if the \
0a80: 66 42 54 63 6c 5f 43 68 61 6e 6e 65 6c 54 79 70  fBTcl_ChannelTyp
0a90: 65 5c 66 52 20 76 65 72 73 69 6f 6e 20 69 73 0a  e\fR version is.
0aa0: 2b 5c 66 42 54 43 4c 5f 43 48 41 4e 4e 45 4c 5f  +\fBTCL_CHANNEL_
0ab0: 56 45 52 53 49 4f 4e 5f 34 5c 66 52 20 28 6f 72  VERSION_4\fR (or
0ac0: 20 68 69 67 68 65 72 29 2c 20 61 6e 64 0a 2b 5c   higher), and.+\
0ad0: 66 42 54 63 6c 5f 44 72 69 76 65 72 54 68 72 65  fBTcl_DriverThre
0ae0: 61 64 41 63 74 69 6f 6e 50 72 6f 63 5c 66 52 20  adActionProc\fR 
0af0: 69 73 20 64 65 66 69 6e 65 64 20 66 6f 72 20 69  is defined for i
0b00: 74 2e 0a 2b 2e 56 45 20 38 2e 35 0a 20 2e 50 50  t..+.VE 8.5. .PP
0b10: 0a 20 5c 66 42 54 63 6c 5f 53 70 6c 69 63 65 43  . \fBTcl_SpliceC
0b20: 68 61 6e 6e 65 6c 5c 66 52 20 61 64 64 73 20 74  hannel\fR adds t
0b30: 68 65 20 73 70 65 63 69 66 69 65 64 20 5c 66 49  he specified \fI
0b40: 63 68 61 6e 6e 65 6c 5c 66 52 20 74 6f 20 74 68  channel\fR to th
0b50: 65 0a 20 28 74 68 72 65 61 64 29 67 6c 6f 62 61  e. (thread)globa
0b60: 6c 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 63 68  l list of all ch
0b70: 61 6e 6e 65 6c 73 20 28 6f 66 20 74 68 65 20 63  annels (of the c
0b80: 75 72 72 65 6e 74 20 74 68 72 65 61 64 29 2e 0a  urrent thread)..
0b90: 20 41 70 70 6c 69 63 61 74 69 6f 6e 20 74 6f 20   Application to 
0ba0: 61 20 63 68 61 6e 6e 65 6c 20 72 65 67 69 73 74  a channel regist
0bb0: 65 72 65 64 20 69 6e 20 73 6f 6d 65 20 69 6e 74  ered in some int
0bc0: 65 72 70 72 65 74 65 72 20 69 73 20 6e 6f 74 20  erpreter is not 
0bd0: 61 6c 6c 6f 77 65 64 2e 0a 2b 2e 56 53 20 38 2e  allowed..+.VS 8.
0be0: 35 0a 2b 41 6c 73 6f 20 6e 6f 74 69 66 69 65 73  5.+Also notifies
0bf0: 20 74 68 65 20 64 72 69 76 65 72 20 69 66 20 74   the driver if t
0c00: 68 65 20 5c 66 42 54 63 6c 5f 43 68 61 6e 6e 65  he \fBTcl_Channe
0c10: 6c 54 79 70 65 5c 66 52 20 76 65 72 73 69 6f 6e  lType\fR version
0c20: 20 69 73 0a 2b 5c 66 42 54 43 4c 5f 43 48 41 4e   is.+\fBTCL_CHAN
0c30: 4e 45 4c 5f 56 45 52 53 49 4f 4e 5f 34 5c 66 52  NEL_VERSION_4\fR
0c40: 20 28 6f 72 20 68 69 67 68 65 72 29 2c 20 61 6e   (or higher), an
0c50: 64 0a 2b 5c 66 42 54 63 6c 5f 44 72 69 76 65 72  d.+\fBTcl_Driver
0c60: 54 68 72 65 61 64 41 63 74 69 6f 6e 50 72 6f 63  ThreadActionProc
0c70: 5c 66 52 20 69 73 20 64 65 66 69 6e 65 64 20 66  \fR is defined f
0c80: 6f 72 20 69 74 2e 0a 2b 2e 56 45 20 38 2e 35 0a  or it..+.VE 8.5.
0c90: 20 2e 50 50 0a 20 5c 66 42 54 63 6c 5f 43 6c 65   .PP. \fBTcl_Cle
0ca0: 61 72 43 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 72  arChannelHandler
0cb0: 73 5c 66 52 20 72 65 6d 6f 76 65 73 20 61 6c 6c  s\fR removes all
0cc0: 20 63 68 61 6e 6e 65 6c 68 61 6e 64 6c 65 72 73   channelhandlers
0cd0: 20 61 6e 64 20 65 76 65 6e 74 0a 20 73 63 72 69   and event. scri
0ce0: 70 74 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  pts associated w
0cf0: 69 74 68 20 74 68 65 20 73 70 65 63 69 66 69 65  ith the specifie
0d00: 64 20 5c 66 49 63 68 61 6e 6e 65 6c 5c 66 52 2c  d \fIchannel\fR,
0d10: 20 74 68 75 73 20 73 68 75 74 74 69 6e 67 0a 40   thus shutting.@
0d20: 40 20 2d 33 32 36 2c 36 20 2b 33 33 39 2c 37 20  @ -326,6 +339,7 
0d30: 40 40 0a 20 20 20 20 20 20 20 20 20 54 63 6c 5f  @@.         Tcl_
0d40: 44 72 69 76 65 72 46 6c 75 73 68 50 72 6f 63 20  DriverFlushProc 
0d50: 2a 5c 66 49 66 6c 75 73 68 50 72 6f 63 5c 66 52  *\fIflushProc\fR
0d60: 3b 0a 20 20 20 20 20 20 20 20 20 54 63 6c 5f 44  ;.         Tcl_D
0d70: 72 69 76 65 72 48 61 6e 64 6c 65 72 50 72 6f 63  riverHandlerProc
0d80: 20 2a 5c 66 49 68 61 6e 64 6c 65 72 50 72 6f 63   *\fIhandlerProc
0d90: 5c 66 52 3b 0a 20 20 20 20 20 20 20 20 20 54 63  \fR;.         Tc
0da0: 6c 5f 44 72 69 76 65 72 57 69 64 65 53 65 65 6b  l_DriverWideSeek
0db0: 50 72 6f 63 20 2a 5c 66 49 77 69 64 65 53 65 65  Proc *\fIwideSee
0dc0: 6b 50 72 6f 63 5c 66 52 3b 0a 2b 09 54 63 6c 5f  kProc\fR;.+.Tcl_
0dd0: 44 72 69 76 65 72 54 68 72 65 61 64 41 63 74 69  DriverThreadActi
0de0: 6f 6e 50 72 6f 63 20 2a 5c 66 49 74 68 72 65 61  onProc *\fIthrea
0df0: 64 41 63 74 69 6f 6e 50 72 6f 63 5c 66 52 3b 0a  dActionProc\fR;.
0e00: 20 7d 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 54 79   } Tcl_ChannelTy
0e10: 70 65 3b 0a 20 2e 43 45 0a 20 2e 50 50 0a 40 40  pe;. .CE. .PP.@@
0e20: 20 2d 33 34 36 2c 36 20 2b 33 36 30 2c 37 20 40   -346,6 +360,7 @
0e30: 40 0a 20 5c 66 42 54 63 6c 5f 43 68 61 6e 6e 65  @. \fBTcl_Channe
0e40: 6c 4f 75 74 70 75 74 50 72 6f 63 5c 66 52 2c 20  lOutputProc\fR, 
0e50: 5c 66 42 54 63 6c 5f 43 68 61 6e 6e 65 6c 53 65  \fBTcl_ChannelSe
0e60: 65 6b 50 72 6f 63 5c 66 52 2c 0a 20 2e 56 53 20  ekProc\fR,. .VS 
0e70: 38 2e 34 0a 20 5c 66 42 54 63 6c 5f 43 68 61 6e  8.4. \fBTcl_Chan
0e80: 6e 65 6c 57 69 64 65 53 65 65 6b 50 72 6f 63 5c  nelWideSeekProc\
0e90: 66 52 2c 0a 2b 5c 66 42 54 63 6c 5f 43 68 61 6e  fR,.+\fBTcl_Chan
0ea0: 6e 65 6c 54 68 72 65 61 64 41 63 74 69 6f 6e 50  nelThreadActionP
0eb0: 72 6f 63 5c 66 52 2c 0a 20 2e 56 45 20 38 2e 34  roc\fR,. .VE 8.4
0ec0: 0a 20 5c 66 42 54 63 6c 5f 43 68 61 6e 6e 65 6c  . \fBTcl_Channel
0ed0: 53 65 74 4f 70 74 69 6f 6e 50 72 6f 63 5c 66 52  SetOptionProc\fR
0ee0: 2c 20 5c 66 42 54 63 6c 5f 43 68 61 6e 6e 65 6c  , \fBTcl_Channel
0ef0: 47 65 74 4f 70 74 69 6f 6e 50 72 6f 63 5c 66 52  GetOptionProc\fR
0f00: 2c 0a 20 5c 66 42 54 63 6c 5f 43 68 61 6e 6e 65  ,. \fBTcl_Channe
0f10: 6c 57 61 74 63 68 50 72 6f 63 5c 66 52 2c 20 5c  lWatchProc\fR, \
0f20: 66 42 54 63 6c 5f 43 68 61 6e 6e 65 6c 47 65 74  fBTcl_ChannelGet
0f30: 48 61 6e 64 6c 65 50 72 6f 63 5c 66 52 2c 0a 40  HandleProc\fR,.@
0f40: 40 20 2d 33 36 35 2c 31 36 20 2b 33 38 30 2c 32  @ -365,16 +380,2
0f50: 35 20 40 40 0a 20 61 20 70 6f 69 6e 74 65 72 20  5 @@. a pointer 
0f60: 74 6f 20 74 68 65 20 73 74 72 69 6e 67 2e 0a 20  to the string.. 
0f70: 2e 53 53 20 56 45 52 53 49 4f 4e 0a 20 2e 50 50  .SS VERSION. .PP
0f80: 0a 2d 54 68 65 20 5c 66 49 76 65 72 73 69 6f 6e  .-The \fIversion
0f90: 5c 66 52 20 66 69 65 6c 64 20 73 68 6f 75 6c 64  \fR field should
0fa0: 20 62 65 20 73 65 74 20 74 6f 20 5c 66 42 54 43   be set to \fBTC
0fb0: 4c 5f 43 48 41 4e 4e 45 4c 5f 56 45 52 53 49 4f  L_CHANNEL_VERSIO
0fc0: 4e 5f 32 5c 66 52 2e 0a 2d 49 66 20 69 74 20 69  N_2\fR..-If it i
0fd0: 73 20 6e 6f 74 20 73 65 74 20 74 6f 20 74 68 69  s not set to thi
0fe0: 73 20 76 61 6c 75 65 20 5c 66 42 54 43 4c 5f 43  s value \fBTCL_C
0ff0: 48 41 4e 4e 45 4c 5f 56 45 52 53 49 4f 4e 5f 33  HANNEL_VERSION_3
1000: 5c 66 52 2c 20 74 68 65 6e 20 74 68 69 73 0a 2d  \fR, then this.-
1010: 5c 66 42 54 63 6c 5f 43 68 61 6e 6e 65 6c 54 79  \fBTcl_ChannelTy
1020: 70 65 5c 66 52 20 69 73 20 61 73 73 75 6d 65 64  pe\fR is assumed
1030: 20 74 6f 20 68 61 76 65 20 74 68 65 20 6f 6c 64   to have the old
1040: 65 72 20 73 74 72 75 63 74 75 72 65 2e 20 20 53  er structure.  S
1050: 65 65 0a 2b 0a 2b 54 68 65 20 5c 66 49 76 65 72  ee.+.+The \fIver
1060: 73 69 6f 6e 5c 66 52 20 66 69 65 6c 64 20 73 68  sion\fR field sh
1070: 6f 75 6c 64 20 62 65 20 73 65 74 20 74 6f 20 74  ould be set to t
1080: 68 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68  he version of th
1090: 65 20 73 74 72 75 63 74 75 72 65 0a 2b 74 68 61  e structure.+tha
10a0: 74 20 79 6f 75 20 72 65 71 75 69 72 65 2e 20 5c  t you require. \
10b0: 66 42 54 43 4c 5f 43 48 41 4e 4e 45 4c 5f 56 45  fBTCL_CHANNEL_VE
10c0: 52 53 49 4f 4e 5f 32 5c 66 52 20 69 73 20 74 68  RSION_2\fR is th
10d0: 65 20 6d 69 6e 69 6d 75 6d 20 72 65 63 6f 6d 6d  e minimum recomm
10e0: 65 6e 64 65 64 2e 0a 2b 2e 56 53 20 38 2e 34 0a  ended..+.VS 8.4.
10f0: 2b 5c 66 42 54 43 4c 5f 43 48 41 4e 4e 45 4c 5f  +\fBTCL_CHANNEL_
1100: 56 45 52 53 49 4f 4e 5f 33 5c 66 52 20 6d 75 73  VERSION_3\fR mus
1110: 74 20 62 65 20 73 65 74 20 74 6f 20 73 70 65 63  t be set to spec
1120: 69 66 69 79 20 74 68 65 20 5c 66 49 77 69 64 65  ifiy the \fIwide
1130: 53 65 65 6b 50 72 6f 63 5c 66 52 20 6d 65 6d 62  SeekProc\fR memb
1140: 65 72 2e 0a 2b 2e 56 45 20 38 2e 34 0a 2b 2e 56  er..+.VE 8.4.+.V
1150: 53 20 38 2e 35 0a 2b 5c 66 42 54 43 4c 5f 43 48  S 8.5.+\fBTCL_CH
1160: 41 4e 4e 45 4c 5f 56 45 52 53 49 4f 4e 5f 34 5c  ANNEL_VERSION_4\
1170: 66 52 20 6d 75 73 74 20 62 65 20 73 65 74 20 74  fR must be set t
1180: 6f 20 73 70 65 63 69 66 69 79 20 74 68 65 0a 2b  o specifiy the.+
1190: 5c 66 49 74 68 72 65 61 64 41 63 74 69 6f 6e 50  \fIthreadActionP
11a0: 72 6f 63 5c 66 52 20 6d 65 6d 62 65 72 20 28 69  roc\fR member (i
11b0: 6e 63 6c 75 64 65 73 20 5c 66 49 77 69 64 65 53  ncludes \fIwideS
11c0: 65 65 6b 50 72 6f 63 5c 66 52 29 2e 0a 2b 2e 56  eekProc\fR)..+.V
11d0: 45 20 38 2e 35 0a 2b 49 66 20 69 74 20 69 73 20  E 8.5.+If it is 
11e0: 6e 6f 74 20 73 65 74 20 74 6f 20 61 6e 79 20 6f  not set to any o
11f0: 66 20 74 68 65 73 65 2c 20 74 68 65 6e 20 74 68  f these, then th
1200: 69 73 0a 2b 5c 66 42 54 63 6c 5f 43 68 61 6e 6e  is.+\fBTcl_Chann
1210: 65 6c 54 79 70 65 5c 66 52 20 69 73 20 61 73 73  elType\fR is ass
1220: 75 6d 65 64 20 74 6f 20 68 61 76 65 20 74 68 65  umed to have the
1230: 20 6f 72 69 67 69 6e 61 6c 20 73 74 72 75 63 74   original struct
1240: 75 72 65 2e 20 20 53 65 65 0a 20 5c 66 42 4f 4c  ure.  See. \fBOL
1250: 44 20 43 48 41 4e 4e 45 4c 20 54 59 50 45 53 5c  D CHANNEL TYPES\
1260: 66 52 20 66 6f 72 20 6d 6f 72 65 20 64 65 74 61  fR for more deta
1270: 69 6c 73 2e 20 20 57 68 69 6c 65 20 54 63 6c 20  ils.  While Tcl 
1280: 77 69 6c 6c 20 72 65 63 6f 67 6e 69 7a 65 0a 2d  will recognize.-
1290: 61 6e 64 20 66 75 6e 63 74 69 6f 6e 20 77 69 74  and function wit
12a0: 68 20 65 69 74 68 65 72 20 73 74 72 75 63 74 75  h either structu
12b0: 72 65 2c 20 73 74 61 63 6b 65 64 20 63 68 61 6e  re, stacked chan
12c0: 6e 65 6c 73 20 6d 75 73 74 20 62 65 20 6f 66 20  nels must be of 
12d0: 61 74 0a 2b 61 6e 64 20 66 75 6e 63 74 69 6f 6e  at.+and function
12e0: 20 77 69 74 68 20 65 69 74 68 65 72 20 73 74 72   with either str
12f0: 75 63 74 75 72 65 73 2c 20 73 74 61 63 6b 65 64  uctures, stacked
1300: 20 63 68 61 6e 6e 65 6c 73 20 6d 75 73 74 20 62   channels must b
1310: 65 20 6f 66 20 61 74 0a 20 6c 65 61 73 74 20 5c  e of at. least \
1320: 66 42 54 43 4c 5f 43 48 41 4e 4e 45 4c 5f 56 45  fBTCL_CHANNEL_VE
1330: 52 53 49 4f 4e 5f 32 5c 66 52 20 74 6f 20 66 75  RSION_2\fR to fu
1340: 6e 63 74 69 6f 6e 20 63 6f 72 72 65 63 74 6c 79  nction correctly
1350: 2e 0a 20 2e 50 50 0a 20 54 68 69 73 20 76 61 6c  .. .PP. This val
1360: 75 65 20 63 61 6e 20 62 65 20 72 65 74 72 69 65  ue can be retrie
1370: 76 65 64 20 77 69 74 68 20 5c 66 42 54 63 6c 5f  ved with \fBTcl_
1380: 43 68 61 6e 6e 65 6c 56 65 72 73 69 6f 6e 5c 66  ChannelVersion\f
1390: 52 2c 20 77 68 69 63 68 20 72 65 74 75 72 6e 73  R, which returns
13a0: 0a 20 2e 56 53 20 38 2e 34 0a 2d 6f 6e 65 20 6f  . .VS 8.4.-one o
13b0: 66 20 5c 66 42 54 43 4c 5f 43 48 41 4e 4e 45 4c  f \fBTCL_CHANNEL
13c0: 5f 56 45 52 53 49 4f 4e 5f 33 5c 66 52 2c 0a 2b  _VERSION_3\fR,.+
13d0: 6f 6e 65 20 6f 66 20 5c 66 42 54 43 4c 5f 43 48  one of \fBTCL_CH
13e0: 41 4e 4e 45 4c 5f 56 45 52 53 49 4f 4e 5f 34 5c  ANNEL_VERSION_4\
13f0: 66 52 2c 20 5c 66 42 54 43 4c 5f 43 48 41 4e 4e  fR, \fBTCL_CHANN
1400: 45 4c 5f 56 45 52 53 49 4f 4e 5f 33 5c 66 52 2c  EL_VERSION_3\fR,
1410: 0a 20 2e 56 45 20 38 2e 34 0a 20 5c 66 42 54 43  . .VE 8.4. \fBTC
1420: 4c 5f 43 48 41 4e 4e 45 4c 5f 56 45 52 53 49 4f  L_CHANNEL_VERSIO
1430: 4e 5f 32 5c 66 52 20 6f 72 20 5c 66 42 54 43 4c  N_2\fR or \fBTCL
1440: 5f 43 48 41 4e 4e 45 4c 5f 56 45 52 53 49 4f 4e  _CHANNEL_VERSION
1450: 5f 31 5c 66 52 2e 0a 20 2e 53 53 20 42 4c 4f 43  _1\fR.. .SS BLOC
1460: 4b 4d 4f 44 45 50 52 4f 43 0a 40 40 20 2d 37 37  KMODEPROC.@@ -77
1470: 35 2c 36 20 2b 37 39 39 2c 33 36 20 40 40 0a 20  5,6 +799,36 @@. 
1480: 2e 50 50 0a 20 54 68 69 73 20 76 61 6c 75 65 20  .PP. This value 
1490: 63 61 6e 20 62 65 20 72 65 74 72 69 65 76 65 64  can be retrieved
14a0: 20 77 69 74 68 20 5c 66 42 54 63 6c 5f 43 68 61   with \fBTcl_Cha
14b0: 6e 6e 65 6c 48 61 6e 64 6c 65 72 50 72 6f 63 5c  nnelHandlerProc\
14c0: 66 52 2c 20 77 68 69 63 68 20 72 65 74 75 72 6e  fR, which return
14d0: 73 0a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  s. a pointer to 
14e0: 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 2b 0a  the function..+.
14f0: 2b 2e 56 53 20 38 2e 34 0a 2b 2e 53 53 20 22 54  +.VS 8.4.+.SS "T
1500: 48 52 45 41 44 41 43 54 49 4f 4e 50 52 4f 43 22  HREADACTIONPROC"
1510: 0a 2b 2e 50 50 0a 2b 54 68 65 20 5c 66 74 68 72  .+.PP.+The \fthr
1520: 65 61 64 41 63 74 69 6f 6e 50 72 6f 63 5c 66 52  eadActionProc\fR
1530: 20 66 69 65 6c 64 20 63 6f 6e 74 61 69 6e 73 20   field contains 
1540: 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74  the address of t
1550: 68 65 20 66 75 6e 63 74 69 6f 6e 0a 2b 63 61 6c  he function.+cal
1560: 6c 65 64 20 62 79 20 74 68 65 20 67 65 6e 65 72  led by the gener
1570: 69 63 20 6c 61 79 65 72 20 77 68 65 6e 20 61 20  ic layer when a 
1580: 63 68 61 6e 6e 65 6c 20 69 73 20 63 72 65 61 74  channel is creat
1590: 65 64 2c 20 63 6c 6f 73 65 64 2c 20 6f 72 0a 2b  ed, closed, or.+
15a0: 67 6f 69 6e 67 20 74 6f 20 6d 6f 76 65 20 74 6f  going to move to
15b0: 20 61 20 64 69 66 66 65 72 65 6e 74 20 74 68 72   a different thr
15c0: 65 61 64 2c 20 69 2e 65 2e 20 77 68 65 6e 65 76  ead, i.e. whenev
15d0: 65 72 20 74 68 72 65 61 64 2d 73 70 65 63 69 66  er thread-specif
15e0: 69 63 0a 2b 64 72 69 76 65 72 20 73 74 61 74 65  ic.+driver state
15f0: 20 6d 69 67 68 74 20 68 61 76 65 20 74 6f 20 69   might have to i
1600: 6e 69 74 69 61 6c 69 7a 65 64 20 6f 72 20 75 70  nitialized or up
1610: 64 61 74 65 64 2e 20 49 74 20 63 61 6e 20 62 65  dated. It can be
1620: 20 4e 55 4c 4c 2e 0a 2b 54 68 65 20 61 63 74 69   NULL..+The acti
1630: 6f 6e 20 5c 66 49 54 43 4c 5f 43 48 41 4e 4e 45  on \fITCL_CHANNE
1640: 4c 5f 54 48 52 45 41 44 5f 52 45 4d 4f 56 45 5c  L_THREAD_REMOVE\
1650: 66 52 20 69 73 20 75 73 65 64 20 74 6f 20 6e 6f  fR is used to no
1660: 74 69 66 79 20 74 68 65 0a 2b 64 72 69 76 65 72  tify the.+driver
1670: 20 74 68 61 74 20 69 74 20 73 68 6f 75 6c 64 20   that it should 
1680: 75 70 64 61 74 65 20 6f 72 20 72 65 6d 6f 76 65  update or remove
1690: 20 61 6e 79 20 74 68 72 65 61 64 2d 73 70 65 63   any thread-spec
16a0: 69 66 69 63 20 64 61 74 61 20 69 74 0a 2b 6d 69  ific data it.+mi
16b0: 67 68 74 20 62 65 20 6d 61 69 6e 74 61 69 6e 69  ght be maintaini
16c0: 6e 67 20 66 6f 72 20 74 68 65 20 63 68 61 6e 6e  ng for the chann
16d0: 65 6c 2e 0a 2b 2e 50 50 0a 2b 54 68 65 20 61 63  el..+.PP.+The ac
16e0: 74 69 6f 6e 20 5c 66 49 54 43 4c 5f 43 48 41 4e  tion \fITCL_CHAN
16f0: 4e 45 4c 5f 54 48 52 45 41 44 5f 49 4e 53 45 52  NEL_THREAD_INSER
1700: 54 5c 66 52 20 69 73 20 75 73 65 64 20 74 6f 20  T\fR is used to 
1710: 6e 6f 74 69 66 79 20 74 68 65 0a 2b 64 72 69 76  notify the.+driv
1720: 65 72 20 74 68 61 74 20 69 74 20 73 68 6f 75 6c  er that it shoul
1730: 64 20 75 70 64 61 74 65 20 6f 72 20 69 6e 69 74  d update or init
1740: 69 61 6c 69 7a 65 20 61 6e 79 20 74 68 72 65 61  ialize any threa
1750: 64 2d 73 70 65 63 69 66 69 63 20 64 61 74 61 20  d-specific data 
1760: 69 74 0a 2b 6d 69 67 68 74 20 62 65 20 6d 61 69  it.+might be mai
1770: 6e 74 61 69 6e 69 6e 67 20 75 73 69 6e 67 20 74  ntaining using t
1780: 68 65 20 63 61 6c 6c 69 6e 67 20 74 68 72 65 61  he calling threa
1790: 64 20 61 73 20 74 68 65 20 61 73 73 6f 63 69 61  d as the associa
17a0: 74 65 2e 20 53 65 65 0a 2b 5c 66 42 54 63 6c 5f  te. See.+\fBTcl_
17b0: 43 75 74 43 68 61 6e 6e 65 6c 5c 66 52 20 61 6e  CutChannel\fR an
17c0: 64 20 5c 66 42 54 63 6c 5f 53 70 6c 69 63 65 43  d \fBTcl_SpliceC
17d0: 68 61 6e 6e 65 6c 5c 66 52 20 66 6f 72 20 6d 6f  hannel\fR for mo
17e0: 72 65 20 64 65 74 61 69 6c 2e 0a 2b 2e 50 50 0a  re detail..+.PP.
17f0: 2b 2e 43 53 0a 2b 74 79 70 65 64 65 66 20 76 6f  +.CS.+typedef vo
1800: 69 64 20 54 63 6c 5f 44 72 69 76 65 72 54 68 72  id Tcl_DriverThr
1810: 65 61 64 41 63 74 69 6f 6e 50 72 6f 63 28 0a 2b  eadActionProc(.+
1820: 09 43 6c 69 65 6e 74 44 61 74 61 20 5c 66 49 69  .ClientData \fIi
1830: 6e 73 74 61 6e 63 65 44 61 74 61 5c 66 52 2c 0a  nstanceData\fR,.
1840: 2b 20 20 20 20 20 20 69 6e 74 20 20 20 20 20 20  +      int      
1850: 20 20 5c 66 49 61 63 74 69 6f 6e 5c 66 52 29 3b    \fIaction\fR);
1860: 0a 2b 2e 43 45 0a 2b 2e 50 50 0a 2b 5c 66 49 49  .+.CE.+.PP.+\fII
1870: 6e 73 74 61 6e 63 65 44 61 74 61 5c 66 52 20 69  nstanceData\fR i
1880: 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  s the same as th
1890: 65 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 74  e value passed t
18a0: 6f 0a 2b 5c 66 42 54 63 6c 5f 43 72 65 61 74 65  o.+\fBTcl_Create
18b0: 43 68 61 6e 6e 65 6c 5c 66 52 20 77 68 65 6e 20  Channel\fR when 
18c0: 74 68 69 73 20 63 68 61 6e 6e 65 6c 20 77 61 73  this channel was
18d0: 20 63 72 65 61 74 65 64 2e 0a 2b 2e 50 50 0a 2b   created..+.PP.+
18e0: 54 68 65 73 65 20 76 61 6c 75 65 73 20 63 61 6e  These values can
18f0: 20 62 65 20 72 65 74 72 69 65 76 65 64 20 77 69   be retrieved wi
1900: 74 68 20 5c 66 42 54 63 6c 5f 43 68 61 6e 6e 65  th \fBTcl_Channe
1910: 6c 54 68 72 65 61 64 41 63 74 69 6f 6e 50 72 6f  lThreadActionPro
1920: 63 5c 66 52 2c 0a 2b 77 68 69 63 68 20 72 65 74  c\fR,.+which ret
1930: 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  urns a pointer t
1940: 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a  o the function..
1950: 2b 2e 56 45 20 38 2e 34 0a 2b 0a 20 2e 53 48 20  +.VE 8.4.+. .SH 
1960: 54 43 4c 5f 42 41 44 43 48 41 4e 4e 45 4c 4f 50  TCL_BADCHANNELOP
1970: 54 49 4f 4e 0a 20 2e 50 50 0a 20 54 68 69 73 20  TION. .PP. This 
1980: 70 72 6f 63 65 64 75 72 65 20 67 65 6e 65 72 61  procedure genera
1990: 74 65 73 20 61 20 22 62 61 64 20 6f 70 74 69 6f  tes a "bad optio
19a0: 6e 22 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  n" error message
19b0: 20 69 6e 20 61 6e 0a 49 6e 64 65 78 3a 20 67 65   in an.Index: ge
19c0: 6e 65 72 69 63 2f 74 63 6c 2e 64 65 63 6c 73 0a  neric/tcl.decls.
19d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
19e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
19f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1a00: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1a10: 3d 3d 3d 0a 52 43 53 20 66 69 6c 65 3a 20 2f 63  ===.RCS file: /c
1a20: 76 73 72 6f 6f 74 2f 74 63 6c 2f 74 63 6c 2f 67  vsroot/tcl/tcl/g
1a30: 65 6e 65 72 69 63 2f 74 63 6c 2e 64 65 63 6c 73  eneric/tcl.decls
1a40: 2c 76 0a 72 65 74 72 69 65 76 69 6e 67 20 72 65  ,v.retrieving re
1a50: 76 69 73 69 6f 6e 20 31 2e 31 30 37 0a 64 69 66  vision 1.107.dif
1a60: 66 20 2d 77 20 2d 75 20 2d 72 31 2e 31 30 37 20  f -w -u -r1.107 
1a70: 74 63 6c 2e 64 65 63 6c 73 0a 2d 2d 2d 20 67 65  tcl.decls.--- ge
1a80: 6e 65 72 69 63 2f 74 63 6c 2e 64 65 63 6c 73 09  neric/tcl.decls.
1a90: 32 31 20 4a 61 6e 20 32 30 30 35 20 32 32 3a 32  21 Jan 2005 22:2
1aa0: 35 3a 30 38 20 2d 30 30 30 30 09 31 2e 31 30 37  5:08 -0000.1.107
1ab0: 0a 2b 2b 2b 20 67 65 6e 65 72 69 63 2f 74 63 6c  .+++ generic/tcl
1ac0: 2e 64 65 63 6c 73 09 32 36 20 4a 61 6e 20 32 30  .decls.26 Jan 20
1ad0: 30 35 20 32 33 3a 33 36 3a 35 30 20 2d 30 30 30  05 23:36:50 -000
1ae0: 30 0a 40 40 20 2d 31 39 38 34 2c 37 20 2b 31 39  0.@@ -1984,7 +19
1af0: 38 34 2c 31 30 20 40 40 0a 20 09 20 20 20 20 54  84,10 @@. .    T
1b00: 63 6c 5f 53 63 61 6c 65 54 69 6d 65 50 72 6f 63  cl_ScaleTimeProc
1b10: 2a 2a 20 73 63 61 6c 65 50 72 6f 63 2c 0a 20 09  ** scaleProc,. .
1b20: 20 20 20 20 43 6c 69 65 6e 74 44 61 74 61 2a 20      ClientData* 
1b30: 63 6c 69 65 6e 74 44 61 74 61 29 0a 20 7d 0a 2d  clientData). }.-
1b40: 0a 2b 23 20 54 49 50 23 32 31 38 20 28 44 72 69  .+# TIP#218 (Dri
1b50: 76 65 72 20 54 68 72 65 61 64 20 41 63 74 69 6f  ver Thread Actio
1b60: 6e 73 29 20 64 61 76 79 67 72 76 79 2f 61 6b 75  ns) davygrvy/aku
1b70: 70 72 69 65 73 20 43 68 61 6e 6e 65 6c 54 79 70  pries ChannelTyp
1b80: 65 20 76 65 72 20 34 0a 2b 64 65 63 6c 61 72 65  e ver 4.+declare
1b90: 20 35 35 34 20 67 65 6e 65 72 69 63 20 7b 0a 2b   554 generic {.+
1ba0: 20 20 20 20 54 63 6c 5f 44 72 69 76 65 72 54 68      Tcl_DriverTh
1bb0: 72 65 61 64 41 63 74 69 6f 6e 50 72 6f 63 20 2a  readActionProc *
1bc0: 54 63 6c 5f 43 68 61 6e 6e 65 6c 54 68 72 65 61  Tcl_ChannelThrea
1bd0: 64 41 63 74 69 6f 6e 50 72 6f 63 28 54 63 6c 5f  dActionProc(Tcl_
1be0: 43 68 61 6e 6e 65 6c 54 79 70 65 20 2a 63 68 61  ChannelType *cha
1bf0: 6e 54 79 70 65 50 74 72 29 0a 2b 7d 0a 20 0a 20  nTypePtr).+}. . 
1c00: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1c10: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1c20: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1c30: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1c40: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 20  ##############. 
1c50: 0a 49 6e 64 65 78 3a 20 67 65 6e 65 72 69 63 2f  .Index: generic/
1c60: 74 63 6c 2e 68 0a 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  tcl.h.==========
1c70: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1c80: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1c90: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1ca0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 52 43 53 20 66 69  =========.RCS fi
1cb0: 6c 65 3a 20 2f 63 76 73 72 6f 6f 74 2f 74 63 6c  le: /cvsroot/tcl
1cc0: 2f 74 63 6c 2f 67 65 6e 65 72 69 63 2f 74 63 6c  /tcl/generic/tcl
1cd0: 2e 68 2c 76 0a 72 65 74 72 69 65 76 69 6e 67 20  .h,v.retrieving 
1ce0: 72 65 76 69 73 69 6f 6e 20 31 2e 31 39 35 0a 64  revision 1.195.d
1cf0: 69 66 66 20 2d 77 20 2d 75 20 2d 72 31 2e 31 39  iff -w -u -r1.19
1d00: 35 20 74 63 6c 2e 68 0a 2d 2d 2d 20 67 65 6e 65  5 tcl.h.--- gene
1d10: 72 69 63 2f 74 63 6c 2e 68 09 32 31 20 4a 61 6e  ric/tcl.h.21 Jan
1d20: 20 32 30 30 35 20 32 32 3a 32 35 3a 30 39 20 2d   2005 22:25:09 -
1d30: 30 30 30 30 09 31 2e 31 39 35 0a 2b 2b 2b 20 67  0000.1.195.+++ g
1d40: 65 6e 65 72 69 63 2f 74 63 6c 2e 68 09 32 36 20  eneric/tcl.h.26 
1d50: 4a 61 6e 20 32 30 30 35 20 32 33 3a 33 36 3a 35  Jan 2005 23:36:5
1d60: 30 20 2d 30 30 30 30 0a 40 40 20 2d 31 34 36 30  0 -0000.@@ -1460
1d70: 2c 36 20 2b 31 34 36 30 2c 31 34 20 40 40 0a 20  ,6 +1460,14 @@. 
1d80: 23 64 65 66 69 6e 65 20 54 43 4c 5f 43 48 41 4e  #define TCL_CHAN
1d90: 4e 45 4c 5f 56 45 52 53 49 4f 4e 5f 31 09 28 28  NEL_VERSION_1.((
1da0: 54 63 6c 5f 43 68 61 6e 6e 65 6c 54 79 70 65 56  Tcl_ChannelTypeV
1db0: 65 72 73 69 6f 6e 29 20 30 78 31 29 0a 20 23 64  ersion) 0x1). #d
1dc0: 65 66 69 6e 65 20 54 43 4c 5f 43 48 41 4e 4e 45  efine TCL_CHANNE
1dd0: 4c 5f 56 45 52 53 49 4f 4e 5f 32 09 28 28 54 63  L_VERSION_2.((Tc
1de0: 6c 5f 43 68 61 6e 6e 65 6c 54 79 70 65 56 65 72  l_ChannelTypeVer
1df0: 73 69 6f 6e 29 20 30 78 32 29 0a 20 23 64 65 66  sion) 0x2). #def
1e00: 69 6e 65 20 54 43 4c 5f 43 48 41 4e 4e 45 4c 5f  ine TCL_CHANNEL_
1e10: 56 45 52 53 49 4f 4e 5f 33 09 28 28 54 63 6c 5f  VERSION_3.((Tcl_
1e20: 43 68 61 6e 6e 65 6c 54 79 70 65 56 65 72 73 69  ChannelTypeVersi
1e30: 6f 6e 29 20 30 78 33 29 0a 2b 23 64 65 66 69 6e  on) 0x3).+#defin
1e40: 65 20 54 43 4c 5f 43 48 41 4e 4e 45 4c 5f 56 45  e TCL_CHANNEL_VE
1e50: 52 53 49 4f 4e 5f 34 09 28 28 54 63 6c 5f 43 68  RSION_4.((Tcl_Ch
1e60: 61 6e 6e 65 6c 54 79 70 65 56 65 72 73 69 6f 6e  annelTypeVersion
1e70: 29 20 30 78 34 29 0a 2b 0a 2b 2f 2a 0a 2b 20 2a  ) 0x4).+.+/*.+ *
1e80: 20 54 49 50 20 23 32 31 38 3a 20 43 68 61 6e 6e   TIP #218: Chann
1e90: 65 6c 20 41 63 74 69 6f 6e 73 2c 20 49 64 73 20  el Actions, Ids 
1ea0: 66 6f 72 20 54 63 6c 5f 44 72 69 76 65 72 54 68  for Tcl_DriverTh
1eb0: 72 65 61 64 41 63 74 69 6f 6e 50 72 6f 63 0a 2b  readActionProc.+
1ec0: 20 2a 2f 0a 2b 0a 2b 23 64 65 66 69 6e 65 20 54   */.+.+#define T
1ed0: 43 4c 5f 43 48 41 4e 4e 45 4c 5f 54 48 52 45 41  CL_CHANNEL_THREA
1ee0: 44 5f 49 4e 53 45 52 54 20 28 30 29 0a 2b 23 64  D_INSERT (0).+#d
1ef0: 65 66 69 6e 65 20 54 43 4c 5f 43 48 41 4e 4e 45  efine TCL_CHANNE
1f00: 4c 5f 54 48 52 45 41 44 5f 52 45 4d 4f 56 45 20  L_THREAD_REMOVE 
1f10: 28 31 29 0a 20 0a 20 2f 2a 0a 20 20 2a 20 54 79  (1). . /*.  * Ty
1f20: 70 65 64 65 66 73 20 66 6f 72 20 74 68 65 20 76  pedefs for the v
1f30: 61 72 69 6f 75 73 20 6f 70 65 72 61 74 69 6f 6e  arious operation
1f40: 73 20 69 6e 20 61 20 63 68 61 6e 6e 65 6c 20 74  s in a channel t
1f50: 79 70 65 3a 0a 40 40 20 2d 31 34 39 35 2c 36 20  ype:.@@ -1495,6 
1f60: 2b 31 35 30 33 2c 39 20 40 40 0a 20 09 09 20 20  +1503,9 @@. ..  
1f70: 20 20 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73    ClientData ins
1f80: 74 61 6e 63 65 44 61 74 61 2c 20 54 63 6c 5f 57  tanceData, Tcl_W
1f90: 69 64 65 49 6e 74 20 6f 66 66 73 65 74 2c 0a 20  ideInt offset,. 
1fa0: 09 09 20 20 20 20 69 6e 74 20 6d 6f 64 65 2c 20  ..    int mode, 
1fb0: 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65 50 74  int *errorCodePt
1fc0: 72 29 29 3b 0a 20 0a 2b 2f 2a 20 54 49 50 20 23  r));. .+/* TIP #
1fd0: 32 31 38 2c 20 43 68 61 6e 6e 65 6c 20 54 68 72  218, Channel Thr
1fe0: 65 61 64 20 41 63 74 69 6f 6e 73 20 2a 2f 0a 2b  ead Actions */.+
1ff0: 74 79 70 65 64 65 66 20 76 6f 69 64 20 20 20 20  typedef void    
2000: 20 28 54 63 6c 5f 44 72 69 76 65 72 54 68 72 65   (Tcl_DriverThre
2010: 61 64 41 63 74 69 6f 6e 50 72 6f 63 29 20 5f 41  adActionProc) _A
2020: 4e 53 49 5f 41 52 47 53 5f 20 28 28 0a 2b 09 09  NSI_ARGS_ ((.+..
2030: 20 20 20 20 43 6c 69 65 6e 74 44 61 74 61 20 69      ClientData i
2040: 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 69 6e 74  nstanceData, int
2050: 20 61 63 74 69 6f 6e 29 29 3b 0a 20 0a 20 2f 2a   action));. . /*
2060: 0a 20 20 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  .  * The followi
2070: 6e 67 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20  ng declarations 
2080: 65 69 74 68 65 72 20 6d 61 70 20 63 6b 61 6c 6c  either map ckall
2090: 6f 63 20 61 6e 64 20 63 6b 66 72 65 65 20 74 6f  oc and ckfree to
20a0: 0a 40 40 20 2d 31 35 38 35 2c 36 20 2b 31 35 39  .@@ -1585,6 +159
20b0: 36 2c 31 36 20 40 40 0a 20 09 09 09 09 09 20 2a  6,16 @@. ..... *
20c0: 20 68 61 6e 64 6c 65 20 36 34 2d 62 69 74 20 6f   handle 64-bit o
20d0: 66 66 73 65 74 73 2e 20 4d 61 79 20 62 65 0a 20  ffsets. May be. 
20e0: 09 09 09 09 09 20 2a 20 4e 55 4c 4c 2c 20 61 6e  ..... * NULL, an
20f0: 64 20 6d 75 73 74 20 62 65 20 4e 55 4c 4c 20 69  d must be NULL i
2100: 66 0a 20 09 09 09 09 09 20 2a 20 73 65 65 6b 50  f. ..... * seekP
2110: 72 6f 63 20 69 73 20 4e 55 4c 4c 2e 20 2a 2f 0a  roc is NULL. */.
2120: 2b 0a 2b 20 20 20 20 20 2f 2a 0a 2b 20 20 20 20  +.+     /*.+    
2130: 20 20 2a 20 4f 6e 6c 79 20 76 61 6c 69 64 20 69    * Only valid i
2140: 6e 20 54 43 4c 5f 43 48 41 4e 4e 45 4c 5f 56 45  n TCL_CHANNEL_VE
2150: 52 53 49 4f 4e 5f 34 20 63 68 61 6e 6e 65 6c 73  RSION_4 channels
2160: 20 6f 72 20 6c 61 74 65 72 0a 2b 20 20 20 20 20   or later.+     
2170: 20 2a 20 54 49 50 20 23 32 31 38 2c 20 43 68 61   * TIP #218, Cha
2180: 6e 6e 65 6c 20 54 68 72 65 61 64 20 41 63 74 69  nnel Thread Acti
2190: 6f 6e 73 0a 2b 20 20 20 20 20 20 2a 2f 0a 2b 20  ons.+      */.+ 
21a0: 20 20 20 20 54 63 6c 5f 44 72 69 76 65 72 54 68      Tcl_DriverTh
21b0: 72 65 61 64 41 63 74 69 6f 6e 50 72 6f 63 20 2a  readActionProc *
21c0: 74 68 72 65 61 64 41 63 74 69 6f 6e 50 72 6f 63  threadActionProc
21d0: 3b 0a 2b 20 09 09 09 09 09 2f 2a 20 50 72 6f 63  ;.+ ...../* Proc
21e0: 65 64 75 72 65 20 74 6f 20 63 61 6c 6c 20 74 6f  edure to call to
21f0: 20 6e 6f 74 69 66 79 0a 2b 20 09 09 09 09 09 20   notify.+ ..... 
2200: 2a 20 74 68 65 20 64 72 69 76 65 72 20 6f 66 20  * the driver of 
2210: 74 68 72 65 61 64 20 73 70 65 63 69 66 69 63 0a  thread specific.
2220: 2b 20 09 09 09 09 09 20 2a 20 61 63 74 69 76 69  + ..... * activi
2230: 74 79 20 66 6f 72 20 61 20 63 68 61 6e 6e 65 6c  ty for a channel
2240: 2e 0a 2b 09 09 09 09 09 20 2a 20 4d 61 79 20 62  ..+..... * May b
2250: 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 7d 20 54 63  e NULL. */. } Tc
2260: 6c 5f 43 68 61 6e 6e 65 6c 54 79 70 65 3b 0a 20  l_ChannelType;. 
2270: 0a 20 2f 2a 0a 49 6e 64 65 78 3a 20 67 65 6e 65  . /*.Index: gene
2280: 72 69 63 2f 74 63 6c 44 65 63 6c 73 2e 68 0a 3d  ric/tclDecls.h.=
2290: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
22a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
22b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
22c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
22d0: 3d 3d 0a 52 43 53 20 66 69 6c 65 3a 20 2f 63 76  ==.RCS file: /cv
22e0: 73 72 6f 6f 74 2f 74 63 6c 2f 74 63 6c 2f 67 65  sroot/tcl/tcl/ge
22f0: 6e 65 72 69 63 2f 74 63 6c 44 65 63 6c 73 2e 68  neric/tclDecls.h
2300: 2c 76 0a 72 65 74 72 69 65 76 69 6e 67 20 72 65  ,v.retrieving re
2310: 76 69 73 69 6f 6e 20 31 2e 31 30 39 0a 64 69 66  vision 1.109.dif
2320: 66 20 2d 77 20 2d 75 20 2d 72 31 2e 31 30 39 20  f -w -u -r1.109 
2330: 74 63 6c 44 65 63 6c 73 2e 68 0a 2d 2d 2d 20 67  tclDecls.h.--- g
2340: 65 6e 65 72 69 63 2f 74 63 6c 44 65 63 6c 73 2e  eneric/tclDecls.
2350: 68 09 32 31 20 4a 61 6e 20 32 30 30 35 20 32 32  h.21 Jan 2005 22
2360: 3a 32 35 3a 31 31 20 2d 30 30 30 30 09 31 2e 31  :25:11 -0000.1.1
2370: 30 39 0a 2b 2b 2b 20 67 65 6e 65 72 69 63 2f 74  09.+++ generic/t
2380: 63 6c 44 65 63 6c 73 2e 68 09 32 36 20 4a 61 6e  clDecls.h.26 Jan
2390: 20 32 30 30 35 20 32 33 3a 33 36 3a 35 30 20 2d   2005 23:36:50 -
23a0: 30 30 30 30 0a 40 40 20 2d 33 34 35 32 2c 36 20  0000.@@ -3452,6 
23b0: 2b 33 34 35 32 2c 31 32 20 40 40 0a 20 09 09 09  +3452,12 @@. ...
23c0: 09 54 63 6c 5f 53 63 61 6c 65 54 69 6d 65 50 72  .Tcl_ScaleTimePr
23d0: 6f 63 2a 2a 20 73 63 61 6c 65 50 72 6f 63 2c 20  oc** scaleProc, 
23e0: 0a 20 09 09 09 09 43 6c 69 65 6e 74 44 61 74 61  . ....ClientData
23f0: 2a 20 63 6c 69 65 6e 74 44 61 74 61 29 29 3b 0a  * clientData));.
2400: 20 23 65 6e 64 69 66 0a 2b 23 69 66 6e 64 65 66   #endif.+#ifndef
2410: 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 54 68 72 65   Tcl_ChannelThre
2420: 61 64 41 63 74 69 6f 6e 50 72 6f 63 5f 54 43 4c  adActionProc_TCL
2430: 5f 44 45 43 4c 41 52 45 44 0a 2b 23 64 65 66 69  _DECLARED.+#defi
2440: 6e 65 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 54 68  ne Tcl_ChannelTh
2450: 72 65 61 64 41 63 74 69 6f 6e 50 72 6f 63 5f 54  readActionProc_T
2460: 43 4c 5f 44 45 43 4c 41 52 45 44 0a 2b 2f 2a 20  CL_DECLARED.+/* 
2470: 35 35 34 20 2a 2f 0a 2b 45 58 54 45 52 4e 20 54  554 */.+EXTERN T
2480: 63 6c 5f 44 72 69 76 65 72 54 68 72 65 61 64 41  cl_DriverThreadA
2490: 63 74 69 6f 6e 50 72 6f 63 20 2a 20 54 63 6c 5f  ctionProc * Tcl_
24a0: 43 68 61 6e 6e 65 6c 54 68 72 65 61 64 41 63 74  ChannelThreadAct
24b0: 69 6f 6e 50 72 6f 63 20 5f 41 4e 53 49 5f 41 52  ionProc _ANSI_AR
24c0: 47 53 5f 28 28 0a 2b 09 09 09 09 54 63 6c 5f 43  GS_((.+....Tcl_C
24d0: 68 61 6e 6e 65 6c 54 79 70 65 20 2a 20 63 68 61  hannelType * cha
24e0: 6e 54 79 70 65 50 74 72 29 29 3b 0a 2b 23 65 6e  nTypePtr));.+#en
24f0: 64 69 66 0a 20 0a 20 74 79 70 65 64 65 66 20 73  dif. . typedef s
2500: 74 72 75 63 74 20 54 63 6c 53 74 75 62 48 6f 6f  truct TclStubHoo
2510: 6b 73 20 7b 0a 20 20 20 20 20 73 74 72 75 63 74  ks {.     struct
2520: 20 54 63 6c 50 6c 61 74 53 74 75 62 73 20 2a 74   TclPlatStubs *t
2530: 63 6c 50 6c 61 74 53 74 75 62 73 3b 0a 40 40 20  clPlatStubs;.@@ 
2540: 2d 34 30 34 37 2c 36 20 2b 34 30 35 33 2c 37 20  -4047,6 +4053,7 
2550: 40 40 0a 20 20 20 20 20 69 6e 74 20 28 2a 74 63  @@.     int (*tc
2560: 6c 5f 47 65 74 45 6e 73 65 6d 62 6c 65 4e 61 6d  l_GetEnsembleNam
2570: 65 73 70 61 63 65 29 20 5f 41 4e 53 49 5f 41 52  espace) _ANSI_AR
2580: 47 53 5f 28 28 54 63 6c 5f 49 6e 74 65 72 70 20  GS_((Tcl_Interp 
2590: 2a 20 69 6e 74 65 72 70 2c 20 54 63 6c 5f 43 6f  * interp, Tcl_Co
25a0: 6d 6d 61 6e 64 20 74 6f 6b 65 6e 2c 20 54 63 6c  mmand token, Tcl
25b0: 5f 4e 61 6d 65 73 70 61 63 65 20 2a 2a 20 6e 61  _Namespace ** na
25c0: 6d 65 73 70 61 63 65 50 74 72 50 74 72 29 29 3b  mespacePtrPtr));
25d0: 20 2f 2a 20 35 35 31 20 2a 2f 0a 20 20 20 20 20   /* 551 */.     
25e0: 76 6f 69 64 20 28 2a 74 63 6c 5f 53 65 74 54 69  void (*tcl_SetTi
25f0: 6d 65 50 72 6f 63 29 20 5f 41 4e 53 49 5f 41 52  meProc) _ANSI_AR
2600: 47 53 5f 28 28 54 63 6c 5f 47 65 74 54 69 6d 65  GS_((Tcl_GetTime
2610: 50 72 6f 63 2a 20 67 65 74 50 72 6f 63 2c 20 54  Proc* getProc, T
2620: 63 6c 5f 53 63 61 6c 65 54 69 6d 65 50 72 6f 63  cl_ScaleTimeProc
2630: 2a 20 73 63 61 6c 65 50 72 6f 63 2c 20 43 6c 69  * scaleProc, Cli
2640: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
2650: 74 61 29 29 3b 20 2f 2a 20 35 35 32 20 2a 2f 0a  ta)); /* 552 */.
2660: 20 20 20 20 20 76 6f 69 64 20 28 2a 74 63 6c 5f       void (*tcl_
2670: 51 75 65 72 79 54 69 6d 65 50 72 6f 63 29 20 5f  QueryTimeProc) _
2680: 41 4e 53 49 5f 41 52 47 53 5f 28 28 54 63 6c 5f  ANSI_ARGS_((Tcl_
2690: 47 65 74 54 69 6d 65 50 72 6f 63 2a 2a 20 67 65  GetTimeProc** ge
26a0: 74 50 72 6f 63 2c 20 54 63 6c 5f 53 63 61 6c 65  tProc, Tcl_Scale
26b0: 54 69 6d 65 50 72 6f 63 2a 2a 20 73 63 61 6c 65  TimeProc** scale
26c0: 50 72 6f 63 2c 20 43 6c 69 65 6e 74 44 61 74 61  Proc, ClientData
26d0: 2a 20 63 6c 69 65 6e 74 44 61 74 61 29 29 3b 20  * clientData)); 
26e0: 2f 2a 20 35 35 33 20 2a 2f 0a 2b 20 20 20 20 54  /* 553 */.+    T
26f0: 63 6c 5f 44 72 69 76 65 72 54 68 72 65 61 64 41  cl_DriverThreadA
2700: 63 74 69 6f 6e 50 72 6f 63 20 2a 20 28 2a 74 63  ctionProc * (*tc
2710: 6c 5f 43 68 61 6e 6e 65 6c 54 68 72 65 61 64 41  l_ChannelThreadA
2720: 63 74 69 6f 6e 50 72 6f 63 29 20 5f 41 4e 53 49  ctionProc) _ANSI
2730: 5f 41 52 47 53 5f 28 28 54 63 6c 5f 43 68 61 6e  _ARGS_((Tcl_Chan
2740: 6e 65 6c 54 79 70 65 20 2a 20 63 68 61 6e 54 79  nelType * chanTy
2750: 70 65 50 74 72 29 29 3b 20 2f 2a 20 35 35 34 20  pePtr)); /* 554 
2760: 2a 2f 0a 20 7d 20 54 63 6c 53 74 75 62 73 3b 0a  */. } TclStubs;.
2770: 20 0a 20 23 69 66 64 65 66 20 5f 5f 63 70 6c 75   . #ifdef __cplu
2780: 73 70 6c 75 73 0a 40 40 20 2d 36 33 30 33 2c 36  splus.@@ -6303,6
2790: 20 2b 36 33 31 30 2c 31 30 20 40 40 0a 20 23 64   +6310,10 @@. #d
27a0: 65 66 69 6e 65 20 54 63 6c 5f 51 75 65 72 79 54  efine Tcl_QueryT
27b0: 69 6d 65 50 72 6f 63 20 5c 0a 20 09 28 74 63 6c  imeProc \. .(tcl
27c0: 53 74 75 62 73 50 74 72 2d 3e 74 63 6c 5f 51 75  StubsPtr->tcl_Qu
27d0: 65 72 79 54 69 6d 65 50 72 6f 63 29 20 2f 2a 20  eryTimeProc) /* 
27e0: 35 35 33 20 2a 2f 0a 20 23 65 6e 64 69 66 0a 2b  553 */. #endif.+
27f0: 23 69 66 6e 64 65 66 20 54 63 6c 5f 43 68 61 6e  #ifndef Tcl_Chan
2800: 6e 65 6c 54 68 72 65 61 64 41 63 74 69 6f 6e 50  nelThreadActionP
2810: 72 6f 63 0a 2b 23 64 65 66 69 6e 65 20 54 63 6c  roc.+#define Tcl
2820: 5f 43 68 61 6e 6e 65 6c 54 68 72 65 61 64 41 63  _ChannelThreadAc
2830: 74 69 6f 6e 50 72 6f 63 20 5c 0a 2b 09 28 74 63  tionProc \.+.(tc
2840: 6c 53 74 75 62 73 50 74 72 2d 3e 74 63 6c 5f 43  lStubsPtr->tcl_C
2850: 68 61 6e 6e 65 6c 54 68 72 65 61 64 41 63 74 69  hannelThreadActi
2860: 6f 6e 50 72 6f 63 29 20 2f 2a 20 35 35 34 20 2a  onProc) /* 554 *
2870: 2f 0a 2b 23 65 6e 64 69 66 0a 20 0a 20 23 65 6e  /.+#endif. . #en
2880: 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 55  dif /* defined(U
2890: 53 45 5f 54 43 4c 5f 53 54 55 42 53 29 20 26 26  SE_TCL_STUBS) &&
28a0: 20 21 64 65 66 69 6e 65 64 28 55 53 45 5f 54 43   !defined(USE_TC
28b0: 4c 5f 53 54 55 42 5f 50 52 4f 43 53 29 20 2a 2f  L_STUB_PROCS) */
28c0: 0a 20 0a 49 6e 64 65 78 3a 20 67 65 6e 65 72 69  . .Index: generi
28d0: 63 2f 74 63 6c 49 4f 2e 63 0a 3d 3d 3d 3d 3d 3d  c/tclIO.c.======
28e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
28f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2900: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2910: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 52 43  =============.RC
2920: 53 20 66 69 6c 65 3a 20 2f 63 76 73 72 6f 6f 74  S file: /cvsroot
2930: 2f 74 63 6c 2f 74 63 6c 2f 67 65 6e 65 72 69 63  /tcl/tcl/generic
2940: 2f 74 63 6c 49 4f 2e 63 2c 76 0a 72 65 74 72 69  /tclIO.c,v.retri
2950: 65 76 69 6e 67 20 72 65 76 69 73 69 6f 6e 20 31  eving revision 1
2960: 2e 38 31 0a 64 69 66 66 20 2d 77 20 2d 75 20 2d  .81.diff -w -u -
2970: 72 31 2e 38 31 20 74 63 6c 49 4f 2e 63 0a 2d 2d  r1.81 tclIO.c.--
2980: 2d 20 67 65 6e 65 72 69 63 2f 74 63 6c 49 4f 2e  - generic/tclIO.
2990: 63 09 33 30 20 4e 6f 76 20 32 30 30 34 20 31 39  c.30 Nov 2004 19
29a0: 3a 33 34 3a 34 37 20 2d 30 30 30 30 09 31 2e 38  :34:47 -0000.1.8
29b0: 31 0a 2b 2b 2b 20 67 65 6e 65 72 69 63 2f 74 63  1.+++ generic/tc
29c0: 6c 49 4f 2e 63 09 32 36 20 4a 61 6e 20 32 30 30  lIO.c.26 Jan 200
29d0: 35 20 32 33 3a 33 36 3a 35 30 20 2d 30 30 30 30  5 23:36:50 -0000
29e0: 0a 40 40 20 2d 31 32 30 35 2c 31 38 20 2b 31 32  .@@ -1205,18 +12
29f0: 30 35 2c 31 39 20 40 40 0a 20 20 20 20 20 20 2a  05,19 @@.      *
2a00: 20 69 6e 20 74 68 65 20 6c 69 73 74 20 6f 6e 20   in the list on 
2a10: 65 78 69 74 2e 0a 20 20 20 20 20 20 2a 0a 20 20  exit..      *.  
2a20: 20 20 20 20 2a 20 4a 48 3a 20 43 6f 75 6c 64 20      * JH: Could 
2a30: 63 61 6c 6c 20 54 63 6c 5f 53 70 6c 69 63 65 43  call Tcl_SpliceC
2a40: 68 61 6e 6e 65 6c 2c 20 62 75 74 20 6e 65 65 64  hannel, but need
2a50: 20 74 6f 20 61 76 6f 69 64 20 4e 55 4c 4c 20 63   to avoid NULL c
2a60: 68 65 63 6b 2e 0a 2b 20 20 20 20 20 2a 0a 2b 20  heck..+     *.+ 
2a70: 20 20 20 20 2a 20 54 49 50 20 23 32 31 38 2e 0a      * TIP #218..
2a80: 2b 20 20 20 20 20 2a 20 41 4b 3a 20 4a 75 73 74  +     * AK: Just
2a90: 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   initialize the 
2aa0: 66 69 65 6c 64 20 74 6f 20 4e 55 4c 4c 20 62 65  field to NULL be
2ab0: 66 6f 72 65 20 69 6e 76 6f 6b 69 6e 67 20 54 63  fore invoking Tc
2ac0: 6c 5f 53 70 6c 69 63 65 43 68 61 6e 6e 65 6c 0a  l_SpliceChannel.
2ad0: 2b 20 20 20 20 20 2a 20 20 20 20 20 57 65 20 6e  +     *     We n
2ae0: 65 65 64 20 54 63 6c 5f 53 70 6c 69 63 65 43 68  eed Tcl_SpliceCh
2af0: 61 6e 6e 65 6c 2c 20 66 6f 72 20 74 68 65 20 74  annel, for the t
2b00: 68 72 65 61 64 41 63 74 69 6f 6e 20 63 61 6c 6c  hreadAction call
2b10: 73 2e 0a 2b 20 20 20 20 20 2a 20 20 20 20 20 54  s..+     *     T
2b20: 68 65 72 65 20 69 73 20 6e 6f 20 72 65 61 6c 20  here is no real 
2b30: 72 65 61 73 6f 6e 20 74 6f 20 64 75 70 6c 69 63  reason to duplic
2b40: 61 74 65 20 61 6c 6c 20 6f 66 20 74 68 69 73 2e  ate all of this.
2b50: 0a 2b 20 20 20 20 20 2a 20 4e 4f 54 45 3a 20 41  .+     * NOTE: A
2b60: 6c 6c 20 64 72 69 76 65 72 73 20 75 73 69 6e 67  ll drivers using
2b70: 20 74 68 72 65 61 64 20 61 63 74 69 6f 6e 73 20   thread actions 
2b80: 6e 6f 77 20 68 61 76 65 20 74 6f 20 70 65 72 66  now have to perf
2b90: 6f 72 6d 20 74 68 65 69 72 20 54 53 44 0a 2b 20  orm their TSD.+ 
2ba0: 20 20 20 20 2a 20 20 20 20 20 20 20 6d 61 6e 69      *       mani
2bb0: 70 75 6c 61 74 69 6f 6e 20 6f 6e 6c 79 20 69 6e  pulation only in
2bc0: 20 74 68 65 69 72 20 74 68 72 65 61 64 20 61 63   their thread ac
2bd0: 74 69 6f 6e 20 70 72 6f 63 2e 20 44 6f 69 6e 67  tion proc. Doing
2be0: 20 69 74 20 77 68 65 6e 0a 2b 20 20 20 20 20 2a   it when.+     *
2bf0: 20 20 20 20 20 20 20 63 72 65 61 74 69 6e 67 20         creating 
2c00: 74 68 65 69 72 20 69 6e 73 74 61 6e 63 65 20 73  their instance s
2c10: 74 72 75 63 74 75 72 65 73 20 77 69 6c 6c 20 63  tructures will c
2c20: 6f 6c 6c 69 64 65 20 77 69 74 68 20 74 68 65 20  ollide with the 
2c30: 74 68 72 65 61 64 0a 2b 20 20 20 20 20 2a 20 20  thread.+     *  
2c40: 20 20 20 20 20 61 63 74 69 6f 6e 20 61 63 74 69       action acti
2c50: 76 69 74 79 20 61 6e 64 20 6c 65 61 64 20 74 6f  vity and lead to
2c60: 20 64 61 6d 61 67 65 64 20 6c 69 73 74 73 2e 0a   damaged lists..
2c70: 20 20 20 20 20 20 2a 2f 0a 20 0a 2d 20 20 20 20        */. .-    
2c80: 73 74 61 74 65 50 74 72 2d 3e 6e 65 78 74 43 53  statePtr->nextCS
2c90: 50 74 72 20 3d 20 74 73 64 50 74 72 2d 3e 66 69  Ptr = tsdPtr->fi
2ca0: 72 73 74 43 53 50 74 72 3b 0a 2d 20 20 20 20 74  rstCSPtr;.-    t
2cb0: 73 64 50 74 72 2d 3e 66 69 72 73 74 43 53 50 74  sdPtr->firstCSPt
2cc0: 72 20 3d 20 73 74 61 74 65 50 74 72 3b 0a 2d 0a  r = statePtr;.-.
2cd0: 2d 20 20 20 20 2f 2a 0a 2d 20 20 20 20 20 2a 20  -    /*.-     * 
2ce0: 54 49 50 20 23 31 30 2e 20 4d 61 72 6b 20 74 68  TIP #10. Mark th
2cf0: 65 20 63 75 72 72 65 6e 74 20 74 68 72 65 61 64  e current thread
2d00: 20 61 73 20 74 68 65 20 6f 6e 65 20 6d 61 6e 61   as the one mana
2d10: 67 69 6e 67 20 74 68 65 20 6e 65 77 0a 2d 20 20  ging the new.-  
2d20: 20 20 20 2a 09 09 63 68 61 6e 6e 65 6c 2e 20 4e     *..channel. N
2d30: 6f 74 65 3a 20 27 54 63 6c 5f 47 65 74 43 75 72  ote: 'Tcl_GetCur
2d40: 72 65 6e 74 54 68 72 65 61 64 27 20 72 65 74 75  rentThread' retu
2d50: 72 6e 73 20 73 65 6e 73 69 62 6c 65 0a 2d 20 20  rns sensible.-  
2d60: 20 20 20 2a 09 09 76 61 6c 75 65 73 20 65 76 65     *..values eve
2d70: 6e 20 66 6f 72 20 61 20 6e 6f 6e 2d 74 68 72 65  n for a non-thre
2d80: 61 64 65 64 20 63 6f 72 65 2e 0a 2d 20 20 20 20  aded core..-    
2d90: 20 2a 2f 0a 2d 0a 2d 20 20 20 20 73 74 61 74 65   */.-.-    state
2da0: 50 74 72 2d 3e 6d 61 6e 61 67 69 6e 67 54 68 72  Ptr->managingThr
2db0: 65 61 64 20 3d 20 54 63 6c 5f 47 65 74 43 75 72  ead = Tcl_GetCur
2dc0: 72 65 6e 74 54 68 72 65 61 64 28 29 3b 0a 2b 20  rentThread();.+ 
2dd0: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 6e 65 78     statePtr->nex
2de0: 74 43 53 50 74 72 20 3d 20 28 43 68 61 6e 6e 65  tCSPtr = (Channe
2df0: 6c 53 74 61 74 65 20 2a 29 20 4e 55 4c 4c 3b 0a  lState *) NULL;.
2e00: 2b 20 20 20 20 54 63 6c 5f 53 70 6c 69 63 65 43  +    Tcl_SpliceC
2e10: 68 61 6e 6e 65 6c 20 28 28 54 63 6c 5f 43 68 61  hannel ((Tcl_Cha
2e20: 6e 6e 65 6c 29 20 63 68 61 6e 50 74 72 29 3b 0a  nnel) chanPtr);.
2e30: 20 0a 20 20 20 20 20 2f 2a 0a 20 20 20 20 20 20   .     /*.      
2e40: 2a 20 49 6e 73 74 61 6c 6c 20 74 68 69 73 20 63  * Install this c
2e50: 68 61 6e 6e 65 6c 20 69 6e 20 74 68 65 20 66 69  hannel in the fi
2e60: 72 73 74 20 65 6d 70 74 79 20 73 74 61 6e 64 61  rst empty standa
2e70: 72 64 20 63 68 61 6e 6e 65 6c 20 73 6c 6f 74 2c  rd channel slot,
2e80: 20 69 66 0a 40 40 20 2d 32 33 38 32 2c 37 20 2b   if.@@ -2382,7 +
2e90: 32 33 38 33 2c 37 20 40 40 0a 20 20 2a 09 52 65  2383,7 @@.  *.Re
2ea0: 73 65 74 73 20 74 68 65 20 66 69 65 6c 64 20 27  sets the field '
2eb0: 6e 65 78 74 43 53 50 74 72 27 20 6f 66 20 74 68  nextCSPtr' of th
2ec0: 65 20 73 70 65 63 69 66 69 65 64 20 63 68 61 6e  e specified chan
2ed0: 6e 65 6c 20 73 74 61 74 65 20 74 6f 20 4e 55 4c  nel state to NUL
2ee0: 4c 2e 0a 20 20 2a 0a 20 20 2a 20 4e 4f 54 45 3a  L..  *.  * NOTE:
2ef0: 0a 2d 20 2a 09 54 68 65 20 63 68 61 6e 6e 65 6c  .- *.The channel
2f00: 20 74 6f 20 73 70 6c 69 63 65 20 6f 75 74 20 6f   to splice out o
2f10: 66 20 74 68 65 20 6c 69 73 74 20 6d 75 73 74 20  f the list must 
2f20: 6e 6f 74 20 62 65 20 72 65 66 65 72 65 6e 63 65  not be reference
2f30: 64 0a 2b 20 2a 09 54 68 65 20 63 68 61 6e 6e 65  d.+ *.The channe
2f40: 6c 20 74 6f 20 63 75 74 20 6f 75 74 20 6f 66 20  l to cut out of 
2f50: 74 68 65 20 6c 69 73 74 20 6d 75 73 74 20 6e 6f  the list must no
2f60: 74 20 62 65 20 72 65 66 65 72 65 6e 63 65 64 0a  t be referenced.
2f70: 20 20 2a 09 69 6e 20 61 6e 79 20 69 6e 74 65 72    *.in any inter
2f80: 70 72 65 74 65 72 2e 20 54 68 69 73 20 69 73 20  preter. This is 
2f90: 73 6f 6d 65 74 68 69 6e 67 20 74 68 69 73 20 70  something this p
2fa0: 72 6f 63 65 64 75 72 65 20 63 61 6e 6e 6f 74 0a  rocedure cannot.
2fb0: 20 20 2a 09 63 68 65 63 6b 20 28 64 65 73 70 69    *.check (despi
2fc0: 74 65 20 74 68 65 20 72 65 66 63 6f 75 6e 74 29  te the refcount)
2fd0: 20 62 65 63 61 75 73 65 20 74 68 65 20 63 61 6c   because the cal
2fe0: 6c 65 72 20 75 73 75 61 6c 6c 79 20 77 61 6e 74  ler usually want
2ff0: 73 0a 20 20 2a 09 66 69 64 64 6c 65 20 77 69 74  s.  *.fiddle wit
3000: 68 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 28 6c  h the channel (l
3010: 69 6b 65 20 74 72 61 6e 73 66 65 72 69 6e 67 20  ike transfering 
3020: 69 74 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e  it to a differen
3030: 74 0a 40 40 20 2d 32 34 30 34 2c 36 20 2b 32 34  t.@@ -2404,6 +24
3040: 30 35 2c 37 20 40 40 0a 20 09 09 09 09 09 20 2a  05,7 @@. ..... *
3050: 20 63 68 61 6e 6e 65 6c 20 6f 75 74 20 6f 66 20   channel out of 
3060: 74 68 65 20 6c 69 73 74 20 6f 6e 20 63 6c 6f 73  the list on clos
3070: 65 2e 20 2a 2f 0a 20 20 20 20 20 43 68 61 6e 6e  e. */.     Chann
3080: 65 6c 53 74 61 74 65 20 2a 73 74 61 74 65 50 74  elState *statePt
3090: 72 20 3d 20 28 28 43 68 61 6e 6e 65 6c 20 2a 29  r = ((Channel *)
30a0: 20 63 68 61 6e 29 2d 3e 73 74 61 74 65 3b 0a 20   chan)->state;. 
30b0: 09 09 09 09 09 2f 2a 20 73 74 61 74 65 20 6f 66  ...../* state of
30c0: 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 73 74 61   the channel sta
30d0: 63 6b 2e 20 2a 2f 0a 2b 20 20 20 20 54 63 6c 5f  ck. */.+    Tcl_
30e0: 44 72 69 76 65 72 54 68 72 65 61 64 41 63 74 69  DriverThreadActi
30f0: 6f 6e 50 72 6f 63 20 2a 74 68 72 65 61 64 41 63  onProc *threadAc
3100: 74 69 6f 6e 50 72 6f 63 3b 0a 20 0a 20 20 20 20  tionProc;. .    
3110: 20 2f 2a 0a 20 20 20 20 20 20 2a 20 52 65 6d 6f   /*.      * Remo
3120: 76 65 20 74 68 69 73 20 63 68 61 6e 6e 65 6c 20  ve this channel 
3130: 66 72 6f 6d 20 6f 66 20 74 68 65 20 6c 69 73 74  from of the list
3140: 20 6f 66 20 61 6c 6c 20 63 68 61 6e 6e 65 6c 73   of all channels
3150: 0a 40 40 20 2d 32 34 32 36 2c 38 20 2b 32 34 32  .@@ -2426,8 +242
3160: 38 2c 31 32 20 40 40 0a 20 0a 20 20 20 20 20 73  8,12 @@. .     s
3170: 74 61 74 65 50 74 72 2d 3e 6e 65 78 74 43 53 50  tatePtr->nextCSP
3180: 74 72 20 3d 20 28 43 68 61 6e 6e 65 6c 53 74 61  tr = (ChannelSta
3190: 74 65 20 2a 29 20 4e 55 4c 4c 3b 0a 20 0a 2d 20  te *) NULL;. .- 
31a0: 20 20 20 54 63 6c 70 43 75 74 46 69 6c 65 43 68     TclpCutFileCh
31b0: 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 2d 20 20  annel(chan);.-  
31c0: 20 20 54 63 6c 70 43 75 74 53 6f 63 6b 43 68 61    TclpCutSockCha
31d0: 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 2b 20 20 20  nnel(chan);.+   
31e0: 20 2f 2a 20 54 49 50 20 23 32 31 38 2c 20 43 68   /* TIP #218, Ch
31f0: 61 6e 6e 65 6c 20 54 68 72 65 61 64 20 41 63 74  annel Thread Act
3200: 69 6f 6e 73 20 2a 2f 0a 2b 20 20 20 20 74 68 72  ions */.+    thr
3210: 65 61 64 41 63 74 69 6f 6e 50 72 6f 63 20 3d 20  eadActionProc = 
3220: 54 63 6c 5f 43 68 61 6e 6e 65 6c 54 68 72 65 61  Tcl_ChannelThrea
3230: 64 41 63 74 69 6f 6e 50 72 6f 63 20 28 54 63 6c  dActionProc (Tcl
3240: 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 20  _GetChannelType 
3250: 28 63 68 61 6e 29 29 3b 0a 2b 20 20 20 20 69 66  (chan));.+    if
3260: 20 28 74 68 72 65 61 64 41 63 74 69 6f 6e 50 72   (threadActionPr
3270: 6f 63 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 2b 20  oc != NULL) {.+ 
3280: 20 20 20 20 20 20 20 28 2a 74 68 72 65 61 64 41         (*threadA
3290: 63 74 69 6f 6e 50 72 6f 63 29 20 28 54 63 6c 5f  ctionProc) (Tcl_
32a0: 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e  GetChannelInstan
32b0: 63 65 44 61 74 61 28 63 68 61 6e 29 2c 0a 2b 09  ceData(chan),.+.
32c0: 09 09 20 20 20 20 20 54 43 4c 5f 43 48 41 4e 4e  ..     TCL_CHANN
32d0: 45 4c 5f 54 48 52 45 41 44 5f 52 45 4d 4f 56 45  EL_THREAD_REMOVE
32e0: 29 3b 0a 2b 20 20 20 20 7d 0a 20 7d 0a 20 0c 0a  );.+    }. }. ..
32f0: 20 2f 2a 0a 40 40 20 2d 32 34 34 36 2c 37 20 2b   /*.@@ -2446,7 +
3300: 32 34 35 32 2c 37 20 40 40 0a 20 20 2a 09 4e 6f  2452,7 @@.  *.No
3310: 74 68 69 6e 67 2e 0a 20 20 2a 0a 20 20 2a 20 4e  thing..  *.  * N
3320: 4f 54 45 3a 0a 2d 20 2a 09 54 68 65 20 63 68 61  OTE:.- *.The cha
3330: 6e 6e 65 6c 20 74 6f 20 61 64 64 20 74 6f 20 74  nnel to add to t
3340: 68 65 20 6c 69 73 74 20 6d 75 73 74 20 6e 6f 74  he list must not
3350: 20 62 65 20 72 65 66 65 72 65 6e 63 65 64 20 69   be referenced i
3360: 6e 20 61 6e 79 0a 2b 20 2a 09 54 68 65 20 63 68  n any.+ *.The ch
3370: 61 6e 6e 65 6c 20 74 6f 20 73 70 6c 69 63 65 20  annel to splice 
3380: 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 20 6d 75  into the list mu
3390: 73 74 20 6e 6f 74 20 62 65 20 72 65 66 65 72 65  st not be refere
33a0: 6e 63 65 64 20 69 6e 20 61 6e 79 0a 20 20 2a 09  nced in any.  *.
33b0: 69 6e 74 65 72 70 72 65 74 65 72 2e 20 54 68 69  interpreter. Thi
33c0: 73 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 74  s is something t
33d0: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 63 61  his procedure ca
33e0: 6e 6e 6f 74 20 63 68 65 63 6b 0a 20 20 2a 09 28  nnot check.  *.(
33f0: 64 65 73 70 69 74 65 20 74 68 65 20 72 65 66 63  despite the refc
3400: 6f 75 6e 74 29 20 62 65 63 61 75 73 65 20 74 68  ount) because th
3410: 65 20 63 61 6c 6c 65 72 20 75 73 75 61 6c 6c 79  e caller usually
3420: 20 77 61 6e 74 73 20 66 69 67 67 6c 65 0a 20 20   wants figgle.  
3430: 2a 09 77 69 74 68 20 74 68 65 20 63 68 61 6e 6e  *.with the chann
3440: 65 6c 20 28 6c 69 6b 65 20 74 72 61 6e 73 66 65  el (like transfe
3450: 72 69 6e 67 20 69 74 20 74 6f 20 61 20 64 69 66  ring it to a dif
3460: 66 65 72 65 6e 74 20 74 68 72 65 61 64 29 0a 40  ferent thread).@
3470: 40 20 2d 32 34 36 34 2c 36 20 2b 32 34 37 30 2c  @ -2464,6 +2470,
3480: 37 20 40 40 0a 20 7b 0a 20 20 20 20 20 54 68 72  7 @@. {.     Thr
3490: 65 61 64 53 70 65 63 69 66 69 63 44 61 74 61 20  eadSpecificData 
34a0: 2a 74 73 64 50 74 72 20 3d 20 54 43 4c 5f 54 53  *tsdPtr = TCL_TS
34b0: 44 5f 49 4e 49 54 28 26 64 61 74 61 4b 65 79 29  D_INIT(&dataKey)
34c0: 3b 0a 20 20 20 20 20 43 68 61 6e 6e 65 6c 53 74  ;.     ChannelSt
34d0: 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20  ate *statePtr = 
34e0: 28 28 43 68 61 6e 6e 65 6c 20 2a 29 20 63 68 61  ((Channel *) cha
34f0: 6e 29 2d 3e 73 74 61 74 65 3b 0a 2b 20 20 20 20  n)->state;.+    
3500: 54 63 6c 5f 44 72 69 76 65 72 54 68 72 65 61 64  Tcl_DriverThread
3510: 41 63 74 69 6f 6e 50 72 6f 63 20 2a 74 68 72 65  ActionProc *thre
3520: 61 64 41 63 74 69 6f 6e 50 72 6f 63 3b 0a 20 0a  adActionProc;. .
3530: 20 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74       if (statePt
3540: 72 2d 3e 6e 65 78 74 43 53 50 74 72 20 21 3d 20  r->nextCSPtr != 
3550: 28 43 68 61 6e 6e 65 6c 53 74 61 74 65 20 2a 29  (ChannelState *)
3560: 20 4e 55 4c 4c 29 20 7b 0a 20 09 54 63 6c 5f 50   NULL) {. .Tcl_P
3570: 61 6e 69 63 28 22 54 63 6c 5f 53 70 6c 69 63 65  anic("Tcl_Splice
3580: 43 68 61 6e 6e 65 6c 3a 20 74 72 79 69 6e 67 20  Channel: trying 
3590: 74 6f 20 61 64 64 20 63 68 61 6e 6e 65 6c 20 75  to add channel u
35a0: 73 65 64 20 69 6e 20 64 69 66 66 65 72 65 6e 74  sed in different
35b0: 20 6c 69 73 74 22 29 3b 0a 40 40 20 2d 32 34 38   list");.@@ -248
35c0: 30 2c 38 20 2b 32 34 38 37 2c 31 32 20 40 40 0a  0,8 +2487,12 @@.
35d0: 20 0a 20 20 20 20 20 73 74 61 74 65 50 74 72 2d   .     statePtr-
35e0: 3e 6d 61 6e 61 67 69 6e 67 54 68 72 65 61 64 20  >managingThread 
35f0: 3d 20 54 63 6c 5f 47 65 74 43 75 72 72 65 6e 74  = Tcl_GetCurrent
3600: 54 68 72 65 61 64 28 29 3b 0a 20 0a 2d 20 20 20  Thread();. .-   
3610: 20 54 63 6c 70 53 70 6c 69 63 65 46 69 6c 65 43   TclpSpliceFileC
3620: 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 2d 20  hannel(chan);.- 
3630: 20 20 20 54 63 6c 70 53 70 6c 69 63 65 53 6f 63     TclpSpliceSoc
3640: 6b 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a  kChannel(chan);.
3650: 2b 20 20 20 20 2f 2a 20 54 49 50 20 23 32 31 38  +    /* TIP #218
3660: 2c 20 43 68 61 6e 6e 65 6c 20 54 68 72 65 61 64  , Channel Thread
3670: 20 41 63 74 69 6f 6e 73 20 2a 2f 0a 2b 20 20 20   Actions */.+   
3680: 20 74 68 72 65 61 64 41 63 74 69 6f 6e 50 72 6f   threadActionPro
3690: 63 20 3d 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 54  c = Tcl_ChannelT
36a0: 68 72 65 61 64 41 63 74 69 6f 6e 50 72 6f 63 20  hreadActionProc 
36b0: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54  (Tcl_GetChannelT
36c0: 79 70 65 20 28 63 68 61 6e 29 29 3b 0a 2b 20 20  ype (chan));.+  
36d0: 20 20 69 66 20 28 74 68 72 65 61 64 41 63 74 69    if (threadActi
36e0: 6f 6e 50 72 6f 63 20 21 3d 20 4e 55 4c 4c 29 20  onProc != NULL) 
36f0: 7b 0a 2b 20 20 20 20 20 20 20 20 28 2a 74 68 72  {.+        (*thr
3700: 65 61 64 41 63 74 69 6f 6e 50 72 6f 63 29 20 28  eadActionProc) (
3710: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e  Tcl_GetChannelIn
3720: 73 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29  stanceData(chan)
3730: 2c 0a 2b 09 09 09 20 20 20 20 20 54 43 4c 5f 43  ,.+...     TCL_C
3740: 48 41 4e 4e 45 4c 5f 54 48 52 45 41 44 5f 49 4e  HANNEL_THREAD_IN
3750: 53 45 52 54 29 3b 0a 2b 20 20 20 20 7d 0a 20 7d  SERT);.+    }. }
3760: 0a 20 0c 0a 20 2f 2a 0a 40 40 20 2d 38 39 35 33  . .. /*.@@ -8953
3770: 2c 36 20 2b 38 39 36 34 2c 38 20 40 40 0a 20 09  ,6 +8964,8 @@. .
3780: 72 65 74 75 72 6e 20 54 43 4c 5f 43 48 41 4e 4e  return TCL_CHANN
3790: 45 4c 5f 56 45 52 53 49 4f 4e 5f 32 3b 0a 20 20  EL_VERSION_2;.  
37a0: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63 68     } else if (ch
37b0: 61 6e 54 79 70 65 50 74 72 2d 3e 76 65 72 73 69  anTypePtr->versi
37c0: 6f 6e 20 3d 3d 20 54 43 4c 5f 43 48 41 4e 4e 45  on == TCL_CHANNE
37d0: 4c 5f 56 45 52 53 49 4f 4e 5f 33 29 20 7b 0a 20  L_VERSION_3) {. 
37e0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 43 48 41 4e  .return TCL_CHAN
37f0: 4e 45 4c 5f 56 45 52 53 49 4f 4e 5f 33 3b 0a 2b  NEL_VERSION_3;.+
3800: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63      } else if (c
3810: 68 61 6e 54 79 70 65 50 74 72 2d 3e 76 65 72 73  hanTypePtr->vers
3820: 69 6f 6e 20 3d 3d 20 54 43 4c 5f 43 48 41 4e 4e  ion == TCL_CHANN
3830: 45 4c 5f 56 45 52 53 49 4f 4e 5f 34 29 20 7b 0a  EL_VERSION_4) {.
3840: 2b 09 72 65 74 75 72 6e 20 54 43 4c 5f 43 48 41  +.return TCL_CHA
3850: 4e 4e 45 4c 5f 56 45 52 53 49 4f 4e 5f 34 3b 0a  NNEL_VERSION_4;.
3860: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 09       } else {. .
3870: 2f 2a 0a 20 09 20 2a 20 49 6e 20 3c 76 32 20 63  /*. . * In <v2 c
3880: 68 61 6e 6e 65 6c 20 76 65 72 73 69 6f 6e 73 2c  hannel versions,
3890: 20 74 68 65 20 76 65 72 73 69 6f 6e 20 66 69 65   the version fie
38a0: 6c 64 20 69 73 20 6f 63 63 75 70 69 65 64 0a 40  ld is occupied.@
38b0: 40 20 2d 39 33 30 38 2c 36 20 2b 39 33 32 31 2c  @ -9308,6 +9321,
38c0: 33 34 20 40 40 0a 20 20 20 20 20 7d 0a 20 7d 0a  34 @@.     }. }.
38d0: 20 0c 0a 2b 2f 2a 0a 2b 20 2a 2d 2d 2d 2d 2d 2d   ..+/*.+ *------
38e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
38f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3920: 0a 2b 20 2a 0a 2b 20 2a 20 54 63 6c 5f 43 68 61  .+ *.+ * Tcl_Cha
3930: 6e 6e 65 6c 54 68 72 65 61 64 41 63 74 69 6f 6e  nnelThreadAction
3940: 50 72 6f 63 20 2d 2d 0a 2b 20 2a 0a 2b 20 2a 20  Proc --.+ *.+ * 
3950: 20 20 20 20 20 54 49 50 20 23 32 31 38 2c 20 43       TIP #218, C
3960: 68 61 6e 6e 65 6c 20 54 68 72 65 61 64 20 41 63  hannel Thread Ac
3970: 74 69 6f 6e 73 2e 0a 2b 20 2a 09 52 65 74 75 72  tions..+ *.Retur
3980: 6e 20 74 68 65 20 54 63 6c 5f 44 72 69 76 65 72  n the Tcl_Driver
3990: 54 68 72 65 61 64 41 63 74 69 6f 6e 50 72 6f 63  ThreadActionProc
39a0: 20 6f 66 20 74 68 65 20 63 68 61 6e 6e 65 6c 20   of the channel 
39b0: 74 79 70 65 2e 0a 2b 20 2a 0a 2b 20 2a 20 52 65  type..+ *.+ * Re
39c0: 73 75 6c 74 73 3a 0a 2b 20 2a 09 41 20 70 6f 69  sults:.+ *.A poi
39d0: 6e 74 65 72 20 74 6f 20 74 68 65 20 70 72 6f 63  nter to the proc
39e0: 2e 0a 2b 20 2a 0a 2b 20 2a 20 53 69 64 65 20 65  ..+ *.+ * Side e
39f0: 66 66 65 63 74 73 3a 0a 2b 20 2a 09 4e 6f 6e 65  ffects:.+ *.None
3a00: 2e 0a 2b 20 2a 0a 2b 20 2a 2d 2d 2d 2d 2d 2d 2d  ..+ *.+ *-------
3a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
3a50: 2b 20 2a 2f 0a 2b 0a 2b 54 63 6c 5f 44 72 69 76  + */.+.+Tcl_Driv
3a60: 65 72 54 68 72 65 61 64 41 63 74 69 6f 6e 50 72  erThreadActionPr
3a70: 6f 63 20 2a 0a 2b 54 63 6c 5f 43 68 61 6e 6e 65  oc *.+Tcl_Channe
3a80: 6c 54 68 72 65 61 64 41 63 74 69 6f 6e 50 72 6f  lThreadActionPro
3a90: 63 28 63 68 61 6e 54 79 70 65 50 74 72 29 0a 2b  c(chanTypePtr).+
3aa0: 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 54      Tcl_ChannelT
3ab0: 79 70 65 20 2a 63 68 61 6e 54 79 70 65 50 74 72  ype *chanTypePtr
3ac0: 3b 09 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20  ;./* Pointer to 
3ad0: 63 68 61 6e 6e 65 6c 20 74 79 70 65 2e 20 2a 2f  channel type. */
3ae0: 0a 2b 7b 0a 2b 20 20 20 20 69 66 20 28 48 61 76  .+{.+    if (Hav
3af0: 65 56 65 72 73 69 6f 6e 28 63 68 61 6e 54 79 70  eVersion(chanTyp
3b00: 65 50 74 72 2c 20 54 43 4c 5f 43 48 41 4e 4e 45  ePtr, TCL_CHANNE
3b10: 4c 5f 56 45 52 53 49 4f 4e 5f 34 29 29 20 7b 0a  L_VERSION_4)) {.
3b20: 2b 09 72 65 74 75 72 6e 20 63 68 61 6e 54 79 70  +.return chanTyp
3b30: 65 50 74 72 2d 3e 74 68 72 65 61 64 41 63 74 69  ePtr->threadActi
3b40: 6f 6e 50 72 6f 63 3b 0a 2b 20 20 20 20 7d 20 65  onProc;.+    } e
3b50: 6c 73 65 20 7b 0a 2b 09 72 65 74 75 72 6e 20 4e  lse {.+.return N
3b60: 55 4c 4c 3b 0a 2b 20 20 20 20 7d 0a 2b 7d 0a 2b  ULL;.+    }.+}.+
3b70: 0c 0a 20 23 69 66 20 30 0a 20 2f 2a 0a 20 20 2a  .. #if 0. /*.  *
3b80: 20 46 6f 72 20 66 75 74 75 72 65 20 64 65 62 75   For future debu
3b90: 67 67 69 6e 67 20 77 6f 72 6b 2c 20 61 20 73 69  gging work, a si
3ba0: 6d 70 6c 65 20 66 75 6e 63 74 69 6f 6e 20 74 6f  mple function to
3bb0: 20 70 72 69 6e 74 20 74 68 65 20 66 6c 61 67 73   print the flags
3bc0: 20 6f 66 0a 49 6e 64 65 78 3a 20 67 65 6e 65 72   of.Index: gener
3bd0: 69 63 2f 74 63 6c 49 6e 74 2e 68 0a 3d 3d 3d 3d  ic/tclInt.h.====
3be0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3bf0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3c00: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3c10: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a  ===============.
3c20: 52 43 53 20 66 69 6c 65 3a 20 2f 63 76 73 72 6f  RCS file: /cvsro
3c30: 6f 74 2f 74 63 6c 2f 74 63 6c 2f 67 65 6e 65 72  ot/tcl/tcl/gener
3c40: 69 63 2f 74 63 6c 49 6e 74 2e 68 2c 76 0a 72 65  ic/tclInt.h,v.re
3c50: 74 72 69 65 76 69 6e 67 20 72 65 76 69 73 69 6f  trieving revisio
3c60: 6e 20 31 2e 32 31 33 0a 64 69 66 66 20 2d 77 20  n 1.213.diff -w 
3c70: 2d 75 20 2d 72 31 2e 32 31 33 20 74 63 6c 49 6e  -u -r1.213 tclIn
3c80: 74 2e 68 0a 2d 2d 2d 20 67 65 6e 65 72 69 63 2f  t.h.--- generic/
3c90: 74 63 6c 49 6e 74 2e 68 09 32 31 20 4a 61 6e 20  tclInt.h.21 Jan 
3ca0: 32 30 30 35 20 32 32 3a 32 35 3a 31 38 20 2d 30  2005 22:25:18 -0
3cb0: 30 30 30 09 31 2e 32 31 33 0a 2b 2b 2b 20 67 65  000.1.213.+++ ge
3cc0: 6e 65 72 69 63 2f 74 63 6c 49 6e 74 2e 68 09 32  neric/tclInt.h.2
3cd0: 36 20 4a 61 6e 20 32 30 30 35 20 32 33 3a 33 36  6 Jan 2005 23:36
3ce0: 3a 35 30 20 2d 30 30 30 30 0a 40 40 20 2d 31 39  :50 -0000.@@ -19
3cf0: 37 37 2c 31 30 20 2b 31 39 37 37 2c 36 20 40 40  77,10 +1977,6 @@
3d00: 0a 20 4d 4f 44 55 4c 45 5f 53 43 4f 50 45 20 69  . MODULE_SCOPE i
3d10: 6e 74 09 54 63 6c 70 4f 62 6a 43 68 64 69 72 20  nt.TclpObjChdir 
3d20: 5f 41 4e 53 49 5f 41 52 47 53 5f 28 28 54 63 6c  _ANSI_ARGS_((Tcl
3d30: 5f 4f 62 6a 20 2a 70 61 74 68 50 74 72 29 29 3b  _Obj *pathPtr));
3d40: 0a 20 4d 4f 44 55 4c 45 5f 53 43 4f 50 45 20 54  . MODULE_SCOPE T
3d50: 63 6c 5f 4f 62 6a 20 2a 09 54 63 6c 50 61 74 68  cl_Obj *.TclPath
3d60: 50 61 72 74 20 5f 41 4e 53 49 5f 41 52 47 53 5f  Part _ANSI_ARGS_
3d70: 28 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  ((Tcl_Interp *in
3d80: 74 65 72 70 2c 20 0a 20 09 09 09 20 20 20 20 54  terp, . ...    T
3d90: 63 6c 5f 4f 62 6a 20 2a 70 61 74 68 50 74 72 2c  cl_Obj *pathPtr,
3da0: 20 54 63 6c 5f 50 61 74 68 50 61 72 74 20 70 6f   Tcl_PathPart po
3db0: 72 74 69 6f 6e 29 29 3b 0a 2d 4d 4f 44 55 4c 45  rtion));.-MODULE
3dc0: 5f 53 43 4f 50 45 20 76 6f 69 64 09 54 63 6c 70  _SCOPE void.Tclp
3dd0: 43 75 74 46 69 6c 65 43 68 61 6e 6e 65 6c 20 5f  CutFileChannel _
3de0: 41 4e 53 49 5f 41 52 47 53 5f 28 28 54 63 6c 5f  ANSI_ARGS_((Tcl_
3df0: 43 68 61 6e 6e 65 6c 20 63 68 61 6e 29 29 3b 0a  Channel chan));.
3e00: 2d 4d 4f 44 55 4c 45 5f 53 43 4f 50 45 20 76 6f  -MODULE_SCOPE vo
3e10: 69 64 09 54 63 6c 70 43 75 74 53 6f 63 6b 43 68  id.TclpCutSockCh
3e20: 61 6e 6e 65 6c 20 5f 41 4e 53 49 5f 41 52 47 53  annel _ANSI_ARGS
3e30: 5f 28 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63  _((Tcl_Channel c
3e40: 68 61 6e 29 29 3b 0a 2d 4d 4f 44 55 4c 45 5f 53  han));.-MODULE_S
3e50: 43 4f 50 45 20 76 6f 69 64 09 54 63 6c 70 53 70  COPE void.TclpSp
3e60: 6c 69 63 65 46 69 6c 65 43 68 61 6e 6e 65 6c 20  liceFileChannel 
3e70: 5f 41 4e 53 49 5f 41 52 47 53 5f 28 28 54 63 6c  _ANSI_ARGS_((Tcl
3e80: 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 29 29 3b  _Channel chan));
3e90: 0a 2d 4d 4f 44 55 4c 45 5f 53 43 4f 50 45 20 76  .-MODULE_SCOPE v
3ea0: 6f 69 64 09 54 63 6c 70 53 70 6c 69 63 65 53 6f  oid.TclpSpliceSo
3eb0: 63 6b 43 68 61 6e 6e 65 6c 20 5f 41 4e 53 49 5f  ckChannel _ANSI_
3ec0: 41 52 47 53 5f 28 28 54 63 6c 5f 43 68 61 6e 6e  ARGS_((Tcl_Chann
3ed0: 65 6c 20 63 68 61 6e 29 29 3b 0a 20 4d 4f 44 55  el chan));. MODU
3ee0: 4c 45 5f 53 43 4f 50 45 20 76 6f 69 64 09 54 63  LE_SCOPE void.Tc
3ef0: 6c 70 50 61 6e 69 63 20 5f 41 4e 53 49 5f 41 52  lpPanic _ANSI_AR
3f00: 47 53 5f 28 54 43 4c 5f 56 41 52 41 52 47 53 28  GS_(TCL_VARARGS(
3f10: 43 4f 4e 53 54 20 63 68 61 72 20 2a 2c 0a 20 09  CONST char *,. .
3f20: 09 09 20 20 20 20 66 6f 72 6d 61 74 29 29 3b 0a  ..    format));.
3f30: 20 4d 4f 44 55 4c 45 5f 53 43 4f 50 45 20 63 68   MODULE_SCOPE ch
3f40: 61 72 20 2a 09 54 63 6c 70 52 65 61 64 6c 69 6e  ar *.TclpReadlin
3f50: 6b 20 5f 41 4e 53 49 5f 41 52 47 53 5f 28 28 43  k _ANSI_ARGS_((C
3f60: 4f 4e 53 54 20 63 68 61 72 20 2a 66 69 6c 65 4e  ONST char *fileN
3f70: 61 6d 65 2c 0a 49 6e 64 65 78 3a 20 67 65 6e 65  ame,.Index: gene
3f80: 72 69 63 2f 74 63 6c 53 74 75 62 49 6e 69 74 2e  ric/tclStubInit.
3f90: 63 0a 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  c.==============
3fa0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3fb0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3fc0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3fd0: 3d 3d 3d 3d 3d 0a 52 43 53 20 66 69 6c 65 3a 20  =====.RCS file: 
3fe0: 2f 63 76 73 72 6f 6f 74 2f 74 63 6c 2f 74 63 6c  /cvsroot/tcl/tcl
3ff0: 2f 67 65 6e 65 72 69 63 2f 74 63 6c 53 74 75 62  /generic/tclStub
4000: 49 6e 69 74 2e 63 2c 76 0a 72 65 74 72 69 65 76  Init.c,v.retriev
4010: 69 6e 67 20 72 65 76 69 73 69 6f 6e 20 31 2e 31  ing revision 1.1
4020: 31 32 0a 64 69 66 66 20 2d 77 20 2d 75 20 2d 72  12.diff -w -u -r
4030: 31 2e 31 31 32 20 74 63 6c 53 74 75 62 49 6e 69  1.112 tclStubIni
4040: 74 2e 63 0a 2d 2d 2d 20 67 65 6e 65 72 69 63 2f  t.c.--- generic/
4050: 74 63 6c 53 74 75 62 49 6e 69 74 2e 63 09 32 31  tclStubInit.c.21
4060: 20 4a 61 6e 20 32 30 30 35 20 32 32 3a 32 35 3a   Jan 2005 22:25:
4070: 31 39 20 2d 30 30 30 30 09 31 2e 31 31 32 0a 2b  19 -0000.1.112.+
4080: 2b 2b 20 67 65 6e 65 72 69 63 2f 74 63 6c 53 74  ++ generic/tclSt
4090: 75 62 49 6e 69 74 2e 63 09 32 36 20 4a 61 6e 20  ubInit.c.26 Jan 
40a0: 32 30 30 35 20 32 33 3a 33 36 3a 35 31 20 2d 30  2005 23:36:51 -0
40b0: 30 30 30 0a 40 40 20 2d 39 37 30 2c 36 20 2b 39  000.@@ -970,6 +9
40c0: 37 30 2c 37 20 40 40 0a 20 20 20 20 20 54 63 6c  70,7 @@.     Tcl
40d0: 5f 47 65 74 45 6e 73 65 6d 62 6c 65 4e 61 6d 65  _GetEnsembleName
40e0: 73 70 61 63 65 2c 20 2f 2a 20 35 35 31 20 2a 2f  space, /* 551 */
40f0: 0a 20 20 20 20 20 54 63 6c 5f 53 65 74 54 69 6d  .     Tcl_SetTim
4100: 65 50 72 6f 63 2c 20 2f 2a 20 35 35 32 20 2a 2f  eProc, /* 552 */
4110: 0a 20 20 20 20 20 54 63 6c 5f 51 75 65 72 79 54  .     Tcl_QueryT
4120: 69 6d 65 50 72 6f 63 2c 20 2f 2a 20 35 35 33 20  imeProc, /* 553 
4130: 2a 2f 0a 2b 20 20 20 20 54 63 6c 5f 43 68 61 6e  */.+    Tcl_Chan
4140: 6e 65 6c 54 68 72 65 61 64 41 63 74 69 6f 6e 50  nelThreadActionP
4150: 72 6f 63 2c 20 2f 2a 20 35 35 34 20 2a 2f 0a 20  roc, /* 554 */. 
4160: 7d 3b 0a 20 0a 20 2f 2a 20 21 45 4e 44 21 3a 20  };. . /* !END!: 
4170: 44 6f 20 6e 6f 74 20 65 64 69 74 20 61 62 6f 76  Do not edit abov
4180: 65 20 74 68 69 73 20 6c 69 6e 65 2e 20 2a 2f 0a  e this line. */.
4190: 49 6e 64 65 78 3a 20 74 65 73 74 73 2f 69 6f 2e  Index: tests/io.
41a0: 74 65 73 74 0a 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  test.===========
41b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
41c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
41d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
41e0: 3d 3d 3d 3d 3d 3d 3d 3d 0a 52 43 53 20 66 69 6c  ========.RCS fil
41f0: 65 3a 20 2f 63 76 73 72 6f 6f 74 2f 74 63 6c 2f  e: /cvsroot/tcl/
4200: 74 63 6c 2f 74 65 73 74 73 2f 69 6f 2e 74 65 73  tcl/tests/io.tes
4210: 74 2c 76 0a 72 65 74 72 69 65 76 69 6e 67 20 72  t,v.retrieving r
4220: 65 76 69 73 69 6f 6e 20 31 2e 36 35 0a 64 69 66  evision 1.65.dif
4230: 66 20 2d 77 20 2d 75 20 2d 72 31 2e 36 35 20 69  f -w -u -r1.65 i
4240: 6f 2e 74 65 73 74 0a 2d 2d 2d 20 74 65 73 74 73  o.test.--- tests
4250: 2f 69 6f 2e 74 65 73 74 09 31 38 20 4e 6f 76 20  /io.test.18 Nov 
4260: 32 30 30 34 20 31 39 3a 32 32 3a 31 32 20 2d 30  2004 19:22:12 -0
4270: 30 30 30 09 31 2e 36 35 0a 2b 2b 2b 20 74 65 73  000.1.65.+++ tes
4280: 74 73 2f 69 6f 2e 74 65 73 74 09 32 36 20 4a 61  ts/io.test.26 Ja
4290: 6e 20 32 30 30 35 20 32 33 3a 33 36 3a 35 32 20  n 2005 23:36:52 
42a0: 2d 30 30 30 30 0a 40 40 20 2d 31 37 30 34 2c 36  -0000.@@ -1704,6
42b0: 20 2b 31 37 30 34 2c 31 32 20 40 40 0a 20 20 20   +1704,12 @@.   
42c0: 20 20 73 65 74 20 66 20 5b 6f 70 65 6e 20 22 7c    set f [open "|
42d0: 5b 6c 69 73 74 20 5b 69 6e 74 65 72 70 72 65 74  [list [interpret
42e0: 65 72 5d 20 24 70 61 74 68 28 73 63 72 69 70 74  er] $path(script
42f0: 29 20 5b 61 72 72 61 79 20 67 65 74 20 70 61 74  ) [array get pat
4300: 68 5d 5d 22 20 72 5d 0a 20 20 20 20 20 73 65 74  h]]" r].     set
4310: 20 63 20 5b 67 65 74 73 20 24 66 5d 0a 20 20 20   c [gets $f].   
4320: 20 20 63 6c 6f 73 65 20 24 66 0a 2b 20 20 20 20    close $f.+    
4330: 23 20 41 64 64 65 64 20 64 65 6c 61 79 20 74 6f  # Added delay to
4340: 20 67 69 76 65 20 57 69 6e 64 6f 77 73 20 74 69   give Windows ti
4350: 6d 65 20 74 6f 20 73 74 6f 70 20 74 68 65 20 73  me to stop the s
4360: 70 61 77 6e 65 64 20 70 72 6f 63 65 73 73 20 61  pawned process a
4370: 6e 64 20 63 6c 65 61 6e 0a 2b 20 20 20 20 23 20  nd clean.+    # 
4380: 75 70 20 69 74 73 20 67 72 69 70 20 6f 6e 20 74  up its grip on t
4390: 68 65 20 66 69 6c 65 20 74 65 73 74 31 2e 20 41  he file test1. A
43a0: 64 64 65 64 20 64 65 6c 65 74 65 20 61 73 20 70  dded delete as p
43b0: 72 6f 70 65 72 20 74 65 73 74 20 63 6c 65 61 6e  roper test clean
43c0: 75 70 2e 0a 2b 20 20 20 20 23 20 54 68 65 20 66  up..+    # The f
43d0: 61 69 6c 69 6e 67 20 74 65 73 74 73 20 77 65 72  ailing tests wer
43e0: 65 20 31 38 2e 31 20 61 6e 64 20 31 38 2e 32 20  e 18.1 and 18.2 
43f0: 61 73 20 66 69 72 73 74 20 72 65 2d 75 73 65 72  as first re-user
4400: 73 20 6f 66 20 66 69 6c 65 20 22 74 65 73 74 31  s of file "test1
4410: 22 2e 0a 2b 20 20 20 20 61 66 74 65 72 20 31 30  "..+    after 10
4420: 30 30 30 0a 2b 20 20 20 20 66 69 6c 65 20 64 65  000.+    file de
4430: 6c 65 74 65 20 24 70 61 74 68 28 73 63 72 69 70  lete $path(scrip
4440: 74 29 0a 2b 20 20 20 20 66 69 6c 65 20 64 65 6c  t).+    file del
4450: 65 74 65 20 24 70 61 74 68 28 74 65 73 74 31 29  ete $path(test1)
4460: 0a 20 20 20 20 20 73 65 74 20 63 0a 20 7d 20 68  .     set c. } h
4470: 65 6c 6c 6f 0a 20 0a 49 6e 64 65 78 3a 20 75 6e  ello. .Index: un
4480: 69 78 2f 74 63 6c 55 6e 69 78 43 68 61 6e 2e 63  ix/tclUnixChan.c
4490: 0a 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  .===============
44a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
44b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
44c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
44d0: 3d 3d 3d 3d 0a 52 43 53 20 66 69 6c 65 3a 20 2f  ====.RCS file: /
44e0: 63 76 73 72 6f 6f 74 2f 74 63 6c 2f 74 63 6c 2f  cvsroot/tcl/tcl/
44f0: 75 6e 69 78 2f 74 63 6c 55 6e 69 78 43 68 61 6e  unix/tclUnixChan
4500: 2e 63 2c 76 0a 72 65 74 72 69 65 76 69 6e 67 20  .c,v.retrieving 
4510: 72 65 76 69 73 69 6f 6e 20 31 2e 35 33 0a 64 69  revision 1.53.di
4520: 66 66 20 2d 77 20 2d 75 20 2d 72 31 2e 35 33 20  ff -w -u -r1.53 
4530: 74 63 6c 55 6e 69 78 43 68 61 6e 2e 63 0a 2d 2d  tclUnixChan.c.--
4540: 2d 20 75 6e 69 78 2f 74 63 6c 55 6e 69 78 43 68  - unix/tclUnixCh
4550: 61 6e 2e 63 09 31 37 20 4e 6f 76 20 32 30 30 34  an.c.17 Nov 2004
4560: 20 30 32 3a 35 31 3a 33 32 20 2d 30 30 30 30 09   02:51:32 -0000.
4570: 31 2e 35 33 0a 2b 2b 2b 20 75 6e 69 78 2f 74 63  1.53.+++ unix/tc
4580: 6c 55 6e 69 78 43 68 61 6e 2e 63 09 32 36 20 4a  lUnixChan.c.26 J
4590: 61 6e 20 32 30 30 35 20 32 33 3a 33 36 3a 35 32  an 2005 23:36:52
45a0: 20 2d 30 30 30 30 0a 40 40 20 2d 32 33 32 2c 36   -0000.@@ -232,6
45b0: 20 2b 32 33 32 2c 31 30 20 40 40 0a 20 09 09 09   +232,10 @@. ...
45c0: 20 20 20 20 69 6e 74 20 74 6f 57 72 69 74 65 2c      int toWrite,
45d0: 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65 29   int *errorCode)
45e0: 29 3b 0a 20 73 74 61 74 69 63 20 69 6e 74 09 09  );. static int..
45f0: 46 69 6c 65 53 65 65 6b 50 72 6f 63 20 5f 41 4e  FileSeekProc _AN
4600: 53 49 5f 41 52 47 53 5f 28 28 43 6c 69 65 6e 74  SI_ARGS_((Client
4610: 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74  Data instanceDat
4620: 61 2c 0a 20 09 09 09 20 20 20 20 6c 6f 6e 67 20  a,. ...    long 
4630: 6f 66 66 73 65 74 2c 20 69 6e 74 20 6d 6f 64 65  offset, int mode
4640: 2c 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65  , int *errorCode
4650: 29 29 3b 0a 2b 23 69 66 64 65 66 20 44 45 50 52  ));.+#ifdef DEPR
4660: 45 43 41 54 45 44 0a 2b 73 74 61 74 69 63 20 76  ECATED.+static v
4670: 6f 69 64 20 20 20 20 20 20 20 20 20 20 20 20 20  oid             
4680: 46 69 6c 65 54 68 72 65 61 64 41 63 74 69 6f 6e  FileThreadAction
4690: 50 72 6f 63 20 5f 41 4e 53 49 5f 41 52 47 53 5f  Proc _ANSI_ARGS_
46a0: 20 28 28 0a 2b 09 09 09 20 20 20 43 6c 69 65 6e   ((.+...   Clien
46b0: 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61  tData instanceDa
46c0: 74 61 2c 20 69 6e 74 20 61 63 74 69 6f 6e 29 29  ta, int action))
46d0: 3b 0a 2b 23 65 6e 64 69 66 0a 20 73 74 61 74 69  ;.+#endif. stati
46e0: 63 20 54 63 6c 5f 57 69 64 65 49 6e 74 09 46 69  c Tcl_WideInt.Fi
46f0: 6c 65 57 69 64 65 53 65 65 6b 50 72 6f 63 20 5f  leWideSeekProc _
4700: 41 4e 53 49 5f 41 52 47 53 5f 28 28 43 6c 69 65  ANSI_ARGS_((Clie
4710: 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44  ntData instanceD
4720: 61 74 61 2c 0a 20 09 09 09 20 20 20 20 54 63 6c  ata,. ...    Tcl
4730: 5f 57 69 64 65 49 6e 74 20 6f 66 66 73 65 74 2c  _WideInt offset,
4740: 20 69 6e 74 20 6d 6f 64 65 2c 20 69 6e 74 20 2a   int mode, int *
4750: 65 72 72 6f 72 43 6f 64 65 29 29 3b 0a 20 73 74  errorCode));. st
4760: 61 74 69 63 20 76 6f 69 64 09 09 46 69 6c 65 57  atic void..FileW
4770: 61 74 63 68 50 72 6f 63 20 5f 41 4e 53 49 5f 41  atchProc _ANSI_A
4780: 52 47 53 5f 28 28 43 6c 69 65 6e 74 44 61 74 61  RGS_((ClientData
4790: 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 0a 40   instanceData,.@
47a0: 40 20 2d 32 39 31 2c 37 20 2b 32 39 35 2c 37 20  @ -291,7 +295,7 
47b0: 40 40 0a 20 0a 20 73 74 61 74 69 63 20 54 63 6c  @@. . static Tcl
47c0: 5f 43 68 61 6e 6e 65 6c 54 79 70 65 20 66 69 6c  _ChannelType fil
47d0: 65 43 68 61 6e 6e 65 6c 54 79 70 65 20 3d 20 7b  eChannelType = {
47e0: 0a 20 20 20 20 20 22 66 69 6c 65 22 2c 09 09 09  .     "file",...
47f0: 2f 2a 20 54 79 70 65 20 6e 61 6d 65 2e 20 2a 2f  /* Type name. */
4800: 0a 2d 20 20 20 20 54 43 4c 5f 43 48 41 4e 4e 45  .-    TCL_CHANNE
4810: 4c 5f 56 45 52 53 49 4f 4e 5f 33 2c 09 2f 2a 20  L_VERSION_3,./* 
4820: 76 33 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 2b 20  v3 channel */.+ 
4830: 20 20 20 54 43 4c 5f 43 48 41 4e 4e 45 4c 5f 56     TCL_CHANNEL_V
4840: 45 52 53 49 4f 4e 5f 34 2c 09 2f 2a 20 76 34 20  ERSION_4,./* v4 
4850: 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 20  channel */.     
4860: 46 69 6c 65 43 6c 6f 73 65 50 72 6f 63 2c 09 09  FileCloseProc,..
4870: 2f 2a 20 43 6c 6f 73 65 20 70 72 6f 63 2e 20 2a  /* Close proc. *
4880: 2f 0a 20 20 20 20 20 46 69 6c 65 49 6e 70 75 74  /.     FileInput
4890: 50 72 6f 63 2c 09 09 2f 2a 20 49 6e 70 75 74 20  Proc,../* Input 
48a0: 70 72 6f 63 2e 20 2a 2f 0a 20 20 20 20 20 46 69  proc. */.     Fi
48b0: 6c 65 4f 75 74 70 75 74 50 72 6f 63 2c 09 09 2f  leOutputProc,../
48c0: 2a 20 4f 75 74 70 75 74 20 70 72 6f 63 2e 20 2a  * Output proc. *
48d0: 2f 0a 40 40 20 2d 33 30 35 2c 36 20 2b 33 30 39  /.@@ -305,6 +309
48e0: 2c 31 31 20 40 40 0a 20 20 20 20 20 4e 55 4c 4c  ,11 @@.     NULL
48f0: 2c 09 09 09 2f 2a 20 66 6c 75 73 68 20 70 72 6f  ,.../* flush pro
4900: 63 2e 20 2a 2f 0a 20 20 20 20 20 4e 55 4c 4c 2c  c. */.     NULL,
4910: 09 09 09 2f 2a 20 68 61 6e 64 6c 65 72 20 70 72  .../* handler pr
4920: 6f 63 2e 20 2a 2f 0a 20 20 20 20 20 46 69 6c 65  oc. */.     File
4930: 57 69 64 65 53 65 65 6b 50 72 6f 63 2c 09 09 2f  WideSeekProc,../
4940: 2a 20 77 69 64 65 20 73 65 65 6b 20 70 72 6f 63  * wide seek proc
4950: 2e 20 2a 2f 0a 2b 23 69 66 64 65 66 20 44 45 50  . */.+#ifdef DEP
4960: 52 45 43 41 54 45 44 0a 2b 20 20 20 20 46 69 6c  RECATED.+    Fil
4970: 65 54 68 72 65 61 64 41 63 74 69 6f 6e 50 72 6f  eThreadActionPro
4980: 63 2c 20 20 20 20 20 20 20 2f 2a 20 74 68 72 65  c,       /* thre
4990: 61 64 20 61 63 74 69 6f 6e 73 20 2a 2f 0a 2b 23  ad actions */.+#
49a0: 65 6c 73 65 0a 2b 20 20 20 20 4e 55 4c 4c 2c 0a  else.+    NULL,.
49b0: 2b 23 65 6e 64 69 66 0a 20 7d 3b 0a 20 0a 20 23  +#endif. };. . #
49c0: 69 66 64 65 66 20 53 55 50 50 4f 52 54 53 5f 54  ifdef SUPPORTS_T
49d0: 54 59 0a 40 40 20 2d 33 31 35 2c 37 20 2b 33 32  TY.@@ -315,7 +32
49e0: 34 2c 37 20 40 40 0a 20 0a 20 73 74 61 74 69 63  4,7 @@. . static
49f0: 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 54 79 70 65   Tcl_ChannelType
4a00: 20 74 74 79 43 68 61 6e 6e 65 6c 54 79 70 65 20   ttyChannelType 
4a10: 3d 20 7b 0a 20 20 20 20 20 22 74 74 79 22 2c 09  = {.     "tty",.
4a20: 09 09 2f 2a 20 54 79 70 65 20 6e 61 6d 65 2e 20  ../* Type name. 
4a30: 2a 2f 0a 2d 20 20 20 20 54 43 4c 5f 43 48 41 4e  */.-    TCL_CHAN
4a40: 4e 45 4c 5f 56 45 52 53 49 4f 4e 5f 32 2c 09 2f  NEL_VERSION_2,./
4a50: 2a 20 76 32 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a  * v2 channel */.
4a60: 2b 20 20 20 20 54 43 4c 5f 43 48 41 4e 4e 45 4c  +    TCL_CHANNEL
4a70: 5f 56 45 52 53 49 4f 4e 5f 34 2c 09 2f 2a 20 76  _VERSION_4,./* v
4a80: 34 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20  4 channel */.   
4a90: 20 20 54 74 79 43 6c 6f 73 65 50 72 6f 63 2c 09    TtyCloseProc,.
4aa0: 09 2f 2a 20 43 6c 6f 73 65 20 70 72 6f 63 2e 20  ./* Close proc. 
4ab0: 2a 2f 0a 20 20 20 20 20 46 69 6c 65 49 6e 70 75  */.     FileInpu
4ac0: 74 50 72 6f 63 2c 09 09 2f 2a 20 49 6e 70 75 74  tProc,../* Input
4ad0: 20 70 72 6f 63 2e 20 2a 2f 0a 20 23 69 66 20 42   proc. */. #if B
4ae0: 41 44 5f 54 49 50 33 35 5f 46 4c 55 53 48 0a 40  AD_TIP35_FLUSH.@
4af0: 40 20 2d 33 33 32 2c 36 20 2b 33 34 31 2c 38 20  @ -332,6 +341,8 
4b00: 40 40 0a 20 20 20 20 20 46 69 6c 65 42 6c 6f 63  @@.     FileBloc
4b10: 6b 4d 6f 64 65 50 72 6f 63 2c 09 09 2f 2a 20 53  kModeProc,../* S
4b20: 65 74 20 62 6c 6f 63 6b 69 6e 67 20 6f 72 20 6e  et blocking or n
4b30: 6f 6e 2d 62 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65  on-blocking mode
4b40: 2e 2a 2f 0a 20 20 20 20 20 4e 55 4c 4c 2c 09 09  .*/.     NULL,..
4b50: 09 2f 2a 20 66 6c 75 73 68 20 70 72 6f 63 2e 20  ./* flush proc. 
4b60: 2a 2f 0a 20 20 20 20 20 4e 55 4c 4c 2c 09 09 09  */.     NULL,...
4b70: 2f 2a 20 68 61 6e 64 6c 65 72 20 70 72 6f 63 2e  /* handler proc.
4b80: 20 2a 2f 0a 2b 20 20 20 20 4e 55 4c 4c 2c 09 09   */.+    NULL,..
4b90: 09 2f 2a 20 77 69 64 65 20 73 65 65 6b 20 70 72  ./* wide seek pr
4ba0: 6f 63 2e 20 2a 2f 0a 2b 20 20 20 20 4e 55 4c 4c  oc. */.+    NULL
4bb0: 2c 09 09 09 2f 2a 20 74 68 72 65 61 64 20 61 63  ,.../* thread ac
4bc0: 74 69 6f 6e 20 70 72 6f 63 2e 20 2a 2f 0a 20 7d  tion proc. */. }
4bd0: 3b 0a 20 23 65 6e 64 69 66 09 2f 2a 20 53 55 50  ;. #endif./* SUP
4be0: 50 4f 52 54 53 5f 54 54 59 20 2a 2f 0a 20 0a 40  PORTS_TTY */. .@
4bf0: 40 20 2d 33 34 32 2c 37 20 2b 33 35 33 2c 37 20  @ -342,7 +353,7 
4c00: 40 40 0a 20 0a 20 73 74 61 74 69 63 20 54 63 6c  @@. . static Tcl
4c10: 5f 43 68 61 6e 6e 65 6c 54 79 70 65 20 74 63 70  _ChannelType tcp
4c20: 43 68 61 6e 6e 65 6c 54 79 70 65 20 3d 20 7b 0a  ChannelType = {.
4c30: 20 20 20 20 20 22 74 63 70 22 2c 09 09 09 2f 2a       "tcp",.../*
4c40: 20 54 79 70 65 20 6e 61 6d 65 2e 20 2a 2f 0a 2d   Type name. */.-
4c50: 20 20 20 20 54 43 4c 5f 43 48 41 4e 4e 45 4c 5f      TCL_CHANNEL_
4c60: 56 45 52 53 49 4f 4e 5f 32 2c 09 2f 2a 20 76 32  VERSION_2,./* v2
4c70: 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 2b 20 20 20   channel */.+   
4c80: 20 54 43 4c 5f 43 48 41 4e 4e 45 4c 5f 56 45 52   TCL_CHANNEL_VER
4c90: 53 49 4f 4e 5f 34 2c 09 2f 2a 20 76 34 20 63 68  SION_4,./* v4 ch
4ca0: 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 20 54 63  annel */.     Tc
4cb0: 70 43 6c 6f 73 65 50 72 6f 63 2c 09 09 2f 2a 20  pCloseProc,../* 
4cc0: 43 6c 6f 73 65 20 70 72 6f 63 2e 20 2a 2f 0a 20  Close proc. */. 
4cd0: 20 20 20 20 54 63 70 49 6e 70 75 74 50 72 6f 63      TcpInputProc
4ce0: 2c 09 09 2f 2a 20 49 6e 70 75 74 20 70 72 6f 63  ,../* Input proc
4cf0: 2e 20 2a 2f 0a 20 20 20 20 20 54 63 70 4f 75 74  . */.     TcpOut
4d00: 70 75 74 50 72 6f 63 2c 09 09 2f 2a 20 4f 75 74  putProc,../* Out
4d10: 70 75 74 20 70 72 6f 63 2e 20 2a 2f 0a 40 40 20  put proc. */.@@ 
4d20: 2d 33 35 35 2c 36 20 2b 33 36 36 2c 38 20 40 40  -355,6 +366,8 @@
4d30: 0a 20 20 20 20 20 54 63 70 42 6c 6f 63 6b 4d 6f  .     TcpBlockMo
4d40: 64 65 50 72 6f 63 2c 09 09 2f 2a 20 53 65 74 20  deProc,../* Set 
4d50: 62 6c 6f 63 6b 69 6e 67 20 6f 72 20 6e 6f 6e 2d  blocking or non-
4d60: 62 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2e 2a 2f  blocking mode.*/
4d70: 0a 20 20 20 20 20 4e 55 4c 4c 2c 09 09 09 2f 2a  .     NULL,.../*
4d80: 20 66 6c 75 73 68 20 70 72 6f 63 2e 20 2a 2f 0a   flush proc. */.
4d90: 20 20 20 20 20 4e 55 4c 4c 2c 09 09 09 2f 2a 20       NULL,.../* 
4da0: 68 61 6e 64 6c 65 72 20 70 72 6f 63 2e 20 2a 2f  handler proc. */
4db0: 0a 2b 20 20 20 20 4e 55 4c 4c 2c 09 09 09 2f 2a  .+    NULL,.../*
4dc0: 20 77 69 64 65 20 73 65 65 6b 20 70 72 6f 63 2e   wide seek proc.
4dd0: 20 2a 2f 0a 2b 20 20 20 20 4e 55 4c 4c 2c 09 09   */.+    NULL,..
4de0: 09 2f 2a 20 74 68 72 65 61 64 20 61 63 74 69 6f  ./* thread actio
4df0: 6e 20 70 72 6f 63 2e 20 2a 2f 0a 20 7d 3b 0a 20  n proc. */. };. 
4e00: 0a 20 0c 0a 40 40 20 2d 31 38 32 31 2c 36 20 2b  . ..@@ -1821,6 +
4e10: 31 38 33 34 2c 31 35 20 40 40 0a 20 09 66 73 50  1834,15 @@. .fsP
4e20: 74 72 20 3d 20 28 46 69 6c 65 53 74 61 74 65 20  tr = (FileState 
4e30: 2a 29 20 63 6b 61 6c 6c 6f 63 28 28 75 6e 73 69  *) ckalloc((unsi
4e40: 67 6e 65 64 29 20 73 69 7a 65 6f 66 28 46 69 6c  gned) sizeof(Fil
4e50: 65 53 74 61 74 65 29 29 3b 0a 20 20 20 20 20 7d  eState));.     }
4e60: 0a 20 0a 2b 23 69 66 64 65 66 20 44 45 50 52 45  . .+#ifdef DEPRE
4e70: 43 41 54 45 44 0a 2b 20 20 20 20 69 66 20 28 63  CATED.+    if (c
4e80: 68 61 6e 6e 65 6c 54 79 70 65 50 74 72 20 3d 3d  hannelTypePtr ==
4e90: 20 26 66 69 6c 65 43 68 61 6e 6e 65 6c 54 79 70   &fileChannelTyp
4ea0: 65 29 20 7b 0a 2b 20 20 20 20 20 20 20 20 2f 2a  e) {.+        /*
4eb0: 20 54 49 50 20 23 32 31 38 2e 20 52 65 6d 6f 76   TIP #218. Remov
4ec0: 65 64 20 74 68 65 20 63 6f 64 65 20 69 6e 73 65  ed the code inse
4ed0: 72 74 69 6e 67 20 74 68 65 20 6e 65 77 20 73 74  rting the new st
4ee0: 72 75 63 74 75 72 65 0a 2b 09 20 2a 20 69 6e 74  ructure.+. * int
4ef0: 6f 20 74 68 65 20 67 6c 6f 62 61 6c 20 6c 69 73  o the global lis
4f00: 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 77 20 68  t. This is now h
4f10: 61 6e 64 6c 65 64 20 69 6e 20 74 68 65 20 74 68  andled in the th
4f20: 72 65 61 64 0a 2b 09 20 2a 20 61 63 74 69 6f 6e  read.+. * action
4f30: 20 63 61 6c 6c 62 61 63 6b 73 2c 20 61 6e 64 20   callbacks, and 
4f40: 6f 6e 6c 79 20 74 68 65 72 65 2e 0a 2b 09 20 2a  only there..+. *
4f50: 2f 0a 2b 20 20 20 20 20 20 20 20 66 73 50 74 72  /.+        fsPtr
4f60: 2d 3e 6e 65 78 74 50 74 72 20 3d 20 4e 55 4c 4c  ->nextPtr = NULL
4f70: 3b 0a 2b 20 20 20 20 7d 0a 2b 23 65 6e 64 69 66  ;.+    }.+#endif
4f80: 20 2f 2a 20 44 45 50 52 45 43 41 54 45 44 20 2a   /* DEPRECATED *
4f90: 2f 0a 20 20 20 20 20 66 73 50 74 72 2d 3e 76 61  /.     fsPtr->va
4fa0: 6c 69 64 4d 61 73 6b 20 3d 20 63 68 61 6e 6e 65  lidMask = channe
4fb0: 6c 50 65 72 6d 69 73 73 69 6f 6e 73 20 7c 20 54  lPermissions | T
4fc0: 43 4c 5f 45 58 43 45 50 54 49 4f 4e 3b 0a 20 20  CL_EXCEPTION;.  
4fd0: 20 20 20 66 73 50 74 72 2d 3e 66 64 20 3d 20 66     fsPtr->fd = f
4fe0: 64 3b 0a 20 0a 40 40 20 2d 33 32 33 39 2c 31 33  d;. .@@ -3239,13
4ff0: 20 2b 33 32 36 31 2c 31 33 20 40 40 0a 20 20 20   +3261,13 @@.   
5000: 20 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74 3b    return result;
5010: 0a 20 7d 0a 20 0c 0a 2b 23 69 66 64 65 66 20 44  . }. ..+#ifdef D
5020: 45 50 52 45 43 41 54 45 44 0a 20 2f 2a 0a 20 20  EPRECATED. /*.  
5030: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
5040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5070: 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 0a 2d 20 2a 20  -------.  *.- * 
5080: 54 63 6c 70 43 75 74 46 69 6c 65 43 68 61 6e 6e  TclpCutFileChann
5090: 65 6c 20 2d 2d 0a 2b 20 2a 20 46 69 6c 65 54 68  el --.+ * FileTh
50a0: 72 65 61 64 41 63 74 69 6f 6e 50 72 6f 63 20 2d  readActionProc -
50b0: 2d 0a 20 20 2a 0a 2d 20 2a 09 52 65 6d 6f 76 65  -.  *.- *.Remove
50c0: 20 61 6e 79 20 74 68 72 65 61 64 20 6c 6f 63 61   any thread loca
50d0: 6c 20 72 65 66 73 20 74 6f 20 74 68 69 73 20 63  l refs to this c
50e0: 68 61 6e 6e 65 6c 2e 20 53 65 65 0a 2d 20 2a 09  hannel. See.- *.
50f0: 54 63 6c 5f 43 75 74 43 68 61 6e 6e 65 6c 20 66  Tcl_CutChannel f
5100: 6f 72 20 6d 6f 72 65 20 69 6e 66 6f 2e 0a 2b 20  or more info..+ 
5110: 2a 09 49 6e 73 65 72 74 20 6f 72 20 72 65 6d 6f  *.Insert or remo
5120: 76 65 20 61 6e 79 20 74 68 72 65 61 64 20 6c 6f  ve any thread lo
5130: 63 61 6c 20 72 65 66 73 20 74 6f 20 74 68 69 73  cal refs to this
5140: 20 63 68 61 6e 6e 65 6c 2e 0a 20 20 2a 0a 20 20   channel..  *.  
5150: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 20 2a 09 4e  * Results:.  *.N
5160: 6f 6e 65 2e 0a 40 40 20 2d 33 32 35 36 2c 33 35  one..@@ -3256,35
5170: 20 2b 33 32 37 38 2c 33 39 20 40 40 0a 20 20 2a   +3278,39 @@.  *
5180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
51a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
51b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
51c0: 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2f 0a 20 0a 2d 76  ------.  */. .-v
51d0: 6f 69 64 0a 2d 54 63 6c 70 43 75 74 46 69 6c 65  oid.-TclpCutFile
51e0: 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 0a 2d 20  Channel(chan).- 
51f0: 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63     Tcl_Channel c
5200: 68 61 6e 3b 09 09 09 2f 2a 20 54 68 65 20 63 68  han;.../* The ch
5210: 61 6e 6e 65 6c 20 62 65 69 6e 67 20 72 65 6d 6f  annel being remo
5220: 76 65 64 2e 20 4d 75 73 74 0a 2d 20 20 20 20 20  ved. Must.-     
5230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5250: 20 20 20 20 2a 20 6e 6f 74 20 62 65 20 72 65 66      * not be ref
5260: 65 72 65 6e 63 65 64 20 69 6e 20 61 6e 79 0a 2d  erenced in any.-
5270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5290: 20 20 20 20 20 20 20 20 20 2a 20 69 6e 74 65 72           * inter
52a0: 70 72 65 74 65 72 2e 20 2a 2f 0a 2b 73 74 61 74  preter. */.+stat
52b0: 69 63 20 76 6f 69 64 0a 2b 46 69 6c 65 54 68 72  ic void.+FileThr
52c0: 65 61 64 41 63 74 69 6f 6e 50 72 6f 63 20 28 69  eadActionProc (i
52d0: 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 61 63 74  nstanceData, act
52e0: 69 6f 6e 29 0a 2b 20 20 20 20 20 43 6c 69 65 6e  ion).+     Clien
52f0: 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61  tData instanceDa
5300: 74 61 3b 0a 2b 20 20 20 20 20 69 6e 74 20 61 63  ta;.+     int ac
5310: 74 69 6f 6e 3b 0a 20 7b 0a 2b 20 20 20 20 54 68  tion;. {.+    Th
5320: 72 65 61 64 53 70 65 63 69 66 69 63 44 61 74 61  readSpecificData
5330: 20 2a 74 73 64 50 74 72 20 3d 20 54 43 4c 5f 54   *tsdPtr = TCL_T
5340: 53 44 5f 49 4e 49 54 28 26 64 61 74 61 4b 65 79  SD_INIT(&dataKey
5350: 29 3b 0a 2b 20 20 20 20 46 69 6c 65 53 74 61 74  );.+    FileStat
5360: 65 20 2a 66 73 50 74 72 20 3d 20 28 46 69 6c 65  e *fsPtr = (File
5370: 53 74 61 74 65 20 2a 29 20 69 6e 73 74 61 6e 63  State *) instanc
5380: 65 44 61 74 61 3b 0a 2b 0a 2b 20 20 20 20 69 66  eData;.+.+    if
5390: 20 28 61 63 74 69 6f 6e 20 3d 3d 20 54 43 4c 5f   (action == TCL_
53a0: 43 48 41 4e 4e 45 4c 5f 54 48 52 45 41 44 5f 49  CHANNEL_THREAD_I
53b0: 4e 53 45 52 54 29 20 7b 0a 2b 20 20 20 20 20 20  NSERT) {.+      
53c0: 20 20 66 73 50 74 72 2d 3e 6e 65 78 74 50 74 72    fsPtr->nextPtr
53d0: 20 20 20 20 20 20 20 3d 20 74 73 64 50 74 72 2d         = tsdPtr-
53e0: 3e 66 69 72 73 74 46 69 6c 65 50 74 72 3b 0a 2b  >firstFilePtr;.+
53f0: 09 74 73 64 50 74 72 2d 3e 66 69 72 73 74 46 69  .tsdPtr->firstFi
5400: 6c 65 50 74 72 20 3d 20 66 73 50 74 72 3b 0a 2b  lePtr = fsPtr;.+
5410: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 2b 20 20      } else {.+  
5420: 20 20 20 20 20 20 46 69 6c 65 53 74 61 74 65 20        FileState 
5430: 2a 2a 6e 65 78 74 50 74 72 50 74 72 3b 0a 2b 09  **nextPtrPtr;.+.
5440: 69 6e 74 20 72 65 6d 6f 76 65 64 20 3d 20 30 3b  int removed = 0;
5450: 0a 2b 0a 2b 09 66 6f 72 20 28 6e 65 78 74 50 74  .+.+.for (nextPt
5460: 72 50 74 72 20 3d 20 26 28 74 73 64 50 74 72 2d  rPtr = &(tsdPtr-
5470: 3e 66 69 72 73 74 46 69 6c 65 50 74 72 29 3b 20  >firstFilePtr); 
5480: 28 2a 6e 65 78 74 50 74 72 50 74 72 29 20 21 3d  (*nextPtrPtr) !=
5490: 20 4e 55 4c 4c 3b 0a 2b 09 20 20 20 20 20 6e 65   NULL;.+.     ne
54a0: 78 74 50 74 72 50 74 72 20 3d 20 26 28 28 2a 6e  xtPtrPtr = &((*n
54b0: 65 78 74 50 74 72 50 74 72 29 2d 3e 6e 65 78 74  extPtrPtr)->next
54c0: 50 74 72 29 29 20 7b 0a 2b 09 20 20 20 20 69 66  Ptr)) {.+.    if
54d0: 20 28 28 2a 6e 65 78 74 50 74 72 50 74 72 29 20   ((*nextPtrPtr) 
54e0: 3d 3d 20 66 73 50 74 72 29 20 7b 0a 2b 09 20 20  == fsPtr) {.+.  
54f0: 20 20 20 20 20 20 28 2a 6e 65 78 74 50 74 72 50        (*nextPtrP
5500: 74 72 29 20 3d 20 66 73 50 74 72 2d 3e 6e 65 78  tr) = fsPtr->nex
5510: 74 50 74 72 3b 0a 2b 09 09 72 65 6d 6f 76 65 64  tPtr;.+..removed
5520: 20 3d 20 31 3b 0a 2b 09 09 62 72 65 61 6b 3b 0a   = 1;.+..break;.
5530: 2b 09 20 20 20 20 7d 0a 20 7d 0a 20 0c 0a 20 2f  +.    }. }. .. /
5540: 2a 0a 2d 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *.- *-----------
5550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2d 20 2a 0a  -----------.- *.
5590: 2d 20 2a 20 54 63 6c 70 53 70 6c 69 63 65 46 69  - * TclpSpliceFi
55a0: 6c 65 43 68 61 6e 6e 65 6c 20 2d 2d 0a 2d 20 2a  leChannel --.- *
55b0: 0a 2d 20 2a 09 49 6e 73 65 72 74 20 74 68 72 65  .- *.Insert thre
55c0: 61 64 20 6c 6f 63 61 6c 20 72 65 66 20 66 6f 72  ad local ref for
55d0: 20 74 68 69 73 20 63 68 61 6e 6e 65 6c 2e 0a 2d   this channel..-
55e0: 20 2a 09 54 63 6c 5f 53 70 6c 69 63 65 43 68 61   *.Tcl_SpliceCha
55f0: 6e 6e 65 6c 20 66 6f 72 20 6d 6f 72 65 20 69 6e  nnel for more in
5600: 66 6f 2e 0a 2d 20 2a 0a 2d 20 2a 20 52 65 73 75  fo..- *.- * Resu
5610: 6c 74 73 3a 0a 2d 20 2a 09 4e 6f 6e 65 2e 0a 2d  lts:.- *.None..-
5620: 20 2a 0a 2d 20 2a 20 53 69 64 65 20 65 66 66 65   *.- * Side effe
5630: 63 74 73 3a 0a 2d 20 2a 09 4e 6f 6e 65 2e 20 54  cts:.- *.None. T
5640: 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 75  his is a no-op u
5650: 6e 64 65 72 20 75 6e 69 78 2e 0a 2d 20 2a 0a 2d  nder unix..- *.-
5660: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
5670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
56a0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 2b 09 20 2a 20 54 68  --------.+. * Th
56b0: 69 73 20 63 6f 75 6c 64 20 68 61 70 70 65 6e 20  is could happen 
56c0: 69 66 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 77  if the channel w
56d0: 61 73 20 63 72 65 61 74 65 64 20 69 6e 20 6f 6e  as created in on
56e0: 65 0a 2b 09 20 2a 20 74 68 72 65 61 64 20 61 6e  e.+. * thread an
56f0: 64 20 74 68 65 6e 20 6d 6f 76 65 64 20 74 6f 20  d then moved to 
5700: 61 6e 6f 74 68 65 72 20 77 69 74 68 6f 75 74 20  another without 
5710: 75 70 64 61 74 69 6e 67 0a 2b 09 20 2a 20 74 68  updating.+. * th
5720: 65 20 74 68 72 65 61 64 20 6c 6f 63 61 6c 20 64  e thread local d
5730: 61 74 61 20 69 6e 20 65 61 63 68 20 74 68 72 65  ata in each thre
5740: 61 64 2e 0a 20 20 2a 2f 0a 20 0a 2d 76 6f 69 64  ad..  */. .-void
5750: 0a 2d 54 63 6c 70 53 70 6c 69 63 65 46 69 6c 65  .-TclpSpliceFile
5760: 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 0a 2d 20  Channel(chan).- 
5770: 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63     Tcl_Channel c
5780: 68 61 6e 3b 09 09 09 2f 2a 20 54 68 65 20 63 68  han;.../* The ch
5790: 61 6e 6e 65 6c 20 62 65 69 6e 67 20 72 65 6d 6f  annel being remo
57a0: 76 65 64 2e 20 4d 75 73 74 0a 2d 20 20 20 20 20  ved. Must.-     
57b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
57c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
57d0: 20 20 20 20 2a 20 6e 6f 74 20 62 65 20 72 65 66      * not be ref
57e0: 65 72 65 6e 63 65 64 20 69 6e 20 61 6e 79 0a 2d  erenced in any.-
57f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5810: 20 20 20 20 20 20 20 20 20 2a 20 69 6e 74 65 72           * inter
5820: 70 72 65 74 65 72 2e 20 2a 2f 0a 2d 7b 0a 2b 09  preter. */.-{.+.
5830: 69 66 20 28 21 72 65 6d 6f 76 65 64 29 20 7b 0a  if (!removed) {.
5840: 2b 09 20 20 20 20 54 63 6c 5f 50 61 6e 69 63 28  +.    Tcl_Panic(
5850: 22 66 69 6c 65 20 69 6e 66 6f 20 70 74 72 20 6e  "file info ptr n
5860: 6f 74 20 6f 6e 20 74 68 72 65 61 64 20 63 68 61  ot on thread cha
5870: 6e 6e 65 6c 20 6c 69 73 74 22 29 3b 0a 20 7d 0a  nnel list");. }.
5880: 2b 20 20 20 20 7d 0a 2b 7d 0a 2b 23 65 6e 64 69  +    }.+}.+#endi
5890: 66 0a 49 6e 64 65 78 3a 20 75 6e 69 78 2f 74 63  f.Index: unix/tc
58a0: 6c 55 6e 69 78 50 69 70 65 2e 63 0a 3d 3d 3d 3d  lUnixPipe.c.====
58b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
58c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
58d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
58e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a  ===============.
58f0: 52 43 53 20 66 69 6c 65 3a 20 2f 63 76 73 72 6f  RCS file: /cvsro
5900: 6f 74 2f 74 63 6c 2f 74 63 6c 2f 75 6e 69 78 2f  ot/tcl/tcl/unix/
5910: 74 63 6c 55 6e 69 78 50 69 70 65 2e 63 2c 76 0a  tclUnixPipe.c,v.
5920: 72 65 74 72 69 65 76 69 6e 67 20 72 65 76 69 73  retrieving revis
5930: 69 6f 6e 20 31 2e 32 36 0a 64 69 66 66 20 2d 77  ion 1.26.diff -w
5940: 20 2d 75 20 2d 72 31 2e 32 36 20 74 63 6c 55 6e   -u -r1.26 tclUn
5950: 69 78 50 69 70 65 2e 63 0a 2d 2d 2d 20 75 6e 69  ixPipe.c.--- uni
5960: 78 2f 74 63 6c 55 6e 69 78 50 69 70 65 2e 63 09  x/tclUnixPipe.c.
5970: 36 20 4f 63 74 20 32 30 30 34 20 31 36 3a 30 38  6 Oct 2004 16:08
5980: 3a 35 37 20 2d 30 30 30 30 09 31 2e 32 36 0a 2b  :57 -0000.1.26.+
5990: 2b 2b 20 75 6e 69 78 2f 74 63 6c 55 6e 69 78 50  ++ unix/tclUnixP
59a0: 69 70 65 2e 63 09 32 36 20 4a 61 6e 20 32 30 30  ipe.c.26 Jan 200
59b0: 35 20 32 33 3a 33 36 3a 35 32 20 2d 30 30 30 30  5 23:36:52 -0000
59c0: 0a 40 40 20 2d 37 31 2c 37 20 2b 37 31 2c 37 20  .@@ -71,7 +71,7 
59d0: 40 40 0a 20 0a 20 73 74 61 74 69 63 20 54 63 6c  @@. . static Tcl
59e0: 5f 43 68 61 6e 6e 65 6c 54 79 70 65 20 70 69 70  _ChannelType pip
59f0: 65 43 68 61 6e 6e 65 6c 54 79 70 65 20 3d 20 7b  eChannelType = {
5a00: 0a 20 20 20 20 20 22 70 69 70 65 22 2c 09 09 09  .     "pipe",...
5a10: 2f 2a 20 54 79 70 65 20 6e 61 6d 65 2e 20 2a 2f  /* Type name. */
5a20: 0a 2d 20 20 20 20 54 43 4c 5f 43 48 41 4e 4e 45  .-    TCL_CHANNE
5a30: 4c 5f 56 45 52 53 49 4f 4e 5f 32 2c 09 2f 2a 20  L_VERSION_2,./* 
5a40: 76 32 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 2b 20  v2 channel */.+ 
5a50: 20 20 20 54 43 4c 5f 43 48 41 4e 4e 45 4c 5f 56     TCL_CHANNEL_V
5a60: 45 52 53 49 4f 4e 5f 34 2c 09 2f 2a 20 76 34 20  ERSION_4,./* v4 
5a70: 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 20  channel */.     
5a80: 50 69 70 65 43 6c 6f 73 65 50 72 6f 63 2c 09 09  PipeCloseProc,..
5a90: 2f 2a 20 43 6c 6f 73 65 20 70 72 6f 63 2e 20 2a  /* Close proc. *
5aa0: 2f 0a 20 20 20 20 20 50 69 70 65 49 6e 70 75 74  /.     PipeInput
5ab0: 50 72 6f 63 2c 09 09 2f 2a 20 49 6e 70 75 74 20  Proc,../* Input 
5ac0: 70 72 6f 63 2e 20 2a 2f 0a 20 20 20 20 20 50 69  proc. */.     Pi
5ad0: 70 65 4f 75 74 70 75 74 50 72 6f 63 2c 09 09 2f  peOutputProc,../
5ae0: 2a 20 4f 75 74 70 75 74 20 70 72 6f 63 2e 20 2a  * Output proc. *
5af0: 2f 0a 40 40 20 2d 38 34 2c 36 20 2b 38 34 2c 38  /.@@ -84,6 +84,8
5b00: 20 40 40 0a 20 20 20 20 20 50 69 70 65 42 6c 6f   @@.     PipeBlo
5b10: 63 6b 4d 6f 64 65 50 72 6f 63 2c 09 09 2f 2a 20  ckModeProc,../* 
5b20: 53 65 74 20 62 6c 6f 63 6b 69 6e 67 20 6f 72 20  Set blocking or 
5b30: 6e 6f 6e 2d 62 6c 6f 63 6b 69 6e 67 20 6d 6f 64  non-blocking mod
5b40: 65 2e 2a 2f 0a 20 20 20 20 20 4e 55 4c 4c 2c 09  e.*/.     NULL,.
5b50: 09 09 2f 2a 20 66 6c 75 73 68 20 70 72 6f 63 2e  ../* flush proc.
5b60: 20 2a 2f 0a 20 20 20 20 20 4e 55 4c 4c 2c 09 09   */.     NULL,..
5b70: 09 2f 2a 20 68 61 6e 64 6c 65 72 20 70 72 6f 63  ./* handler proc
5b80: 2e 20 2a 2f 0a 2b 20 20 20 20 4e 55 4c 4c 2c 20  . */.+    NULL, 
5b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ba0: 20 20 20 20 20 20 2f 2a 20 77 69 64 65 20 73 65        /* wide se
5bb0: 65 6b 20 70 72 6f 63 20 2a 2f 0a 2b 20 20 20 20  ek proc */.+    
5bc0: 4e 55 4c 4c 2c 20 20 20 20 20 20 20 20 20 20 20  NULL,           
5bd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74              /* t
5be0: 68 72 65 61 64 20 61 63 74 69 6f 6e 20 70 72 6f  hread action pro
5bf0: 63 20 2a 2f 0a 20 7d 3b 0a 20 0c 0a 20 2f 2a 0a  c */. };. .. /*.
5c00: 49 6e 64 65 78 3a 20 75 6e 69 78 2f 74 63 6c 55  Index: unix/tclU
5c10: 6e 69 78 53 6f 63 6b 2e 63 0a 3d 3d 3d 3d 3d 3d  nixSock.c.======
5c20: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5c30: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5c40: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5c50: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 52 43  =============.RC
5c60: 53 20 66 69 6c 65 3a 20 2f 63 76 73 72 6f 6f 74  S file: /cvsroot
5c70: 2f 74 63 6c 2f 74 63 6c 2f 75 6e 69 78 2f 74 63  /tcl/tcl/unix/tc
5c80: 6c 55 6e 69 78 53 6f 63 6b 2e 63 2c 76 0a 72 65  lUnixSock.c,v.re
5c90: 74 72 69 65 76 69 6e 67 20 72 65 76 69 73 69 6f  trieving revisio
5ca0: 6e 20 31 2e 39 0a 64 69 66 66 20 2d 77 20 2d 75  n 1.9.diff -w -u
5cb0: 20 2d 72 31 2e 39 20 74 63 6c 55 6e 69 78 53 6f   -r1.9 tclUnixSo
5cc0: 63 6b 2e 63 0a 2d 2d 2d 20 75 6e 69 78 2f 74 63  ck.c.--- unix/tc
5cd0: 6c 55 6e 69 78 53 6f 63 6b 2e 63 09 36 20 41 70  lUnixSock.c.6 Ap
5ce0: 72 20 32 30 30 34 20 32 32 3a 32 35 3a 35 37 20  r 2004 22:25:57 
5cf0: 2d 30 30 30 30 09 31 2e 39 0a 2b 2b 2b 20 75 6e  -0000.1.9.+++ un
5d00: 69 78 2f 74 63 6c 55 6e 69 78 53 6f 63 6b 2e 63  ix/tclUnixSock.c
5d10: 09 32 36 20 4a 61 6e 20 32 30 30 35 20 32 33 3a  .26 Jan 2005 23:
5d20: 33 36 3a 35 32 20 2d 30 30 30 30 0a 40 40 20 2d  36:52 -0000.@@ -
5d30: 31 34 37 2c 34 39 20 2b 31 34 37 2c 33 20 40 40  147,49 +147,3 @@
5d40: 0a 20 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20  . {.     return 
5d50: 54 43 4c 5f 4f 4b 3b 0a 20 7d 0a 2d 0c 0a 2d 2f  TCL_OK;. }.-..-/
5d60: 2a 0a 2d 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *.- *-----------
5d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2d 20 2a 0a  -----------.- *.
5db0: 2d 20 2a 20 54 63 6c 70 43 75 74 53 6f 63 6b 43  - * TclpCutSockC
5dc0: 68 61 6e 6e 65 6c 20 2d 2d 0a 2d 20 2a 0a 2d 20  hannel --.- *.- 
5dd0: 2a 09 52 65 6d 6f 76 65 20 61 6e 79 20 74 68 72  *.Remove any thr
5de0: 65 61 64 20 6c 6f 63 61 6c 20 72 65 66 73 20 74  ead local refs t
5df0: 6f 20 74 68 69 73 20 63 68 61 6e 6e 65 6c 2e 20  o this channel. 
5e00: 53 65 65 0a 2d 20 2a 09 54 63 6c 5f 43 75 74 43  See.- *.Tcl_CutC
5e10: 68 61 6e 6e 65 6c 20 66 6f 72 20 6d 6f 72 65 20  hannel for more 
5e20: 69 6e 66 6f 2e 20 44 75 6d 6d 79 20 64 65 66 69  info. Dummy defi
5e30: 6e 69 74 69 6f 6e 2e 0a 2d 20 2a 0a 2d 20 2a 20  nition..- *.- * 
5e40: 52 65 73 75 6c 74 73 3a 0a 2d 20 2a 09 4e 6f 6e  Results:.- *.Non
5e50: 65 2e 0a 2d 20 2a 0a 2d 20 2a 20 53 69 64 65 20  e..- *.- * Side 
5e60: 65 66 66 65 63 74 73 3a 0a 2d 20 2a 09 4e 6f 6e  effects:.- *.Non
5e70: 65 2e 0a 2d 20 2a 0a 2d 20 2a 2d 2d 2d 2d 2d 2d  e..- *.- *------
5e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5ec0: 0a 2d 20 2a 2f 0a 2d 0a 2d 76 6f 69 64 0a 2d 54  .- */.-.-void.-T
5ed0: 63 6c 70 43 75 74 53 6f 63 6b 43 68 61 6e 6e 65  clpCutSockChanne
5ee0: 6c 28 63 68 61 6e 29 0a 2d 20 20 20 20 54 63 6c  l(chan).-    Tcl
5ef0: 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 0a 2d  _Channel chan;.-
5f00: 7b 0a 2d 7d 0a 2d 0c 0a 2d 2f 2a 0a 2d 20 2a 2d  {.-}.-..-/*.- *-
5f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5f50: 2d 2d 2d 2d 2d 0a 2d 20 2a 0a 2d 20 2a 20 54 63  -----.- *.- * Tc
5f60: 6c 70 53 70 6c 69 63 65 53 6f 63 6b 43 68 61 6e  lpSpliceSockChan
5f70: 6e 65 6c 20 2d 2d 0a 2d 20 2a 0a 2d 20 2a 09 49  nel --.- *.- *.I
5f80: 6e 73 65 72 74 20 74 68 72 65 61 64 20 6c 6f 63  nsert thread loc
5f90: 61 6c 20 72 65 66 20 66 6f 72 20 74 68 69 73 20  al ref for this 
5fa0: 63 68 61 6e 6e 65 6c 2e 0a 2d 20 2a 09 54 63 6c  channel..- *.Tcl
5fb0: 5f 53 70 6c 69 63 65 43 68 61 6e 6e 65 6c 20 66  _SpliceChannel f
5fc0: 6f 72 20 6d 6f 72 65 20 69 6e 66 6f 2e 20 44 75  or more info. Du
5fd0: 6d 6d 79 20 64 65 66 69 6e 69 74 69 6f 6e 2e 0a  mmy definition..
5fe0: 2d 20 2a 0a 2d 20 2a 20 52 65 73 75 6c 74 73 3a  - *.- * Results:
5ff0: 0a 2d 20 2a 09 4e 6f 6e 65 2e 0a 2d 20 2a 0a 2d  .- *.None..- *.-
6000: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
6010: 0a 2d 20 2a 09 4e 6f 6e 65 2e 0a 2d 20 2a 0a 2d  .- *.None..- *.-
6020: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
6030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6060: 2d 2d 2d 2d 2d 2d 2d 2d 0a 2d 20 2a 2f 0a 2d 0a  --------.- */.-.
6070: 2d 76 6f 69 64 0a 2d 54 63 6c 70 53 70 6c 69 63  -void.-TclpSplic
6080: 65 53 6f 63 6b 43 68 61 6e 6e 65 6c 28 63 68 61  eSockChannel(cha
6090: 6e 29 0a 2d 20 20 20 20 54 63 6c 5f 43 68 61 6e  n).-    Tcl_Chan
60a0: 6e 65 6c 20 63 68 61 6e 3b 0a 2d 7b 0a 2d 7d 0a  nel chan;.-{.-}.
60b0: 49 6e 64 65 78 3a 20 77 69 6e 2f 74 63 6c 57 69  Index: win/tclWi
60c0: 6e 43 68 61 6e 2e 63 0a 3d 3d 3d 3d 3d 3d 3d 3d  nChan.c.========
60d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
60e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
60f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
6100: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 52 43 53 20  ===========.RCS 
6110: 66 69 6c 65 3a 20 2f 63 76 73 72 6f 6f 74 2f 74  file: /cvsroot/t
6120: 63 6c 2f 74 63 6c 2f 77 69 6e 2f 74 63 6c 57 69  cl/tcl/win/tclWi
6130: 6e 43 68 61 6e 2e 63 2c 76 0a 72 65 74 72 69 65  nChan.c,v.retrie
6140: 76 69 6e 67 20 72 65 76 69 73 69 6f 6e 20 31 2e  ving revision 1.
6150: 33 38 0a 64 69 66 66 20 2d 77 20 2d 75 20 2d 72  38.diff -w -u -r
6160: 31 2e 33 38 20 74 63 6c 57 69 6e 43 68 61 6e 2e  1.38 tclWinChan.
6170: 63 0a 2d 2d 2d 20 77 69 6e 2f 74 63 6c 57 69 6e  c.--- win/tclWin
6180: 43 68 61 6e 2e 63 09 31 39 20 4a 61 6e 20 32 30  Chan.c.19 Jan 20
6190: 30 35 20 32 32 3a 30 37 3a 34 31 20 2d 30 30 30  05 22:07:41 -000
61a0: 30 09 31 2e 33 38 0a 2b 2b 2b 20 77 69 6e 2f 74  0.1.38.+++ win/t
61b0: 63 6c 57 69 6e 43 68 61 6e 2e 63 09 32 36 20 4a  clWinChan.c.26 J
61c0: 61 6e 20 32 30 30 35 20 32 33 3a 33 36 3a 35 32  an 2005 23:36:52
61d0: 20 2d 30 30 30 30 0a 40 40 20 2d 39 38 2c 36 20   -0000.@@ -98,6 
61e0: 2b 39 38 2c 38 20 40 40 0a 20 09 09 09 20 20 20  +98,8 @@. ...   
61f0: 20 69 6e 74 20 66 6c 61 67 73 29 29 3b 0a 20 73   int flags));. s
6200: 74 61 74 69 63 20 76 6f 69 64 09 09 46 69 6c 65  tatic void..File
6210: 57 61 74 63 68 50 72 6f 63 20 5f 41 4e 53 49 5f  WatchProc _ANSI_
6220: 41 52 47 53 5f 28 28 43 6c 69 65 6e 74 44 61 74  ARGS_((ClientDat
6230: 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 0a  a instanceData,.
6240: 20 09 09 09 20 20 20 20 69 6e 74 20 6d 61 73 6b   ...    int mask
6250: 29 29 3b 0a 2b 73 74 61 74 69 63 20 76 6f 69 64  ));.+static void
6260: 20 20 20 20 20 20 20 20 20 20 20 20 20 46 69 6c               Fil
6270: 65 54 68 72 65 61 64 41 63 74 69 6f 6e 50 72 6f  eThreadActionPro
6280: 63 20 5f 41 4e 53 49 5f 41 52 47 53 5f 20 28 28  c _ANSI_ARGS_ ((
6290: 0a 2b 09 09 09 20 20 20 43 6c 69 65 6e 74 44 61  .+...   ClientDa
62a0: 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c  ta instanceData,
62b0: 20 69 6e 74 20 61 63 74 69 6f 6e 29 29 3b 0a 20   int action));. 
62c0: 0a 20 2f 2a 0a 20 20 2a 20 54 68 69 73 20 73 74  . /*.  * This st
62d0: 72 75 63 74 75 72 65 20 64 65 73 63 72 69 62 65  ructure describe
62e0: 73 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 74 79  s the channel ty
62f0: 70 65 20 73 74 72 75 63 74 75 72 65 20 66 6f 72  pe structure for
6300: 20 66 69 6c 65 20 62 61 73 65 64 20 49 4f 2e 0a   file based IO..
6310: 40 40 20 2d 31 30 35 2c 37 20 2b 31 30 37 2c 37  @@ -105,7 +107,7
6320: 20 40 40 0a 20 0a 20 73 74 61 74 69 63 20 54 63   @@. . static Tc
6330: 6c 5f 43 68 61 6e 6e 65 6c 54 79 70 65 20 66 69  l_ChannelType fi
6340: 6c 65 43 68 61 6e 6e 65 6c 54 79 70 65 20 3d 20  leChannelType = 
6350: 7b 0a 20 20 20 20 20 22 66 69 6c 65 22 2c 09 09  {.     "file",..
6360: 09 2f 2a 20 54 79 70 65 20 6e 61 6d 65 2e 20 2a  ./* Type name. *
6370: 2f 0a 2d 20 20 20 20 54 43 4c 5f 43 48 41 4e 4e  /.-    TCL_CHANN
6380: 45 4c 5f 56 45 52 53 49 4f 4e 5f 33 2c 09 2f 2a  EL_VERSION_3,./*
6390: 20 76 33 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 2b   v3 channel */.+
63a0: 20 20 20 20 54 43 4c 5f 43 48 41 4e 4e 45 4c 5f      TCL_CHANNEL_
63b0: 56 45 52 53 49 4f 4e 5f 34 2c 09 2f 2a 20 76 34  VERSION_4,./* v4
63c0: 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20   channel */.    
63d0: 20 46 69 6c 65 43 6c 6f 73 65 50 72 6f 63 2c 09   FileCloseProc,.
63e0: 09 2f 2a 20 43 6c 6f 73 65 20 70 72 6f 63 2e 20  ./* Close proc. 
63f0: 2a 2f 0a 20 20 20 20 20 46 69 6c 65 49 6e 70 75  */.     FileInpu
6400: 74 50 72 6f 63 2c 09 09 2f 2a 20 49 6e 70 75 74  tProc,../* Input
6410: 20 70 72 6f 63 2e 20 2a 2f 0a 20 20 20 20 20 46   proc. */.     F
6420: 69 6c 65 4f 75 74 70 75 74 50 72 6f 63 2c 09 09  ileOutputProc,..
6430: 2f 2a 20 4f 75 74 70 75 74 20 70 72 6f 63 2e 20  /* Output proc. 
6440: 2a 2f 0a 40 40 20 2d 31 31 39 2c 36 20 2b 31 32  */.@@ -119,6 +12
6450: 31 2c 37 20 40 40 0a 20 20 20 20 20 4e 55 4c 4c  1,7 @@.     NULL
6460: 2c 09 09 09 2f 2a 20 66 6c 75 73 68 20 70 72 6f  ,.../* flush pro
6470: 63 2e 20 2a 2f 0a 20 20 20 20 20 4e 55 4c 4c 2c  c. */.     NULL,
6480: 09 09 09 2f 2a 20 68 61 6e 64 6c 65 72 20 70 72  .../* handler pr
6490: 6f 63 2e 20 2a 2f 0a 20 20 20 20 20 46 69 6c 65  oc. */.     File
64a0: 57 69 64 65 53 65 65 6b 50 72 6f 63 2c 09 09 2f  WideSeekProc,../
64b0: 2a 20 57 69 64 65 20 73 65 65 6b 20 70 72 6f 63  * Wide seek proc
64c0: 2e 20 2a 2f 0a 2b 20 20 20 20 46 69 6c 65 54 68  . */.+    FileTh
64d0: 72 65 61 64 41 63 74 69 6f 6e 50 72 6f 63 2c 09  readActionProc,.
64e0: 2f 2a 20 54 68 72 65 61 64 20 61 63 74 69 6f 6e  /* Thread action
64f0: 20 70 72 6f 63 2e 20 2a 2f 0a 20 7d 3b 0a 20 0a   proc. */. };. .
6500: 20 23 69 66 20 64 65 66 69 6e 65 64 28 48 41 56   #if defined(HAV
6510: 45 5f 4e 4f 5f 53 45 48 29 20 26 26 20 64 65 66  E_NO_SEH) && def
6520: 69 6e 65 64 28 54 43 4c 5f 4d 45 4d 5f 44 45 42  ined(TCL_MEM_DEB
6530: 55 47 29 0a 40 40 20 2d 34 33 30 2c 31 31 20 2b  UG).@@ -430,11 +
6540: 34 33 33 2c 31 31 20 40 40 0a 20 09 69 66 20 28  433,11 @@. .if (
6550: 69 6e 66 6f 50 74 72 20 3d 3d 20 66 69 6c 65 49  infoPtr == fileI
6560: 6e 66 6f 50 74 72 29 20 7b 0a 20 20 20 20 20 20  nfoPtr) {.      
6570: 20 20 20 20 20 20 20 2f 2a 0a 20 20 20 20 20 20         /*.      
6580: 20 20 20 20 20 20 20 20 2a 20 54 68 69 73 20 63          * This c
6590: 68 61 6e 6e 65 6c 20 65 78 69 73 74 73 20 6f 6e  hannel exists on
65a0: 20 74 68 65 20 74 68 72 65 61 64 20 6c 6f 63 61   the thread loca
65b0: 6c 20 6c 69 73 74 2e 20 49 74 20 73 68 6f 75 6c  l list. It shoul
65c0: 64 0a 2d 20 20 20 20 20 20 20 20 20 20 20 20 20  d.-             
65d0: 2a 20 68 61 76 65 20 62 65 65 6e 20 72 65 6d 6f  * have been remo
65e0: 76 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65  ved by an earlie
65f0: 72 20 63 61 6c 6c 20 74 6f 20 54 63 6c 70 43 75  r call to TclpCu
6600: 74 46 69 6c 65 43 68 61 6e 6e 65 6c 2c 0a 2b 20  tFileChannel,.+ 
6610: 20 20 20 20 20 20 20 20 20 20 20 20 2a 20 68 61              * ha
6620: 76 65 20 62 65 65 6e 20 72 65 6d 6f 76 65 64 20  ve been removed 
6630: 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20 54 68  by an earlier Th
6640: 72 65 61 64 61 63 74 69 6f 6e 20 63 61 6c 6c 2c  readaction call,
6650: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a  .              *
6660: 20 62 75 74 20 64 6f 20 74 68 61 74 20 6e 6f 77   but do that now
6670: 20 73 69 6e 63 65 20 6a 75 73 74 20 64 65 61 6c   since just deal
6680: 6c 6f 63 61 74 69 6e 67 20 66 69 6c 65 49 6e 66  locating fileInf
6690: 6f 50 74 72 20 77 6f 75 6c 64 0a 20 20 20 20 20  oPtr would.     
66a0: 20 20 20 20 20 20 20 20 20 2a 20 6c 65 61 76 65           * leave
66b0: 20 61 6e 20 64 65 61 6c 6c 6f 63 61 74 65 64 20   an deallocated 
66c0: 70 6f 69 6e 74 65 72 20 6f 6e 20 74 68 65 20 74  pointer on the t
66d0: 68 72 65 61 64 20 6c 6f 63 61 6c 20 6c 69 73 74  hread local list
66e0: 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
66f0: 2a 2f 0a 2d 20 20 20 20 20 20 20 20 20 20 20 20  */.-            
6700: 54 63 6c 70 43 75 74 46 69 6c 65 43 68 61 6e 6e  TclpCutFileChann
6710: 65 6c 28 66 69 6c 65 49 6e 66 6f 50 74 72 2d 3e  el(fileInfoPtr->
6720: 63 68 61 6e 6e 65 6c 29 3b 0a 2b 09 20 20 20 20  channel);.+.    
6730: 46 69 6c 65 54 68 72 65 61 64 41 63 74 69 6f 6e  FileThreadAction
6740: 50 72 6f 63 28 66 69 6c 65 49 6e 66 6f 50 74 72  Proc(fileInfoPtr
6750: 2c 54 43 4c 5f 43 48 41 4e 4e 45 4c 5f 54 48 52  ,TCL_CHANNEL_THR
6760: 45 41 44 5f 52 45 4d 4f 56 45 29 3b 0a 20 20 20  EAD_REMOVE);.   
6770: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
6780: 0a 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  .         }.    
6790: 20 7d 0a 40 40 20 2d 31 33 30 37 2c 38 20 2b 31   }.@@ -1307,8 +1
67a0: 33 31 30 2c 31 31 20 40 40 0a 20 20 20 20 20 7d  310,11 @@.     }
67b0: 0a 20 0a 20 20 20 20 20 69 6e 66 6f 50 74 72 20  . .     infoPtr 
67c0: 3d 20 28 46 69 6c 65 49 6e 66 6f 20 2a 29 20 63  = (FileInfo *) c
67d0: 6b 61 6c 6c 6f 63 28 28 75 6e 73 69 67 6e 65 64  kalloc((unsigned
67e0: 29 20 73 69 7a 65 6f 66 28 46 69 6c 65 49 6e 66  ) sizeof(FileInf
67f0: 6f 29 29 3b 0a 2d 20 20 20 20 69 6e 66 6f 50 74  o));.-    infoPt
6800: 72 2d 3e 6e 65 78 74 50 74 72 20 3d 20 74 73 64  r->nextPtr = tsd
6810: 50 74 72 2d 3e 66 69 72 73 74 46 69 6c 65 50 74  Ptr->firstFilePt
6820: 72 3b 0a 2d 20 20 20 20 74 73 64 50 74 72 2d 3e  r;.-    tsdPtr->
6830: 66 69 72 73 74 46 69 6c 65 50 74 72 20 3d 20 69  firstFilePtr = i
6840: 6e 66 6f 50 74 72 3b 0a 2b 20 20 20 20 2f 2a 20  nfoPtr;.+    /* 
6850: 54 49 50 20 23 32 31 38 2e 20 52 65 6d 6f 76 65  TIP #218. Remove
6860: 64 20 74 68 65 20 63 6f 64 65 20 69 6e 73 65 72  d the code inser
6870: 74 69 6e 67 20 74 68 65 20 6e 65 77 20 73 74 72  ting the new str
6880: 75 63 74 75 72 65 0a 2b 20 20 20 20 20 2a 20 69  ucture.+     * i
6890: 6e 74 6f 20 74 68 65 20 67 6c 6f 62 61 6c 20 6c  nto the global l
68a0: 69 73 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 77  ist. This is now
68b0: 20 68 61 6e 64 6c 65 64 20 69 6e 20 74 68 65 20   handled in the 
68c0: 74 68 72 65 61 64 0a 2b 20 20 20 20 20 2a 20 61  thread.+     * a
68d0: 63 74 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 73 2c  ction callbacks,
68e0: 20 61 6e 64 20 6f 6e 6c 79 20 74 68 65 72 65 2e   and only there.
68f0: 0a 2b 20 20 20 20 20 2a 2f 0a 2b 20 20 20 20 69  .+     */.+    i
6900: 6e 66 6f 50 74 72 2d 3e 6e 65 78 74 50 74 72 20  nfoPtr->nextPtr 
6910: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 69 6e 66  = NULL;.     inf
6920: 6f 50 74 72 2d 3e 76 61 6c 69 64 4d 61 73 6b 20  oPtr->validMask 
6930: 3d 20 70 65 72 6d 69 73 73 69 6f 6e 73 3b 0a 20  = permissions;. 
6940: 20 20 20 20 69 6e 66 6f 50 74 72 2d 3e 77 61 74      infoPtr->wat
6950: 63 68 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20  chMask = 0;.    
6960: 20 69 6e 66 6f 50 74 72 2d 3e 66 6c 61 67 73 20   infoPtr->flags 
6970: 3d 20 61 70 70 65 6e 64 4d 6f 64 65 3b 0a 40 40  = appendMode;.@@
6980: 20 2d 31 33 37 33 2c 31 30 20 2b 31 33 37 39 2c   -1373,10 +1379,
6990: 39 20 40 40 0a 20 2f 2a 0a 20 20 2a 2d 2d 2d 2d  9 @@. /*.  *----
69a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
69b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
69c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
69d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
69e0: 2d 2d 0a 20 20 2a 0a 2d 20 2a 20 54 63 6c 70 43  --.  *.- * TclpC
69f0: 75 74 46 69 6c 65 43 68 61 6e 6e 65 6c 20 2d 2d  utFileChannel --
6a00: 0a 2b 20 2a 20 46 69 6c 65 54 68 72 65 61 64 41  .+ * FileThreadA
6a10: 63 74 69 6f 6e 50 72 6f 63 20 2d 2d 0a 20 20 2a  ctionProc --.  *
6a20: 0a 2d 20 2a 09 52 65 6d 6f 76 65 20 61 6e 79 20  .- *.Remove any 
6a30: 74 68 72 65 61 64 20 6c 6f 63 61 6c 20 72 65 66  thread local ref
6a40: 73 20 74 6f 20 74 68 69 73 20 63 68 61 6e 6e 65  s to this channe
6a50: 6c 2e 20 53 65 65 0a 2d 20 2a 09 53 65 65 20 54  l. See.- *.See T
6a60: 63 6c 5f 43 75 74 43 68 61 6e 6e 65 6c 20 66 6f  cl_CutChannel fo
6a70: 72 20 6d 6f 72 65 20 69 6e 66 6f 2e 0a 2b 20 2a  r more info..+ *
6a80: 09 49 6e 73 65 72 74 20 6f 72 20 72 65 6d 6f 76  .Insert or remov
6a90: 65 20 61 6e 79 20 74 68 72 65 61 64 20 6c 6f 63  e any thread loc
6aa0: 61 6c 20 72 65 66 73 20 74 6f 20 74 68 69 73 20  al refs to this 
6ab0: 63 68 61 6e 6e 65 6c 2e 0a 20 20 2a 0a 20 20 2a  channel..  *.  *
6ac0: 20 52 65 73 75 6c 74 73 3a 0a 20 20 2a 09 4e 6f   Results:.  *.No
6ad0: 6e 65 2e 0a 40 40 20 2d 31 33 38 37 2c 32 34 20  ne..@@ -1387,24 
6ae0: 2b 31 33 39 32 2c 32 31 20 40 40 0a 20 20 2a 2d  +1392,21 @@.  *-
6af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6b30: 2d 2d 2d 2d 2d 0a 20 20 2a 2f 0a 20 0a 2d 76 6f  -----.  */. .-vo
6b40: 69 64 0a 2d 54 63 6c 70 43 75 74 46 69 6c 65 43  id.-TclpCutFileC
6b50: 68 61 6e 6e 65 6c 28 63 68 61 6e 29 0a 2d 20 20  hannel(chan).-  
6b60: 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68    Tcl_Channel ch
6b70: 61 6e 3b 09 09 09 2f 2a 20 54 68 65 20 63 68 61  an;.../* The cha
6b80: 6e 6e 65 6c 20 62 65 69 6e 67 20 72 65 6d 6f 76  nnel being remov
6b90: 65 64 2e 20 4d 75 73 74 0a 2d 09 09 09 09 09 20  ed. Must.-..... 
6ba0: 2a 20 6e 6f 74 20 62 65 20 72 65 66 65 72 65 6e  * not be referen
6bb0: 63 65 64 20 69 6e 20 61 6e 79 0a 2d 09 09 09 09  ced in any.-....
6bc0: 09 20 2a 20 69 6e 74 65 72 70 72 65 74 65 72 2e  . * interpreter.
6bd0: 20 2a 2f 0a 2b 73 74 61 74 69 63 20 76 6f 69 64   */.+static void
6be0: 0a 2b 46 69 6c 65 54 68 72 65 61 64 41 63 74 69  .+FileThreadActi
6bf0: 6f 6e 50 72 6f 63 20 28 69 6e 73 74 61 6e 63 65  onProc (instance
6c00: 44 61 74 61 2c 20 61 63 74 69 6f 6e 29 0a 2b 20  Data, action).+ 
6c10: 20 20 20 20 43 6c 69 65 6e 74 44 61 74 61 20 69      ClientData i
6c20: 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 2b 20 20  nstanceData;.+  
6c30: 20 20 20 69 6e 74 20 61 63 74 69 6f 6e 3b 0a 20     int action;. 
6c40: 7b 0a 20 20 20 20 20 54 68 72 65 61 64 53 70 65  {.     ThreadSpe
6c50: 63 69 66 69 63 44 61 74 61 20 2a 74 73 64 50 74  cificData *tsdPt
6c60: 72 20 3d 20 54 43 4c 5f 54 53 44 5f 49 4e 49 54  r = TCL_TSD_INIT
6c70: 28 26 64 61 74 61 4b 65 79 29 3b 0a 2d 20 20 20  (&dataKey);.-   
6c80: 20 43 68 61 6e 6e 65 6c 20 2a 63 68 61 6e 50 74   Channel *chanPt
6c90: 72 20 3d 20 28 43 68 61 6e 6e 65 6c 20 2a 29 20  r = (Channel *) 
6ca0: 63 68 61 6e 3b 0a 2d 20 20 20 20 46 69 6c 65 49  chan;.-    FileI
6cb0: 6e 66 6f 20 2a 69 6e 66 6f 50 74 72 3b 0a 2b 20  nfo *infoPtr;.+ 
6cc0: 20 20 20 46 69 6c 65 49 6e 66 6f 20 2a 69 6e 66     FileInfo *inf
6cd0: 6f 50 74 72 20 3d 20 28 46 69 6c 65 49 6e 66 6f  oPtr = (FileInfo
6ce0: 20 2a 29 20 69 6e 73 74 61 6e 63 65 44 61 74 61   *) instanceData
6cf0: 3b 0a 2b 0a 2b 20 20 20 20 69 66 20 28 61 63 74  ;.+.+    if (act
6d00: 69 6f 6e 20 3d 3d 20 54 43 4c 5f 43 48 41 4e 4e  ion == TCL_CHANN
6d10: 45 4c 5f 54 48 52 45 41 44 5f 49 4e 53 45 52 54  EL_THREAD_INSERT
6d20: 29 20 7b 0a 2b 20 20 20 20 20 20 20 20 69 6e 66  ) {.+        inf
6d30: 6f 50 74 72 2d 3e 6e 65 78 74 50 74 72 20 3d 20  oPtr->nextPtr = 
6d40: 74 73 64 50 74 72 2d 3e 66 69 72 73 74 46 69 6c  tsdPtr->firstFil
6d50: 65 50 74 72 3b 0a 2b 09 74 73 64 50 74 72 2d 3e  ePtr;.+.tsdPtr->
6d60: 66 69 72 73 74 46 69 6c 65 50 74 72 20 3d 20 69  firstFilePtr = i
6d70: 6e 66 6f 50 74 72 3b 0a 2b 20 20 20 20 7d 20 65  nfoPtr;.+    } e
6d80: 6c 73 65 20 7b 0a 20 20 20 20 20 46 69 6c 65 49  lse {.     FileI
6d90: 6e 66 6f 20 2a 2a 6e 65 78 74 50 74 72 50 74 72  nfo **nextPtrPtr
6da0: 3b 0a 20 20 20 20 20 69 6e 74 20 72 65 6d 6f 76  ;.     int remov
6db0: 65 64 20 3d 20 30 3b 0a 20 0a 2d 20 20 20 20 69  ed = 0;. .-    i
6dc0: 66 20 28 63 68 61 6e 50 74 72 2d 3e 74 79 70 65  f (chanPtr->type
6dd0: 50 74 72 20 21 3d 20 26 66 69 6c 65 43 68 61 6e  Ptr != &fileChan
6de0: 6e 65 6c 54 79 70 65 29 20 7b 0a 2d 09 72 65 74  nelType) {.-.ret
6df0: 75 72 6e 3b 0a 2d 20 20 20 20 7d 0a 2d 0a 2d 20  urn;.-    }.-.- 
6e00: 20 20 20 69 6e 66 6f 50 74 72 20 3d 20 28 46 69     infoPtr = (Fi
6e10: 6c 65 49 6e 66 6f 20 2a 29 20 63 68 61 6e 50 74  leInfo *) chanPt
6e20: 72 2d 3e 69 6e 73 74 61 6e 63 65 44 61 74 61 3b  r->instanceData;
6e30: 0a 2d 0a 20 20 20 20 20 66 6f 72 20 28 6e 65 78  .-.     for (nex
6e40: 74 50 74 72 50 74 72 20 3d 20 26 28 74 73 64 50  tPtrPtr = &(tsdP
6e50: 74 72 2d 3e 66 69 72 73 74 46 69 6c 65 50 74 72  tr->firstFilePtr
6e60: 29 3b 20 28 2a 6e 65 78 74 50 74 72 50 74 72 29  ); (*nextPtrPtr)
6e70: 20 21 3d 20 4e 55 4c 4c 3b 0a 20 09 20 20 20 20   != NULL;. .    
6e80: 6e 65 78 74 50 74 72 50 74 72 20 3d 20 26 28 28  nextPtrPtr = &((
6e90: 2a 6e 65 78 74 50 74 72 50 74 72 29 2d 3e 6e 65  *nextPtrPtr)->ne
6ea0: 78 74 50 74 72 29 29 20 7b 0a 20 09 69 66 20 28  xtPtr)) {. .if (
6eb0: 28 2a 6e 65 78 74 50 74 72 50 74 72 29 20 3d 3d  (*nextPtrPtr) ==
6ec0: 20 69 6e 66 6f 50 74 72 29 20 7b 0a 40 40 20 2d   infoPtr) {.@@ -
6ed0: 31 34 32 34 2c 34 30 20 2b 31 34 32 36 2c 34 20  1424,40 +1426,4 
6ee0: 40 40 0a 20 09 54 63 6c 5f 50 61 6e 69 63 28 22  @@. .Tcl_Panic("
6ef0: 66 69 6c 65 20 69 6e 66 6f 20 70 74 72 20 6e 6f  file info ptr no
6f00: 74 20 6f 6e 20 74 68 72 65 61 64 20 63 68 61 6e  t on thread chan
6f10: 6e 65 6c 20 6c 69 73 74 22 29 3b 0a 20 20 20 20  nel list");.    
6f20: 20 7d 0a 20 7d 0a 2d 0c 0a 2d 2f 2a 0a 2d 20 2a   }. }.-..-/*.- *
6f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f70: 2d 2d 2d 2d 2d 2d 0a 2d 20 2a 0a 2d 20 2a 20 54  ------.- *.- * T
6f80: 63 6c 70 53 70 6c 69 63 65 46 69 6c 65 43 68 61  clpSpliceFileCha
6f90: 6e 6e 65 6c 20 2d 2d 0a 2d 20 2a 0a 2d 20 2a 09  nnel --.- *.- *.
6fa0: 49 6e 73 65 72 74 20 74 68 72 65 61 64 20 6c 6f  Insert thread lo
6fb0: 63 61 6c 20 72 65 66 20 66 6f 72 20 74 68 69 73  cal ref for this
6fc0: 20 63 68 61 6e 6e 65 6c 2e 0a 2d 20 2a 09 53 65   channel..- *.Se
6fd0: 65 20 54 63 6c 5f 53 70 6c 69 63 65 43 68 61 6e  e Tcl_SpliceChan
6fe0: 6e 65 6c 20 66 6f 72 20 6d 6f 72 65 20 69 6e 66  nel for more inf
6ff0: 6f 2e 0a 2d 20 2a 0a 2d 20 2a 20 52 65 73 75 6c  o..- *.- * Resul
7000: 74 73 3a 0a 2d 20 2a 09 4e 6f 6e 65 2e 0a 2d 20  ts:.- *.None..- 
7010: 2a 0a 2d 20 2a 20 53 69 64 65 20 65 66 66 65 63  *.- * Side effec
7020: 74 73 3a 0a 2d 20 2a 09 43 68 61 6e 67 65 73 20  ts:.- *.Changes 
7030: 74 68 72 65 61 64 20 6c 6f 63 61 6c 20 6c 69 73  thread local lis
7040: 74 20 6f 66 20 76 61 6c 69 64 20 63 68 61 6e 6e  t of valid chann
7050: 65 6c 73 2e 0a 2d 20 2a 0a 2d 20 2a 2d 2d 2d 2d  els..- *.- *----
7060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
70a0: 2d 2d 0a 2d 20 2a 2f 0a 2d 0a 2d 76 6f 69 64 0a  --.- */.-.-void.
70b0: 2d 54 63 6c 70 53 70 6c 69 63 65 46 69 6c 65 43  -TclpSpliceFileC
70c0: 68 61 6e 6e 65 6c 28 63 68 61 6e 29 0a 2d 20 20  hannel(chan).-  
70d0: 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68    Tcl_Channel ch
70e0: 61 6e 3b 09 09 09 2f 2a 20 54 68 65 20 63 68 61  an;.../* The cha
70f0: 6e 6e 65 6c 20 62 65 69 6e 67 20 72 65 6d 6f 76  nnel being remov
7100: 65 64 2e 20 4d 75 73 74 0a 2d 09 09 09 09 09 20  ed. Must.-..... 
7110: 2a 20 6e 6f 74 20 62 65 20 72 65 66 65 72 65 6e  * not be referen
7120: 63 65 64 20 69 6e 20 61 6e 79 0a 2d 09 09 09 09  ced in any.-....
7130: 09 20 2a 20 69 6e 74 65 72 70 72 65 74 65 72 2e  . * interpreter.
7140: 20 2a 2f 0a 2d 7b 0a 2d 20 20 20 20 54 68 72 65   */.-{.-    Thre
7150: 61 64 53 70 65 63 69 66 69 63 44 61 74 61 20 2a  adSpecificData *
7160: 74 73 64 50 74 72 20 3d 20 54 43 4c 5f 54 53 44  tsdPtr = TCL_TSD
7170: 5f 49 4e 49 54 28 26 64 61 74 61 4b 65 79 29 3b  _INIT(&dataKey);
7180: 0a 2d 20 20 20 20 43 68 61 6e 6e 65 6c 20 2a 63  .-    Channel *c
7190: 68 61 6e 50 74 72 20 3d 20 28 43 68 61 6e 6e 65  hanPtr = (Channe
71a0: 6c 20 2a 29 20 63 68 61 6e 3b 0a 2d 20 20 20 20  l *) chan;.-    
71b0: 46 69 6c 65 49 6e 66 6f 20 2a 69 6e 66 6f 50 74  FileInfo *infoPt
71c0: 72 3b 0a 2d 0a 2d 20 20 20 20 69 66 20 28 63 68  r;.-.-    if (ch
71d0: 61 6e 50 74 72 2d 3e 74 79 70 65 50 74 72 20 21  anPtr->typePtr !
71e0: 3d 20 26 66 69 6c 65 43 68 61 6e 6e 65 6c 54 79  = &fileChannelTy
71f0: 70 65 29 20 7b 0a 2d 09 72 65 74 75 72 6e 3b 0a  pe) {.-.return;.
7200: 2d 20 20 20 20 7d 0a 2d 0a 2d 20 20 20 20 69 6e  -    }.-.-    in
7210: 66 6f 50 74 72 20 3d 20 28 46 69 6c 65 49 6e 66  foPtr = (FileInf
7220: 6f 20 2a 29 20 63 68 61 6e 50 74 72 2d 3e 69 6e  o *) chanPtr->in
7230: 73 74 61 6e 63 65 44 61 74 61 3b 0a 2d 0a 2d 20  stanceData;.-.- 
7240: 20 20 20 69 6e 66 6f 50 74 72 2d 3e 6e 65 78 74     infoPtr->next
7250: 50 74 72 20 3d 20 74 73 64 50 74 72 2d 3e 66 69  Ptr = tsdPtr->fi
7260: 72 73 74 46 69 6c 65 50 74 72 3b 0a 2d 20 20 20  rstFilePtr;.-   
7270: 20 74 73 64 50 74 72 2d 3e 66 69 72 73 74 46 69   tsdPtr->firstFi
7280: 6c 65 50 74 72 20 3d 20 69 6e 66 6f 50 74 72 3b  lePtr = infoPtr;
7290: 0a 20 7d 0a 49 6e 64 65 78 3a 20 77 69 6e 2f 74  . }.Index: win/t
72a0: 63 6c 57 69 6e 43 6f 6e 73 6f 6c 65 2e 63 0a 3d  clWinConsole.c.=
72b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
72c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
72d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
72e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
72f0: 3d 3d 0a 52 43 53 20 66 69 6c 65 3a 20 2f 63 76  ==.RCS file: /cv
7300: 73 72 6f 6f 74 2f 74 63 6c 2f 74 63 6c 2f 77 69  sroot/tcl/tcl/wi
7310: 6e 2f 74 63 6c 57 69 6e 43 6f 6e 73 6f 6c 65 2e  n/tclWinConsole.
7320: 63 2c 76 0a 72 65 74 72 69 65 76 69 6e 67 20 72  c,v.retrieving r
7330: 65 76 69 73 69 6f 6e 20 31 2e 31 32 0a 64 69 66  evision 1.12.dif
7340: 66 20 2d 77 20 2d 75 20 2d 72 31 2e 31 32 20 74  f -w -u -r1.12 t
7350: 63 6c 57 69 6e 43 6f 6e 73 6f 6c 65 2e 63 0a 2d  clWinConsole.c.-
7360: 2d 2d 20 77 69 6e 2f 74 63 6c 57 69 6e 43 6f 6e  -- win/tclWinCon
7370: 73 6f 6c 65 2e 63 09 31 30 20 53 65 70 20 32 30  sole.c.10 Sep 20
7380: 30 34 20 30 31 3a 35 32 3a 31 37 20 2d 30 30 30  04 01:52:17 -000
7390: 30 09 31 2e 31 32 0a 2b 2b 2b 20 77 69 6e 2f 74  0.1.12.+++ win/t
73a0: 63 6c 57 69 6e 43 6f 6e 73 6f 6c 65 2e 63 09 32  clWinConsole.c.2
73b0: 36 20 4a 61 6e 20 32 30 30 35 20 32 33 3a 33 36  6 Jan 2005 23:36
73c0: 3a 35 32 20 2d 30 30 30 30 0a 40 40 20 2d 31 34  :52 -0000.@@ -14
73d0: 38 2c 37 20 2b 31 34 38 2c 37 20 40 40 0a 20 73  8,7 +148,7 @@. s
73e0: 74 61 74 69 63 20 76 6f 69 64 09 09 43 6f 6e 73  tatic void..Cons
73f0: 6f 6c 65 45 78 69 74 48 61 6e 64 6c 65 72 28 43  oleExitHandler(C
7400: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
7410: 44 61 74 61 29 3b 0a 20 73 74 61 74 69 63 20 69  Data);. static i
7420: 6e 74 09 09 43 6f 6e 73 6f 6c 65 47 65 74 48 61  nt..ConsoleGetHa
7430: 6e 64 6c 65 50 72 6f 63 28 43 6c 69 65 6e 74 44  ndleProc(ClientD
7440: 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61  ata instanceData
7450: 2c 0a 20 09 09 09 20 20 20 20 69 6e 74 20 64 69  ,. ...    int di
7460: 72 65 63 74 69 6f 6e 2c 20 43 6c 69 65 6e 74 44  rection, ClientD
7470: 61 74 61 20 2a 68 61 6e 64 6c 65 50 74 72 29 3b  ata *handlePtr);
7480: 0a 2d 73 74 61 74 69 63 20 54 68 72 65 61 64 53  .-static ThreadS
7490: 70 65 63 69 66 69 63 44 61 74 61 20 2a 43 6f 6e  pecificData *Con
74a0: 73 6f 6c 65 49 6e 69 74 28 76 6f 69 64 29 3b 0a  soleInit(void);.
74b0: 2b 73 74 61 74 69 63 20 76 6f 69 64 20 20 20 20  +static void    
74c0: 20 20 20 20 20 20 20 20 20 43 6f 6e 73 6f 6c 65           Console
74d0: 49 6e 69 74 28 76 6f 69 64 29 3b 0a 20 73 74 61  Init(void);. sta
74e0: 74 69 63 20 69 6e 74 09 09 43 6f 6e 73 6f 6c 65  tic int..Console
74f0: 49 6e 70 75 74 50 72 6f 63 28 43 6c 69 65 6e 74  InputProc(Client
7500: 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74  Data instanceDat
7510: 61 2c 20 63 68 61 72 20 2a 62 75 66 2c 0a 20 09  a, char *buf,. .
7520: 09 09 20 20 20 20 69 6e 74 20 74 6f 52 65 61 64  ..    int toRead
7530: 2c 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65  , int *errorCode
7540: 29 3b 0a 20 73 74 61 74 69 63 20 69 6e 74 09 09  );. static int..
7550: 43 6f 6e 73 6f 6c 65 4f 75 74 70 75 74 50 72 6f  ConsoleOutputPro
7560: 63 28 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73  c(ClientData ins
7570: 74 61 6e 63 65 44 61 74 61 2c 0a 40 40 20 2d 31  tanceData,.@@ -1
7580: 36 30 2c 36 20 2b 31 36 30 2c 39 20 40 40 0a 20  60,6 +160,9 @@. 
7590: 73 74 61 74 69 63 20 76 6f 69 64 09 09 50 72 6f  static void..Pro
75a0: 63 45 78 69 74 48 61 6e 64 6c 65 72 28 43 6c 69  cExitHandler(Cli
75b0: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
75c0: 74 61 29 3b 0a 20 73 74 61 74 69 63 20 69 6e 74  ta);. static int
75d0: 09 09 57 61 69 74 46 6f 72 52 65 61 64 28 43 6f  ..WaitForRead(Co
75e0: 6e 73 6f 6c 65 49 6e 66 6f 20 2a 69 6e 66 6f 50  nsoleInfo *infoP
75f0: 74 72 2c 20 69 6e 74 20 62 6c 6f 63 6b 69 6e 67  tr, int blocking
7600: 29 3b 0a 20 0a 2b 73 74 61 74 69 63 20 76 6f 69  );. .+static voi
7610: 64 20 20 20 20 20 20 20 20 20 20 20 20 20 43 6f  d             Co
7620: 6e 73 6f 6c 65 54 68 72 65 61 64 41 63 74 69 6f  nsoleThreadActio
7630: 6e 50 72 6f 63 20 5f 41 4e 53 49 5f 41 52 47 53  nProc _ANSI_ARGS
7640: 5f 20 28 28 0a 2b 09 09 09 20 20 20 43 6c 69 65  _ ((.+...   Clie
7650: 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44  ntData instanceD
7660: 61 74 61 2c 20 69 6e 74 20 61 63 74 69 6f 6e 29  ata, int action)
7670: 29 3b 0a 2b 0a 20 2f 2a 0a 20 20 2a 20 54 68 69  );.+. /*.  * Thi
7680: 73 20 73 74 72 75 63 74 75 72 65 20 64 65 73 63  s structure desc
7690: 72 69 62 65 73 20 74 68 65 20 63 68 61 6e 6e 65  ribes the channe
76a0: 6c 20 74 79 70 65 20 73 74 72 75 63 74 75 72 65  l type structure
76b0: 20 66 6f 72 20 63 6f 6d 6d 61 6e 64 20 63 6f 6e   for command con
76c0: 73 6f 6c 65 0a 20 20 2a 20 62 61 73 65 64 20 49  sole.  * based I
76d0: 4f 2e 0a 40 40 20 2d 31 36 37 2c 37 20 2b 31 37  O..@@ -167,7 +17
76e0: 30 2c 37 20 40 40 0a 20 0a 20 73 74 61 74 69 63  0,7 @@. . static
76f0: 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 54 79 70 65   Tcl_ChannelType
7700: 20 63 6f 6e 73 6f 6c 65 43 68 61 6e 6e 65 6c 54   consoleChannelT
7710: 79 70 65 20 3d 20 7b 0a 20 20 20 20 20 22 63 6f  ype = {.     "co
7720: 6e 73 6f 6c 65 22 2c 09 09 09 2f 2a 20 54 79 70  nsole",.../* Typ
7730: 65 20 6e 61 6d 65 2e 20 2a 2f 0a 2d 20 20 20 20  e name. */.-    
7740: 54 43 4c 5f 43 48 41 4e 4e 45 4c 5f 56 45 52 53  TCL_CHANNEL_VERS
7750: 49 4f 4e 5f 32 2c 09 2f 2a 20 76 32 20 63 68 61  ION_2,./* v2 cha
7760: 6e 6e 65 6c 20 2a 2f 0a 2b 20 20 20 20 54 43 4c  nnel */.+    TCL
7770: 5f 43 48 41 4e 4e 45 4c 5f 56 45 52 53 49 4f 4e  _CHANNEL_VERSION
7780: 5f 34 2c 09 2f 2a 20 76 34 20 63 68 61 6e 6e 65  _4,./* v4 channe
7790: 6c 20 2a 2f 0a 20 20 20 20 20 43 6f 6e 73 6f 6c  l */.     Consol
77a0: 65 43 6c 6f 73 65 50 72 6f 63 2c 09 09 2f 2a 20  eCloseProc,../* 
77b0: 43 6c 6f 73 65 20 70 72 6f 63 2e 20 2a 2f 0a 20  Close proc. */. 
77c0: 20 20 20 20 43 6f 6e 73 6f 6c 65 49 6e 70 75 74      ConsoleInput
77d0: 50 72 6f 63 2c 09 09 2f 2a 20 49 6e 70 75 74 20  Proc,../* Input 
77e0: 70 72 6f 63 2e 20 2a 2f 0a 20 20 20 20 20 43 6f  proc. */.     Co
77f0: 6e 73 6f 6c 65 4f 75 74 70 75 74 50 72 6f 63 2c  nsoleOutputProc,
7800: 09 09 2f 2a 20 4f 75 74 70 75 74 20 70 72 6f 63  ../* Output proc
7810: 2e 20 2a 2f 0a 40 40 20 2d 31 38 30 2c 36 20 2b  . */.@@ -180,6 +
7820: 31 38 33 2c 38 20 40 40 0a 20 20 20 20 20 43 6f  183,8 @@.     Co
7830: 6e 73 6f 6c 65 42 6c 6f 63 6b 4d 6f 64 65 50 72  nsoleBlockModePr
7840: 6f 63 2c 09 2f 2a 20 53 65 74 20 62 6c 6f 63 6b  oc,./* Set block
7850: 69 6e 67 20 6f 72 20 6e 6f 6e 2d 62 6c 6f 63 6b  ing or non-block
7860: 69 6e 67 20 6d 6f 64 65 2e 2a 2f 0a 20 20 20 20  ing mode.*/.    
7870: 20 4e 55 4c 4c 2c 09 09 09 2f 2a 20 66 6c 75 73   NULL,.../* flus
7880: 68 20 70 72 6f 63 2e 20 2a 2f 0a 20 20 20 20 20  h proc. */.     
7890: 4e 55 4c 4c 2c 09 09 09 2f 2a 20 68 61 6e 64 6c  NULL,.../* handl
78a0: 65 72 20 70 72 6f 63 2e 20 2a 2f 0a 2b 20 20 20  er proc. */.+   
78b0: 20 4e 55 4c 4c 2c 20 20 20 20 20 20 20 20 20 20   NULL,          
78c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
78d0: 77 69 64 65 20 73 65 65 6b 20 70 72 6f 63 20 2a  wide seek proc *
78e0: 2f 0a 2b 20 20 20 20 43 6f 6e 73 6f 6c 65 54 68  /.+    ConsoleTh
78f0: 72 65 61 64 41 63 74 69 6f 6e 50 72 6f 63 2c 20  readActionProc, 
7900: 20 20 20 2f 2a 20 74 68 72 65 61 64 20 61 63 74     /* thread act
7910: 69 6f 6e 20 70 72 6f 63 20 2a 2f 0a 20 7d 3b 0a  ion proc */. };.
7920: 20 0c 0a 20 2f 2a 0a 40 40 20 2d 31 39 38 2c 37   .. /*.@@ -198,7
7930: 20 2b 32 30 33 2c 37 20 40 40 0a 20 20 2a 2d 2d   +203,7 @@.  *--
7940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7980: 2d 2d 2d 2d 0a 20 20 2a 2f 0a 20 0a 2d 73 74 61  ----.  */. .-sta
7990: 74 69 63 20 54 68 72 65 61 64 53 70 65 63 69 66  tic ThreadSpecif
79a0: 69 63 44 61 74 61 20 2a 0a 2b 73 74 61 74 69 63  icData *.+static
79b0: 20 76 6f 69 64 0a 20 43 6f 6e 73 6f 6c 65 49 6e   void. ConsoleIn
79c0: 69 74 28 29 0a 20 7b 0a 20 20 20 20 20 54 68 72  it(). {.     Thr
79d0: 65 61 64 53 70 65 63 69 66 69 63 44 61 74 61 20  eadSpecificData 
79e0: 2a 74 73 64 50 74 72 3b 0a 40 40 20 2d 32 32 34  *tsdPtr;.@@ -224
79f0: 2c 37 20 2b 32 32 39 2c 36 20 40 40 0a 20 09 54  ,7 +229,6 @@. .T
7a00: 63 6c 5f 43 72 65 61 74 65 45 76 65 6e 74 53 6f  cl_CreateEventSo
7a10: 75 72 63 65 28 43 6f 6e 73 6f 6c 65 53 65 74 75  urce(ConsoleSetu
7a20: 70 50 72 6f 63 2c 20 43 6f 6e 73 6f 6c 65 43 68  pProc, ConsoleCh
7a30: 65 63 6b 50 72 6f 63 2c 20 4e 55 4c 4c 29 3b 0a  eckProc, NULL);.
7a40: 20 09 54 63 6c 5f 43 72 65 61 74 65 54 68 72 65   .Tcl_CreateThre
7a50: 61 64 45 78 69 74 48 61 6e 64 6c 65 72 28 43 6f  adExitHandler(Co
7a60: 6e 73 6f 6c 65 45 78 69 74 48 61 6e 64 6c 65 72  nsoleExitHandler
7a70: 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 7d 0a  , NULL);.     }.
7a80: 2d 20 20 20 20 72 65 74 75 72 6e 20 74 73 64 50  -    return tsdP
7a90: 74 72 3b 0a 20 7d 0a 20 0c 0a 20 2f 2a 0a 40 40  tr;. }. .. /*.@@
7aa0: 20 2d 31 31 36 39 2c 37 20 2b 31 31 37 33 2c 31   -1169,7 +1173,1
7ab0: 30 20 40 40 0a 20 09 20 2a 2f 0a 20 0a 20 09 54  0 @@. . */. . .T
7ac0: 63 6c 5f 4d 75 74 65 78 4c 6f 63 6b 28 26 63 6f  cl_MutexLock(&co
7ad0: 6e 73 6f 6c 65 4d 75 74 65 78 29 3b 0a 2b 09 69  nsoleMutex);.+.i
7ae0: 66 20 28 69 6e 66 6f 50 74 72 2d 3e 74 68 72 65  f (infoPtr->thre
7af0: 61 64 49 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  adId != NULL) {.
7b00: 2b 09 20 20 20 20 2f 2a 20 54 49 50 20 23 32 31  +.    /* TIP #21
7b10: 38 2e 20 57 68 65 6e 20 69 6e 20 66 6c 69 67 68  8. When in fligh
7b20: 74 20 69 67 6e 6f 72 65 20 74 68 65 20 65 76 65  t ignore the eve
7b30: 6e 74 2c 20 6e 6f 20 6f 6e 65 20 77 69 6c 6c 20  nt, no one will 
7b40: 72 65 63 65 69 76 65 20 69 74 20 61 6e 79 77 61  receive it anywa
7b50: 79 20 2a 2f 0a 20 09 54 63 6c 5f 54 68 72 65 61  y */. .Tcl_Threa
7b60: 64 41 6c 65 72 74 28 69 6e 66 6f 50 74 72 2d 3e  dAlert(infoPtr->
7b70: 74 68 72 65 61 64 49 64 29 3b 0a 2b 09 7d 0a 20  threadId);.+.}. 
7b80: 09 54 63 6c 5f 4d 75 74 65 78 55 6e 6c 6f 63 6b  .Tcl_MutexUnlock
7b90: 28 26 63 6f 6e 73 6f 6c 65 4d 75 74 65 78 29 3b  (&consoleMutex);
7ba0: 0a 20 20 20 20 20 7d 0a 20 0a 40 40 20 2d 31 32  .     }. .@@ -12
7bb0: 35 35 2c 37 20 2b 31 32 36 32 2c 31 30 20 40 40  55,7 +1262,10 @@
7bc0: 0a 20 09 20 2a 2f 0a 20 0a 20 09 54 63 6c 5f 4d  . . */. . .Tcl_M
7bd0: 75 74 65 78 4c 6f 63 6b 28 26 63 6f 6e 73 6f 6c  utexLock(&consol
7be0: 65 4d 75 74 65 78 29 3b 0a 2b 09 69 66 20 28 69  eMutex);.+.if (i
7bf0: 6e 66 6f 50 74 72 2d 3e 74 68 72 65 61 64 49 64  nfoPtr->threadId
7c00: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 2b 09 20 20   != NULL) {.+.  
7c10: 20 20 2f 2a 20 54 49 50 20 23 32 31 38 2e 20 57    /* TIP #218. W
7c20: 68 65 6e 20 69 6e 20 66 6c 69 67 68 74 20 69 67  hen in flight ig
7c30: 6e 6f 72 65 20 74 68 65 20 65 76 65 6e 74 2c 20  nore the event, 
7c40: 6e 6f 20 6f 6e 65 20 77 69 6c 6c 20 72 65 63 65  no one will rece
7c50: 69 76 65 20 69 74 20 61 6e 79 77 61 79 20 2a 2f  ive it anyway */
7c60: 0a 20 09 54 63 6c 5f 54 68 72 65 61 64 41 6c 65  . .Tcl_ThreadAle
7c70: 72 74 28 69 6e 66 6f 50 74 72 2d 3e 74 68 72 65  rt(infoPtr->thre
7c80: 61 64 49 64 29 3b 0a 2b 09 7d 0a 20 09 54 63 6c  adId);.+.}. .Tcl
7c90: 5f 4d 75 74 65 78 55 6e 6c 6f 63 6b 28 26 63 6f  _MutexUnlock(&co
7ca0: 6e 73 6f 6c 65 4d 75 74 65 78 29 3b 0a 20 20 20  nsoleMutex);.   
7cb0: 20 20 7d 0a 20 0a 40 40 20 2d 31 32 39 30 2c 31    }. .@@ -1290,1
7cc0: 30 20 2b 31 33 30 30 2c 39 20 40 40 0a 20 7b 0a  0 +1300,9 @@. {.
7cd0: 20 20 20 20 20 63 68 61 72 20 65 6e 63 6f 64 69       char encodi
7ce0: 6e 67 5b 34 20 2b 20 54 43 4c 5f 49 4e 54 45 47  ng[4 + TCL_INTEG
7cf0: 45 52 5f 53 50 41 43 45 5d 3b 0a 20 20 20 20 20  ER_SPACE];.     
7d00: 43 6f 6e 73 6f 6c 65 49 6e 66 6f 20 2a 69 6e 66  ConsoleInfo *inf
7d10: 6f 50 74 72 3b 0a 2d 20 20 20 20 54 68 72 65 61  oPtr;.-    Threa
7d20: 64 53 70 65 63 69 66 69 63 44 61 74 61 20 2a 74  dSpecificData *t
7d30: 73 64 50 74 72 3b 0a 20 20 20 20 20 44 57 4f 52  sdPtr;.     DWOR
7d40: 44 20 69 64 2c 20 6d 6f 64 65 73 3b 0a 20 0a 2d  D id, modes;. .-
7d50: 20 20 20 20 74 73 64 50 74 72 20 3d 20 43 6f 6e      tsdPtr = Con
7d60: 73 6f 6c 65 49 6e 69 74 28 29 3b 0a 2b 20 20 20  soleInit();.+   
7d70: 20 43 6f 6e 73 6f 6c 65 49 6e 69 74 28 29 3b 0a   ConsoleInit();.
7d80: 20 0a 20 20 20 20 20 2f 2a 0a 20 20 20 20 20 20   .     /*.      
7d90: 2a 20 53 65 65 20 69 66 20 61 20 63 68 61 6e 6e  * See if a chann
7da0: 65 6c 20 77 69 74 68 20 74 68 69 73 20 68 61 6e  el with this han
7db0: 64 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69 73  dle already exis
7dc0: 74 73 2e 0a 40 40 20 2d 31 33 30 34 2c 39 20 2b  ts..@@ -1304,9 +
7dd0: 31 33 31 33 2c 31 32 20 40 40 0a 20 0a 20 20 20  1313,12 @@. .   
7de0: 20 20 69 6e 66 6f 50 74 72 2d 3e 76 61 6c 69 64    infoPtr->valid
7df0: 4d 61 73 6b 20 3d 20 70 65 72 6d 69 73 73 69 6f  Mask = permissio
7e00: 6e 73 3b 0a 20 20 20 20 20 69 6e 66 6f 50 74 72  ns;.     infoPtr
7e10: 2d 3e 68 61 6e 64 6c 65 20 3d 20 68 61 6e 64 6c  ->handle = handl
7e20: 65 3b 0a 2b 20 20 20 20 69 6e 66 6f 50 74 72 2d  e;.+    infoPtr-
7e30: 3e 63 68 61 6e 6e 65 6c 20 3d 20 28 54 63 6c 5f  >channel = (Tcl_
7e40: 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 3b 0a 20  Channel) NULL;. 
7e50: 0a 20 20 20 20 20 77 73 70 72 69 6e 74 66 41 28  .     wsprintfA(
7e60: 65 6e 63 6f 64 69 6e 67 2c 20 22 63 70 25 64 22  encoding, "cp%d"
7e70: 2c 20 47 65 74 43 6f 6e 73 6f 6c 65 43 50 28 29  , GetConsoleCP()
7e80: 29 3b 0a 20 0a 2b 20 20 20 20 69 6e 66 6f 50 74  );. .+    infoPt
7e90: 72 2d 3e 74 68 72 65 61 64 49 64 20 3d 20 54 63  r->threadId = Tc
7ea0: 6c 5f 47 65 74 43 75 72 72 65 6e 74 54 68 72 65  l_GetCurrentThre
7eb0: 61 64 28 29 3b 0a 2b 0a 20 20 20 20 20 2f 2a 0a  ad();.+.     /*.
7ec0: 20 20 20 20 20 20 2a 20 55 73 65 20 74 68 65 20        * Use the 
7ed0: 70 6f 69 6e 74 65 72 20 66 6f 72 20 74 68 65 20  pointer for the 
7ee0: 6e 61 6d 65 20 6f 66 20 74 68 65 20 72 65 73 75  name of the resu
7ef0: 6c 74 20 63 68 61 6e 6e 65 6c 2e 0a 20 20 20 20  lt channel..    
7f00: 20 20 2a 20 54 68 69 73 20 6b 65 65 70 73 20 74    * This keeps t
7f10: 68 65 20 63 68 61 6e 6e 65 6c 20 6e 61 6d 65 73  he channel names
7f20: 20 75 6e 69 71 75 65 2c 20 73 69 6e 63 65 20 73   unique, since s
7f30: 6f 6d 65 20 6d 61 79 20 73 68 61 72 65 0a 40 40  ome may share.@@
7f40: 20 2d 31 33 31 38 2c 38 20 2b 31 33 33 30 2c 36   -1318,8 +1330,6
7f50: 20 40 40 0a 20 20 20 20 20 69 6e 66 6f 50 74 72   @@.     infoPtr
7f60: 2d 3e 63 68 61 6e 6e 65 6c 20 3d 20 54 63 6c 5f  ->channel = Tcl_
7f70: 43 72 65 61 74 65 43 68 61 6e 6e 65 6c 28 26 63  CreateChannel(&c
7f80: 6f 6e 73 6f 6c 65 43 68 61 6e 6e 65 6c 54 79 70  onsoleChannelTyp
7f90: 65 2c 20 63 68 61 6e 6e 65 6c 4e 61 6d 65 2c 0a  e, channelName,.
7fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 43 6c               (Cl
7fb0: 69 65 6e 74 44 61 74 61 29 20 69 6e 66 6f 50 74  ientData) infoPt
7fc0: 72 2c 20 70 65 72 6d 69 73 73 69 6f 6e 73 29 3b  r, permissions);
7fd0: 0a 20 0a 2d 20 20 20 20 69 6e 66 6f 50 74 72 2d  . .-    infoPtr-
7fe0: 3e 74 68 72 65 61 64 49 64 20 3d 20 54 63 6c 5f  >threadId = Tcl_
7ff0: 47 65 74 43 75 72 72 65 6e 74 54 68 72 65 61 64  GetCurrentThread
8000: 28 29 3b 0a 2d 0a 20 20 20 20 20 69 66 20 28 70  ();.-.     if (p
8010: 65 72 6d 69 73 73 69 6f 6e 73 20 26 20 54 43 4c  ermissions & TCL
8020: 5f 52 45 41 44 41 42 4c 45 29 20 7b 0a 20 09 2f  _READABLE) {. ./
8030: 2a 0a 20 09 20 2a 20 4d 61 6b 65 20 73 75 72 65  *. . * Make sure
8040: 20 74 68 65 20 63 6f 6e 73 6f 6c 65 20 69 6e 70   the console inp
8050: 75 74 20 62 75 66 66 65 72 20 69 73 20 72 65 61  ut buffer is rea
8060: 64 79 20 66 6f 72 20 6f 6e 6c 79 20 63 68 61 72  dy for only char
8070: 61 63 74 65 72 0a 40 40 20 2d 31 33 36 30 2c 33  acter.@@ -1360,3
8080: 20 2b 31 33 37 30 2c 35 31 20 40 40 0a 20 0a 20   +1370,51 @@. . 
8090: 20 20 20 20 72 65 74 75 72 6e 20 69 6e 66 6f 50      return infoP
80a0: 74 72 2d 3e 63 68 61 6e 6e 65 6c 3b 0a 20 7d 0a  tr->channel;. }.
80b0: 2b 0c 0a 2b 2f 2a 0a 2b 20 2a 2d 2d 2d 2d 2d 2d  +..+/*.+ *------
80c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
80d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
80e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
80f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8100: 0a 2b 20 2a 0a 2b 20 2a 20 43 6f 6e 73 6f 6c 65  .+ *.+ * Console
8110: 54 68 72 65 61 64 41 63 74 69 6f 6e 50 72 6f 63  ThreadActionProc
8120: 20 2d 2d 0a 2b 20 2a 0a 2b 20 2a 09 49 6e 73 65   --.+ *.+ *.Inse
8130: 72 74 20 6f 72 20 72 65 6d 6f 76 65 20 61 6e 79  rt or remove any
8140: 20 74 68 72 65 61 64 20 6c 6f 63 61 6c 20 72 65   thread local re
8150: 66 73 20 74 6f 20 74 68 69 73 20 63 68 61 6e 6e  fs to this chann
8160: 65 6c 2e 0a 2b 20 2a 0a 2b 20 2a 20 52 65 73 75  el..+ *.+ * Resu
8170: 6c 74 73 3a 0a 2b 20 2a 09 4e 6f 6e 65 2e 0a 2b  lts:.+ *.None..+
8180: 20 2a 0a 2b 20 2a 20 53 69 64 65 20 65 66 66 65   *.+ * Side effe
8190: 63 74 73 3a 0a 2b 20 2a 09 43 68 61 6e 67 65 73  cts:.+ *.Changes
81a0: 20 74 68 72 65 61 64 20 6c 6f 63 61 6c 20 6c 69   thread local li
81b0: 73 74 20 6f 66 20 76 61 6c 69 64 20 63 68 61 6e  st of valid chan
81c0: 6e 65 6c 73 2e 0a 2b 20 2a 0a 2b 20 2a 2d 2d 2d  nels..+ *.+ *---
81d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
81e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
81f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8210: 2d 2d 2d 0a 2b 20 2a 2f 0a 2b 0a 2b 73 74 61 74  ---.+ */.+.+stat
8220: 69 63 20 76 6f 69 64 0a 2b 43 6f 6e 73 6f 6c 65  ic void.+Console
8230: 54 68 72 65 61 64 41 63 74 69 6f 6e 50 72 6f 63  ThreadActionProc
8240: 20 28 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20   (instanceData, 
8250: 61 63 74 69 6f 6e 29 0a 2b 20 20 20 20 20 43 6c  action).+     Cl
8260: 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63  ientData instanc
8270: 65 44 61 74 61 3b 0a 2b 20 20 20 20 20 69 6e 74  eData;.+     int
8280: 20 61 63 74 69 6f 6e 3b 0a 2b 7b 0a 2b 20 20 20   action;.+{.+   
8290: 20 43 6f 6e 73 6f 6c 65 49 6e 66 6f 20 2a 69 6e   ConsoleInfo *in
82a0: 66 6f 50 74 72 20 3d 20 28 43 6f 6e 73 6f 6c 65  foPtr = (Console
82b0: 49 6e 66 6f 20 2a 29 20 69 6e 73 74 61 6e 63 65  Info *) instance
82c0: 44 61 74 61 3b 0a 2b 0a 2b 20 20 20 20 2f 2a 20  Data;.+.+    /* 
82d0: 57 65 20 64 6f 20 6e 6f 74 20 61 63 63 65 73 73  We do not access
82e0: 20 66 69 72 73 74 43 6f 6e 73 6f 6c 65 50 74 72   firstConsolePtr
82f0: 20 69 6e 20 74 68 65 20 74 68 72 65 61 64 20 73   in the thread s
8300: 74 72 75 63 74 75 72 65 73 2e 20 54 68 69 73 20  tructures. This 
8310: 69 73 0a 2b 20 20 20 20 20 2a 20 6e 6f 74 20 66  is.+     * not f
8320: 6f 72 20 61 6c 6c 20 73 65 72 69 61 6c 73 20 6d  or all serials m
8330: 61 6e 61 67 65 64 20 62 79 20 74 68 65 20 74 68  anaged by the th
8340: 72 65 61 64 2c 20 62 75 74 20 6f 6e 6c 79 20 74  read, but only t
8350: 68 6f 73 65 20 77 65 20 61 72 65 0a 2b 20 20 20  hose we are.+   
8360: 20 20 2a 20 77 61 74 63 68 69 6e 67 2e 20 52 65    * watching. Re
8370: 6d 6f 76 61 6c 20 6f 66 20 74 68 65 20 66 69 6c  moval of the fil
8380: 65 76 65 6e 74 20 68 61 6e 64 6c 65 72 73 20 62  event handlers b
8390: 65 66 6f 72 65 20 74 72 61 6e 73 66 65 72 20 74  efore transfer t
83a0: 68 75 73 0a 2b 20 20 20 20 20 2a 20 74 61 6b 65  hus.+     * take
83b0: 73 20 63 61 72 65 20 6f 66 20 74 68 69 73 20 73  s care of this s
83c0: 74 72 75 63 74 75 72 65 2e 0a 2b 20 20 20 20 20  tructure..+     
83d0: 2a 2f 0a 2b 0a 2b 20 20 20 20 54 63 6c 5f 4d 75  */.+.+    Tcl_Mu
83e0: 74 65 78 4c 6f 63 6b 28 26 63 6f 6e 73 6f 6c 65  texLock(&console
83f0: 4d 75 74 65 78 29 3b 0a 2b 20 20 20 20 69 66 20  Mutex);.+    if 
8400: 28 61 63 74 69 6f 6e 20 3d 3d 20 54 43 4c 5f 43  (action == TCL_C
8410: 48 41 4e 4e 45 4c 5f 54 48 52 45 41 44 5f 49 4e  HANNEL_THREAD_IN
8420: 53 45 52 54 29 20 7b 0a 2b 20 20 20 20 20 20 20  SERT) {.+       
8430: 20 2f 2a 20 57 65 20 63 61 6e 27 74 20 63 6f 70   /* We can't cop
8440: 79 20 74 68 65 20 74 68 72 65 61 64 20 69 6e 66  y the thread inf
8450: 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68  ormation from th
8460: 65 20 63 68 61 6e 6e 65 6c 20 77 68 65 6e 0a 2b  e channel when.+
8470: 09 20 2a 20 74 68 65 20 63 68 61 6e 6e 65 6c 20  . * the channel 
8480: 69 73 20 63 72 65 61 74 65 64 2e 20 41 74 20 74  is created. At t
8490: 68 69 73 20 74 69 6d 65 20 74 68 65 20 63 68 61  his time the cha
84a0: 6e 6e 65 6c 20 62 61 63 6b 0a 2b 09 20 2a 20 70  nnel back.+. * p
84b0: 6f 69 6e 74 65 72 20 68 61 73 20 6e 6f 74 20 62  ointer has not b
84c0: 65 65 6e 20 73 65 74 20 79 65 74 2e 20 48 6f 77  een set yet. How
84d0: 65 76 65 72 20 69 6e 20 74 68 61 74 20 63 61 73  ever in that cas
84e0: 65 20 74 68 65 0a 2b 09 20 2a 20 74 68 72 65 61  e the.+. * threa
84f0: 64 49 64 20 68 61 73 20 61 6c 72 65 61 64 79 20  dId has already 
8500: 62 65 65 6e 20 73 65 74 20 62 79 20 54 63 6c 70  been set by Tclp
8510: 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64 43 68 61  CreateCommandCha
8520: 6e 6e 65 6c 0a 2b 09 20 2a 20 69 74 73 65 6c 66  nnel.+. * itself
8530: 2c 20 73 6f 20 74 68 65 20 73 74 72 75 63 74 75  , so the structu
8540: 72 65 20 69 73 20 73 74 69 6c 6c 20 67 6f 6f 64  re is still good
8550: 2e 0a 2b 09 20 2a 2f 0a 2b 0a 2b 20 20 20 20 20  ..+. */.+.+     
8560: 20 20 20 43 6f 6e 73 6f 6c 65 49 6e 69 74 20 28     ConsoleInit (
8570: 29 3b 0a 2b 20 20 20 20 20 20 20 20 69 66 20 28  );.+        if (
8580: 69 6e 66 6f 50 74 72 2d 3e 63 68 61 6e 6e 65 6c  infoPtr->channel
8590: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 2b 09 20 20   != NULL) {.+.  
85a0: 20 20 69 6e 66 6f 50 74 72 2d 3e 74 68 72 65 61    infoPtr->threa
85b0: 64 49 64 20 3d 20 54 63 6c 5f 47 65 74 43 68 61  dId = Tcl_GetCha
85c0: 6e 6e 65 6c 54 68 72 65 61 64 20 28 69 6e 66 6f  nnelThread (info
85d0: 50 74 72 2d 3e 63 68 61 6e 6e 65 6c 29 3b 0a 2b  Ptr->channel);.+
85e0: 09 7d 0a 2b 20 20 20 20 7d 20 65 6c 73 65 20 7b  .}.+    } else {
85f0: 0a 2b 09 69 6e 66 6f 50 74 72 2d 3e 74 68 72 65  .+.infoPtr->thre
8600: 61 64 49 64 20 3d 20 4e 55 4c 4c 3b 0a 2b 20 20  adId = NULL;.+  
8610: 20 20 7d 0a 2b 20 20 20 20 54 63 6c 5f 4d 75 74    }.+    Tcl_Mut
8620: 65 78 55 6e 6c 6f 63 6b 28 26 63 6f 6e 73 6f 6c  exUnlock(&consol
8630: 65 4d 75 74 65 78 29 3b 0a 2b 7d 0a 49 6e 64 65  eMutex);.+}.Inde
8640: 78 3a 20 77 69 6e 2f 74 63 6c 57 69 6e 50 69 70  x: win/tclWinPip
8650: 65 2e 63 0a 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  e.c.============
8660: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
8670: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
8680: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
8690: 3d 3d 3d 3d 3d 3d 3d 0a 52 43 53 20 66 69 6c 65  =======.RCS file
86a0: 3a 20 2f 63 76 73 72 6f 6f 74 2f 74 63 6c 2f 74  : /cvsroot/tcl/t
86b0: 63 6c 2f 77 69 6e 2f 74 63 6c 57 69 6e 50 69 70  cl/win/tclWinPip
86c0: 65 2e 63 2c 76 0a 72 65 74 72 69 65 76 69 6e 67  e.c,v.retrieving
86d0: 20 72 65 76 69 73 69 6f 6e 20 31 2e 35 33 0a 64   revision 1.53.d
86e0: 69 66 66 20 2d 77 20 2d 75 20 2d 72 31 2e 35 33  iff -w -u -r1.53
86f0: 20 74 63 6c 57 69 6e 50 69 70 65 2e 63 0a 2d 2d   tclWinPipe.c.--
8700: 2d 20 77 69 6e 2f 74 63 6c 57 69 6e 50 69 70 65  - win/tclWinPipe
8710: 2e 63 09 31 20 44 65 63 20 32 30 30 34 20 32 33  .c.1 Dec 2004 23
8720: 3a 31 38 3a 35 35 20 2d 30 30 30 30 09 31 2e 35  :18:55 -0000.1.5
8730: 33 0a 2b 2b 2b 20 77 69 6e 2f 74 63 6c 57 69 6e  3.+++ win/tclWin
8740: 50 69 70 65 2e 63 09 32 36 20 4a 61 6e 20 32 30  Pipe.c.26 Jan 20
8750: 30 35 20 32 33 3a 33 36 3a 35 32 20 2d 30 30 30  05 23:36:52 -000
8760: 30 0a 40 40 20 2d 32 30 35 2c 36 20 2b 32 30 35  0.@@ -205,6 +205
8770: 2c 39 20 40 40 0a 20 73 74 61 74 69 63 20 69 6e  ,9 @@. static in
8780: 74 09 09 54 65 6d 70 46 69 6c 65 4e 61 6d 65 28  t..TempFileName(
8790: 57 43 48 41 52 20 6e 61 6d 65 5b 4d 41 58 5f 50  WCHAR name[MAX_P
87a0: 41 54 48 5d 29 3b 0a 20 73 74 61 74 69 63 20 69  ATH]);. static i
87b0: 6e 74 09 09 57 61 69 74 46 6f 72 52 65 61 64 28  nt..WaitForRead(
87c0: 50 69 70 65 49 6e 66 6f 20 2a 69 6e 66 6f 50 74  PipeInfo *infoPt
87d0: 72 2c 20 69 6e 74 20 62 6c 6f 63 6b 69 6e 67 29  r, int blocking)
87e0: 3b 0a 20 0a 2b 73 74 61 74 69 63 20 76 6f 69 64  ;. .+static void
87f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 50 69 70               Pip
8800: 65 54 68 72 65 61 64 41 63 74 69 6f 6e 50 72 6f  eThreadActionPro
8810: 63 20 5f 41 4e 53 49 5f 41 52 47 53 5f 20 28 28  c _ANSI_ARGS_ ((
8820: 0a 2b 09 09 09 20 20 20 43 6c 69 65 6e 74 44 61  .+...   ClientDa
8830: 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c  ta instanceData,
8840: 20 69 6e 74 20 61 63 74 69 6f 6e 29 29 3b 0a 2b   int action));.+
8850: 0a 20 2f 2a 0a 20 20 2a 20 54 68 69 73 20 73 74  . /*.  * This st
8860: 72 75 63 74 75 72 65 20 64 65 73 63 72 69 62 65  ructure describe
8870: 73 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 74 79  s the channel ty
8880: 70 65 20 73 74 72 75 63 74 75 72 65 20 66 6f 72  pe structure for
8890: 20 63 6f 6d 6d 61 6e 64 20 70 69 70 65 0a 20 20   command pipe.  
88a0: 2a 20 62 61 73 65 64 20 49 4f 2e 0a 40 40 20 2d  * based IO..@@ -
88b0: 32 31 32 2c 37 20 2b 32 31 35 2c 37 20 40 40 0a  212,7 +215,7 @@.
88c0: 20 0a 20 73 74 61 74 69 63 20 54 63 6c 5f 43 68   . static Tcl_Ch
88d0: 61 6e 6e 65 6c 54 79 70 65 20 70 69 70 65 43 68  annelType pipeCh
88e0: 61 6e 6e 65 6c 54 79 70 65 20 3d 20 7b 0a 20 20  annelType = {.  
88f0: 20 20 20 22 70 69 70 65 22 2c 09 09 09 2f 2a 20     "pipe",.../* 
8900: 54 79 70 65 20 6e 61 6d 65 2e 20 2a 2f 0a 2d 20  Type name. */.- 
8910: 20 20 20 54 43 4c 5f 43 48 41 4e 4e 45 4c 5f 56     TCL_CHANNEL_V
8920: 45 52 53 49 4f 4e 5f 32 2c 09 2f 2a 20 76 32 20  ERSION_2,./* v2 
8930: 63 68 61 6e 6e 65 6c 20 2a 2f 0a 2b 20 20 20 20  channel */.+    
8940: 54 43 4c 5f 43 48 41 4e 4e 45 4c 5f 56 45 52 53  TCL_CHANNEL_VERS
8950: 49 4f 4e 5f 34 2c 09 2f 2a 20 76 34 20 63 68 61  ION_4,./* v4 cha
8960: 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 20 54 43 4c  nnel */.     TCL
8970: 5f 43 4c 4f 53 45 32 50 52 4f 43 2c 09 09 2f 2a  _CLOSE2PROC,../*
8980: 20 43 6c 6f 73 65 20 70 72 6f 63 2e 20 2a 2f 0a   Close proc. */.
8990: 20 20 20 20 20 50 69 70 65 49 6e 70 75 74 50 72       PipeInputPr
89a0: 6f 63 2c 09 09 2f 2a 20 49 6e 70 75 74 20 70 72  oc,../* Input pr
89b0: 6f 63 2e 20 2a 2f 0a 20 20 20 20 20 50 69 70 65  oc. */.     Pipe
89c0: 4f 75 74 70 75 74 50 72 6f 63 2c 09 09 2f 2a 20  OutputProc,../* 
89d0: 4f 75 74 70 75 74 20 70 72 6f 63 2e 20 2a 2f 0a  Output proc. */.
89e0: 40 40 20 2d 32 32 35 2c 36 20 2b 32 32 38 2c 38  @@ -225,6 +228,8
89f0: 20 40 40 0a 20 20 20 20 20 50 69 70 65 42 6c 6f   @@.     PipeBlo
8a00: 63 6b 4d 6f 64 65 50 72 6f 63 2c 09 09 2f 2a 20  ckModeProc,../* 
8a10: 53 65 74 20 62 6c 6f 63 6b 69 6e 67 20 6f 72 20  Set blocking or 
8a20: 6e 6f 6e 2d 62 6c 6f 63 6b 69 6e 67 20 6d 6f 64  non-blocking mod
8a30: 65 2e 2a 2f 0a 20 20 20 20 20 4e 55 4c 4c 2c 09  e.*/.     NULL,.
8a40: 09 09 2f 2a 20 66 6c 75 73 68 20 70 72 6f 63 2e  ../* flush proc.
8a50: 20 2a 2f 0a 20 20 20 20 20 4e 55 4c 4c 2c 09 09   */.     NULL,..
8a60: 09 2f 2a 20 68 61 6e 64 6c 65 72 20 70 72 6f 63  ./* handler proc
8a70: 2e 20 2a 2f 0a 2b 20 20 20 20 4e 55 4c 4c 2c 20  . */.+    NULL, 
8a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a90: 20 20 20 20 20 20 2f 2a 20 77 69 64 65 20 73 65        /* wide se
8aa0: 65 6b 20 70 72 6f 63 20 2a 2f 0a 2b 20 20 20 20  ek proc */.+    
8ab0: 50 69 70 65 54 68 72 65 61 64 41 63 74 69 6f 6e  PipeThreadAction
8ac0: 50 72 6f 63 2c 20 20 20 20 20 20 20 2f 2a 20 74  Proc,       /* t
8ad0: 68 72 65 61 64 20 61 63 74 69 6f 6e 20 70 72 6f  hread action pro
8ae0: 63 20 2a 2f 0a 20 7d 3b 0a 20 0c 0a 20 2f 2a 0a  c */. };. .. /*.
8af0: 40 40 20 2d 31 36 39 36 2c 36 20 2b 31 37 30 31  @@ -1696,6 +1701
8b00: 2c 37 20 40 40 0a 20 20 20 20 20 69 6e 66 6f 50  ,7 @@.     infoP
8b10: 74 72 2d 3e 77 72 69 74 65 42 75 66 20 3d 20 30  tr->writeBuf = 0
8b20: 3b 0a 20 20 20 20 20 69 6e 66 6f 50 74 72 2d 3e  ;.     infoPtr->
8b30: 77 72 69 74 65 42 75 66 4c 65 6e 20 3d 20 30 3b  writeBufLen = 0;
8b40: 0a 20 20 20 20 20 69 6e 66 6f 50 74 72 2d 3e 77  .     infoPtr->w
8b50: 72 69 74 65 45 72 72 6f 72 20 3d 20 30 3b 0a 2b  riteError = 0;.+
8b60: 20 20 20 20 69 6e 66 6f 50 74 72 2d 3e 63 68 61      infoPtr->cha
8b70: 6e 6e 65 6c 20 3d 20 28 54 63 6c 5f 43 68 61 6e  nnel = (Tcl_Chan
8b80: 6e 65 6c 29 20 4e 55 4c 4c 3b 0a 20 0a 20 20 20  nel) NULL;. .   
8b90: 20 20 2f 2a 0a 20 20 20 20 20 20 2a 20 55 73 65    /*.      * Use
8ba0: 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 64 73 20   one of the fds 
8bb0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
8bc0: 74 68 65 20 63 68 61 6e 6e 65 6c 20 61 73 20 74  the channel as t
8bd0: 68 65 0a 40 40 20 2d 32 39 37 37 2c 37 20 2b 32  he.@@ -2977,7 +2
8be0: 39 38 33 2c 31 30 20 40 40 0a 20 09 20 2a 2f 0a  983,10 @@. . */.
8bf0: 20 0a 20 09 54 63 6c 5f 4d 75 74 65 78 4c 6f 63   . .Tcl_MutexLoc
8c00: 6b 28 26 70 69 70 65 4d 75 74 65 78 29 3b 0a 2b  k(&pipeMutex);.+
8c10: 09 69 66 20 28 69 6e 66 6f 50 74 72 2d 3e 74 68  .if (infoPtr->th
8c20: 72 65 61 64 49 64 20 21 3d 20 4e 55 4c 4c 29 20  readId != NULL) 
8c30: 7b 0a 2b 09 20 20 20 20 2f 2a 20 54 49 50 20 23  {.+.    /* TIP #
8c40: 32 31 38 2e 20 57 68 65 6e 20 69 6e 20 66 6c 69  218. When in fli
8c50: 67 68 74 20 69 67 6e 6f 72 65 20 74 68 65 20 65  ght ignore the e
8c60: 76 65 6e 74 2c 20 6e 6f 20 6f 6e 65 20 77 69 6c  vent, no one wil
8c70: 6c 20 72 65 63 65 69 76 65 20 69 74 20 61 6e 79  l receive it any
8c80: 77 61 79 20 2a 2f 0a 20 09 54 63 6c 5f 54 68 72  way */. .Tcl_Thr
8c90: 65 61 64 41 6c 65 72 74 28 69 6e 66 6f 50 74 72  eadAlert(infoPtr
8ca0: 2d 3e 74 68 72 65 61 64 49 64 29 3b 0a 2b 09 7d  ->threadId);.+.}
8cb0: 0a 20 09 54 63 6c 5f 4d 75 74 65 78 55 6e 6c 6f  . .Tcl_MutexUnlo
8cc0: 63 6b 28 26 70 69 70 65 4d 75 74 65 78 29 3b 0a  ck(&pipeMutex);.
8cd0: 20 20 20 20 20 7d 0a 20 0a 40 40 20 2d 33 30 36       }. .@@ -306
8ce0: 35 2c 31 30 20 2b 33 30 37 34 2c 36 30 20 40 40  5,10 +3074,60 @@
8cf0: 0a 20 09 20 2a 2f 0a 20 0a 20 09 54 63 6c 5f 4d  . . */. . .Tcl_M
8d00: 75 74 65 78 4c 6f 63 6b 28 26 70 69 70 65 4d 75  utexLock(&pipeMu
8d10: 74 65 78 29 3b 0a 2b 09 69 66 20 28 69 6e 66 6f  tex);.+.if (info
8d20: 50 74 72 2d 3e 74 68 72 65 61 64 49 64 20 21 3d  Ptr->threadId !=
8d30: 20 4e 55 4c 4c 29 20 7b 0a 2b 09 20 20 20 20 2f   NULL) {.+.    /
8d40: 2a 20 54 49 50 20 23 32 31 38 2e 20 57 68 65 6e  * TIP #218. When
8d50: 20 69 6e 20 66 6c 69 67 68 74 20 69 67 6e 6f 72   in flight ignor
8d60: 65 20 74 68 65 20 65 76 65 6e 74 2c 20 6e 6f 20  e the event, no 
8d70: 6f 6e 65 20 77 69 6c 6c 20 72 65 63 65 69 76 65  one will receive
8d80: 20 69 74 20 61 6e 79 77 61 79 20 2a 2f 0a 20 09   it anyway */. .
8d90: 54 63 6c 5f 54 68 72 65 61 64 41 6c 65 72 74 28  Tcl_ThreadAlert(
8da0: 69 6e 66 6f 50 74 72 2d 3e 74 68 72 65 61 64 49  infoPtr->threadI
8db0: 64 29 3b 0a 2b 09 7d 0a 20 09 54 63 6c 5f 4d 75  d);.+.}. .Tcl_Mu
8dc0: 74 65 78 55 6e 6c 6f 63 6b 28 26 70 69 70 65 4d  texUnlock(&pipeM
8dd0: 75 74 65 78 29 3b 0a 20 20 20 20 20 7d 0a 20 0a  utex);.     }. .
8de0: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
8df0: 7d 0a 20 0a 2b 2f 2a 0a 2b 20 2a 2d 2d 2d 2d 2d  }. .+/*.+ *-----
8e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e40: 2d 0a 2b 20 2a 0a 2b 20 2a 20 50 69 70 65 54 68  -.+ *.+ * PipeTh
8e50: 72 65 61 64 41 63 74 69 6f 6e 50 72 6f 63 20 2d  readActionProc -
8e60: 2d 0a 2b 20 2a 0a 2b 20 2a 09 49 6e 73 65 72 74  -.+ *.+ *.Insert
8e70: 20 6f 72 20 72 65 6d 6f 76 65 20 61 6e 79 20 74   or remove any t
8e80: 68 72 65 61 64 20 6c 6f 63 61 6c 20 72 65 66 73  hread local refs
8e90: 20 74 6f 20 74 68 69 73 20 63 68 61 6e 6e 65 6c   to this channel
8ea0: 2e 0a 2b 20 2a 0a 2b 20 2a 20 52 65 73 75 6c 74  ..+ *.+ * Result
8eb0: 73 3a 0a 2b 20 2a 09 4e 6f 6e 65 2e 0a 2b 20 2a  s:.+ *.None..+ *
8ec0: 0a 2b 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  .+ * Side effect
8ed0: 73 3a 0a 2b 20 2a 09 43 68 61 6e 67 65 73 20 74  s:.+ *.Changes t
8ee0: 68 72 65 61 64 20 6c 6f 63 61 6c 20 6c 69 73 74  hread local list
8ef0: 20 6f 66 20 76 61 6c 69 64 20 63 68 61 6e 6e 65   of valid channe
8f00: 6c 73 2e 0a 2b 20 2a 0a 2b 20 2a 2d 2d 2d 2d 2d  ls..+ *.+ *-----
8f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8f50: 2d 0a 2b 20 2a 2f 0a 2b 0a 2b 73 74 61 74 69 63  -.+ */.+.+static
8f60: 20 76 6f 69 64 0a 2b 50 69 70 65 54 68 72 65 61   void.+PipeThrea
8f70: 64 41 63 74 69 6f 6e 50 72 6f 63 20 28 69 6e 73  dActionProc (ins
8f80: 74 61 6e 63 65 44 61 74 61 2c 20 61 63 74 69 6f  tanceData, actio
8f90: 6e 29 0a 2b 20 20 20 20 20 43 6c 69 65 6e 74 44  n).+     ClientD
8fa0: 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61  ata instanceData
8fb0: 3b 0a 2b 20 20 20 20 20 69 6e 74 20 61 63 74 69  ;.+     int acti
8fc0: 6f 6e 3b 0a 2b 7b 0a 2b 20 20 20 20 50 69 70 65  on;.+{.+    Pipe
8fd0: 49 6e 66 6f 20 2a 69 6e 66 6f 50 74 72 20 3d 20  Info *infoPtr = 
8fe0: 28 50 69 70 65 49 6e 66 6f 20 2a 29 20 69 6e 73  (PipeInfo *) ins
8ff0: 74 61 6e 63 65 44 61 74 61 3b 0a 2b 0a 2b 20 20  tanceData;.+.+  
9000: 20 20 2f 2a 20 57 65 20 64 6f 20 6e 6f 74 20 61    /* We do not a
9010: 63 63 65 73 73 20 66 69 72 73 74 50 69 70 65 50  ccess firstPipeP
9020: 74 72 20 69 6e 20 74 68 65 20 74 68 72 65 61 64  tr in the thread
9030: 20 73 74 72 75 63 74 75 72 65 73 2e 20 54 68 69   structures. Thi
9040: 73 20 69 73 0a 2b 20 20 20 20 20 2a 20 6e 6f 74  s is.+     * not
9050: 20 66 6f 72 20 61 6c 6c 20 70 69 70 65 73 20 6d   for all pipes m
9060: 61 6e 61 67 65 64 20 62 79 20 74 68 65 20 74 68  anaged by the th
9070: 72 65 61 64 2c 20 62 75 74 20 6f 6e 6c 79 20 74  read, but only t
9080: 68 6f 73 65 20 77 65 20 61 72 65 0a 2b 20 20 20  hose we are.+   
9090: 20 20 2a 20 77 61 74 63 68 69 6e 67 2e 20 52 65    * watching. Re
90a0: 6d 6f 76 61 6c 20 6f 66 20 74 68 65 20 66 69 6c  moval of the fil
90b0: 65 76 65 6e 74 20 68 61 6e 64 6c 65 72 73 20 62  event handlers b
90c0: 65 66 6f 72 65 20 74 72 61 6e 73 66 65 72 20 74  efore transfer t
90d0: 68 75 73 0a 2b 20 20 20 20 20 2a 20 74 61 6b 65  hus.+     * take
90e0: 73 20 63 61 72 65 20 6f 66 20 74 68 69 73 20 73  s care of this s
90f0: 74 72 75 63 74 75 72 65 2e 0a 2b 20 20 20 20 20  tructure..+     
9100: 2a 2f 0a 2b 0a 2b 20 20 20 20 54 63 6c 5f 4d 75  */.+.+    Tcl_Mu
9110: 74 65 78 4c 6f 63 6b 28 26 70 69 70 65 4d 75 74  texLock(&pipeMut
9120: 65 78 29 3b 0a 2b 20 20 20 20 69 66 20 28 61 63  ex);.+    if (ac
9130: 74 69 6f 6e 20 3d 3d 20 54 43 4c 5f 43 48 41 4e  tion == TCL_CHAN
9140: 4e 45 4c 5f 54 48 52 45 41 44 5f 49 4e 53 45 52  NEL_THREAD_INSER
9150: 54 29 20 7b 0a 2b 20 20 20 20 20 20 20 20 2f 2a  T) {.+        /*
9160: 20 57 65 20 63 61 6e 27 74 20 63 6f 70 79 20 74   We can't copy t
9170: 68 65 20 74 68 72 65 61 64 20 69 6e 66 6f 72 6d  he thread inform
9180: 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 63  ation from the c
9190: 68 61 6e 6e 65 6c 20 77 68 65 6e 0a 2b 09 20 2a  hannel when.+. *
91a0: 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 69 73 20   the channel is 
91b0: 63 72 65 61 74 65 64 2e 20 41 74 20 74 68 69 73  created. At this
91c0: 20 74 69 6d 65 20 74 68 65 20 63 68 61 6e 6e 65   time the channe
91d0: 6c 20 62 61 63 6b 0a 2b 09 20 2a 20 70 6f 69 6e  l back.+. * poin
91e0: 74 65 72 20 68 61 73 20 6e 6f 74 20 62 65 65 6e  ter has not been
91f0: 20 73 65 74 20 79 65 74 2e 20 48 6f 77 65 76 65   set yet. Howeve
9200: 72 20 69 6e 20 74 68 61 74 20 63 61 73 65 20 74  r in that case t
9210: 68 65 0a 2b 09 20 2a 20 74 68 72 65 61 64 49 64  he.+. * threadId
9220: 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
9230: 6e 20 73 65 74 20 62 79 20 54 63 6c 70 43 72 65  n set by TclpCre
9240: 61 74 65 43 6f 6d 6d 61 6e 64 43 68 61 6e 6e 65  ateCommandChanne
9250: 6c 0a 2b 09 20 2a 20 69 74 73 65 6c 66 2c 20 73  l.+. * itself, s
9260: 6f 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  o the structure 
9270: 69 73 20 73 74 69 6c 6c 20 67 6f 6f 64 2e 0a 2b  is still good..+
9280: 09 20 2a 2f 0a 2b 0a 2b 20 20 20 20 20 20 20 20  . */.+.+        
9290: 50 69 70 65 49 6e 69 74 20 28 29 3b 0a 2b 20 20  PipeInit ();.+  
92a0: 20 20 20 20 20 20 69 66 20 28 69 6e 66 6f 50 74        if (infoPt
92b0: 72 2d 3e 63 68 61 6e 6e 65 6c 20 21 3d 20 4e 55  r->channel != NU
92c0: 4c 4c 29 20 7b 0a 2b 09 20 20 20 20 69 6e 66 6f  LL) {.+.    info
92d0: 50 74 72 2d 3e 74 68 72 65 61 64 49 64 20 3d 20  Ptr->threadId = 
92e0: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 68  Tcl_GetChannelTh
92f0: 72 65 61 64 20 28 69 6e 66 6f 50 74 72 2d 3e 63  read (infoPtr->c
9300: 68 61 6e 6e 65 6c 29 3b 0a 2b 09 7d 0a 2b 20 20  hannel);.+.}.+  
9310: 20 20 7d 20 65 6c 73 65 20 7b 0a 2b 09 69 6e 66    } else {.+.inf
9320: 6f 50 74 72 2d 3e 74 68 72 65 61 64 49 64 20 3d  oPtr->threadId =
9330: 20 4e 55 4c 4c 3b 0a 2b 20 20 20 20 7d 0a 2b 20   NULL;.+    }.+ 
9340: 20 20 20 54 63 6c 5f 4d 75 74 65 78 55 6e 6c 6f     Tcl_MutexUnlo
9350: 63 6b 28 26 70 69 70 65 4d 75 74 65 78 29 3b 0a  ck(&pipeMutex);.
9360: 2b 7d 0a 49 6e 64 65 78 3a 20 77 69 6e 2f 74 63  +}.Index: win/tc
9370: 6c 57 69 6e 53 65 72 69 61 6c 2e 63 0a 3d 3d 3d  lWinSerial.c.===
9380: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
9390: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
93a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
93b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
93c0: 0a 52 43 53 20 66 69 6c 65 3a 20 2f 63 76 73 72  .RCS file: /cvsr
93d0: 6f 6f 74 2f 74 63 6c 2f 74 63 6c 2f 77 69 6e 2f  oot/tcl/tcl/win/
93e0: 74 63 6c 57 69 6e 53 65 72 69 61 6c 2e 63 2c 76  tclWinSerial.c,v
93f0: 0a 72 65 74 72 69 65 76 69 6e 67 20 72 65 76 69  .retrieving revi
9400: 73 69 6f 6e 20 31 2e 32 38 0a 64 69 66 66 20 2d  sion 1.28.diff -
9410: 77 20 2d 75 20 2d 72 31 2e 32 38 20 74 63 6c 57  w -u -r1.28 tclW
9420: 69 6e 53 65 72 69 61 6c 2e 63 0a 2d 2d 2d 20 77  inSerial.c.--- w
9430: 69 6e 2f 74 63 6c 57 69 6e 53 65 72 69 61 6c 2e  in/tclWinSerial.
9440: 63 09 31 39 20 41 75 67 20 32 30 30 33 20 31 39  c.19 Aug 2003 19
9450: 3a 33 39 3a 35 36 20 2d 30 30 30 30 09 31 2e 32  :39:56 -0000.1.2
9460: 38 0a 2b 2b 2b 20 77 69 6e 2f 74 63 6c 57 69 6e  8.+++ win/tclWin
9470: 53 65 72 69 61 6c 2e 63 09 32 36 20 4a 61 6e 20  Serial.c.26 Jan 
9480: 32 30 30 35 20 32 33 3a 33 36 3a 35 32 20 2d 30  2005 23:36:52 -0
9490: 30 30 30 0a 40 40 20 2d 32 30 30 2c 36 20 2b 32  000.@@ -200,6 +2
94a0: 30 30 2c 39 20 40 40 0a 20 09 09 09 09 20 20 20  00,9 @@. ....   
94b0: 20 43 4f 4e 53 54 20 63 68 61 72 20 2a 76 61 6c   CONST char *val
94c0: 75 65 29 29 3b 0a 20 73 74 61 74 69 63 20 44 57  ue));. static DW
94d0: 4f 52 44 20 57 49 4e 41 50 49 09 09 53 65 72 69  ORD WINAPI..Seri
94e0: 61 6c 57 72 69 74 65 72 54 68 72 65 61 64 28 4c  alWriterThread(L
94f0: 50 56 4f 49 44 20 61 72 67 29 3b 0a 20 0a 2b 73  PVOID arg);. .+s
9500: 74 61 74 69 63 20 76 6f 69 64 20 20 20 20 20 20  tatic void      
9510: 20 20 20 20 20 20 20 53 65 72 69 61 6c 54 68 72         SerialThr
9520: 65 61 64 41 63 74 69 6f 6e 50 72 6f 63 20 5f 41  eadActionProc _A
9530: 4e 53 49 5f 41 52 47 53 5f 20 28 28 0a 2b 09 09  NSI_ARGS_ ((.+..
9540: 09 20 20 20 43 6c 69 65 6e 74 44 61 74 61 20 69  .   ClientData i
9550: 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 69 6e 74  nstanceData, int
9560: 20 61 63 74 69 6f 6e 29 29 3b 0a 2b 0a 20 2f 2a   action));.+. /*
9570: 0a 20 20 2a 20 54 68 69 73 20 73 74 72 75 63 74  .  * This struct
9580: 75 72 65 20 64 65 73 63 72 69 62 65 73 20 74 68  ure describes th
9590: 65 20 63 68 61 6e 6e 65 6c 20 74 79 70 65 20 73  e channel type s
95a0: 74 72 75 63 74 75 72 65 20 66 6f 72 20 63 6f 6d  tructure for com
95b0: 6d 61 6e 64 20 73 65 72 69 61 6c 0a 20 20 2a 20  mand serial.  * 
95c0: 62 61 73 65 64 20 49 4f 2e 0a 40 40 20 2d 32 30  based IO..@@ -20
95d0: 37 2c 37 20 2b 32 31 30 2c 37 20 40 40 0a 20 0a  7,7 +210,7 @@. .
95e0: 20 73 74 61 74 69 63 20 54 63 6c 5f 43 68 61 6e   static Tcl_Chan
95f0: 6e 65 6c 54 79 70 65 20 73 65 72 69 61 6c 43 68  nelType serialCh
9600: 61 6e 6e 65 6c 54 79 70 65 20 3d 20 7b 0a 20 20  annelType = {.  
9610: 20 20 20 22 73 65 72 69 61 6c 22 2c 09 09 09 2f     "serial",.../
9620: 2a 20 54 79 70 65 20 6e 61 6d 65 2e 20 2a 2f 0a  * Type name. */.
9630: 2d 20 20 20 20 54 43 4c 5f 43 48 41 4e 4e 45 4c  -    TCL_CHANNEL
9640: 5f 56 45 52 53 49 4f 4e 5f 32 2c 09 2f 2a 20 76  _VERSION_2,./* v
9650: 32 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 2b 20 20  2 channel */.+  
9660: 20 20 54 43 4c 5f 43 48 41 4e 4e 45 4c 5f 56 45    TCL_CHANNEL_VE
9670: 52 53 49 4f 4e 5f 34 2c 09 2f 2a 20 76 34 20 63  RSION_4,./* v4 c
9680: 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 20 53  hannel */.     S
9690: 65 72 69 61 6c 43 6c 6f 73 65 50 72 6f 63 2c 09  erialCloseProc,.
96a0: 09 2f 2a 20 43 6c 6f 73 65 20 70 72 6f 63 2e 20  ./* Close proc. 
96b0: 2a 2f 0a 20 20 20 20 20 53 65 72 69 61 6c 49 6e  */.     SerialIn
96c0: 70 75 74 50 72 6f 63 2c 09 09 2f 2a 20 49 6e 70  putProc,../* Inp
96d0: 75 74 20 70 72 6f 63 2e 20 2a 2f 0a 20 20 20 20  ut proc. */.    
96e0: 20 53 65 72 69 61 6c 4f 75 74 70 75 74 50 72 6f   SerialOutputPro
96f0: 63 2c 09 09 2f 2a 20 4f 75 74 70 75 74 20 70 72  c,../* Output pr
9700: 6f 63 2e 20 2a 2f 0a 40 40 20 2d 32 32 30 2c 36  oc. */.@@ -220,6
9710: 20 2b 32 32 33 2c 38 20 40 40 0a 20 20 20 20 20   +223,8 @@.     
9720: 53 65 72 69 61 6c 42 6c 6f 63 6b 50 72 6f 63 2c  SerialBlockProc,
9730: 09 09 2f 2a 20 53 65 74 20 62 6c 6f 63 6b 69 6e  ../* Set blockin
9740: 67 20 6f 72 20 6e 6f 6e 2d 62 6c 6f 63 6b 69 6e  g or non-blockin
9750: 67 20 6d 6f 64 65 2e 2a 2f 0a 20 20 20 20 20 4e  g mode.*/.     N
9760: 55 4c 4c 2c 09 09 09 2f 2a 20 66 6c 75 73 68 20  ULL,.../* flush 
9770: 70 72 6f 63 2e 20 2a 2f 0a 20 20 20 20 20 4e 55  proc. */.     NU
9780: 4c 4c 2c 09 09 09 2f 2a 20 68 61 6e 64 6c 65 72  LL,.../* handler
9790: 20 70 72 6f 63 2e 20 2a 2f 0a 2b 20 20 20 20 4e   proc. */.+    N
97a0: 55 4c 4c 2c 20 20 20 20 20 20 20 20 20 20 20 20  ULL,            
97b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 77 69             /* wi
97c0: 64 65 20 73 65 65 6b 20 70 72 6f 63 20 2a 2f 0a  de seek proc */.
97d0: 2b 20 20 20 20 53 65 72 69 61 6c 54 68 72 65 61  +    SerialThrea
97e0: 64 41 63 74 69 6f 6e 50 72 6f 63 2c 20 20 20 20  dActionProc,    
97f0: 20 2f 2a 20 74 68 72 65 61 64 20 61 63 74 69 6f   /* thread actio
9800: 6e 20 70 72 6f 63 20 2a 2f 0a 20 7d 3b 0a 20 0c  n proc */. };. .
9810: 0a 20 2f 2a 0a 40 40 20 2d 31 33 38 34 2c 37 20  . /*.@@ -1384,7 
9820: 2b 31 33 38 39 2c 31 30 20 40 40 0a 20 09 20 2a  +1389,10 @@. . *
9830: 2f 0a 20 0a 20 09 54 63 6c 5f 4d 75 74 65 78 4c  /. . .Tcl_MutexL
9840: 6f 63 6b 28 26 73 65 72 69 61 6c 4d 75 74 65 78  ock(&serialMutex
9850: 29 3b 0a 2b 09 69 66 20 28 69 6e 66 6f 50 74 72  );.+.if (infoPtr
9860: 2d 3e 74 68 72 65 61 64 49 64 20 21 3d 20 4e 55  ->threadId != NU
9870: 4c 4c 29 20 7b 0a 2b 09 20 20 20 20 2f 2a 20 54  LL) {.+.    /* T
9880: 49 50 20 23 32 31 38 2e 20 57 68 65 6e 20 69 6e  IP #218. When in
9890: 20 66 6c 69 67 68 74 20 69 67 6e 6f 72 65 20 74   flight ignore t
98a0: 68 65 20 65 76 65 6e 74 2c 20 6e 6f 20 6f 6e 65  he event, no one
98b0: 20 77 69 6c 6c 20 72 65 63 65 69 76 65 20 69 74   will receive it
98c0: 20 61 6e 79 77 61 79 20 2a 2f 0a 20 09 54 63 6c   anyway */. .Tcl
98d0: 5f 54 68 72 65 61 64 41 6c 65 72 74 28 69 6e 66  _ThreadAlert(inf
98e0: 6f 50 74 72 2d 3e 74 68 72 65 61 64 49 64 29 3b  oPtr->threadId);
98f0: 0a 2b 09 7d 0a 20 09 54 63 6c 5f 4d 75 74 65 78  .+.}. .Tcl_Mutex
9900: 55 6e 6c 6f 63 6b 28 26 73 65 72 69 61 6c 4d 75  Unlock(&serialMu
9910: 74 65 78 29 3b 0a 20 20 20 20 20 7d 0a 20 0a 40  tex);.     }. .@
9920: 40 20 2d 31 34 35 38 2c 31 36 20 2b 31 34 36 36  @ -1458,16 +1466
9930: 2c 32 35 20 40 40 0a 20 20 20 20 20 69 6e 74 20  ,25 @@.     int 
9940: 70 65 72 6d 69 73 73 69 6f 6e 73 3b 0a 20 7b 0a  permissions;. {.
9950: 20 20 20 20 20 53 65 72 69 61 6c 49 6e 66 6f 20       SerialInfo 
9960: 2a 69 6e 66 6f 50 74 72 3b 0a 2d 20 20 20 20 54  *infoPtr;.-    T
9970: 68 72 65 61 64 53 70 65 63 69 66 69 63 44 61 74  hreadSpecificDat
9980: 61 20 2a 74 73 64 50 74 72 3b 0a 20 20 20 20 20  a *tsdPtr;.     
9990: 44 57 4f 52 44 20 69 64 3b 0a 20 0a 2d 20 20 20  DWORD id;. .-   
99a0: 20 74 73 64 50 74 72 20 3d 20 53 65 72 69 61 6c   tsdPtr = Serial
99b0: 49 6e 69 74 28 29 3b 0a 2b 20 20 20 20 53 65 72  Init();.+    Ser
99c0: 69 61 6c 49 6e 69 74 28 29 3b 0a 20 0a 20 20 20  ialInit();. .   
99d0: 20 20 69 6e 66 6f 50 74 72 20 3d 20 28 53 65 72    infoPtr = (Ser
99e0: 69 61 6c 49 6e 66 6f 20 2a 29 20 63 6b 61 6c 6c  ialInfo *) ckall
99f0: 6f 63 28 28 75 6e 73 69 67 6e 65 64 29 20 73 69  oc((unsigned) si
9a00: 7a 65 6f 66 28 53 65 72 69 61 6c 49 6e 66 6f 29  zeof(SerialInfo)
9a10: 29 3b 0a 20 20 20 20 20 6d 65 6d 73 65 74 28 69  );.     memset(i
9a20: 6e 66 6f 50 74 72 2c 20 30 2c 20 73 69 7a 65 6f  nfoPtr, 0, sizeo
9a30: 66 28 53 65 72 69 61 6c 49 6e 66 6f 29 29 3b 0a  f(SerialInfo));.
9a40: 20 0a 20 20 20 20 20 69 6e 66 6f 50 74 72 2d 3e   .     infoPtr->
9a50: 76 61 6c 69 64 4d 61 73 6b 20 3d 20 70 65 72 6d  validMask = perm
9a60: 69 73 73 69 6f 6e 73 3b 0a 20 20 20 20 20 69 6e  issions;.     in
9a70: 66 6f 50 74 72 2d 3e 68 61 6e 64 6c 65 20 3d 20  foPtr->handle = 
9a80: 68 61 6e 64 6c 65 3b 0a 2b 20 20 20 20 69 6e 66  handle;.+    inf
9a90: 6f 50 74 72 2d 3e 63 68 61 6e 6e 65 6c 20 20 20  oPtr->channel   
9aa0: 20 20 20 20 3d 20 28 54 63 6c 5f 43 68 61 6e 6e      = (Tcl_Chann
9ab0: 65 6c 29 20 4e 55 4c 4c 3b 0a 2b 20 20 20 20 69  el) NULL;.+    i
9ac0: 6e 66 6f 50 74 72 2d 3e 72 65 61 64 61 62 6c 65  nfoPtr->readable
9ad0: 20 20 20 20 20 20 3d 20 30 3b 20 0a 2b 20 20 20        = 0; .+   
9ae0: 20 69 6e 66 6f 50 74 72 2d 3e 77 72 69 74 61 62   infoPtr->writab
9af0: 6c 65 20 20 20 20 20 20 3d 20 31 3b 0a 2b 20 20  le      = 1;.+  
9b00: 20 20 69 6e 66 6f 50 74 72 2d 3e 74 6f 57 72 69    infoPtr->toWri
9b10: 74 65 20 20 20 20 20 20 20 3d 20 69 6e 66 6f 50  te       = infoP
9b20: 74 72 2d 3e 77 72 69 74 65 51 75 65 75 65 20 3d  tr->writeQueue =
9b30: 20 30 3b 0a 2b 20 20 20 20 69 6e 66 6f 50 74 72   0;.+    infoPtr
9b40: 2d 3e 62 6c 6f 63 6b 54 69 6d 65 20 20 20 20 20  ->blockTime     
9b50: 3d 20 53 45 52 49 41 4c 5f 44 45 46 41 55 4c 54  = SERIAL_DEFAULT
9b60: 5f 42 4c 4f 43 4b 54 49 4d 45 3b 0a 2b 20 20 20  _BLOCKTIME;.+   
9b70: 20 69 6e 66 6f 50 74 72 2d 3e 6c 61 73 74 45 76   infoPtr->lastEv
9b80: 65 6e 74 54 69 6d 65 20 3d 20 30 3b 0a 2b 20 20  entTime = 0;.+  
9b90: 20 20 69 6e 66 6f 50 74 72 2d 3e 6c 61 73 74 45    infoPtr->lastE
9ba0: 72 72 6f 72 20 20 20 20 20 3d 20 69 6e 66 6f 50  rror     = infoP
9bb0: 74 72 2d 3e 65 72 72 6f 72 20 3d 20 30 3b 0a 2b  tr->error = 0;.+
9bc0: 20 20 20 20 69 6e 66 6f 50 74 72 2d 3e 74 68 72      infoPtr->thr
9bd0: 65 61 64 49 64 20 20 20 20 20 20 3d 20 54 63 6c  eadId      = Tcl
9be0: 5f 47 65 74 43 75 72 72 65 6e 74 54 68 72 65 61  _GetCurrentThrea
9bf0: 64 28 29 3b 0a 2b 20 20 20 20 69 6e 66 6f 50 74  d();.+    infoPt
9c00: 72 2d 3e 73 79 73 42 75 66 52 65 61 64 20 20 20  r->sysBufRead   
9c10: 20 3d 20 34 30 39 36 3b 0a 2b 20 20 20 20 69 6e   = 4096;.+    in
9c20: 66 6f 50 74 72 2d 3e 73 79 73 42 75 66 57 72 69  foPtr->sysBufWri
9c30: 74 65 20 20 20 3d 20 34 30 39 36 3b 0a 20 0a 20  te   = 4096;. . 
9c40: 20 20 20 20 2f 2a 0a 20 20 20 20 20 20 2a 20 55      /*.      * U
9c50: 73 65 20 74 68 65 20 70 6f 69 6e 74 65 72 20 74  se the pointer t
9c60: 6f 20 6b 65 65 70 20 74 68 65 20 63 68 61 6e 6e  o keep the chann
9c70: 65 6c 20 6e 61 6d 65 73 20 75 6e 69 71 75 65 2c  el names unique,
9c80: 20 69 6e 20 63 61 73 65 0a 40 40 20 2d 31 34 37   in case.@@ -147
9c90: 39 2c 31 34 20 2b 31 34 39 36 2c 36 20 40 40 0a  9,14 +1496,6 @@.
9ca0: 20 20 20 20 20 69 6e 66 6f 50 74 72 2d 3e 63 68       infoPtr->ch
9cb0: 61 6e 6e 65 6c 20 3d 20 54 63 6c 5f 43 72 65 61  annel = Tcl_Crea
9cc0: 74 65 43 68 61 6e 6e 65 6c 28 26 73 65 72 69 61  teChannel(&seria
9cd0: 6c 43 68 61 6e 6e 65 6c 54 79 70 65 2c 20 63 68  lChannelType, ch
9ce0: 61 6e 6e 65 6c 4e 61 6d 65 2c 0a 20 09 20 20 20  annelName,. .   
9cf0: 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e   (ClientData) in
9d00: 66 6f 50 74 72 2c 20 70 65 72 6d 69 73 73 69 6f  foPtr, permissio
9d10: 6e 73 29 3b 0a 20 0a 2d 20 20 20 20 69 6e 66 6f  ns);. .-    info
9d20: 50 74 72 2d 3e 72 65 61 64 61 62 6c 65 20 3d 20  Ptr->readable = 
9d30: 30 3b 20 0a 2d 20 20 20 20 69 6e 66 6f 50 74 72  0; .-    infoPtr
9d40: 2d 3e 77 72 69 74 61 62 6c 65 20 3d 20 31 3b 0a  ->writable = 1;.
9d50: 2d 20 20 20 20 69 6e 66 6f 50 74 72 2d 3e 74 6f  -    infoPtr->to
9d60: 57 72 69 74 65 20 3d 20 69 6e 66 6f 50 74 72 2d  Write = infoPtr-
9d70: 3e 77 72 69 74 65 51 75 65 75 65 20 3d 20 30 3b  >writeQueue = 0;
9d80: 0a 2d 20 20 20 20 69 6e 66 6f 50 74 72 2d 3e 62  .-    infoPtr->b
9d90: 6c 6f 63 6b 54 69 6d 65 20 3d 20 53 45 52 49 41  lockTime = SERIA
9da0: 4c 5f 44 45 46 41 55 4c 54 5f 42 4c 4f 43 4b 54  L_DEFAULT_BLOCKT
9db0: 49 4d 45 3b 0a 2d 20 20 20 20 69 6e 66 6f 50 74  IME;.-    infoPt
9dc0: 72 2d 3e 6c 61 73 74 45 76 65 6e 74 54 69 6d 65  r->lastEventTime
9dd0: 20 3d 20 30 3b 0a 2d 20 20 20 20 69 6e 66 6f 50   = 0;.-    infoP
9de0: 74 72 2d 3e 6c 61 73 74 45 72 72 6f 72 20 3d 20  tr->lastError = 
9df0: 69 6e 66 6f 50 74 72 2d 3e 65 72 72 6f 72 20 3d  infoPtr->error =
9e00: 20 30 3b 0a 2d 20 20 20 20 69 6e 66 6f 50 74 72   0;.-    infoPtr
9e10: 2d 3e 74 68 72 65 61 64 49 64 20 3d 20 54 63 6c  ->threadId = Tcl
9e20: 5f 47 65 74 43 75 72 72 65 6e 74 54 68 72 65 61  _GetCurrentThrea
9e30: 64 28 29 3b 0a 2d 20 20 20 20 69 6e 66 6f 50 74  d();.-    infoPt
9e40: 72 2d 3e 73 79 73 42 75 66 52 65 61 64 20 3d 20  r->sysBufRead = 
9e50: 69 6e 66 6f 50 74 72 2d 3e 73 79 73 42 75 66 57  infoPtr->sysBufW
9e60: 72 69 74 65 20 3d 20 34 30 39 36 3b 0a 20 0a 20  rite = 4096;. . 
9e70: 20 20 20 20 53 65 74 75 70 43 6f 6d 6d 28 68 61      SetupComm(ha
9e80: 6e 64 6c 65 2c 20 69 6e 66 6f 50 74 72 2d 3e 73  ndle, infoPtr->s
9e90: 79 73 42 75 66 52 65 61 64 2c 20 69 6e 66 6f 50  ysBufRead, infoP
9ea0: 74 72 2d 3e 73 79 73 42 75 66 57 72 69 74 65 29  tr->sysBufWrite)
9eb0: 3b 0a 20 20 20 20 20 50 75 72 67 65 43 6f 6d 6d  ;.     PurgeComm
9ec0: 28 68 61 6e 64 6c 65 2c 0a 40 40 20 2d 32 31 35  (handle,.@@ -215
9ed0: 38 2c 33 20 2b 32 31 36 37 2c 35 31 20 40 40 0a  8,3 +2167,51 @@.
9ee0: 20 09 09 22 6d 6f 64 65 20 70 6f 6c 6c 69 6e 74   .."mode pollint
9ef0: 65 72 76 61 6c 20 6c 61 73 74 65 72 72 6f 72 20  erval lasterror 
9f00: 71 75 65 75 65 20 73 79 73 62 75 66 66 65 72 20  queue sysbuffer 
9f10: 74 74 79 73 74 61 74 75 73 20 78 63 68 61 72 22  ttystatus xchar"
9f20: 29 3b 0a 20 20 20 20 20 7d 0a 20 7d 0a 2b 0c 0a  );.     }. }.+..
9f30: 2b 2f 2a 0a 2b 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  +/*.+ *---------
9f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2b 20  -------------.+ 
9f80: 2a 0a 2b 20 2a 20 53 65 72 69 61 6c 54 68 72 65  *.+ * SerialThre
9f90: 61 64 41 63 74 69 6f 6e 50 72 6f 63 20 2d 2d 0a  adActionProc --.
9fa0: 2b 20 2a 0a 2b 20 2a 09 49 6e 73 65 72 74 20 6f  + *.+ *.Insert o
9fb0: 72 20 72 65 6d 6f 76 65 20 61 6e 79 20 74 68 72  r remove any thr
9fc0: 65 61 64 20 6c 6f 63 61 6c 20 72 65 66 73 20 74  ead local refs t
9fd0: 6f 20 74 68 69 73 20 63 68 61 6e 6e 65 6c 2e 0a  o this channel..
9fe0: 2b 20 2a 0a 2b 20 2a 20 52 65 73 75 6c 74 73 3a  + *.+ * Results:
9ff0: 0a 2b 20 2a 09 4e 6f 6e 65 2e 0a 2b 20 2a 0a 2b  .+ *.None..+ *.+
a000: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
a010: 0a 2b 20 2a 09 43 68 61 6e 67 65 73 20 74 68 72  .+ *.Changes thr
a020: 65 61 64 20 6c 6f 63 61 6c 20 6c 69 73 74 20 6f  ead local list o
a030: 66 20 76 61 6c 69 64 20 63 68 61 6e 6e 65 6c 73  f valid channels
a040: 2e 0a 2b 20 2a 0a 2b 20 2a 2d 2d 2d 2d 2d 2d 2d  ..+ *.+ *-------
a050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
a090: 2b 20 2a 2f 0a 2b 0a 2b 73 74 61 74 69 63 20 76  + */.+.+static v
a0a0: 6f 69 64 0a 2b 53 65 72 69 61 6c 54 68 72 65 61  oid.+SerialThrea
a0b0: 64 41 63 74 69 6f 6e 50 72 6f 63 20 28 69 6e 73  dActionProc (ins
a0c0: 74 61 6e 63 65 44 61 74 61 2c 20 61 63 74 69 6f  tanceData, actio
a0d0: 6e 29 0a 2b 20 20 20 20 20 43 6c 69 65 6e 74 44  n).+     ClientD
a0e0: 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61  ata instanceData
a0f0: 3b 0a 2b 20 20 20 20 20 69 6e 74 20 61 63 74 69  ;.+     int acti
a100: 6f 6e 3b 0a 2b 7b 0a 2b 20 20 20 20 53 65 72 69  on;.+{.+    Seri
a110: 61 6c 49 6e 66 6f 20 2a 69 6e 66 6f 50 74 72 20  alInfo *infoPtr 
a120: 3d 20 28 53 65 72 69 61 6c 49 6e 66 6f 20 2a 29  = (SerialInfo *)
a130: 20 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 2b   instanceData;.+
a140: 0a 2b 20 20 20 20 2f 2a 20 57 65 20 64 6f 20 6e  .+    /* We do n
a150: 6f 74 20 61 63 63 65 73 73 20 66 69 72 73 74 53  ot access firstS
a160: 65 72 69 61 6c 50 74 72 20 69 6e 20 74 68 65 20  erialPtr in the 
a170: 74 68 72 65 61 64 20 73 74 72 75 63 74 75 72 65  thread structure
a180: 73 2e 20 54 68 69 73 20 69 73 0a 2b 20 20 20 20  s. This is.+    
a190: 20 2a 20 6e 6f 74 20 66 6f 72 20 61 6c 6c 20 73   * not for all s
a1a0: 65 72 69 61 6c 73 20 6d 61 6e 61 67 65 64 20 62  erials managed b
a1b0: 79 20 74 68 65 20 74 68 72 65 61 64 2c 20 62 75  y the thread, bu
a1c0: 74 20 6f 6e 6c 79 20 74 68 6f 73 65 20 77 65 20  t only those we 
a1d0: 61 72 65 0a 2b 20 20 20 20 20 2a 20 77 61 74 63  are.+     * watc
a1e0: 68 69 6e 67 2e 20 52 65 6d 6f 76 61 6c 20 6f 66  hing. Removal of
a1f0: 20 74 68 65 20 66 69 6c 65 76 65 6e 74 20 68 61   the filevent ha
a200: 6e 64 6c 65 72 73 20 62 65 66 6f 72 65 20 74 72  ndlers before tr
a210: 61 6e 73 66 65 72 20 74 68 75 73 0a 2b 20 20 20  ansfer thus.+   
a220: 20 20 2a 20 74 61 6b 65 73 20 63 61 72 65 20 6f    * takes care o
a230: 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  f this structure
a240: 2e 0a 2b 20 20 20 20 20 2a 2f 0a 2b 0a 2b 20 20  ..+     */.+.+  
a250: 20 20 54 63 6c 5f 4d 75 74 65 78 4c 6f 63 6b 28    Tcl_MutexLock(
a260: 26 73 65 72 69 61 6c 4d 75 74 65 78 29 3b 0a 2b  &serialMutex);.+
a270: 20 20 20 20 69 66 20 28 61 63 74 69 6f 6e 20 3d      if (action =
a280: 3d 20 54 43 4c 5f 43 48 41 4e 4e 45 4c 5f 54 48  = TCL_CHANNEL_TH
a290: 52 45 41 44 5f 49 4e 53 45 52 54 29 20 7b 0a 2b  READ_INSERT) {.+
a2a0: 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 63 61          /* We ca
a2b0: 6e 27 74 20 63 6f 70 79 20 74 68 65 20 74 68 72  n't copy the thr
a2c0: 65 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ead information 
a2d0: 66 72 6f 6d 20 74 68 65 20 63 68 61 6e 6e 65 6c  from the channel
a2e0: 20 77 68 65 6e 0a 2b 09 20 2a 20 74 68 65 20 63   when.+. * the c
a2f0: 68 61 6e 6e 65 6c 20 69 73 20 63 72 65 61 74 65  hannel is create
a300: 64 2e 20 41 74 20 74 68 69 73 20 74 69 6d 65 20  d. At this time 
a310: 74 68 65 20 63 68 61 6e 6e 65 6c 20 62 61 63 6b  the channel back
a320: 0a 2b 09 20 2a 20 70 6f 69 6e 74 65 72 20 68 61  .+. * pointer ha
a330: 73 20 6e 6f 74 20 62 65 65 6e 20 73 65 74 20 79  s not been set y
a340: 65 74 2e 20 48 6f 77 65 76 65 72 20 69 6e 20 74  et. However in t
a350: 68 61 74 20 63 61 73 65 20 74 68 65 0a 2b 09 20  hat case the.+. 
a360: 2a 20 74 68 72 65 61 64 49 64 20 68 61 73 20 61  * threadId has a
a370: 6c 72 65 61 64 79 20 62 65 65 6e 20 73 65 74 20  lready been set 
a380: 62 79 20 54 63 6c 70 43 72 65 61 74 65 43 6f 6d  by TclpCreateCom
a390: 6d 61 6e 64 43 68 61 6e 6e 65 6c 0a 2b 09 20 2a  mandChannel.+. *
a3a0: 20 69 74 73 65 6c 66 2c 20 73 6f 20 74 68 65 20   itself, so the 
a3b0: 73 74 72 75 63 74 75 72 65 20 69 73 20 73 74 69  structure is sti
a3c0: 6c 6c 20 67 6f 6f 64 2e 0a 2b 09 20 2a 2f 0a 2b  ll good..+. */.+
a3d0: 0a 2b 20 20 20 20 20 20 20 20 53 65 72 69 61 6c  .+        Serial
a3e0: 49 6e 69 74 20 28 29 3b 0a 2b 20 20 20 20 20 20  Init ();.+      
a3f0: 20 20 69 66 20 28 69 6e 66 6f 50 74 72 2d 3e 63    if (infoPtr->c
a400: 68 61 6e 6e 65 6c 20 21 3d 20 4e 55 4c 4c 29 20  hannel != NULL) 
a410: 7b 0a 2b 09 20 20 20 20 69 6e 66 6f 50 74 72 2d  {.+.    infoPtr-
a420: 3e 74 68 72 65 61 64 49 64 20 3d 20 54 63 6c 5f  >threadId = Tcl_
a430: 47 65 74 43 68 61 6e 6e 65 6c 54 68 72 65 61 64  GetChannelThread
a440: 20 28 69 6e 66 6f 50 74 72 2d 3e 63 68 61 6e 6e   (infoPtr->chann
a450: 65 6c 29 3b 0a 2b 09 7d 0a 2b 20 20 20 20 7d 20  el);.+.}.+    } 
a460: 65 6c 73 65 20 7b 0a 2b 09 69 6e 66 6f 50 74 72  else {.+.infoPtr
a470: 2d 3e 74 68 72 65 61 64 49 64 20 3d 20 4e 55 4c  ->threadId = NUL
a480: 4c 3b 0a 2b 20 20 20 20 7d 0a 2b 20 20 20 20 54  L;.+    }.+    T
a490: 63 6c 5f 4d 75 74 65 78 55 6e 6c 6f 63 6b 28 26  cl_MutexUnlock(&
a4a0: 73 65 72 69 61 6c 4d 75 74 65 78 29 3b 0a 2b 7d  serialMutex);.+}
a4b0: 0a 49 6e 64 65 78 3a 20 77 69 6e 2f 74 63 6c 57  .Index: win/tclW
a4c0: 69 6e 53 6f 63 6b 2e 63 0a 3d 3d 3d 3d 3d 3d 3d  inSock.c.=======
a4d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
a4e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
a4f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
a500: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 52 43 53  ============.RCS
a510: 20 66 69 6c 65 3a 20 2f 63 76 73 72 6f 6f 74 2f   file: /cvsroot/
a520: 74 63 6c 2f 74 63 6c 2f 77 69 6e 2f 74 63 6c 57  tcl/tcl/win/tclW
a530: 69 6e 53 6f 63 6b 2e 63 2c 76 0a 72 65 74 72 69  inSock.c,v.retri
a540: 65 76 69 6e 67 20 72 65 76 69 73 69 6f 6e 20 31  eving revision 1
a550: 2e 34 34 0a 64 69 66 66 20 2d 77 20 2d 75 20 2d  .44.diff -w -u -
a560: 72 31 2e 34 34 20 74 63 6c 57 69 6e 53 6f 63 6b  r1.44 tclWinSock
a570: 2e 63 0a 2d 2d 2d 20 77 69 6e 2f 74 63 6c 57 69  .c.--- win/tclWi
a580: 6e 53 6f 63 6b 2e 63 09 36 20 4f 63 74 20 32 30  nSock.c.6 Oct 20
a590: 30 34 20 31 34 3a 33 39 3a 32 30 20 2d 30 30 30  04 14:39:20 -000
a5a0: 30 09 31 2e 34 34 0a 2b 2b 2b 20 77 69 6e 2f 74  0.1.44.+++ win/t
a5b0: 63 6c 57 69 6e 53 6f 63 6b 2e 63 09 32 36 20 4a  clWinSock.c.26 J
a5c0: 61 6e 20 32 30 30 35 20 32 33 3a 33 36 3a 35 32  an 2005 23:36:52
a5d0: 20 2d 30 30 30 30 0a 40 40 20 2d 32 36 35 2c 36   -0000.@@ -265,6
a5e0: 20 2b 32 36 35 2c 31 30 20 40 40 0a 20 09 09 09   +265,10 @@. ...
a5f0: 09 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65 50  .int *errorCodeP
a600: 74 72 29 29 3b 0a 20 73 74 61 74 69 63 20 44 57  tr));. static DW
a610: 4f 52 44 20 57 49 4e 41 50 49 09 20 20 20 20 53  ORD WINAPI.    S
a620: 6f 63 6b 65 74 54 68 72 65 61 64 20 5f 41 4e 53  ocketThread _ANS
a630: 49 5f 41 52 47 53 5f 28 28 4c 50 56 4f 49 44 20  I_ARGS_((LPVOID 
a640: 61 72 67 29 29 3b 0a 20 0a 2b 73 74 61 74 69 63  arg));. .+static
a650: 20 76 6f 69 64 20 20 20 20 20 20 20 20 20 20 20   void           
a660: 20 20 54 63 70 54 68 72 65 61 64 41 63 74 69 6f    TcpThreadActio
a670: 6e 50 72 6f 63 20 5f 41 4e 53 49 5f 41 52 47 53  nProc _ANSI_ARGS
a680: 5f 20 28 28 0a 2b 09 09 09 20 20 20 43 6c 69 65  _ ((.+...   Clie
a690: 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44  ntData instanceD
a6a0: 61 74 61 2c 20 69 6e 74 20 61 63 74 69 6f 6e 29  ata, int action)
a6b0: 29 3b 0a 2b 0a 2b 0a 20 2f 2a 0a 20 20 2a 20 54  );.+.+. /*.  * T
a6c0: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 64 65  his structure de
a6d0: 73 63 72 69 62 65 73 20 74 68 65 20 63 68 61 6e  scribes the chan
a6e0: 6e 65 6c 20 74 79 70 65 20 73 74 72 75 63 74 75  nel type structu
a6f0: 72 65 20 66 6f 72 20 54 43 50 20 73 6f 63 6b 65  re for TCP socke
a700: 74 0a 20 20 2a 20 62 61 73 65 64 20 49 4f 2e 0a  t.  * based IO..
a710: 40 40 20 2d 32 37 32 2c 37 20 2b 32 37 36 2c 37  @@ -272,7 +276,7
a720: 20 40 40 0a 20 0a 20 73 74 61 74 69 63 20 54 63   @@. . static Tc
a730: 6c 5f 43 68 61 6e 6e 65 6c 54 79 70 65 20 74 63  l_ChannelType tc
a740: 70 43 68 61 6e 6e 65 6c 54 79 70 65 20 3d 20 7b  pChannelType = {
a750: 0a 20 20 20 20 20 22 74 63 70 22 2c 09 09 20 20  .     "tcp",..  
a760: 20 20 2f 2a 20 54 79 70 65 20 6e 61 6d 65 2e 20    /* Type name. 
a770: 2a 2f 0a 2d 20 20 20 20 54 43 4c 5f 43 48 41 4e  */.-    TCL_CHAN
a780: 4e 45 4c 5f 56 45 52 53 49 4f 4e 5f 32 2c 20 20  NEL_VERSION_2,  
a790: 2f 2a 20 76 32 20 63 68 61 6e 6e 65 6c 20 2a 2f  /* v2 channel */
a7a0: 0a 2b 20 20 20 20 54 43 4c 5f 43 48 41 4e 4e 45  .+    TCL_CHANNE
a7b0: 4c 5f 56 45 52 53 49 4f 4e 5f 34 2c 20 20 2f 2a  L_VERSION_4,  /*
a7c0: 20 76 34 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20   v4 channel */. 
a7d0: 20 20 20 20 54 63 70 43 6c 6f 73 65 50 72 6f 63      TcpCloseProc
a7e0: 2c 09 20 20 20 20 2f 2a 20 43 6c 6f 73 65 20 70  ,.    /* Close p
a7f0: 72 6f 63 2e 20 2a 2f 0a 20 20 20 20 20 54 63 70  roc. */.     Tcp
a800: 49 6e 70 75 74 50 72 6f 63 2c 09 20 20 20 20 2f  InputProc,.    /
a810: 2a 20 49 6e 70 75 74 20 70 72 6f 63 2e 20 2a 2f  * Input proc. */
a820: 0a 20 20 20 20 20 54 63 70 4f 75 74 70 75 74 50  .     TcpOutputP
a830: 72 6f 63 2c 09 20 20 20 20 2f 2a 20 4f 75 74 70  roc,.    /* Outp
a840: 75 74 20 70 72 6f 63 2e 20 2a 2f 0a 40 40 20 2d  ut proc. */.@@ -
a850: 32 38 35 2c 36 20 2b 32 38 39 2c 38 20 40 40 0a  285,6 +289,8 @@.
a860: 20 20 20 20 20 54 63 70 42 6c 6f 63 6b 50 72 6f       TcpBlockPro
a870: 63 2c 09 20 20 20 20 2f 2a 20 53 65 74 20 73 6f  c,.    /* Set so
a880: 63 6b 65 74 20 69 6e 74 6f 20 28 6e 6f 6e 2d 29  cket into (non-)
a890: 62 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2e 20 2a  blocking mode. *
a8a0: 2f 0a 20 20 20 20 20 4e 55 4c 4c 2c 09 09 20 20  /.     NULL,..  
a8b0: 20 20 2f 2a 20 66 6c 75 73 68 20 70 72 6f 63 2e    /* flush proc.
a8c0: 20 2a 2f 0a 20 20 20 20 20 4e 55 4c 4c 2c 09 09   */.     NULL,..
a8d0: 20 20 20 20 2f 2a 20 68 61 6e 64 6c 65 72 20 70      /* handler p
a8e0: 72 6f 63 2e 20 2a 2f 0a 2b 20 20 20 20 4e 55 4c  roc. */.+    NUL
a8f0: 4c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  L,              
a900: 20 20 20 20 20 2f 2a 20 77 69 64 65 20 73 65 65       /* wide see
a910: 6b 20 70 72 6f 63 20 2a 2f 0a 2b 20 20 20 20 54  k proc */.+    T
a920: 63 70 54 68 72 65 61 64 41 63 74 69 6f 6e 50 72  cpThreadActionPr
a930: 6f 63 2c 20 20 20 20 2f 2a 20 74 68 72 65 61 64  oc,    /* thread
a940: 20 61 63 74 69 6f 6e 20 70 72 6f 63 20 2a 2f 0a   action proc */.
a950: 20 7d 3b 0a 20 0a 20 0c 0a 40 40 20 2d 39 37 30   };. . ..@@ -970
a960: 2c 37 20 2b 39 37 36 2c 37 20 40 40 0a 20 20 20  ,7 +976,7 @@.   
a970: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
a980: 74 65 72 70 3b 09 09 2f 2a 20 55 6e 75 73 65 64  terp;../* Unused
a990: 2e 20 2a 2f 0a 20 7b 0a 20 20 20 20 20 53 6f 63  . */. {.     Soc
a9a0: 6b 65 74 49 6e 66 6f 20 2a 69 6e 66 6f 50 74 72  ketInfo *infoPtr
a9b0: 20 3d 20 28 53 6f 63 6b 65 74 49 6e 66 6f 20 2a   = (SocketInfo *
a9c0: 29 20 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a  ) instanceData;.
a9d0: 2d 20 20 20 20 53 6f 63 6b 65 74 49 6e 66 6f 20  -    SocketInfo 
a9e0: 2a 2a 6e 65 78 74 50 74 72 50 74 72 3b 0a 2b 20  **nextPtrPtr;.+ 
a9f0: 20 20 20 2f 2a 20 54 49 50 20 23 32 31 38 20 2a     /* TIP #218 *
aa00: 2f 0a 20 20 20 20 20 69 6e 74 20 65 72 72 6f 72  /.     int error
aa10: 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 54  Code = 0;.     T
aa20: 68 72 65 61 64 53 70 65 63 69 66 69 63 44 61 74  hreadSpecificDat
aa30: 61 20 2a 74 73 64 50 74 72 20 3d 20 54 43 4c 5f  a *tsdPtr = TCL_
aa40: 54 53 44 5f 49 4e 49 54 28 26 64 61 74 61 4b 65  TSD_INIT(&dataKe
aa50: 79 29 3b 0a 20 0a 40 40 20 2d 39 39 35 2c 32 30  y);. .@@ -995,20
aa60: 20 2b 31 30 30 31 2c 31 32 20 40 40 0a 20 20 20   +1001,12 @@.   
aa70: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 7d 0a 20        }.     }. 
aa80: 0a 2d 20 20 20 20 2f 2a 0a 2d 20 20 20 20 20 2a  .-    /*.-     *
aa90: 20 52 65 6d 6f 76 65 20 74 68 65 20 73 6f 63 6b   Remove the sock
aaa0: 65 74 20 66 72 6f 6d 20 73 6f 63 6b 65 74 4c 69  et from socketLi
aab0: 73 74 2e 0a 2b 20 20 20 20 2f 2a 20 54 49 50 20  st..+    /* TIP 
aac0: 23 32 31 38 2e 20 52 65 6d 6f 76 65 64 20 74 68  #218. Removed th
aad0: 65 20 63 6f 64 65 20 72 65 6d 6f 76 69 6e 67 20  e code removing 
aae0: 74 68 65 20 73 74 72 75 63 74 75 72 65 0a 2b 20  the structure.+ 
aaf0: 20 20 20 20 2a 20 66 72 6f 6d 20 74 68 65 20 67      * from the g
ab00: 6c 6f 62 61 6c 20 73 6f 63 6b 65 74 20 6c 69 73  lobal socket lis
ab10: 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 77 20 64  t. This is now d
ab20: 6f 6e 65 20 62 79 0a 2b 20 20 20 20 20 2a 20 74  one by.+     * t
ab30: 68 65 20 74 68 72 65 61 64 20 61 63 74 69 6f 6e  he thread action
ab40: 20 63 61 6c 6c 62 61 63 6b 73 2c 20 61 6e 64 20   callbacks, and 
ab50: 6f 6e 6c 79 20 74 68 65 72 65 2e 20 54 68 69 73  only there. This
ab60: 0a 2b 20 20 20 20 20 2a 20 68 61 70 70 65 6e 73  .+     * happens
ab70: 20 62 65 66 6f 72 65 20 74 68 69 73 20 63 6f 64   before this cod
ab80: 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 57 65 20  e is called. We 
ab90: 63 61 6e 20 66 72 65 65 0a 2b 20 20 20 20 20 2a  can free.+     *
aba0: 20 77 69 74 68 6f 75 74 20 66 65 61 72 20 6f 66   without fear of
abb0: 20 64 61 6d 61 67 69 6e 67 20 74 68 65 20 6c 69   damaging the li
abc0: 73 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 2d 0a 2d  st..      */.-.-
abd0: 20 20 20 20 57 61 69 74 46 6f 72 53 69 6e 67 6c      WaitForSingl
abe0: 65 4f 62 6a 65 63 74 28 74 73 64 50 74 72 2d 3e  eObject(tsdPtr->
abf0: 73 6f 63 6b 65 74 4c 69 73 74 4c 6f 63 6b 2c 20  socketListLock, 
ac00: 49 4e 46 49 4e 49 54 45 29 3b 0a 2d 20 20 20 20  INFINITE);.-    
ac10: 66 6f 72 20 28 6e 65 78 74 50 74 72 50 74 72 20  for (nextPtrPtr 
ac20: 3d 20 26 28 74 73 64 50 74 72 2d 3e 73 6f 63 6b  = &(tsdPtr->sock
ac30: 65 74 4c 69 73 74 29 3b 20 28 2a 6e 65 78 74 50  etList); (*nextP
ac40: 74 72 50 74 72 29 20 21 3d 20 4e 55 4c 4c 3b 0a  trPtr) != NULL;.
ac50: 2d 09 20 6e 65 78 74 50 74 72 50 74 72 20 3d 20  -. nextPtrPtr = 
ac60: 26 28 28 2a 6e 65 78 74 50 74 72 50 74 72 29 2d  &((*nextPtrPtr)-
ac70: 3e 6e 65 78 74 50 74 72 29 29 20 7b 0a 2d 09 69  >nextPtr)) {.-.i
ac80: 66 20 28 28 2a 6e 65 78 74 50 74 72 50 74 72 29  f ((*nextPtrPtr)
ac90: 20 3d 3d 20 69 6e 66 6f 50 74 72 29 20 7b 0a 2d   == infoPtr) {.-
aca0: 09 20 20 20 20 28 2a 6e 65 78 74 50 74 72 50 74  .    (*nextPtrPt
acb0: 72 29 20 3d 20 69 6e 66 6f 50 74 72 2d 3e 6e 65  r) = infoPtr->ne
acc0: 78 74 50 74 72 3b 0a 2d 09 20 20 20 20 62 72 65  xtPtr;.-.    bre
acd0: 61 6b 3b 0a 2d 09 7d 0a 2d 20 20 20 20 7d 0a 2d  ak;.-.}.-    }.-
ace0: 20 20 20 20 0a 2d 20 20 20 20 53 65 74 45 76 65      .-    SetEve
acf0: 6e 74 28 74 73 64 50 74 72 2d 3e 73 6f 63 6b 65  nt(tsdPtr->socke
ad00: 74 4c 69 73 74 4c 6f 63 6b 29 3b 0a 20 20 20 20  tListLock);.    
ad10: 20 63 6b 66 72 65 65 28 28 63 68 61 72 20 2a 29   ckfree((char *)
ad20: 20 69 6e 66 6f 50 74 72 29 3b 0a 20 20 20 20 20   infoPtr);.     
ad30: 72 65 74 75 72 6e 20 65 72 72 6f 72 43 6f 64 65  return errorCode
ad40: 3b 0a 20 7d 0a 40 40 20 2d 31 30 32 35 2c 37 20  ;. }.@@ -1025,7 
ad50: 2b 31 30 32 33 2c 37 20 40 40 0a 20 20 2a 09 52  +1023,7 @@.  *.R
ad60: 65 74 75 72 6e 73 20 61 20 6e 65 77 6c 79 20 61  eturns a newly a
ad70: 6c 6c 6f 63 61 74 65 64 20 53 6f 63 6b 65 74 49  llocated SocketI
ad80: 6e 66 6f 2e 0a 20 20 2a 0a 20 20 2a 20 53 69 64  nfo..  *.  * Sid
ad90: 65 20 65 66 66 65 63 74 73 3a 0a 2d 20 2a 09 41  e effects:.- *.A
ada0: 64 64 73 20 74 68 65 20 73 6f 63 6b 65 74 20 74  dds the socket t
adb0: 6f 20 74 68 65 20 67 6c 6f 62 61 6c 20 73 6f 63  o the global soc
adc0: 6b 65 74 20 6c 69 73 74 2e 0a 2b 20 2a 09 4e 6f  ket list..+ *.No
add0: 6e 65 2c 20 65 78 63 65 70 74 20 66 6f 72 20 61  ne, except for a
ade0: 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 6d 65 6d  llocation of mem
adf0: 6f 72 79 2e 0a 20 20 2a 0a 20 20 2a 2d 2d 2d 2d  ory..  *.  *----
ae00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ae10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ae20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ae30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ae40: 2d 2d 0a 20 20 2a 2f 0a 40 40 20 2d 31 30 34 39  --.  */.@@ -1049
ae50: 2c 31 30 20 2b 31 30 34 37 2c 31 31 20 40 40 0a  ,10 +1047,11 @@.
ae60: 20 20 20 20 20 69 6e 66 6f 50 74 72 2d 3e 61 63       infoPtr->ac
ae70: 63 65 70 74 50 72 6f 63 44 61 74 61 20 3d 20 4e  ceptProcData = N
ae80: 55 4c 4c 3b 0a 20 20 20 20 20 69 6e 66 6f 50 74  ULL;.     infoPt
ae90: 72 2d 3e 6c 61 73 74 45 72 72 6f 72 20 3d 20 30  r->lastError = 0
aea0: 3b 0a 20 0a 2d 20 20 20 20 57 61 69 74 46 6f 72  ;. .-    WaitFor
aeb0: 53 69 6e 67 6c 65 4f 62 6a 65 63 74 28 74 73 64  SingleObject(tsd
aec0: 50 74 72 2d 3e 73 6f 63 6b 65 74 4c 69 73 74 4c  Ptr->socketListL
aed0: 6f 63 6b 2c 20 49 4e 46 49 4e 49 54 45 29 3b 0a  ock, INFINITE);.
aee0: 2d 20 20 20 20 69 6e 66 6f 50 74 72 2d 3e 6e 65  -    infoPtr->ne
aef0: 78 74 50 74 72 20 3d 20 74 73 64 50 74 72 2d 3e  xtPtr = tsdPtr->
af00: 73 6f 63 6b 65 74 4c 69 73 74 3b 0a 2d 20 20 20  socketList;.-   
af10: 20 74 73 64 50 74 72 2d 3e 73 6f 63 6b 65 74 4c   tsdPtr->socketL
af20: 69 73 74 20 3d 20 69 6e 66 6f 50 74 72 3b 0a 2d  ist = infoPtr;.-
af30: 20 20 20 20 53 65 74 45 76 65 6e 74 28 74 73 64      SetEvent(tsd
af40: 50 74 72 2d 3e 73 6f 63 6b 65 74 4c 69 73 74 4c  Ptr->socketListL
af50: 6f 63 6b 29 3b 0a 2b 20 20 20 20 2f 2a 20 54 49  ock);.+    /* TI
af60: 50 20 23 32 31 38 2e 20 52 65 6d 6f 76 65 64 20  P #218. Removed 
af70: 74 68 65 20 63 6f 64 65 20 69 6e 73 65 72 74 69  the code inserti
af80: 6e 67 20 74 68 65 20 6e 65 77 20 73 74 72 75 63  ng the new struc
af90: 74 75 72 65 0a 2b 20 20 20 20 20 2a 20 69 6e 74  ture.+     * int
afa0: 6f 20 74 68 65 20 67 6c 6f 62 61 6c 20 6c 69 73  o the global lis
afb0: 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 77 20 68  t. This is now h
afc0: 61 6e 64 6c 65 64 20 69 6e 20 74 68 65 20 74 68  andled in the th
afd0: 72 65 61 64 0a 2b 20 20 20 20 20 2a 20 61 63 74  read.+     * act
afe0: 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 73 2c 20 61  ion callbacks, a
aff0: 6e 64 20 6f 6e 6c 79 20 74 68 65 72 65 2e 0a 2b  nd only there..+
b000: 20 20 20 20 20 2a 2f 0a 2b 20 20 20 20 69 6e 66       */.+    inf
b010: 6f 50 74 72 2d 3e 6e 65 78 74 50 74 72 20 3d 20  oPtr->nextPtr = 
b020: 4e 55 4c 4c 3b 0a 20 20 20 20 20 0a 20 20 20 20  NULL;.     .    
b030: 20 72 65 74 75 72 6e 20 69 6e 66 6f 50 74 72 3b   return infoPtr;
b040: 0a 20 7d 0a 40 40 20 2d 31 30 36 39 2c 37 20 2b  . }.@@ -1069,7 +
b050: 31 30 36 38 2c 37 20 40 40 0a 20 20 2a 09 52 65  1068,7 @@.  *.Re
b060: 74 75 72 6e 73 20 61 20 6e 65 77 20 53 6f 63 6b  turns a new Sock
b070: 65 74 49 6e 66 6f 2c 20 6f 72 20 4e 55 4c 4c 20  etInfo, or NULL 
b080: 77 69 74 68 20 61 6e 20 65 72 72 6f 72 20 69 6e  with an error in
b090: 20 69 6e 74 65 72 70 2e 0a 20 20 2a 0a 20 20 2a   interp..  *.  *
b0a0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 2d   Side effects:.-
b0b0: 20 2a 09 41 64 64 73 20 61 20 6e 65 77 20 73 6f   *.Adds a new so
b0c0: 63 6b 65 74 20 74 6f 20 74 68 65 20 73 6f 63 6b  cket to the sock
b0d0: 65 74 4c 69 73 74 2e 0a 2b 20 2a 09 4e 6f 6e 65  etList..+ *.None
b0e0: 2c 20 65 78 63 65 70 74 20 66 6f 72 20 61 6c 6c  , except for all
b0f0: 6f 63 61 74 69 6f 6e 20 6f 66 20 6d 65 6d 6f 72  ocation of memor
b100: 79 2e 0a 20 20 2a 0a 20 20 2a 2d 2d 2d 2d 2d 2d  y..  *.  *------
b110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b150: 0a 20 20 2a 2f 0a 40 40 20 2d 32 36 36 36 2c 31  .  */.@@ -2666,1
b160: 35 20 2b 32 36 36 35 2c 31 32 20 40 40 0a 20 20  5 +2665,12 @@.  
b170: 20 20 20 72 65 74 75 72 6e 20 77 69 6e 53 6f 63     return winSoc
b180: 6b 2e 67 65 74 73 65 72 76 62 79 6e 61 6d 65 28  k.getservbyname(
b190: 6e 61 6d 65 2c 20 70 72 6f 74 6f 29 3b 0a 20 7d  name, proto);. }
b1a0: 0a 20 0a 2d 0a 2d 0c 0a 20 2f 2a 0a 20 20 2a 2d  . .-.-.. /*.  *-
b1b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b1c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b1d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b1e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b1f0: 2d 2d 2d 2d 2d 0a 20 20 2a 0a 2d 20 2a 20 54 63  -----.  *.- * Tc
b200: 6c 70 43 75 74 53 6f 63 6b 43 68 61 6e 6e 65 6c  lpCutSockChannel
b210: 20 2d 2d 0a 2b 20 2a 20 54 63 70 54 68 72 65 61   --.+ * TcpThrea
b220: 64 41 63 74 69 6f 6e 50 72 6f 63 20 2d 2d 0a 20  dActionProc --. 
b230: 20 2a 0a 2d 20 2a 09 52 65 6d 6f 76 65 20 61 6e   *.- *.Remove an
b240: 79 20 74 68 72 65 61 64 20 6c 6f 63 61 6c 20 72  y thread local r
b250: 65 66 73 20 74 6f 20 74 68 69 73 20 63 68 61 6e  efs to this chan
b260: 6e 65 6c 2e 20 53 65 65 0a 2d 20 2a 09 54 63 6c  nel. See.- *.Tcl
b270: 5f 43 75 74 43 68 61 6e 6e 65 6c 20 66 6f 72 20  _CutChannel for 
b280: 6d 6f 72 65 20 69 6e 66 6f 2e 0a 2b 20 2a 09 49  more info..+ *.I
b290: 6e 73 65 72 74 20 6f 72 20 72 65 6d 6f 76 65 20  nsert or remove 
b2a0: 61 6e 79 20 74 68 72 65 61 64 20 6c 6f 63 61 6c  any thread local
b2b0: 20 72 65 66 73 20 74 6f 20 74 68 69 73 20 63 68   refs to this ch
b2c0: 61 6e 6e 65 6c 2e 0a 20 20 2a 0a 20 20 2a 20 52  annel..  *.  * R
b2d0: 65 73 75 6c 74 73 3a 0a 20 20 2a 09 4e 6f 6e 65  esults:.  *.None
b2e0: 2e 0a 40 40 20 2d 32 36 38 35 2c 33 31 20 2b 32  ..@@ -2685,31 +2
b2f0: 36 38 31 2c 34 31 20 40 40 0a 20 20 2a 2d 2d 2d  681,41 @@.  *---
b300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b340: 2d 2d 2d 0a 20 20 2a 2f 0a 20 0a 2d 76 6f 69 64  ---.  */. .-void
b350: 0a 2d 54 63 6c 70 43 75 74 53 6f 63 6b 43 68 61  .-TclpCutSockCha
b360: 6e 6e 65 6c 28 63 68 61 6e 29 0a 2d 20 20 20 20  nnel(chan).-    
b370: 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e  Tcl_Channel chan
b380: 3b 09 09 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e  ;.../* The chann
b390: 65 6c 20 62 65 69 6e 67 20 72 65 6d 6f 76 65 64  el being removed
b3a0: 2e 20 4d 75 73 74 0a 2d 20 20 20 20 20 20 20 20  . Must.-        
b3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b3d0: 20 2a 20 6e 6f 74 20 62 65 20 72 65 66 65 72 65   * not be refere
b3e0: 6e 63 65 64 20 69 6e 20 61 6e 79 0a 2d 20 20 20  nced in any.-   
b3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b410: 20 20 20 20 20 20 2a 20 69 6e 74 65 72 70 72 65        * interpre
b420: 74 65 72 2e 20 2a 2f 0a 2b 73 74 61 74 69 63 20  ter. */.+static 
b430: 76 6f 69 64 0a 2b 54 63 70 54 68 72 65 61 64 41  void.+TcpThreadA
b440: 63 74 69 6f 6e 50 72 6f 63 20 28 69 6e 73 74 61  ctionProc (insta
b450: 6e 63 65 44 61 74 61 2c 20 61 63 74 69 6f 6e 29  nceData, action)
b460: 0a 2b 20 20 20 20 20 43 6c 69 65 6e 74 44 61 74  .+     ClientDat
b470: 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a  a instanceData;.
b480: 2b 20 20 20 20 20 69 6e 74 20 61 63 74 69 6f 6e  +     int action
b490: 3b 0a 20 7b 0a 20 20 20 20 20 54 68 72 65 61 64  ;. {.     Thread
b4a0: 53 70 65 63 69 66 69 63 44 61 74 61 20 2a 74 73  SpecificData *ts
b4b0: 64 50 74 72 3b 0a 2d 20 20 20 20 53 6f 63 6b 65  dPtr;.-    Socke
b4c0: 74 49 6e 66 6f 20 2a 69 6e 66 6f 50 74 72 3b 0a  tInfo *infoPtr;.
b4d0: 2d 20 20 20 20 53 6f 63 6b 65 74 49 6e 66 6f 20  -    SocketInfo 
b4e0: 2a 2a 6e 65 78 74 50 74 72 50 74 72 3b 0a 2d 20  **nextPtrPtr;.- 
b4f0: 20 20 20 69 6e 74 20 72 65 6d 6f 76 65 64 20 3d     int removed =
b500: 20 30 3b 0a 2d 0a 2d 20 20 20 20 69 66 20 28 54   0;.-.-    if (T
b510: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70  cl_GetChannelTyp
b520: 65 28 63 68 61 6e 29 20 21 3d 20 26 74 63 70 43  e(chan) != &tcpC
b530: 68 61 6e 6e 65 6c 54 79 70 65 29 20 7b 0a 2d 20  hannelType) {.- 
b540: 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 2d         return;.-
b550: 20 20 20 20 7d 0a 2b 20 20 20 20 53 6f 63 6b 65      }.+    Socke
b560: 74 49 6e 66 6f 20 2a 69 6e 66 6f 50 74 72 20 3d  tInfo *infoPtr =
b570: 20 28 53 6f 63 6b 65 74 49 6e 66 6f 20 2a 29 20   (SocketInfo *) 
b580: 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 2b 20  instanceData;.+ 
b590: 20 20 20 69 6e 74 20 20 20 20 20 20 6e 6f 74 69     int      noti
b5a0: 66 79 43 6d 64 3b 0a 20 0a 2b 20 20 20 20 69 66  fyCmd;. .+    if
b5b0: 20 28 61 63 74 69 6f 6e 20 3d 3d 20 54 43 4c 5f   (action == TCL_
b5c0: 43 48 41 4e 4e 45 4c 5f 54 48 52 45 41 44 5f 49  CHANNEL_THREAD_I
b5d0: 4e 53 45 52 54 29 20 7b 0a 20 20 20 20 20 2f 2a  NSERT) {.     /*
b5e0: 0a 2d 20 20 20 20 20 2a 20 54 68 65 20 69 6e 69  .-     * The ini
b5f0: 74 69 61 6c 69 7a 74 69 6f 6e 20 6f 66 20 74 73  tializtion of ts
b600: 64 50 74 72 20 5f 61 66 74 65 72 5f 20 77 65 20  dPtr _after_ we 
b610: 68 61 76 65 20 64 65 74 65 72 6d 69 6e 65 64 20  have determined 
b620: 74 68 61 74 20 77 65 0a 2d 20 20 20 20 20 2a 20  that we.-     * 
b630: 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68  are dealing with
b640: 20 73 6f 63 6b 65 74 20 69 73 20 6e 65 63 65 73   socket is neces
b650: 73 61 72 79 2e 20 44 6f 69 6e 67 20 69 74 20 62  sary. Doing it b
b660: 65 66 6f 72 65 20 63 61 75 73 65 73 0a 2d 20 20  efore causes.-  
b670: 20 20 20 2a 20 74 68 65 20 6d 6f 64 75 6c 65 20     * the module 
b680: 74 6f 20 61 63 63 65 73 73 20 74 68 20 74 64 73  to access th tds
b690: 50 74 72 20 77 68 65 6e 20 69 74 20 69 73 20 6e  Ptr when it is n
b6a0: 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 79  ot initialized y
b6b0: 65 74 2c 0a 2d 20 20 20 20 20 2a 20 63 61 75 73  et,.-     * caus
b6c0: 69 6e 67 20 61 20 6c 6f 63 6b 75 70 2e 0a 2b 09  ing a lockup..+.
b6d0: 20 2a 20 45 6e 73 75 72 65 20 74 68 61 74 20 73   * Ensure that s
b6e0: 6f 63 6b 65 74 20 73 75 62 73 79 73 74 65 6d 20  ocket subsystem 
b6f0: 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 69  is initialized i
b700: 6e 20 74 68 69 73 20 74 68 72 65 61 64 2c 20 6f  n this thread, o
b710: 72 0a 2b 09 20 2a 20 65 6c 73 65 20 73 6f 63 6b  r.+. * else sock
b720: 65 74 73 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72  ets will not wor
b730: 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 0a 2b 20  k..      */. .+ 
b740: 20 20 20 20 20 20 20 54 63 6c 5f 4d 75 74 65 78         Tcl_Mutex
b750: 4c 6f 63 6b 28 26 73 6f 63 6b 65 74 4d 75 74 65  Lock(&socketMute
b760: 78 29 3b 0a 2b 09 49 6e 69 74 53 6f 63 6b 65 74  x);.+.InitSocket
b770: 73 28 29 3b 0a 2b 09 54 63 6c 5f 4d 75 74 65 78  s();.+.Tcl_Mutex
b780: 55 6e 6c 6f 63 6b 28 26 73 6f 63 6b 65 74 4d 75  Unlock(&socketMu
b790: 74 65 78 29 3b 0a 2b 0a 20 20 20 20 20 74 73 64  tex);.+.     tsd
b7a0: 50 74 72 20 20 3d 20 54 43 4c 5f 54 53 44 5f 49  Ptr  = TCL_TSD_I
b7b0: 4e 49 54 28 26 64 61 74 61 4b 65 79 29 3b 0a 2d  NIT(&dataKey);.-
b7c0: 20 20 20 20 69 6e 66 6f 50 74 72 20 3d 20 28 53      infoPtr = (S
b7d0: 6f 63 6b 65 74 49 6e 66 6f 20 2a 29 20 54 63 6c  ocketInfo *) Tcl
b7e0: 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61  _GetChannelInsta
b7f0: 6e 63 65 44 61 74 61 20 28 63 68 61 6e 29 3b 0a  nceData (chan);.
b800: 20 0a 2b 09 57 61 69 74 46 6f 72 53 69 6e 67 6c   .+.WaitForSingl
b810: 65 4f 62 6a 65 63 74 28 74 73 64 50 74 72 2d 3e  eObject(tsdPtr->
b820: 73 6f 63 6b 65 74 4c 69 73 74 4c 6f 63 6b 2c 20  socketListLock, 
b830: 49 4e 46 49 4e 49 54 45 29 3b 0a 2b 09 69 6e 66  INFINITE);.+.inf
b840: 6f 50 74 72 2d 3e 6e 65 78 74 50 74 72 20 3d 20  oPtr->nextPtr = 
b850: 74 73 64 50 74 72 2d 3e 73 6f 63 6b 65 74 4c 69  tsdPtr->socketLi
b860: 73 74 3b 0a 2b 09 74 73 64 50 74 72 2d 3e 73 6f  st;.+.tsdPtr->so
b870: 63 6b 65 74 4c 69 73 74 20 3d 20 69 6e 66 6f 50  cketList = infoP
b880: 74 72 3b 0a 2b 09 53 65 74 45 76 65 6e 74 28 74  tr;.+.SetEvent(t
b890: 73 64 50 74 72 2d 3e 73 6f 63 6b 65 74 4c 69 73  sdPtr->socketLis
b8a0: 74 4c 6f 63 6b 29 3b 0a 2b 0a 2b 09 6e 6f 74 69  tLock);.+.+.noti
b8b0: 66 79 43 6d 64 20 3d 20 53 45 4c 45 43 54 3b 0a  fyCmd = SELECT;.
b8c0: 2b 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 2b 20  +    } else {.+ 
b8d0: 20 20 20 20 20 20 20 53 6f 63 6b 65 74 49 6e 66         SocketInf
b8e0: 6f 20 2a 2a 6e 65 78 74 50 74 72 50 74 72 3b 0a  o **nextPtrPtr;.
b8f0: 2b 09 69 6e 74 20 72 65 6d 6f 76 65 64 20 3d 20  +.int removed = 
b900: 30 3b 0a 2b 0a 2b 09 74 73 64 50 74 72 20 20 3d  0;.+.+.tsdPtr  =
b910: 20 54 43 4c 5f 54 53 44 5f 49 4e 49 54 28 26 64   TCL_TSD_INIT(&d
b920: 61 74 61 4b 65 79 29 3b 0a 2b 0a 2b 09 2f 2a 20  ataKey);.+.+./* 
b930: 54 49 50 20 23 32 31 38 2c 20 42 75 67 66 69 78  TIP #218, Bugfix
b940: 3a 20 41 6c 6c 20 61 63 63 65 73 73 20 74 6f 20  : All access to 
b950: 73 6f 63 6b 65 74 4c 69 73 74 20 68 61 73 20 74  socketList has t
b960: 6f 20 62 65 20 70 72 6f 74 65 63 74 65 64 20 62  o be protected b
b970: 79 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 2b 09  y the lock */.+.
b980: 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a  WaitForSingleObj
b990: 65 63 74 28 74 73 64 50 74 72 2d 3e 73 6f 63 6b  ect(tsdPtr->sock
b9a0: 65 74 4c 69 73 74 4c 6f 63 6b 2c 20 49 4e 46 49  etListLock, INFI
b9b0: 4e 49 54 45 29 3b 0a 20 20 20 20 20 66 6f 72 20  NITE);.     for 
b9c0: 28 6e 65 78 74 50 74 72 50 74 72 20 3d 20 26 28  (nextPtrPtr = &(
b9d0: 74 73 64 50 74 72 2d 3e 73 6f 63 6b 65 74 4c 69  tsdPtr->socketLi
b9e0: 73 74 29 3b 20 28 2a 6e 65 78 74 50 74 72 50 74  st); (*nextPtrPt
b9f0: 72 29 20 21 3d 20 4e 55 4c 4c 3b 0a 20 09 20 6e  r) != NULL;. . n
ba00: 65 78 74 50 74 72 50 74 72 20 3d 20 26 28 28 2a  extPtrPtr = &((*
ba10: 6e 65 78 74 50 74 72 50 74 72 29 2d 3e 6e 65 78  nextPtrPtr)->nex
ba20: 74 50 74 72 29 29 20 7b 0a 20 09 69 66 20 28 28  tPtr)) {. .if ((
ba30: 2a 6e 65 78 74 50 74 72 50 74 72 29 20 3d 3d 20  *nextPtrPtr) == 
ba40: 69 6e 66 6f 50 74 72 29 20 7b 0a 40 40 20 2d 32  infoPtr) {.@@ -2
ba50: 37 31 38 2c 36 20 2b 32 37 32 34 2c 37 20 40 40  718,6 +2724,7 @@
ba60: 0a 20 09 20 20 20 20 62 72 65 61 6b 3b 0a 20 09  . .    break;. .
ba70: 7d 0a 20 20 20 20 20 7d 0a 2b 09 53 65 74 45 76  }.     }.+.SetEv
ba80: 65 6e 74 28 74 73 64 50 74 72 2d 3e 73 6f 63 6b  ent(tsdPtr->sock
ba90: 65 74 4c 69 73 74 4c 6f 63 6b 29 3b 0a 20 0a 20  etListLock);. . 
baa0: 20 20 20 20 2f 2a 0a 20 20 20 20 20 20 2a 20 54      /*.      * T
bab0: 68 69 73 20 63 6f 75 6c 64 20 68 61 70 70 65 6e  his could happen
bac0: 20 69 66 20 74 68 65 20 63 68 61 6e 6e 65 6c 20   if the channel 
bad0: 77 61 73 20 63 72 65 61 74 65 64 20 69 6e 20 6f  was created in o
bae0: 6e 65 20 74 68 72 65 61 64 0a 40 40 20 2d 32 37  ne thread.@@ -27
baf0: 32 39 2c 37 32 20 2b 32 37 33 36 2c 31 33 20 40  29,72 +2736,13 @
bb00: 40 0a 20 20 20 20 20 20 20 20 20 54 63 6c 5f 50  @.         Tcl_P
bb10: 61 6e 69 63 28 22 66 69 6c 65 20 69 6e 66 6f 20  anic("file info 
bb20: 70 74 72 20 6e 6f 74 20 6f 6e 20 74 68 72 65 61  ptr not on threa
bb30: 64 20 63 68 61 6e 6e 65 6c 20 6c 69 73 74 22 29  d channel list")
bb40: 3b 0a 20 20 20 20 20 7d 0a 20 0a 2d 20 20 20 20  ;.     }. .-    
bb50: 2f 2a 0a 2d 20 20 20 20 20 2a 20 53 74 6f 70 20  /*.-     * Stop 
bb60: 6e 6f 74 69 66 69 63 61 74 69 6f 6e 73 20 66 6f  notifications fo
bb70: 72 20 74 68 65 20 73 6f 63 6b 65 74 20 74 6f 20  r the socket to 
bb80: 6f 63 63 75 72 20 69 6e 20 74 68 69 73 20 74 68  occur in this th
bb90: 72 65 61 64 2e 0a 2d 20 20 20 20 20 2a 2f 0a 2d  read..-     */.-
bba0: 0a 2d 20 20 20 20 53 65 6e 64 4d 65 73 73 61 67  .-    SendMessag
bbb0: 65 28 74 73 64 50 74 72 2d 3e 68 77 6e 64 2c 20  e(tsdPtr->hwnd, 
bbc0: 53 4f 43 4b 45 54 5f 53 45 4c 45 43 54 2c 0a 2d  SOCKET_SELECT,.-
bbd0: 09 09 28 57 50 41 52 41 4d 29 20 55 4e 53 45 4c  ..(WPARAM) UNSEL
bbe0: 45 43 54 2c 20 28 4c 50 41 52 41 4d 29 20 69 6e  ECT, (LPARAM) in
bbf0: 66 6f 50 74 72 29 3b 0a 2d 7d 0a 2d 0c 0a 2d 2f  foPtr);.-}.-..-/
bc00: 2a 0a 2d 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *.- *-----------
bc10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bc20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bc30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bc40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2d 20 2a 0a  -----------.- *.
bc50: 2d 20 2a 20 54 63 6c 70 53 70 6c 69 63 65 53 6f  - * TclpSpliceSo
bc60: 63 6b 43 68 61 6e 6e 65 6c 20 2d 2d 0a 2d 20 2a  ckChannel --.- *
bc70: 0a 2d 20 2a 09 49 6e 73 65 72 74 20 74 68 72 65  .- *.Insert thre
bc80: 61 64 20 6c 6f 63 61 6c 20 72 65 66 20 66 6f 72  ad local ref for
bc90: 20 74 68 69 73 20 63 68 61 6e 6e 65 6c 2e 0a 2d   this channel..-
bca0: 20 2a 09 54 63 6c 5f 53 70 6c 69 63 65 43 68 61   *.Tcl_SpliceCha
bcb0: 6e 6e 65 6c 20 66 6f 72 20 6d 6f 72 65 20 69 6e  nnel for more in
bcc0: 66 6f 2e 0a 2d 20 2a 0a 2d 20 2a 20 52 65 73 75  fo..- *.- * Resu
bcd0: 6c 74 73 3a 0a 2d 20 2a 09 4e 6f 6e 65 2e 0a 2d  lts:.- *.None..-
bce0: 20 2a 0a 2d 20 2a 20 53 69 64 65 20 65 66 66 65   *.- * Side effe
bcf0: 63 74 73 3a 0a 2d 20 2a 09 43 68 61 6e 67 65 73  cts:.- *.Changes
bd00: 20 74 68 72 65 61 64 20 6c 6f 63 61 6c 20 6c 69   thread local li
bd10: 73 74 20 6f 66 20 76 61 6c 69 64 20 63 68 61 6e  st of valid chan
bd20: 6e 65 6c 73 2e 0a 2d 20 2a 0a 2d 20 2a 2d 2d 2d  nels..- *.- *---
bd30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bd40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bd50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bd60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bd70: 2d 2d 2d 0a 2d 20 2a 2f 0a 2d 0a 2d 76 6f 69 64  ---.- */.-.-void
bd80: 0a 2d 54 63 6c 70 53 70 6c 69 63 65 53 6f 63 6b  .-TclpSpliceSock
bd90: 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 0a 2d 20  Channel(chan).- 
bda0: 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63     Tcl_Channel c
bdb0: 68 61 6e 3b 09 09 09 2f 2a 20 54 68 65 20 63 68  han;.../* The ch
bdc0: 61 6e 6e 65 6c 20 62 65 69 6e 67 20 72 65 6d 6f  annel being remo
bdd0: 76 65 64 2e 20 4d 75 73 74 0a 2d 20 20 20 20 20  ved. Must.-     
bde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bdf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be00: 20 20 20 20 2a 20 6e 6f 74 20 62 65 20 72 65 66      * not be ref
be10: 65 72 65 6e 63 65 64 20 69 6e 20 61 6e 79 0a 2d  erenced in any.-
be20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be40: 20 20 20 20 20 20 20 20 20 2a 20 69 6e 74 65 72           * inter
be50: 70 72 65 74 65 72 2e 20 2a 2f 0a 2d 7b 0a 2d 20  preter. */.-{.- 
be60: 20 20 20 54 68 72 65 61 64 53 70 65 63 69 66 69     ThreadSpecifi
be70: 63 44 61 74 61 20 2a 74 73 64 50 74 72 3b 0a 2d  cData *tsdPtr;.-
be80: 20 20 20 20 53 6f 63 6b 65 74 49 6e 66 6f 20 2a      SocketInfo *
be90: 69 6e 66 6f 50 74 72 3b 0a 2d 0a 2d 20 20 20 20  infoPtr;.-.-    
bea0: 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e  if (Tcl_GetChann
beb0: 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20  elType(chan) != 
bec0: 26 74 63 70 43 68 61 6e 6e 65 6c 54 79 70 65 29  &tcpChannelType)
bed0: 20 7b 0a 2d 20 20 20 20 20 20 20 20 72 65 74 75   {.-        retu
bee0: 72 6e 3b 0a 2b 09 6e 6f 74 69 66 79 43 6d 64 20  rn;.+.notifyCmd 
bef0: 3d 20 55 4e 53 45 4c 45 43 54 3b 0a 20 20 20 20  = UNSELECT;.    
bf00: 20 7d 0a 20 0a 20 20 20 20 20 2f 2a 0a 2d 20 20   }. .     /*.-  
bf10: 20 20 20 2a 20 45 6e 73 75 72 65 20 74 68 61 74     * Ensure that
bf20: 20 73 6f 63 6b 65 74 20 73 75 62 73 79 73 74 65   socket subsyste
bf30: 6d 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  m is initialized
bf40: 20 69 6e 20 74 68 69 73 20 74 68 72 65 61 64 2c   in this thread,
bf50: 20 6f 72 0a 2d 20 20 20 20 20 2a 20 65 6c 73 65   or.-     * else
bf60: 20 73 6f 63 6b 65 74 73 20 77 69 6c 6c 20 6e 6f   sockets will no
bf70: 74 20 77 6f 72 6b 2e 0a 2d 20 20 20 20 20 2a 2f  t work..-     */
bf80: 0a 2d 0a 2d 20 20 20 20 54 63 6c 5f 4d 75 74 65  .-.-    Tcl_Mute
bf90: 78 4c 6f 63 6b 28 26 73 6f 63 6b 65 74 4d 75 74  xLock(&socketMut
bfa0: 65 78 29 3b 0a 2d 20 20 20 20 49 6e 69 74 53 6f  ex);.-    InitSo
bfb0: 63 6b 65 74 73 28 29 3b 0a 2d 20 20 20 20 54 63  ckets();.-    Tc
bfc0: 6c 5f 4d 75 74 65 78 55 6e 6c 6f 63 6b 28 26 73  l_MutexUnlock(&s
bfd0: 6f 63 6b 65 74 4d 75 74 65 78 29 3b 0a 2d 0a 2d  ocketMutex);.-.-
bfe0: 20 20 20 20 2f 2a 0a 2d 20 20 20 20 20 2a 20 54      /*.-     * T
bff0: 68 65 20 69 6e 69 74 69 61 6c 69 7a 74 69 6f 6e  he initializtion
c000: 20 6f 66 20 74 73 64 50 74 72 20 5f 61 66 74 65   of tsdPtr _afte
c010: 72 5f 20 77 65 20 68 61 76 65 20 64 65 74 65 72  r_ we have deter
c020: 6d 69 6e 65 64 20 74 68 61 74 20 77 65 0a 2d 20  mined that we.- 
c030: 20 20 20 20 2a 20 61 72 65 20 64 65 61 6c 69 6e      * are dealin
c040: 67 20 77 69 74 68 20 73 6f 63 6b 65 74 20 69 73  g with socket is
c050: 20 6e 65 63 65 73 73 61 72 79 2e 20 44 6f 69 6e   necessary. Doin
c060: 67 20 69 74 20 62 65 66 6f 72 65 20 63 61 75 73  g it before caus
c070: 65 73 0a 2d 20 20 20 20 20 2a 20 74 68 65 20 6d  es.-     * the m
c080: 6f 64 75 6c 65 20 74 6f 20 61 63 63 65 73 73 20  odule to access 
c090: 74 68 20 74 64 73 50 74 72 20 77 68 65 6e 20 69  th tdsPtr when i
c0a0: 74 20 69 73 20 6e 6f 74 20 69 6e 69 74 69 61 6c  t is not initial
c0b0: 69 7a 65 64 20 79 65 74 2c 0a 2d 20 20 20 20 20  ized yet,.-     
c0c0: 2a 20 63 61 75 73 69 6e 67 20 61 20 6c 6f 63 6b  * causing a lock
c0d0: 75 70 2e 0a 2d 20 20 20 20 20 2a 2f 0a 2d 0a 2d  up..-     */.-.-
c0e0: 20 20 20 20 74 73 64 50 74 72 20 20 3d 20 54 43      tsdPtr  = TC
c0f0: 4c 5f 54 53 44 5f 49 4e 49 54 28 26 64 61 74 61  L_TSD_INIT(&data
c100: 4b 65 79 29 3b 0a 2d 20 20 20 20 69 6e 66 6f 50  Key);.-    infoP
c110: 74 72 20 3d 20 28 53 6f 63 6b 65 74 49 6e 66 6f  tr = (SocketInfo
c120: 20 2a 29 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e   *) Tcl_GetChann
c130: 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 20 28  elInstanceData (
c140: 63 68 61 6e 29 3b 0a 2d 0a 2d 20 20 20 20 57 61  chan);.-.-    Wa
c150: 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63  itForSingleObjec
c160: 74 28 74 73 64 50 74 72 2d 3e 73 6f 63 6b 65 74  t(tsdPtr->socket
c170: 4c 69 73 74 4c 6f 63 6b 2c 20 49 4e 46 49 4e 49  ListLock, INFINI
c180: 54 45 29 3b 0a 2d 20 20 20 20 69 6e 66 6f 50 74  TE);.-    infoPt
c190: 72 2d 3e 6e 65 78 74 50 74 72 20 3d 20 74 73 64  r->nextPtr = tsd
c1a0: 50 74 72 2d 3e 73 6f 63 6b 65 74 4c 69 73 74 3b  Ptr->socketList;
c1b0: 0a 2d 20 20 20 20 74 73 64 50 74 72 2d 3e 73 6f  .-    tsdPtr->so
c1c0: 63 6b 65 74 4c 69 73 74 20 3d 20 69 6e 66 6f 50  cketList = infoP
c1d0: 74 72 3b 0a 2d 20 20 20 20 53 65 74 45 76 65 6e  tr;.-    SetEven
c1e0: 74 28 74 73 64 50 74 72 2d 3e 73 6f 63 6b 65 74  t(tsdPtr->socket
c1f0: 4c 69 73 74 4c 6f 63 6b 29 3b 0a 2d 0a 2d 20 20  ListLock);.-.-  
c200: 20 20 2f 2a 0a 2d 20 20 20 20 20 2a 20 45 6e 73    /*.-     * Ens
c210: 75 72 65 20 74 68 61 74 20 6e 6f 74 69 66 69 63  ure that notific
c220: 61 74 69 6f 6e 73 20 66 6f 72 20 74 68 65 20 73  ations for the s
c230: 6f 63 6b 65 74 20 6f 63 63 75 72 20 69 6e 20 74  ocket occur in t
c240: 68 69 73 20 74 68 72 65 61 64 2e 0a 2b 20 20 20  his thread..+   
c250: 20 20 2a 20 45 6e 73 75 72 65 20 74 68 61 74 2c    * Ensure that,
c260: 20 6f 72 20 73 74 6f 70 2c 20 6e 6f 74 69 66 69   or stop, notifi
c270: 63 61 74 69 6f 6e 73 20 66 6f 72 20 74 68 65 20  cations for the 
c280: 73 6f 63 6b 65 74 20 6f 63 63 75 72 20 69 6e 20  socket occur in 
c290: 74 68 69 73 20 74 68 72 65 61 64 2e 0a 20 20 20  this thread..   
c2a0: 20 20 20 2a 2f 0a 20 0a 20 20 20 20 20 53 65 6e     */. .     Sen
c2b0: 64 4d 65 73 73 61 67 65 28 74 73 64 50 74 72 2d  dMessage(tsdPtr-
c2c0: 3e 68 77 6e 64 2c 20 53 4f 43 4b 45 54 5f 53 45  >hwnd, SOCKET_SE
c2d0: 4c 45 43 54 2c 0a 2d 09 09 28 57 50 41 52 41 4d  LECT,.-..(WPARAM
c2e0: 29 20 53 45 4c 45 43 54 2c 20 28 4c 50 41 52 41  ) SELECT, (LPARA
c2f0: 4d 29 20 69 6e 66 6f 50 74 72 29 3b 0a 2b 09 09  M) infoPtr);.+..
c300: 28 57 50 41 52 41 4d 29 20 6e 6f 74 69 66 79 43  (WPARAM) notifyC
c310: 6d 64 2c 20 28 4c 50 41 52 41 4d 29 20 69 6e 66  md, (LPARAM) inf
c320: 6f 50 74 72 29 3b 0a 20 7d 0a                    oPtr);. }.