Tcl Source Code

Hex Artifact Content
Login

Artifact edcaab189bf3e9d28f5fb4b90acc3727e8df259c:

Attachment "tclIORTrans.c" to ticket [1163274fff] added by andreas_kupries 2007-11-15 05:51:25.
0000: 2f 2a 0a 20 2a 20 74 63 6c 49 4f 52 54 72 61 6e  /*. * tclIORTran
0010: 73 2e 63 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69  s.c --. *. *.Thi
0020: 73 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20  s file contains 
0030: 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
0040: 6f 6e 20 6f 66 20 54 63 6c 27 73 20 67 65 6e 65  on of Tcl's gene
0050: 72 69 63 20 74 72 61 6e 73 66 6f 72 6d 61 74 69  ric transformati
0060: 6f 6e 0a 20 2a 09 72 65 66 6c 65 63 74 69 6f 6e  on. *.reflection
0070: 20 63 6f 64 65 2c 20 77 68 69 63 68 20 61 6c 6c   code, which all
0080: 6f 77 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e  ows the implemen
0090: 74 61 74 69 6f 6e 20 6f 66 20 54 63 6c 20 63 68  tation of Tcl ch
00a0: 61 6e 6e 65 6c 0a 20 2a 09 74 72 61 6e 73 66 6f  annel. *.transfo
00b0: 72 6d 61 74 69 6f 6e 73 20 69 6e 20 54 63 6c 20  rmations in Tcl 
00c0: 63 6f 64 65 2e 0a 20 2a 0a 20 2a 09 50 61 72 74  code.. *. *.Part
00d0: 73 20 6f 66 20 74 68 69 73 20 66 69 6c 65 20 61  s of this file a
00e0: 72 65 20 62 61 73 65 64 20 6f 6e 20 63 6f 64 65  re based on code
00f0: 20 63 6f 6e 74 72 69 62 75 74 65 64 20 62 79 20   contributed by 
0100: 4a 65 61 6e 2d 43 6c 61 75 64 65 0a 20 2a 09 57  Jean-Claude. *.W
0110: 69 70 70 6c 65 72 2e 0a 20 2a 0a 20 2a 09 53 65  ippler.. *. *.Se
0120: 65 20 54 49 50 20 23 32 33 30 20 66 6f 72 20 74  e TIP #230 for t
0130: 68 65 20 73 70 65 63 69 66 69 63 61 74 69 6f 6e  he specification
0140: 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
0150: 6e 61 6c 69 74 79 2e 0a 20 2a 0a 20 2a 20 43 6f  nality.. *. * Co
0160: 70 79 72 69 67 68 74 20 28 63 29 20 32 30 30 37  pyright (c) 2007
0170: 20 41 63 74 69 76 65 53 74 61 74 65 2e 0a 20 2a   ActiveState.. *
0180: 0a 20 2a 20 53 65 65 20 74 68 65 20 66 69 6c 65  . * See the file
0190: 20 22 6c 69 63 65 6e 73 65 2e 74 65 72 6d 73 22   "license.terms"
01a0: 20 66 6f 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   for information
01b0: 20 6f 6e 20 75 73 61 67 65 20 61 6e 64 20 72 65   on usage and re
01c0: 64 69 73 74 72 69 62 75 74 69 6f 6e 20 6f 66 0a  distribution of.
01d0: 20 2a 20 74 68 69 73 20 66 69 6c 65 2c 20 61 6e   * this file, an
01e0: 64 20 66 6f 72 20 61 20 44 49 53 43 4c 41 49 4d  d for a DISCLAIM
01f0: 45 52 20 4f 46 20 41 4c 4c 20 57 41 52 52 41 4e  ER OF ALL WARRAN
0200: 54 49 45 53 2e 0a 20 2a 0a 20 2a 20 52 43 53 3a  TIES.. *. * RCS:
0210: 20 40 28 23 29 20 24 49 64 3a 20 74 63 6c 49 4f   @(#) $Id: tclIO
0220: 52 43 68 61 6e 2e 63 2c 76 20 31 2e 32 34 20 32  RChan.c,v 1.24 2
0230: 30 30 37 2f 30 34 2f 32 34 20 30 32 3a 34 32 3a  007/04/24 02:42:
0240: 31 38 20 6b 65 6e 6e 79 6b 62 20 45 78 70 20 24  18 kennykb Exp $
0250: 0a 20 2a 2f 0a 0a 23 69 6e 63 6c 75 64 65 20 3c  . */..#include <
0260: 74 63 6c 49 6e 74 2e 68 3e 0a 23 69 6e 63 6c 75  tclInt.h>.#inclu
0270: 64 65 20 3c 74 63 6c 49 4f 2e 68 3e 0a 23 69 6e  de <tclIO.h>.#in
0280: 63 6c 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e  clude <assert.h>
0290: 0a 0a 23 69 66 6e 64 65 66 20 45 49 4e 56 41 4c  ..#ifndef EINVAL
02a0: 0a 23 64 65 66 69 6e 65 20 45 49 4e 56 41 4c 09  .#define EINVAL.
02b0: 39 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66  9.#endif.#ifndef
02c0: 20 45 4f 4b 0a 23 64 65 66 69 6e 65 20 45 4f 4b   EOK.#define EOK
02d0: 09 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 44 55  .0.#endif../* DU
02e0: 50 4c 49 43 41 54 45 20 6f 66 20 48 61 76 65 56  PLICATE of HaveV
02f0: 65 72 73 69 6f 6e 28 29 20 69 6e 20 74 63 6c 49  ersion() in tclI
0300: 4f 2e 63 20 2f 2f 20 54 4f 44 4f 20 2d 20 4d 4f  O.c // TODO - MO
0310: 44 55 4c 45 5f 53 43 4f 50 45 20 2a 2f 0a 73 74  DULE_SCOPE */.st
0320: 61 74 69 63 20 69 6e 74 09 09 48 61 76 65 56 65  atic int..HaveVe
0330: 72 73 69 6f 6e 28 63 6f 6e 73 74 20 54 63 6c 5f  rsion(const Tcl_
0340: 43 68 61 6e 6e 65 6c 54 79 70 65 20 2a 74 79 70  ChannelType *typ
0350: 65 50 74 72 2c 0a 09 09 09 20 20 20 20 54 63 6c  ePtr,....    Tcl
0360: 5f 43 68 61 6e 6e 65 6c 54 79 70 65 56 65 72 73  _ChannelTypeVers
0370: 69 6f 6e 20 6d 69 6e 69 6d 75 6d 56 65 72 73 69  ion minimumVersi
0380: 6f 6e 29 3b 0a 0a 2f 2a 0a 20 2a 20 53 69 67 6e  on);../*. * Sign
0390: 61 74 75 72 65 73 20 6f 66 20 61 6c 6c 20 66 75  atures of all fu
03a0: 6e 63 74 69 6f 6e 73 20 75 73 65 64 20 69 6e 20  nctions used in 
03b0: 74 68 65 20 43 20 6c 61 79 65 72 20 6f 66 20 74  the C layer of t
03c0: 68 65 20 72 65 66 6c 65 63 74 69 6f 6e 2e 0a 20  he reflection.. 
03d0: 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 09 09  */..static int..
03e0: 52 65 66 6c 65 63 74 43 6c 6f 73 65 28 43 6c 69  ReflectClose(Cli
03f0: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
0400: 74 61 2c 0a 09 09 09 20 20 20 20 54 63 6c 5f 49  ta,....    Tcl_I
0410: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 3b 0a  nterp *interp);.
0420: 73 74 61 74 69 63 20 69 6e 74 09 09 52 65 66 6c  static int..Refl
0430: 65 63 74 49 6e 70 75 74 28 43 6c 69 65 6e 74 44  ectInput(ClientD
0440: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
0450: 63 68 61 72 20 2a 62 75 66 2c 0a 09 09 09 20 20  char *buf,....  
0460: 20 20 69 6e 74 20 74 6f 52 65 61 64 2c 20 69 6e    int toRead, in
0470: 74 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 29  t *errorCodePtr)
0480: 3b 0a 73 74 61 74 69 63 20 69 6e 74 09 09 52 65  ;.static int..Re
0490: 66 6c 65 63 74 4f 75 74 70 75 74 28 43 6c 69 65  flectOutput(Clie
04a0: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
04b0: 61 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 62  a, const char *b
04c0: 75 66 2c 0a 09 09 09 20 20 20 20 69 6e 74 20 74  uf,....    int t
04d0: 6f 57 72 69 74 65 2c 20 69 6e 74 20 2a 65 72 72  oWrite, int *err
04e0: 6f 72 43 6f 64 65 50 74 72 29 3b 0a 73 74 61 74  orCodePtr);.stat
04f0: 69 63 20 76 6f 69 64 09 09 52 65 66 6c 65 63 74  ic void..Reflect
0500: 57 61 74 63 68 28 43 6c 69 65 6e 74 44 61 74 61  Watch(ClientData
0510: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 69 6e 74   clientData, int
0520: 20 6d 61 73 6b 29 3b 0a 73 74 61 74 69 63 20 69   mask);.static i
0530: 6e 74 09 09 52 65 66 6c 65 63 74 42 6c 6f 63 6b  nt..ReflectBlock
0540: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65  (ClientData clie
0550: 6e 74 44 61 74 61 2c 20 69 6e 74 20 6d 6f 64 65  ntData, int mode
0560: 29 3b 0a 73 74 61 74 69 63 20 54 63 6c 5f 57 69  );.static Tcl_Wi
0570: 64 65 49 6e 74 09 52 65 66 6c 65 63 74 53 65 65  deInt.ReflectSee
0580: 6b 57 69 64 65 28 43 6c 69 65 6e 74 44 61 74 61  kWide(ClientData
0590: 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 09 09 09   clientData,....
05a0: 20 20 20 20 54 63 6c 5f 57 69 64 65 49 6e 74 20      Tcl_WideInt 
05b0: 6f 66 66 73 65 74 2c 20 69 6e 74 20 6d 6f 64 65  offset, int mode
05c0: 2c 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65  , int *errorCode
05d0: 50 74 72 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  Ptr);.static int
05e0: 09 09 52 65 66 6c 65 63 74 53 65 65 6b 28 43 6c  ..ReflectSeek(Cl
05f0: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
0600: 61 74 61 2c 20 6c 6f 6e 67 20 6f 66 66 73 65 74  ata, long offset
0610: 2c 0a 09 09 09 20 20 20 20 69 6e 74 20 6d 6f 64  ,....    int mod
0620: 65 2c 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64  e, int *errorCod
0630: 65 50 74 72 29 3b 0a 73 74 61 74 69 63 20 69 6e  ePtr);.static in
0640: 74 09 09 52 65 66 6c 65 63 74 47 65 74 4f 70 74  t..ReflectGetOpt
0650: 69 6f 6e 28 43 6c 69 65 6e 74 44 61 74 61 20 63  ion(ClientData c
0660: 6c 69 65 6e 74 44 61 74 61 2c 0a 09 09 09 20 20  lientData,....  
0670: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
0680: 74 65 72 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  terp, const char
0690: 20 2a 6f 70 74 69 6f 6e 4e 61 6d 65 2c 0a 09 09   *optionName,...
06a0: 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
06b0: 20 2a 64 73 50 74 72 29 3b 0a 73 74 61 74 69 63   *dsPtr);.static
06c0: 20 69 6e 74 09 09 52 65 66 6c 65 63 74 53 65 74   int..ReflectSet
06d0: 4f 70 74 69 6f 6e 28 43 6c 69 65 6e 74 44 61 74  Option(ClientDat
06e0: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 09 09  a clientData,...
06f0: 09 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  .    Tcl_Interp 
0700: 2a 69 6e 74 65 72 70 2c 20 63 6f 6e 73 74 20 63  *interp, const c
0710: 68 61 72 20 2a 6f 70 74 69 6f 6e 4e 61 6d 65 2c  har *optionName,
0720: 0a 09 09 09 20 20 20 20 63 6f 6e 73 74 20 63 68  ....    const ch
0730: 61 72 20 2a 6e 65 77 56 61 6c 75 65 29 3b 0a 73  ar *newValue);.s
0740: 74 61 74 69 63 20 69 6e 74 09 09 52 65 66 6c 65  tatic int..Refle
0750: 63 74 48 61 6e 64 6c 65 28 43 6c 69 65 6e 74 44  ctHandle(ClientD
0760: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
0770: 69 6e 74 20 64 69 72 65 63 74 69 6f 6e 2c 0a 09  int direction,..
0780: 09 09 09 20 20 20 20 20 20 43 6c 69 65 6e 74 44  ...      ClientD
0790: 61 74 61 2a 20 68 61 6e 64 6c 65 29 3b 0a 73 74  ata* handle);.st
07a0: 61 74 69 63 20 69 6e 74 09 09 52 65 66 6c 65 63  atic int..Reflec
07b0: 74 4e 6f 74 69 66 79 28 43 6c 69 65 6e 74 44 61  tNotify(ClientDa
07c0: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 69  ta clientData, i
07d0: 6e 74 20 6d 61 73 6b 29 3b 0a 0a 2f 2a 0a 20 2a  nt mask);../*. *
07e0: 20 54 68 65 20 43 20 6c 61 79 65 72 20 63 68 61   The C layer cha
07f0: 6e 6e 65 6c 20 74 79 70 65 2f 64 72 69 76 65 72  nnel type/driver
0800: 20 64 65 66 69 6e 69 74 69 6f 6e 20 75 73 65 64   definition used
0810: 20 62 79 20 74 68 65 20 72 65 66 6c 65 63 74 69   by the reflecti
0820: 6f 6e 2e 20 54 68 69 73 20 69 73 0a 20 2a 20 61  on. This is. * a
0830: 20 76 65 72 73 69 6f 6e 20 33 20 73 74 72 75 63   version 3 struc
0840: 74 75 72 65 2e 0a 20 2a 2f 0a 0a 73 74 61 74 69  ture.. */..stati
0850: 63 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 54 79 70  c Tcl_ChannelTyp
0860: 65 20 74 63 6c 52 54 72 61 6e 73 66 6f 72 6d 54  e tclRTransformT
0870: 79 70 65 20 3d 20 7b 0a 20 20 20 20 22 74 63 6c  ype = {.    "tcl
0880: 72 74 72 61 6e 73 66 6f 72 6d 22 2c 20 20 20 20  rtransform",    
0890: 20 20 20 2f 2a 20 54 79 70 65 20 6e 61 6d 65 2e     /* Type name.
08a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08c0: 20 20 2a 2f 0a 20 20 20 20 54 43 4c 5f 43 48 41    */.    TCL_CHA
08d0: 4e 4e 45 4c 5f 56 45 52 53 49 4f 4e 5f 35 2c 20  NNEL_VERSION_5, 
08e0: 2f 2a 20 76 35 20 63 68 61 6e 6e 65 6c 20 2a 2f  /* v5 channel */
08f0: 0a 20 20 20 20 52 65 66 6c 65 63 74 43 6c 6f 73  .    ReflectClos
0900: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  e,          /* C
0910: 6c 6f 73 65 20 63 68 61 6e 6e 65 6c 2c 20 63 6c  lose channel, cl
0920: 65 61 6e 20 69 6e 73 74 61 6e 63 65 20 64 61 74  ean instance dat
0930: 61 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  a          */.  
0940: 20 20 52 65 66 6c 65 63 74 49 6e 70 75 74 2c 20    ReflectInput, 
0950: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64           /* Hand
0960: 6c 65 20 72 65 61 64 20 72 65 71 75 65 73 74 20  le read request 
0970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0980: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 52          */.    R
0990: 65 66 6c 65 63 74 4f 75 74 70 75 74 2c 20 20 20  eflectOutput,   
09a0: 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20        /* Handle 
09b0: 77 72 69 74 65 20 72 65 71 75 65 73 74 20 20 20  write request   
09c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09d0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 52 65 66 6c       */.    Refl
09e0: 65 63 74 53 65 65 6b 2c 20 20 20 20 20 20 20 20  ectSeek,        
09f0: 20 20 20 2f 2a 20 4d 6f 76 65 20 6c 6f 63 61 74     /* Move locat
0a00: 69 6f 6e 20 6f 66 20 61 63 63 65 73 73 20 70 6f  ion of access po
0a10: 69 6e 74 2e 20 20 20 20 20 20 20 20 20 20 20 20  int.            
0a20: 20 20 2a 2f 0a 20 20 20 20 52 65 66 6c 65 63 74    */.    Reflect
0a30: 53 65 74 4f 70 74 69 6f 6e 2c 20 20 20 20 20 20  SetOption,      
0a40: 2f 2a 20 53 65 74 20 6f 70 74 69 6f 6e 73 2e 20  /* Set options. 
0a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
0a70: 2f 0a 20 20 20 20 52 65 66 6c 65 63 74 47 65 74  /.    ReflectGet
0a80: 4f 70 74 69 6f 6e 2c 20 20 20 20 20 20 2f 2a 20  Option,      /* 
0a90: 47 65 74 20 6f 70 74 69 6f 6e 73 2e 20 20 20 20  Get options.    
0aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ab0: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
0ac0: 20 20 20 52 65 66 6c 65 63 74 57 61 74 63 68 2c     ReflectWatch,
0ad0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69            /* Ini
0ae0: 74 69 61 6c 69 7a 65 20 6e 6f 74 69 66 69 65 72  tialize notifier
0af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b00: 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
0b10: 52 65 66 6c 65 63 74 48 61 6e 64 6c 65 2c 20 20  ReflectHandle,  
0b20: 20 20 20 20 20 20 20 2f 2a 20 47 65 74 20 4f 53         /* Get OS
0b30: 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20 74 68 65   handle from the
0b40: 20 63 68 61 6e 6e 65 6c 2e 20 20 20 20 20 20 20   channel.       
0b50: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 4e 55 4c        */.    NUL
0b60: 4c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  L,              
0b70: 20 20 20 20 2f 2a 20 4e 6f 20 63 6c 6f 73 65 32      /* No close2
0b80: 20 73 75 70 70 6f 72 74 2e 20 20 20 20 20 20 20   support.       
0b90: 20 20 20 20 20 20 20 20 4e 55 4c 4c 27 61 62 6c          NULL'abl
0ba0: 65 20 20 2a 2f 0a 20 20 20 20 52 65 66 6c 65 63  e  */.    Reflec
0bb0: 74 42 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  tBlock,         
0bc0: 20 2f 2a 20 53 65 74 20 62 6c 6f 63 6b 69 6e 67   /* Set blocking
0bd0: 2f 6e 6f 6e 62 6c 6f 63 6b 69 6e 67 2e 20 20 20  /nonblocking.   
0be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0bf0: 2a 2f 0a 20 20 20 20 4e 55 4c 4c 2c 20 20 20 20  */.    NULL,    
0c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0c10: 20 46 6c 75 73 68 20 63 68 61 6e 6e 65 6c 2e 20   Flush channel. 
0c20: 4e 6f 74 20 75 73 65 64 20 62 79 20 63 6f 72 65  Not used by core
0c30: 2e 20 4e 55 4c 4c 27 61 62 6c 65 20 20 2a 2f 0a  . NULL'able  */.
0c40: 20 20 20 20 52 65 66 6c 65 63 74 4e 6f 74 69 66      ReflectNotif
0c50: 79 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61  y,         /* Ha
0c60: 6e 64 6c 65 20 65 76 65 6e 74 73 2e 20 20 20 20  ndle events.    
0c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c80: 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
0c90: 20 52 65 66 6c 65 63 74 53 65 65 6b 57 69 64 65   ReflectSeekWide
0ca0: 2c 20 20 20 20 20 20 20 2f 2a 20 4d 6f 76 65 20  ,       /* Move 
0cb0: 61 63 63 65 73 73 20 70 6f 69 6e 74 20 28 36 34  access point (64
0cc0: 20 62 69 74 29 2e 20 20 20 20 20 20 20 20 20 20   bit).          
0cd0: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 4e 55         */.    NU
0ce0: 4c 4c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  LL,             
0cf0: 20 20 20 20 20 2f 2a 20 74 68 72 65 61 64 20 61       /* thread a
0d00: 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 4e 55 4c  ction */.    NUL
0d10: 4c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  L,              
0d20: 20 20 20 20 2f 2a 20 74 72 75 6e 63 61 74 65 20      /* truncate 
0d30: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 20 2a 20 53 74 72  */.};../*. * Str
0d40: 75 63 74 75 72 65 20 6f 66 20 74 68 65 20 62 75  ucture of the bu
0d50: 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 72 61  ffer to hold tra
0d60: 6e 73 66 6f 72 6d 20 72 65 73 75 6c 74 73 20 74  nsform results t
0d70: 6f 20 62 65 20 63 6f 6e 73 75 6d 65 64 20 62 79  o be consumed by
0d80: 20 68 69 67 68 65 72 0a 20 2a 20 6c 61 79 65 72   higher. * layer
0d90: 73 20 75 70 6f 6e 20 72 65 61 64 69 6e 67 20 66  s upon reading f
0da0: 72 6f 6d 20 74 68 65 20 63 68 61 6e 6e 65 6c 2c  rom the channel,
0db0: 20 70 6c 75 73 20 74 68 65 20 66 75 6e 63 74 69   plus the functi
0dc0: 6f 6e 73 20 74 6f 20 6d 61 6e 61 67 65 20 73 75  ons to manage su
0dd0: 63 68 2e 0a 20 2a 2f 0a 0a 74 79 70 65 64 65 66  ch.. */..typedef
0de0: 20 73 74 72 75 63 74 20 5f 52 65 73 75 6c 74 42   struct _ResultB
0df0: 75 66 66 65 72 5f 20 7b 0a 20 20 75 6e 73 69 67  uffer_ {.  unsig
0e00: 6e 65 64 20 63 68 61 72 2a 20 62 75 66 3b 20 20  ned char* buf;  
0e10: 20 20 20 20 20 2f 2a 20 52 65 66 65 72 65 6e 63       /* Referenc
0e20: 65 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 20  e to the buffer 
0e30: 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 20 20  area */.  int   
0e40: 20 20 20 20 20 20 20 20 20 61 6c 6c 6f 63 61 74           allocat
0e50: 65 64 3b 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64  ed; /* Allocated
0e60: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62 75 66   size of the buf
0e70: 66 65 72 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e  fer area */.  in
0e80: 74 20 20 20 20 20 20 20 20 20 20 20 20 75 73 65  t            use
0e90: 64 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  d;      /* Numbe
0ea0: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68  r of bytes in th
0eb0: 65 20 62 75 66 66 65 72 2c 20 3c 3d 20 61 6c 6c  e buffer, <= all
0ec0: 6f 63 61 74 65 64 20 2a 2f 0a 7d 20 52 65 73 75  ocated */.} Resu
0ed0: 6c 74 42 75 66 66 65 72 3b 0a 0a 23 64 65 66 69  ltBuffer;..#defi
0ee0: 6e 65 20 52 65 73 75 6c 74 4c 65 6e 67 74 68 28  ne ResultLength(
0ef0: 72 29 20 28 28 72 29 2d 3e 75 73 65 64 29 0a 2f  r) ((r)->used)./
0f00: 2a 20 73 74 61 74 69 63 20 69 6e 74 20 52 65 73  * static int Res
0f10: 75 6c 74 4c 65 6e 67 74 68 20 20 20 20 20 20 20  ultLength       
0f20: 20 28 52 65 73 75 6c 74 42 75 66 66 65 72 2a 20   (ResultBuffer* 
0f30: 72 29 3b 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76  r); */..static v
0f40: 6f 69 64 20 20 52 65 73 75 6c 74 43 6c 65 61 72  oid  ResultClear
0f50: 20 20 20 20 20 20 20 20 20 20 28 52 65 73 75 6c            (Resul
0f60: 74 42 75 66 66 65 72 2a 20 72 29 3b 0a 73 74 61  tBuffer* r);.sta
0f70: 74 69 63 20 76 6f 69 64 20 20 52 65 73 75 6c 74  tic void  Result
0f80: 49 6e 69 74 20 20 20 20 20 20 20 20 20 20 20 28  Init           (
0f90: 52 65 73 75 6c 74 42 75 66 66 65 72 2a 20 72 29  ResultBuffer* r)
0fa0: 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 20 52  ;.static void  R
0fb0: 65 73 75 6c 74 41 64 64 20 20 20 20 20 20 20 20  esultAdd        
0fc0: 20 20 20 20 28 52 65 73 75 6c 74 42 75 66 66 65      (ResultBuffe
0fd0: 72 2a 20 72 2c 20 75 6e 73 69 67 6e 65 64 20 63  r* r, unsigned c
0fe0: 68 61 72 2a 20 62 75 66 2c 20 69 6e 74 20 74 6f  har* buf, int to
0ff0: 57 72 69 74 65 29 3b 0a 73 74 61 74 69 63 20 69  Write);.static i
1000: 6e 74 20 20 20 52 65 73 75 6c 74 43 6f 70 79 20  nt   ResultCopy 
1010: 20 20 20 20 20 20 20 20 20 20 28 52 65 73 75 6c            (Resul
1020: 74 42 75 66 66 65 72 2a 20 72 2c 20 75 6e 73 69  tBuffer* r, unsi
1030: 67 6e 65 64 20 63 68 61 72 2a 20 62 75 66 2c 20  gned char* buf, 
1040: 69 6e 74 20 74 6f 52 65 61 64 29 3b 0a 0a 23 64  int toRead);..#d
1050: 65 66 69 6e 65 20 52 42 5f 49 4e 43 52 45 4d 45  efine RB_INCREME
1060: 4e 54 20 28 35 31 32 29 0a 0a 2f 2a 0a 20 2a 20  NT (512)../*. * 
1070: 49 6e 73 74 61 6e 63 65 20 64 61 74 61 20 66 6f  Instance data fo
1080: 72 20 61 20 72 65 66 6c 65 63 74 65 64 20 74 72  r a reflected tr
1090: 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 2e 20 3d 3d  ansformation. ==
10a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
10b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 20 2a 2f 0a 0a 74  =========. */..t
10c0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 7b 0a  ypedef struct {.
10d0: 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20      Tcl_Channel 
10e0: 63 68 61 6e 3b 09 09 2f 2a 20 42 61 63 6b 20 72  chan;../* Back r
10f0: 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
1100: 63 68 61 6e 6e 65 6c 20 6f 66 20 74 68 65 0a 09  channel of the..
1110: 09 09 09 20 2a 20 74 72 61 6e 73 66 6f 72 6d 61  ... * transforma
1120: 74 69 6f 6e 20 69 74 73 65 6c 66 2e 20 2a 2f 0a  tion itself. */.
1130: 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20      Tcl_Channel 
1140: 70 61 72 65 6e 74 3b 20 20 20 20 20 20 20 20 20  parent;         
1150: 2f 2a 20 52 65 66 65 72 65 6e 63 65 20 74 6f 20  /* Reference to 
1160: 74 68 65 20 63 68 61 6e 6e 65 6c 20 74 68 65 20  the channel the 
1170: 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 0a 09  transformation..
1180: 09 09 09 20 2a 20 77 61 73 20 70 75 73 68 65 64  ... * was pushed
1190: 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f   on. */.    Tcl_
11a0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 09  Interp *interp;.
11b0: 09 2f 2a 20 52 65 66 65 72 65 6e 63 65 20 74 6f  ./* Reference to
11c0: 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72   the interpreter
11d0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 0a   containing the.
11e0: 09 09 09 09 20 2a 20 54 63 6c 20 6c 65 76 65 6c  .... * Tcl level
11f0: 20 70 61 72 74 20 6f 66 20 74 68 65 20 63 68 61   part of the cha
1200: 6e 6e 65 6c 2e 20 2a 2f 0a 23 69 66 64 65 66 20  nnel. */.#ifdef 
1210: 54 43 4c 5f 54 48 52 45 41 44 53 0a 20 20 20 20  TCL_THREADS.    
1220: 54 63 6c 5f 54 68 72 65 61 64 49 64 20 74 68 72  Tcl_ThreadId thr
1230: 65 61 64 3b 09 2f 2a 20 54 68 72 65 61 64 20 74  ead;./* Thread t
1240: 68 65 20 27 69 6e 74 65 72 70 27 20 62 65 6c 6f  he 'interp' belo
1250: 6e 67 73 20 74 6f 2e 20 2a 2f 0a 23 65 6e 64 69  ngs to. */.#endi
1260: 66 0a 0a 20 20 20 20 54 63 6c 5f 54 69 6d 65 72  f..    Tcl_Timer
1270: 54 6f 6b 65 6e 20 74 69 6d 65 72 3b 0a 0a 20 20  Token timer;..  
1280: 20 20 2f 2a 20 53 65 65 20 5b 3d 3d 5d 20 61 73    /* See [==] as
1290: 20 77 65 6c 6c 2e 0a 20 20 20 20 20 2a 20 53 74   well..     * St
12a0: 6f 72 61 67 65 20 66 6f 72 20 74 68 65 20 63 6f  orage for the co
12b0: 6d 6d 61 6e 64 20 70 72 65 66 69 78 20 61 6e 64  mmand prefix and
12c0: 20 74 68 65 20 61 64 64 69 74 69 6f 6e 61 6c 20   the additional 
12d0: 77 6f 72 64 73 20 72 65 71 75 69 72 65 64 20 66  words required f
12e0: 6f 72 0a 20 20 20 20 20 2a 20 74 68 65 20 69 6e  or.     * the in
12f0: 76 6f 63 61 74 69 6f 6e 20 6f 66 20 6d 65 74 68  vocation of meth
1300: 6f 64 73 20 69 6e 20 74 68 65 20 63 6f 6d 6d 61  ods in the comma
1310: 6e 64 20 68 61 6e 64 6c 65 72 2e 0a 20 20 20 20  nd handler..    
1320: 20 2a 0a 20 20 20 20 20 2a 20 61 72 67 76 20 5b   *.     * argv [
1330: 30 5d 20 2e 2e 2e 20 5b 2e 5d 20 7c 20 5b 61 72  0] ... [.] | [ar
1340: 67 63 2d 32 5d 20 5b 61 72 67 63 2d 31 5d 20 7c  gc-2] [argc-1] |
1350: 20 5b 61 72 67 63 5d 20 20 5b 61 72 67 63 2b 32   [argc]  [argc+2
1360: 5d 0a 20 20 20 20 20 2a 20 20 20 20 20 20 63 6d  ].     *      cm
1370: 64 20 2e 2e 2e 20 70 66 78 20 7c 20 6d 65 74 68  d ... pfx | meth
1380: 6f 64 20 20 20 63 68 61 6e 20 20 20 20 20 7c 20  od   chan     | 
1390: 64 65 74 61 69 6c 31 20 64 65 74 61 69 6c 32 0a  detail1 detail2.
13a0: 20 20 20 20 20 2a 20 20 20 20 20 20 7e 7e 7e 7e       *      ~~~~
13b0: 20 43 54 20 7e 7e 7e 20 20 20 20 20 20 20 20 20   CT ~~~         
13c0: 20 20 20 7e 7e 20 43 54 20 7e 7e 0a 20 20 20 20     ~~ CT ~~.    
13d0: 20 2a 0a 20 20 20 20 20 2a 20 43 54 20 3d 20 42   *.     * CT = B
13e0: 65 6c 6f 6e 67 73 20 74 6f 20 74 68 65 20 27 43  elongs to the 'C
13f0: 6f 6d 6d 61 6e 64 20 68 61 6e 64 6c 65 72 20 54  ommand handler T
1400: 68 72 65 61 64 27 2e 0a 20 20 20 20 20 2a 2f 0a  hread'..     */.
1410: 0a 20 20 20 20 69 6e 74 20 61 72 67 63 3b 09 09  .    int argc;..
1420: 09 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 72  ./* Number of pr
1430: 65 61 6c 6c 6f 63 61 74 65 64 20 77 6f 72 64 73  eallocated words
1440: 20 2d 20 32 20 2a 2f 0a 20 20 20 20 54 63 6c 5f   - 2 */.    Tcl_
1450: 4f 62 6a 20 2a 2a 61 72 67 76 3b 09 09 2f 2a 20  Obj **argv;../* 
1460: 50 72 65 61 6c 6c 6f 63 61 74 65 64 20 61 72 72  Preallocated arr
1470: 61 79 20 66 6f 72 20 63 61 6c 6c 69 6e 67 20 74  ay for calling t
1480: 68 65 20 68 61 6e 64 6c 65 72 2e 0a 09 09 09 09  he handler......
1490: 20 2a 20 61 72 67 73 5b 30 5d 20 69 73 20 70 6c   * args[0] is pl
14a0: 61 63 65 68 6f 6c 64 65 72 20 66 6f 72 20 63 6d  aceholder for cm
14b0: 64 20 77 6f 72 64 2e 0a 09 09 09 09 20 2a 20 46  d word...... * F
14c0: 6f 6c 6c 6f 77 65 64 20 62 79 20 74 68 65 20 61  ollowed by the a
14d0: 72 67 75 6d 65 6e 74 73 20 69 6e 20 74 68 65 20  rguments in the 
14e0: 70 72 65 66 69 78 2c 0a 09 09 09 09 20 2a 20 70  prefix,..... * p
14f0: 6c 75 73 20 34 20 70 6c 61 63 65 68 6f 6c 64 65  lus 4 placeholde
1500: 72 73 20 66 6f 72 20 6d 65 74 68 6f 64 2c 20 63  rs for method, c
1510: 68 61 6e 6e 65 6c 2c 0a 09 09 09 09 20 2a 20 61  hannel,..... * a
1520: 6e 64 20 61 74 20 6d 6f 73 74 20 74 77 6f 20 76  nd at most two v
1530: 61 72 79 69 6e 67 20 28 6d 65 74 68 6f 64 20 73  arying (method s
1540: 70 65 63 69 66 69 63 29 0a 09 09 09 09 20 2a 20  pecific)..... * 
1550: 77 6f 72 64 73 2e 20 2a 2f 0a 20 20 20 20 69 6e  words. */.    in
1560: 74 20 6d 65 74 68 6f 64 73 3b 09 09 2f 2a 20 42  t methods;../* B
1570: 69 74 6d 61 73 6b 20 6f 66 20 73 75 70 70 6f 72  itmask of suppor
1580: 74 65 64 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 0a  ted methods */..
1590: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 4e 4f      /*.     * NO
15a0: 54 45 20 28 39 29 3a 20 53 68 6f 75 6c 64 20 77  TE (9): Should w
15b0: 65 20 68 61 76 65 20 70 72 65 64 65 66 69 6e 65  e have predefine
15c0: 64 20 73 68 61 72 65 64 20 6c 69 74 65 72 61 6c  d shared literal
15d0: 73 20 66 6f 72 20 74 68 65 20 6d 65 74 68 6f 64  s for the method
15e0: 0a 20 20 20 20 20 2a 20 6e 61 6d 65 73 3f 0a 20  .     * names?. 
15f0: 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69 6e 74 20      */..    int 
1600: 6d 6f 64 65 3b 09 09 09 2f 2a 20 4d 61 73 6b 20  mode;.../* Mask 
1610: 6f 66 20 52 2f 57 20 6d 6f 64 65 20 2a 2f 0a 20  of R/W mode */. 
1620: 20 20 20 69 6e 74 20 69 6e 74 65 72 65 73 74 3b     int interest;
1630: 09 09 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 76 65  ../* Mask of eve
1640: 6e 74 73 20 74 68 65 20 63 68 61 6e 6e 65 6c 20  nts the channel 
1650: 69 73 20 69 6e 74 65 72 65 73 74 65 64 0a 09 09  is interested...
1660: 09 09 20 2a 20 69 6e 2e 20 2a 2f 0a 20 20 20 20  .. * in. */.    
1670: 69 6e 74 20 62 6c 6f 63 6b 69 6e 67 3b 20 20 20  int blocking;   
1680: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1690: 6c 61 67 3a 20 43 68 61 6e 6e 65 6c 20 69 73 20  lag: Channel is 
16a0: 62 6c 6f 63 6b 69 6e 67 20 6f 72 20 6e 6f 74 20  blocking or not 
16b0: 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 61 64 49  */.    int readI
16c0: 73 44 72 61 69 6e 65 64 3b 20 20 20 20 20 20 20  sDrained;       
16d0: 20 20 20 2f 2a 20 46 6c 61 67 3a 20 52 65 61 64     /* Flag: Read
16e0: 20 62 75 66 66 65 72 73 20 61 72 65 20 66 6c 75   buffers are flu
16f0: 73 68 65 64 2a 2f 0a 0a 20 20 20 20 52 65 73 75  shed*/..    Resu
1700: 6c 74 42 75 66 66 65 72 20 72 65 73 75 6c 74 3b  ltBuffer result;
1710: 0a 0a 7d 20 52 65 66 6c 65 63 74 65 64 54 72 61  ..} ReflectedTra
1720: 6e 73 66 6f 72 6d 3b 0a 0a 2f 2a 0a 20 2a 20 45  nsform;../*. * E
1730: 76 65 6e 74 20 6c 69 74 65 72 61 6c 73 2e 20 3d  vent literals. =
1740: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1750: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1760: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1770: 3d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 63 6f  =. */..static co
1780: 6e 73 74 20 63 68 61 72 20 2a 65 76 65 6e 74 4f  nst char *eventO
1790: 70 74 69 6f 6e 73 5b 5d 20 3d 20 7b 0a 20 20 20  ptions[] = {.   
17a0: 20 22 72 65 61 64 22 2c 20 22 77 72 69 74 65 22   "read", "write"
17b0: 2c 20 4e 55 4c 4c 0a 7d 3b 0a 74 79 70 65 64 65  , NULL.};.typede
17c0: 66 20 65 6e 75 6d 20 7b 0a 20 20 20 20 45 56 45  f enum {.    EVE
17d0: 4e 54 5f 52 45 41 44 2c 20 45 56 45 4e 54 5f 57  NT_READ, EVENT_W
17e0: 52 49 54 45 0a 7d 20 45 76 65 6e 74 4f 70 74 69  RITE.} EventOpti
17f0: 6f 6e 3b 0a 0a 2f 2a 0a 20 2a 20 4d 65 74 68 6f  on;../*. * Metho
1800: 64 20 6c 69 74 65 72 61 6c 73 2e 20 3d 3d 3d 3d  d literals. ====
1810: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1820: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1830: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 20  ==============. 
1840: 2a 2f 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  */..static const
1850: 20 63 68 61 72 20 2a 6d 65 74 68 6f 64 4e 61 6d   char *methodNam
1860: 65 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 22 63 6c  es[] = {.    "cl
1870: 65 61 72 22 2c 09 09 2f 2a 20 4f 50 54 20 2a 2f  ear",../* OPT */
1880: 0a 20 20 20 20 22 64 72 61 69 6e 22 2c 09 09 2f  .    "drain",../
1890: 2a 20 4f 50 54 2c 20 64 72 61 69 6e 20 3d 3e 20  * OPT, drain => 
18a0: 72 65 61 64 20 2a 2f 0a 20 20 20 20 22 65 76 65  read */.    "eve
18b0: 6e 74 22 2c 09 09 2f 2a 20 4f 50 54 2c 20 65 76  nt",../* OPT, ev
18c0: 65 6e 74 20 3c 3d 3e 20 77 61 74 63 68 20 2a 2f  ent <=> watch */
18d0: 0a 20 20 20 20 22 66 69 6e 61 6c 69 7a 65 22 2c  .    "finalize",
18e0: 09 09 2f 2a 20 20 20 20 20 2a 2f 0a 20 20 20 20  ../*     */.    
18f0: 22 66 6c 75 73 68 22 2c 09 09 2f 2a 20 4f 50 54  "flush",../* OPT
1900: 2c 20 66 6c 75 73 68 20 3d 3e 20 77 72 69 74 65  , flush => write
1910: 20 2a 2f 0a 20 20 20 20 22 69 6e 69 74 69 61 6c   */.    "initial
1920: 69 7a 65 22 2c 09 2f 2a 20 20 20 20 20 2a 2f 0a  ize",./*     */.
1930: 20 20 20 20 22 6c 69 6d 69 74 3f 22 2c 09 09 2f      "limit?",../
1940: 2a 20 4f 50 54 20 2a 2f 0a 20 20 20 20 22 72 65  * OPT */.    "re
1950: 61 64 22 2c 09 09 2f 2a 20 4f 50 54 20 2a 2f 0a  ad",../* OPT */.
1960: 20 20 20 20 22 77 61 74 63 68 22 2c 09 09 2f 2a      "watch",../*
1970: 20 4f 50 54 2c 20 77 61 74 63 68 20 3c 3d 3e 20   OPT, watch <=> 
1980: 65 76 65 6e 74 20 2a 2f 0a 20 20 20 20 22 77 72  event */.    "wr
1990: 69 74 65 22 2c 09 09 2f 2a 20 4f 50 54 20 2a 2f  ite",../* OPT */
19a0: 0a 20 20 20 20 4e 55 4c 4c 0a 7d 3b 0a 74 79 70  .    NULL.};.typ
19b0: 65 64 65 66 20 65 6e 75 6d 20 7b 0a 20 20 20 20  edef enum {.    
19c0: 4d 45 54 48 5f 43 4c 45 41 52 2c 0a 20 20 20 20  METH_CLEAR,.    
19d0: 4d 45 54 48 5f 44 52 41 49 4e 2c 0a 20 20 20 20  METH_DRAIN,.    
19e0: 4d 45 54 48 5f 45 56 45 4e 54 2c 0a 20 20 20 20  METH_EVENT,.    
19f0: 4d 45 54 48 5f 46 49 4e 41 4c 2c 0a 20 20 20 20  METH_FINAL,.    
1a00: 4d 45 54 48 5f 46 4c 55 53 48 2c 0a 20 20 20 20  METH_FLUSH,.    
1a10: 4d 45 54 48 5f 49 4e 49 54 2c 0a 20 20 20 20 4d  METH_INIT,.    M
1a20: 45 54 48 5f 4c 49 4d 49 54 2c 0a 20 20 20 20 4d  ETH_LIMIT,.    M
1a30: 45 54 48 5f 52 45 41 44 2c 0a 20 20 20 20 4d 45  ETH_READ,.    ME
1a40: 54 48 5f 57 41 54 43 48 2c 0a 20 20 20 20 4d 45  TH_WATCH,.    ME
1a50: 54 48 5f 57 52 49 54 45 0a 7d 20 4d 65 74 68 6f  TH_WRITE.} Metho
1a60: 64 4e 61 6d 65 3b 0a 0a 23 64 65 66 69 6e 65 20  dName;..#define 
1a70: 46 4c 41 47 28 6d 29 20 28 31 20 3c 3c 20 28 6d  FLAG(m) (1 << (m
1a80: 29 29 0a 23 64 65 66 69 6e 65 20 52 45 51 55 49  )).#define REQUI
1a90: 52 45 44 5f 4d 45 54 48 4f 44 53 20 5c 0a 09 28  RED_METHODS \..(
1aa0: 46 4c 41 47 28 4d 45 54 48 5f 49 4e 49 54 29 20  FLAG(METH_INIT) 
1ab0: 7c 20 46 4c 41 47 28 4d 45 54 48 5f 46 49 4e 41  | FLAG(METH_FINA
1ac0: 4c 29 29 0a 23 64 65 66 69 6e 65 20 52 41 4e 44  L)).#define RAND
1ad0: 57 20 5c 0a 09 28 54 43 4c 5f 52 45 41 44 41 42  W \..(TCL_READAB
1ae0: 4c 45 20 7c 20 54 43 4c 5f 57 52 49 54 41 42 4c  LE | TCL_WRITABL
1af0: 45 29 0a 0a 23 64 65 66 69 6e 65 20 49 4d 50 4c  E)..#define IMPL
1b00: 49 45 53 28 61 2c 62 29 09 28 28 21 28 61 29 29  IES(a,b).((!(a))
1b10: 20 7c 7c 20 28 62 29 29 0a 23 64 65 66 69 6e 65   || (b)).#define
1b20: 20 4e 45 47 49 4d 50 4c 28 61 2c 62 29 0a 23 64   NEGIMPL(a,b).#d
1b30: 65 66 69 6e 65 20 48 41 53 28 78 2c 66 29 09 28  efine HAS(x,f).(
1b40: 78 20 26 20 46 4c 41 47 28 66 29 29 0a 0c 0a 23  x & FLAG(f))...#
1b50: 69 66 64 65 66 20 54 43 4c 5f 54 48 52 45 41 44  ifdef TCL_THREAD
1b60: 53 0a 2f 2a 0a 20 2a 20 54 68 72 65 61 64 20 73  S./*. * Thread s
1b70: 70 65 63 69 66 69 63 20 74 79 70 65 73 20 61 6e  pecific types an
1b80: 64 20 73 74 72 75 63 74 75 72 65 73 2e 0a 20 2a  d structures.. *
1b90: 0a 20 2a 20 57 65 20 61 72 65 20 68 65 72 65 20  . * We are here 
1ba0: 65 73 73 65 6e 74 69 61 6c 6c 79 20 63 72 65 61  essentially crea
1bb0: 74 69 6e 67 20 61 20 76 65 72 79 20 73 70 65 63  ting a very spec
1bc0: 69 66 69 63 20 69 6d 70 6c 65 6d 65 6e 74 61 74  ific implementat
1bd0: 69 6f 6e 20 6f 66 20 27 74 68 72 65 61 64 0a 20  ion of 'thread. 
1be0: 2a 20 73 65 6e 64 27 2e 0a 20 2a 2f 0a 0a 2f 2a  * send'.. */../*
1bf0: 0a 20 2a 20 45 6e 75 6d 65 72 61 74 69 6f 6e 20  . * Enumeration 
1c00: 6f 66 20 61 6c 6c 20 6f 70 65 72 61 74 69 6f 6e  of all operation
1c10: 73 20 77 68 69 63 68 20 63 61 6e 20 62 65 20 66  s which can be f
1c20: 6f 72 77 61 72 64 65 64 2e 0a 20 2a 2f 0a 0a 74  orwarded.. */..t
1c30: 79 70 65 64 65 66 20 65 6e 75 6d 20 7b 0a 20 20  ypedef enum {.  
1c40: 20 20 46 6f 72 77 61 72 64 65 64 43 6c 65 61 72    ForwardedClear
1c50: 2c 0a 20 20 20 20 46 6f 72 77 61 72 64 65 64 43  ,.    ForwardedC
1c60: 6c 6f 73 65 2c 0a 20 20 20 20 46 6f 72 77 61 72  lose,.    Forwar
1c70: 64 65 64 44 72 61 69 6e 2c 0a 20 20 20 20 46 6f  dedDrain,.    Fo
1c80: 72 77 61 72 64 65 64 45 76 65 6e 74 2c 0a 20 20  rwardedEvent,.  
1c90: 20 20 46 6f 72 77 61 72 64 65 64 46 6c 75 73 68    ForwardedFlush
1ca0: 2c 0a 20 20 20 20 46 6f 72 77 61 72 64 65 64 49  ,.    ForwardedI
1cb0: 6e 70 75 74 2c 0a 20 20 20 20 46 6f 72 77 61 72  nput,.    Forwar
1cc0: 64 65 64 4c 69 6d 69 74 2c 0a 20 20 20 20 46 6f  dedLimit,.    Fo
1cd0: 72 77 61 72 64 65 64 4f 75 74 70 75 74 2c 0a 20  rwardedOutput,. 
1ce0: 20 20 20 46 6f 72 77 61 72 64 65 64 57 61 74 63     ForwardedWatc
1cf0: 68 0a 7d 20 46 6f 72 77 61 72 64 65 64 4f 70 65  h.} ForwardedOpe
1d00: 72 61 74 69 6f 6e 3b 0a 0a 2f 2a 0a 20 2a 20 45  ration;../*. * E
1d10: 76 65 6e 74 20 75 73 65 64 20 74 6f 20 66 6f 72  vent used to for
1d20: 77 61 72 64 20 64 72 69 76 65 72 20 69 6e 76 6f  ward driver invo
1d30: 63 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 74  cations to the t
1d40: 68 72 65 61 64 20 61 63 74 75 61 6c 6c 79 20 6d  hread actually m
1d50: 61 6e 61 67 69 6e 67 0a 20 2a 20 74 68 65 20 63  anaging. * the c
1d60: 68 61 6e 6e 65 6c 2e 20 57 65 20 63 61 6e 6e 6f  hannel. We canno
1d70: 74 20 63 6f 6e 73 74 72 75 63 74 20 74 68 65 20  t construct the 
1d80: 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 78 65 63 75  command to execu
1d90: 74 65 20 61 6e 64 20 66 6f 72 77 61 72 64 0a 20  te and forward. 
1da0: 2a 20 74 68 61 74 2e 20 42 65 63 61 75 73 65 20  * that. Because 
1db0: 74 68 65 6e 20 69 74 20 77 69 6c 6c 20 63 6f 6e  then it will con
1dc0: 74 61 69 6e 20 61 20 6d 69 78 74 75 72 65 20 6f  tain a mixture o
1dd0: 66 20 54 63 6c 5f 4f 62 6a 27 73 20 62 65 6c 6f  f Tcl_Obj's belo
1de0: 6e 67 69 6e 67 20 74 6f 20 62 6f 74 68 0a 20 2a  nging to both. *
1df0: 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 68 61 6e   the command han
1e00: 64 6c 65 72 20 74 68 72 65 61 64 20 28 43 54 29  dler thread (CT)
1e10: 2c 20 61 6e 64 20 74 68 65 20 74 68 72 65 61 64  , and the thread
1e20: 20 6d 61 6e 61 67 69 6e 67 20 74 68 65 20 63 68   managing the ch
1e30: 61 6e 6e 65 6c 20 28 4d 54 29 2c 0a 20 2a 20 65  annel (MT),. * e
1e40: 78 65 63 75 74 65 64 20 69 6e 20 43 54 2e 20 54  xecuted in CT. T
1e50: 63 6c 5f 4f 62 6a 27 73 20 61 72 65 20 6e 6f 74  cl_Obj's are not
1e60: 20 61 6c 6c 6f 77 65 64 20 74 6f 20 63 72 6f 73   allowed to cros
1e70: 73 20 74 68 72 65 61 64 20 62 6f 75 6e 64 61 72  s thread boundar
1e80: 69 65 73 2e 20 53 6f 20 77 65 0a 20 2a 20 66 6f  ies. So we. * fo
1e90: 72 77 61 72 64 20 61 6e 20 6f 70 65 72 61 74 69  rward an operati
1ea0: 6f 6e 20 63 6f 64 65 2c 20 74 68 65 20 61 72 67  on code, the arg
1eb0: 75 6d 65 6e 74 20 64 65 74 61 69 6c 73 2c 20 61  ument details, a
1ec0: 6e 64 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  nd reference to 
1ed0: 72 65 73 75 6c 74 73 2e 0a 20 2a 20 54 68 65 20  results.. * The 
1ee0: 63 6f 6d 6d 61 6e 64 20 69 73 20 61 73 73 65 6d  command is assem
1ef0: 62 6c 65 64 20 69 6e 20 74 68 65 20 43 54 20 61  bled in the CT a
1f00: 6e 64 20 62 65 6c 6f 6e 67 73 20 66 75 6c 6c 79  nd belongs fully
1f10: 20 74 6f 20 74 68 61 74 20 74 68 72 65 61 64 2e   to that thread.
1f20: 20 4e 6f 0a 20 2a 20 73 68 61 72 69 6e 67 20 70   No. * sharing p
1f30: 72 6f 62 6c 65 6d 73 2e 0a 20 2a 2f 0a 0a 74 79  roblems.. */..ty
1f40: 70 65 64 65 66 20 73 74 72 75 63 74 20 46 6f 72  pedef struct For
1f50: 77 61 72 64 50 61 72 61 6d 42 61 73 65 20 7b 0a  wardParamBase {.
1f60: 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 09 09 09      int code;...
1f70: 2f 2a 20 4f 3a 20 4f 6b 2f 46 61 69 6c 20 6f 66  /* O: Ok/Fail of
1f80: 20 74 68 65 20 63 6d 64 20 68 61 6e 64 6c 65 72   the cmd handler
1f90: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 6d 73   */.    char *ms
1fa0: 67 53 74 72 3b 09 09 2f 2a 20 4f 3a 20 45 72 72  gStr;../* O: Err
1fb0: 6f 72 20 6d 65 73 73 61 67 65 20 66 6f 72 20 68  or message for h
1fc0: 61 6e 64 6c 65 72 20 66 61 69 6c 75 72 65 20 2a  andler failure *
1fd0: 2f 0a 20 20 20 20 69 6e 74 20 6d 75 73 74 46 72  /.    int mustFr
1fe0: 65 65 3b 09 09 2f 2a 20 4f 3a 20 54 72 75 65 20  ee;../* O: True 
1ff0: 69 66 20 6d 73 67 53 74 72 20 69 73 20 61 6c 6c  if msgStr is all
2000: 6f 63 61 74 65 64 2c 20 66 61 6c 73 65 20 69 66  ocated, false if
2010: 0a 09 09 09 09 20 2a 20 6f 74 68 65 72 77 69 73  ..... * otherwis
2020: 65 20 28 73 74 61 74 69 63 29 2e 20 2a 2f 0a 7d  e (static). */.}
2030: 20 46 6f 72 77 61 72 64 50 61 72 61 6d 42 61 73   ForwardParamBas
2040: 65 3b 0a 0a 2f 2a 0a 20 2a 20 4f 70 65 72 61 74  e;../*. * Operat
2050: 69 6f 6e 20 73 70 65 63 69 66 69 63 20 70 61 72  ion specific par
2060: 61 6d 65 74 65 72 2f 72 65 73 75 6c 74 20 73 74  ameter/result st
2070: 72 75 63 74 75 72 65 73 2e 20 28 54 68 65 73 65  ructures. (These
2080: 20 61 72 65 20 22 73 75 62 74 79 70 65 73 22 20   are "subtypes" 
2090: 6f 66 0a 20 2a 20 46 6f 72 77 61 72 64 50 61 72  of. * ForwardPar
20a0: 61 6d 42 61 73 65 2e 20 57 68 65 72 65 20 61 6e  amBase. Where an
20b0: 20 6f 70 65 72 61 74 69 6f 6e 20 64 6f 65 73 20   operation does 
20c0: 6e 6f 74 20 6e 65 65 64 20 61 6e 79 20 73 70 65  not need any spe
20d0: 63 69 61 6c 20 74 79 70 65 73 2c 20 69 74 0a 20  cial types, it. 
20e0: 2a 20 68 61 73 20 6e 6f 20 22 73 75 62 74 79 70  * has no "subtyp
20f0: 65 22 20 61 6e 64 20 6a 75 73 74 20 75 73 65 73  e" and just uses
2100: 20 46 6f 72 77 61 72 64 50 61 72 61 6d 42 61 73   ForwardParamBas
2110: 65 2c 20 61 73 20 6c 69 73 74 65 64 20 61 62 6f  e, as listed abo
2120: 76 65 2e 29 0a 20 2a 2f 0a 0a 73 74 72 75 63 74  ve.). */..struct
2130: 20 46 6f 72 77 61 72 64 50 61 72 61 6d 54 72 61   ForwardParamTra
2140: 6e 73 66 6f 72 6d 20 7b 0a 20 20 20 20 46 6f 72  nsform {.    For
2150: 77 61 72 64 50 61 72 61 6d 42 61 73 65 20 62 61  wardParamBase ba
2160: 73 65 3b 09 2f 2a 20 22 53 75 70 65 72 74 79 70  se;./* "Supertyp
2170: 65 22 2e 20 4d 55 53 54 20 43 4f 4d 45 20 46 49  e". MUST COME FI
2180: 52 53 54 2e 20 2a 2f 0a 20 20 20 20 63 68 61 72  RST. */.    char
2190: 20 2a 62 75 66 3b 09 09 09 2f 2a 20 49 3a 20 42   *buf;.../* I: B
21a0: 79 74 65 73 20 74 6f 20 74 72 61 6e 73 66 6f 72  ytes to transfor
21b0: 6d 2c 0a 09 09 09 09 20 2a 20 4f 3a 20 42 79 74  m,..... * O: Byt
21c0: 65 73 20 69 6e 20 74 72 61 6e 73 66 6f 72 6d 20  es in transform 
21d0: 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20 69 6e  result */.    in
21e0: 74 20 73 69 7a 65 3b 09 09 09 2f 2a 20 49 3a 20  t size;.../* I: 
21f0: 23 62 79 74 65 73 20 74 6f 20 74 72 61 6e 73 66  #bytes to transf
2200: 6f 72 6d 2c 0a 09 09 09 09 20 2a 20 4f 3a 20 23  orm,..... * O: #
2210: 62 79 74 65 73 20 69 6e 20 74 68 65 20 74 72 61  bytes in the tra
2220: 6e 73 66 6f 72 6d 20 72 65 73 75 6c 74 20 2a 2f  nsform result */
2230: 0a 7d 3b 0a 73 74 72 75 63 74 20 46 6f 72 77 61  .};.struct Forwa
2240: 72 64 50 61 72 61 6d 4d 61 73 6b 20 7b 0a 20 20  rdParamMask {.  
2250: 20 20 46 6f 72 77 61 72 64 50 61 72 61 6d 42 61    ForwardParamBa
2260: 73 65 20 62 61 73 65 3b 09 2f 2a 20 22 53 75 70  se base;./* "Sup
2270: 65 72 74 79 70 65 22 2e 20 4d 55 53 54 20 43 4f  ertype". MUST CO
2280: 4d 45 20 46 49 52 53 54 2e 20 2a 2f 0a 20 20 20  ME FIRST. */.   
2290: 20 69 6e 74 20 6d 61 73 6b 3b 09 09 09 2f 2a 20   int mask;.../* 
22a0: 49 3a 20 4d 61 73 6b 20 6f 66 20 74 68 65 20 73  I: Mask of the s
22b0: 69 67 6e 61 6c 65 64 20 65 76 65 6e 74 73 2c 0a  ignaled events,.
22c0: 09 09 09 09 2a 20 20 4f 3a 20 4d 61 73 6b 20 6f  ....*  O: Mask o
22d0: 66 20 65 76 65 6e 74 73 20 77 68 69 63 68 20 61  f events which a
22e0: 72 65 20 6f 66 20 69 6e 74 65 72 65 73 74 20 2a  re of interest *
22f0: 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 6f 72 77  /.};.struct Forw
2300: 61 72 64 50 61 72 61 6d 4c 69 6d 69 74 20 7b 0a  ardParamLimit {.
2310: 20 20 20 20 46 6f 72 77 61 72 64 50 61 72 61 6d      ForwardParam
2320: 42 61 73 65 20 62 61 73 65 3b 09 2f 2a 20 22 53  Base base;./* "S
2330: 75 70 65 72 74 79 70 65 22 2e 20 4d 55 53 54 20  upertype". MUST 
2340: 43 4f 4d 45 20 46 49 52 53 54 2e 20 2a 2f 0a 20  COME FIRST. */. 
2350: 20 20 20 69 6e 74 20 6d 61 78 3b 09 09 09 2f 2a     int max;.../*
2360: 20 4f 3a 20 43 68 61 72 61 63 74 65 72 20 72 65   O: Character re
2370: 61 64 20 6c 69 6d 69 74 20 2a 2f 0a 7d 3b 0a 0a  ad limit */.};..
2380: 2f 2a 0a 20 2a 20 4e 6f 77 20 6a 6f 69 6e 20 61  /*. * Now join a
2390: 6c 6c 20 74 68 65 73 65 20 74 6f 67 65 74 68 65  ll these togethe
23a0: 72 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 75 6e  r in a single un
23b0: 69 6f 6e 20 66 6f 72 20 63 6f 6e 76 65 6e 69 65  ion for convenie
23c0: 6e 63 65 2e 0a 20 2a 2f 0a 0a 74 79 70 65 64 65  nce.. */..typede
23d0: 66 20 75 6e 69 6f 6e 20 46 6f 72 77 61 72 64 50  f union ForwardP
23e0: 61 72 61 6d 20 7b 0a 20 20 20 20 46 6f 72 77 61  aram {.    Forwa
23f0: 72 64 50 61 72 61 6d 42 61 73 65 20 62 61 73 65  rdParamBase base
2400: 3b 0a 20 20 20 20 73 74 72 75 63 74 20 46 6f 72  ;.    struct For
2410: 77 61 72 64 50 61 72 61 6d 54 72 61 6e 73 66 6f  wardParamTransfo
2420: 72 6d 20 74 72 61 6e 73 66 6f 72 6d 3b 0a 20 20  rm transform;.  
2430: 20 20 73 74 72 75 63 74 20 46 6f 72 77 61 72 64    struct Forward
2440: 50 61 72 61 6d 4d 61 73 6b 20 20 20 20 20 20 6d  ParamMask      m
2450: 61 73 6b 3b 0a 20 20 20 20 73 74 72 75 63 74 20  ask;.    struct 
2460: 46 6f 72 77 61 72 64 50 61 72 61 6d 4c 69 6d 69  ForwardParamLimi
2470: 74 20 20 20 20 20 6c 69 6d 69 74 3b 0a 7d 20 46  t     limit;.} F
2480: 6f 72 77 61 72 64 50 61 72 61 6d 3b 0a 0a 2f 2a  orwardParam;../*
2490: 0a 20 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c  . * Forward decl
24a0: 61 72 61 74 69 6f 6e 2e 0a 20 2a 2f 0a 0a 74 79  aration.. */..ty
24b0: 70 65 64 65 66 20 73 74 72 75 63 74 20 46 6f 72  pedef struct For
24c0: 77 61 72 64 69 6e 67 52 65 73 75 6c 74 20 46 6f  wardingResult Fo
24d0: 72 77 61 72 64 69 6e 67 52 65 73 75 6c 74 3b 0a  rwardingResult;.
24e0: 0a 2f 2a 0a 20 2a 20 47 65 6e 65 72 61 6c 20 65  ./*. * General e
24f0: 76 65 6e 74 20 73 74 72 75 63 74 75 72 65 2c 20  vent structure, 
2500: 77 69 74 68 20 72 65 66 65 72 65 6e 63 65 20 74  with reference t
2510: 6f 20 6f 70 65 72 61 74 69 6f 6e 20 73 70 65 63  o operation spec
2520: 69 66 69 63 20 64 61 74 61 2e 0a 20 2a 2f 0a 0a  ific data.. */..
2530: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46  typedef struct F
2540: 6f 72 77 61 72 64 69 6e 67 45 76 65 6e 74 20 7b  orwardingEvent {
2550: 0a 20 20 20 20 54 63 6c 5f 45 76 65 6e 74 20 65  .    Tcl_Event e
2560: 76 65 6e 74 3b 09 09 2f 2a 20 42 61 73 69 63 20  vent;../* Basic 
2570: 65 76 65 6e 74 20 64 61 74 61 2c 20 68 61 73 20  event data, has 
2580: 74 6f 20 62 65 20 66 69 72 73 74 20 69 74 65 6d  to be first item
2590: 20 2a 2f 0a 20 20 20 20 46 6f 72 77 61 72 64 69   */.    Forwardi
25a0: 6e 67 52 65 73 75 6c 74 20 2a 72 65 73 75 6c 74  ngResult *result
25b0: 50 74 72 3b 0a 20 20 20 20 46 6f 72 77 61 72 64  Ptr;.    Forward
25c0: 65 64 4f 70 65 72 61 74 69 6f 6e 20 6f 70 3b 09  edOperation op;.
25d0: 2f 2a 20 46 6f 72 77 61 72 64 65 64 20 64 72 69  /* Forwarded dri
25e0: 76 65 72 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f  ver operation */
25f0: 0a 20 20 20 20 52 65 66 6c 65 63 74 65 64 54 72  .    ReflectedTr
2600: 61 6e 73 66 6f 72 6d 20 2a 72 74 50 74 72 3b 09  ansform *rtPtr;.
2610: 2f 2a 20 43 68 61 6e 6e 65 6c 20 69 6e 73 74 61  /* Channel insta
2620: 6e 63 65 20 2a 2f 0a 20 20 20 20 46 6f 72 77 61  nce */.    Forwa
2630: 72 64 50 61 72 61 6d 20 2a 70 61 72 61 6d 3b 09  rdParam *param;.
2640: 2f 2a 20 50 61 63 6b 61 67 65 64 20 61 72 67 75  /* Packaged argu
2650: 6d 65 6e 74 73 20 61 6e 64 20 72 65 74 75 72 6e  ments and return
2660: 20 76 61 6c 75 65 73 2c 20 61 0a 09 09 09 09 20   values, a..... 
2670: 2a 20 46 6f 72 77 61 72 64 50 61 72 61 6d 20 70  * ForwardParam p
2680: 6f 69 6e 74 65 72 2e 20 2a 2f 0a 7d 20 46 6f 72  ointer. */.} For
2690: 77 61 72 64 69 6e 67 45 76 65 6e 74 3b 0a 0a 2f  wardingEvent;../
26a0: 2a 0a 20 2a 20 53 74 72 75 63 74 75 72 65 20 74  *. * Structure t
26b0: 6f 20 6d 61 6e 61 67 65 20 74 68 65 20 72 65 73  o manage the res
26c0: 75 6c 74 20 6f 66 20 74 68 65 20 66 6f 72 77 61  ult of the forwa
26d0: 72 64 69 6e 67 2e 20 54 68 69 73 20 69 73 20 6e  rding. This is n
26e0: 6f 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  ot the result of
26f0: 0a 20 2a 20 74 68 65 20 6f 70 65 72 61 74 69 6f  . * the operatio
2700: 6e 20 69 74 73 65 6c 66 2c 20 62 75 74 20 61 62  n itself, but ab
2710: 6f 75 74 20 74 68 65 20 73 75 63 63 65 73 73 20  out the success 
2720: 6f 66 20 74 68 65 20 66 6f 72 77 61 72 64 20 65  of the forward e
2730: 76 65 6e 74 20 69 74 73 65 6c 66 2e 0a 20 2a 20  vent itself.. * 
2740: 54 68 65 20 65 76 65 6e 74 20 63 61 6e 20 62 65  The event can be
2750: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 65 76 65   successful, eve
2760: 6e 20 69 66 20 74 68 65 20 6f 70 65 72 61 74 69  n if the operati
2770: 6f 6e 20 77 68 69 63 68 20 77 61 73 20 66 6f 72  on which was for
2780: 77 61 72 64 65 64 0a 20 2a 20 66 61 69 6c 65 64  warded. * failed
2790: 2e 20 49 74 20 69 73 20 61 6c 73 6f 20 74 68 65  . It is also the
27a0: 72 65 20 74 6f 20 6d 61 6e 61 67 65 20 74 68 65  re to manage the
27b0: 20 73 79 6e 63 68 72 6f 6e 69 7a 61 74 69 6f 6e   synchronization
27c0: 20 62 65 74 77 65 65 6e 20 74 68 65 20 69 6e 76   between the inv
27d0: 6f 6c 76 65 64 0a 20 2a 20 74 68 72 65 61 64 73  olved. * threads
27e0: 2e 0a 20 2a 2f 0a 0a 73 74 72 75 63 74 20 46 6f  .. */..struct Fo
27f0: 72 77 61 72 64 69 6e 67 52 65 73 75 6c 74 20 7b  rwardingResult {
2800: 0a 20 20 20 20 54 63 6c 5f 54 68 72 65 61 64 49  .    Tcl_ThreadI
2810: 64 20 73 72 63 3b 09 09 2f 2a 20 4f 72 69 67 69  d src;../* Origi
2820: 6e 61 74 69 6e 67 20 74 68 72 65 61 64 2e 20 2a  nating thread. *
2830: 2f 0a 20 20 20 20 54 63 6c 5f 54 68 72 65 61 64  /.    Tcl_Thread
2840: 49 64 20 64 73 74 3b 09 09 2f 2a 20 54 68 72 65  Id dst;../* Thre
2850: 61 64 20 74 68 65 20 6f 70 20 77 61 73 20 66 6f  ad the op was fo
2860: 72 77 61 72 64 65 64 20 74 6f 2e 20 2a 2f 0a 20  rwarded to. */. 
2870: 20 20 20 54 63 6c 5f 43 6f 6e 64 69 74 69 6f 6e     Tcl_Condition
2880: 20 64 6f 6e 65 3b 09 09 2f 2a 20 43 6f 6e 64 69   done;../* Condi
2890: 74 69 6f 6e 20 76 61 72 69 61 62 6c 65 20 74 68  tion variable th
28a0: 65 20 66 6f 72 77 61 72 64 65 72 20 62 6c 6f 63  e forwarder bloc
28b0: 6b 73 0a 09 09 09 09 20 2a 20 6f 6e 2e 20 2a 2f  ks..... * on. */
28c0: 0a 20 20 20 20 69 6e 74 20 72 65 73 75 6c 74 3b  .    int result;
28d0: 09 09 09 2f 2a 20 54 43 4c 5f 4f 4b 20 6f 72 20  .../* TCL_OK or 
28e0: 54 43 4c 5f 45 52 52 4f 52 20 2a 2f 0a 20 20 20  TCL_ERROR */.   
28f0: 20 46 6f 72 77 61 72 64 69 6e 67 45 76 65 6e 74   ForwardingEvent
2900: 20 2a 65 76 50 74 72 3b 09 2f 2a 20 45 76 65 6e   *evPtr;./* Even
2910: 74 20 74 68 65 20 72 65 73 75 6c 74 20 62 65 6c  t the result bel
2920: 6f 6e 67 73 20 74 6f 2e 20 2a 2f 0a 20 20 20 20  ongs to. */.    
2930: 46 6f 72 77 61 72 64 69 6e 67 52 65 73 75 6c 74  ForwardingResult
2940: 20 2a 70 72 65 76 50 74 72 2c 20 2a 6e 65 78 74   *prevPtr, *next
2950: 50 74 72 3b 0a 09 09 09 09 2f 2a 20 4c 69 6e 6b  Ptr;...../* Link
2960: 73 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 20  s into the list 
2970: 6f 66 20 70 65 6e 64 69 6e 67 20 66 6f 72 77 61  of pending forwa
2980: 72 64 65 64 0a 09 09 09 09 20 2a 20 72 65 73 75  rded..... * resu
2990: 6c 74 73 2e 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 20  lts. */.};../*. 
29a0: 2a 20 4c 69 73 74 20 6f 66 20 66 6f 72 77 61 72  * List of forwar
29b0: 64 65 64 20 6f 70 65 72 61 74 69 6f 6e 73 20 77  ded operations w
29c0: 68 69 63 68 20 68 61 76 65 20 6e 6f 74 20 63 6f  hich have not co
29d0: 6d 70 6c 65 74 65 64 20 79 65 74 2c 20 70 6c 75  mpleted yet, plu
29e0: 73 20 74 68 65 20 6d 75 74 65 78 0a 20 2a 20 74  s the mutex. * t
29f0: 6f 20 70 72 6f 74 65 63 74 20 74 68 65 20 61 63  o protect the ac
2a00: 63 65 73 73 20 74 6f 20 74 68 69 73 20 70 72 6f  cess to this pro
2a10: 63 65 73 73 20 67 6c 6f 62 61 6c 20 6c 69 73 74  cess global list
2a20: 2e 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 46 6f  .. */..static Fo
2a30: 72 77 61 72 64 69 6e 67 52 65 73 75 6c 74 20 2a  rwardingResult *
2a40: 66 6f 72 77 61 72 64 4c 69 73 74 20 3d 20 4e 55  forwardList = NU
2a50: 4c 4c 3b 0a 54 43 4c 5f 44 45 43 4c 41 52 45 5f  LL;.TCL_DECLARE_
2a60: 4d 55 54 45 58 28 72 63 46 6f 72 77 61 72 64 4d  MUTEX(rcForwardM
2a70: 75 74 65 78 29 0a 0a 2f 2a 0a 20 2a 20 46 75 6e  utex)../*. * Fun
2a80: 63 74 69 6f 6e 20 63 6f 6e 74 61 69 6e 69 6e 67  ction containing
2a90: 20 74 68 65 20 67 65 6e 65 72 69 63 20 63 6f 64   the generic cod
2aa0: 65 20 65 78 65 63 75 74 69 6e 67 20 61 20 66 6f  e executing a fo
2ab0: 72 77 61 72 64 2c 20 61 6e 64 20 77 72 61 70 70  rward, and wrapp
2ac0: 65 72 0a 20 2a 20 6d 61 63 72 6f 73 20 66 6f 72  er. * macros for
2ad0: 20 74 68 65 20 61 63 74 75 61 6c 20 6f 70 65 72   the actual oper
2ae0: 61 74 69 6f 6e 73 20 77 65 20 77 69 73 68 20 74  ations we wish t
2af0: 6f 20 66 6f 72 77 61 72 64 2e 20 55 73 65 73 20  o forward. Uses 
2b00: 46 6f 72 77 61 72 64 50 72 6f 63 20 61 73 0a 20  ForwardProc as. 
2b10: 2a 20 74 68 65 20 65 76 65 6e 74 20 66 75 6e 63  * the event func
2b20: 74 69 6f 6e 20 65 78 65 63 75 74 65 64 20 62 79  tion executed by
2b30: 20 74 68 65 20 74 68 72 65 61 64 20 72 65 63 65   the thread rece
2b40: 69 76 69 6e 67 20 61 20 66 6f 72 77 61 72 64 69  iving a forwardi
2b50: 6e 67 20 65 76 65 6e 74 0a 20 2a 20 28 77 68 69  ng event. * (whi
2b60: 63 68 20 65 78 65 63 75 74 65 73 20 74 68 65 20  ch executes the 
2b70: 61 70 70 72 6f 70 72 69 61 74 65 20 66 75 6e 63  appropriate func
2b80: 74 69 6f 6e 20 61 6e 64 20 63 6f 6c 6c 65 63 74  tion and collect
2b90: 73 20 74 68 65 20 72 65 73 75 6c 74 2c 20 69 66  s the result, if
2ba0: 20 61 6e 79 29 2e 0a 20 2a 0a 20 2a 20 54 68 65   any).. *. * The
2bb0: 20 74 77 6f 20 45 78 69 74 50 72 6f 63 73 20 61   two ExitProcs a
2bc0: 72 65 20 68 61 6e 64 6c 65 72 73 20 73 6f 20 74  re handlers so t
2bd0: 68 61 74 20 74 68 69 6e 67 73 20 64 6f 20 6e 6f  hat things do no
2be0: 74 20 64 65 61 64 6c 6f 63 6b 20 77 68 65 6e 20  t deadlock when 
2bf0: 65 69 74 68 65 72 0a 20 2a 20 74 68 72 65 61 64  either. * thread
2c00: 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65   involved in the
2c10: 20 66 6f 72 77 61 72 64 69 6e 67 20 65 78 69 74   forwarding exit
2c20: 73 2e 20 54 68 65 79 20 61 6c 73 6f 20 63 6c 65  s. They also cle
2c30: 61 6e 20 74 68 69 6e 67 73 20 75 70 20 73 6f 20  an things up so 
2c40: 74 68 61 74 0a 20 2a 20 77 65 20 64 6f 6e 27 74  that. * we don't
2c50: 20 6c 65 61 6b 20 72 65 73 6f 75 72 63 65 73 20   leak resources 
2c60: 77 68 65 6e 20 74 68 72 65 61 64 73 20 67 6f 20  when threads go 
2c70: 61 77 61 79 2e 0a 20 2a 2f 0a 0a 73 74 61 74 69  away.. */..stati
2c80: 63 20 76 6f 69 64 09 09 46 6f 72 77 61 72 64 4f  c void..ForwardO
2c90: 70 54 6f 4f 77 6e 65 72 54 68 72 65 61 64 28 52  pToOwnerThread(R
2ca0: 65 66 6c 65 63 74 65 64 54 72 61 6e 73 66 6f 72  eflectedTransfor
2cb0: 6d 20 2a 72 74 50 74 72 2c 0a 09 09 09 20 20 20  m *rtPtr,....   
2cc0: 20 46 6f 72 77 61 72 64 65 64 4f 70 65 72 61 74   ForwardedOperat
2cd0: 69 6f 6e 20 6f 70 2c 20 63 6f 6e 73 74 20 56 4f  ion op, const VO
2ce0: 49 44 20 2a 70 61 72 61 6d 29 3b 0a 73 74 61 74  ID *param);.stat
2cf0: 69 63 20 69 6e 74 09 09 46 6f 72 77 61 72 64 50  ic int..ForwardP
2d00: 72 6f 63 28 54 63 6c 5f 45 76 65 6e 74 20 2a 65  roc(Tcl_Event *e
2d10: 76 50 74 72 2c 20 69 6e 74 20 6d 61 73 6b 29 3b  vPtr, int mask);
2d20: 0a 73 74 61 74 69 63 20 76 6f 69 64 09 09 53 72  .static void..Sr
2d30: 63 45 78 69 74 50 72 6f 63 28 43 6c 69 65 6e 74  cExitProc(Client
2d40: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 29  Data clientData)
2d50: 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 09 09 44  ;.static void..D
2d60: 73 74 45 78 69 74 50 72 6f 63 28 43 6c 69 65 6e  stExitProc(Clien
2d70: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
2d80: 29 3b 0a 0a 23 64 65 66 69 6e 65 20 46 72 65 65  );..#define Free
2d90: 52 65 63 65 69 76 65 64 45 72 72 6f 72 28 70 29  ReceivedError(p)
2da0: 20 5c 0a 09 69 66 20 28 28 70 29 2d 3e 62 61 73   \..if ((p)->bas
2db0: 65 2e 6d 75 73 74 46 72 65 65 29 20 7b 20 5c 0a  e.mustFree) { \.
2dc0: 09 20 20 20 20 63 6b 66 72 65 65 28 28 70 29 2d  .    ckfree((p)-
2dd0: 3e 62 61 73 65 2e 6d 73 67 53 74 72 29 3b 20 5c  >base.msgStr); \
2de0: 0a 09 7d 0a 23 64 65 66 69 6e 65 20 50 61 73 73  ..}.#define Pass
2df0: 52 65 63 65 69 76 65 64 45 72 72 6f 72 49 6e 74  ReceivedErrorInt
2e00: 65 72 70 28 69 2c 70 29 20 5c 0a 09 69 66 20 28  erp(i,p) \..if (
2e10: 28 69 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 20 5c  (i) != NULL) { \
2e20: 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61  ..    Tcl_SetCha
2e30: 6e 6e 65 6c 45 72 72 6f 72 49 6e 74 65 72 70 28  nnelErrorInterp(
2e40: 28 69 29 2c 20 5c 0a 09 09 20 20 20 20 54 63 6c  (i), \...    Tcl
2e50: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 70  _NewStringObj((p
2e60: 29 2d 3e 62 61 73 65 2e 6d 73 67 53 74 72 2c 20  )->base.msgStr, 
2e70: 2d 31 29 29 3b 20 5c 0a 09 7d 20 5c 0a 09 46 72  -1)); \..} \..Fr
2e80: 65 65 52 65 63 65 69 76 65 64 45 72 72 6f 72 28  eeReceivedError(
2e90: 70 29 0a 23 64 65 66 69 6e 65 20 50 61 73 73 52  p).#define PassR
2ea0: 65 63 65 69 76 65 64 45 72 72 6f 72 28 63 2c 70  eceivedError(c,p
2eb0: 29 20 5c 0a 09 54 63 6c 5f 53 65 74 43 68 61 6e  ) \..Tcl_SetChan
2ec0: 6e 65 6c 45 72 72 6f 72 28 28 63 29 2c 20 54 63  nelError((c), Tc
2ed0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28  l_NewStringObj((
2ee0: 70 29 2d 3e 62 61 73 65 2e 6d 73 67 53 74 72 2c  p)->base.msgStr,
2ef0: 20 2d 31 29 29 3b 20 5c 0a 09 46 72 65 65 52 65   -1)); \..FreeRe
2f00: 63 65 69 76 65 64 45 72 72 6f 72 28 70 29 0a 23  ceivedError(p).#
2f10: 64 65 66 69 6e 65 20 46 6f 72 77 61 72 64 53 65  define ForwardSe
2f20: 74 53 74 61 74 69 63 45 72 72 6f 72 28 70 2c 65  tStaticError(p,e
2f30: 6d 73 67 29 20 5c 0a 09 28 70 29 2d 3e 62 61 73  msg) \..(p)->bas
2f40: 65 2e 63 6f 64 65 20 3d 20 54 43 4c 5f 45 52 52  e.code = TCL_ERR
2f50: 4f 52 3b 20 5c 0a 09 28 70 29 2d 3e 62 61 73 65  OR; \..(p)->base
2f60: 2e 6d 75 73 74 46 72 65 65 20 3d 20 30 3b 20 5c  .mustFree = 0; \
2f70: 0a 09 28 70 29 2d 3e 62 61 73 65 2e 6d 73 67 53  ..(p)->base.msgS
2f80: 74 72 20 3d 20 28 63 68 61 72 20 2a 29 20 28 65  tr = (char *) (e
2f90: 6d 73 67 29 0a 23 64 65 66 69 6e 65 20 46 6f 72  msg).#define For
2fa0: 77 61 72 64 53 65 74 44 79 6e 61 6d 69 63 45 72  wardSetDynamicEr
2fb0: 72 6f 72 28 70 2c 65 6d 73 67 29 20 5c 0a 09 28  ror(p,emsg) \..(
2fc0: 70 29 2d 3e 62 61 73 65 2e 63 6f 64 65 20 3d 20  p)->base.code = 
2fd0: 54 43 4c 5f 45 52 52 4f 52 3b 20 5c 0a 09 28 70  TCL_ERROR; \..(p
2fe0: 29 2d 3e 62 61 73 65 2e 6d 75 73 74 46 72 65 65  )->base.mustFree
2ff0: 20 3d 20 31 3b 20 5c 0a 09 28 70 29 2d 3e 62 61   = 1; \..(p)->ba
3000: 73 65 2e 6d 73 67 53 74 72 20 3d 20 28 63 68 61  se.msgStr = (cha
3010: 72 20 2a 29 20 28 65 6d 73 67 29 0a 0a 73 74 61  r *) (emsg)..sta
3020: 74 69 63 20 76 6f 69 64 09 09 46 6f 72 77 61 72  tic void..Forwar
3030: 64 53 65 74 4f 62 6a 45 72 72 6f 72 28 46 6f 72  dSetObjError(For
3040: 77 61 72 64 50 61 72 61 6d 20 2a 70 2c 0a 09 09  wardParam *p,...
3050: 09 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62  .    Tcl_Obj *ob
3060: 6a 50 74 72 29 3b 0a 23 65 6e 64 69 66 20 2f 2a  jPtr);.#endif /*
3070: 20 54 43 4c 5f 54 48 52 45 41 44 53 20 2a 2f 0a   TCL_THREADS */.
3080: 0a 23 64 65 66 69 6e 65 20 53 65 74 43 68 61 6e  .#define SetChan
3090: 6e 65 6c 45 72 72 6f 72 53 74 72 28 63 2c 6d 73  nelErrorStr(c,ms
30a0: 67 53 74 72 29 20 5c 0a 09 54 63 6c 5f 53 65 74  gStr) \..Tcl_Set
30b0: 43 68 61 6e 6e 65 6c 45 72 72 6f 72 28 28 63 29  ChannelError((c)
30c0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
30d0: 62 6a 28 28 6d 73 67 53 74 72 29 2c 20 2d 31 29  bj((msgStr), -1)
30e0: 29 0a 0a 73 74 61 74 69 63 20 54 63 6c 5f 4f 62  )..static Tcl_Ob
30f0: 6a 20 2a 09 4d 61 72 73 68 61 6c 6c 45 72 72 6f  j *.MarshallErro
3100: 72 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  r(Tcl_Interp *in
3110: 74 65 72 70 29 3b 0a 73 74 61 74 69 63 20 76 6f  terp);.static vo
3120: 69 64 09 09 55 6e 6d 61 72 73 68 61 6c 6c 45 72  id..UnmarshallEr
3130: 72 6f 72 52 65 73 75 6c 74 28 54 63 6c 5f 49 6e  rorResult(Tcl_In
3140: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 09 09  terp *interp,...
3150: 09 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6d 73  .    Tcl_Obj *ms
3160: 67 4f 62 6a 29 3b 0a 0c 0a 2f 2a 0a 20 2a 20 53  gObj);.../*. * S
3170: 74 61 74 69 63 20 66 75 6e 63 74 69 6f 6e 73 20  tatic functions 
3180: 66 6f 72 20 74 68 69 73 20 66 69 6c 65 3a 0a 20  for this file:. 
3190: 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 09 09  */..static int..
31a0: 45 6e 63 6f 64 65 45 76 65 6e 74 4d 61 73 6b 28  EncodeEventMask(
31b0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
31c0: 72 70 2c 0a 09 09 09 20 20 20 20 63 6f 6e 73 74  rp,....    const
31d0: 20 63 68 61 72 20 2a 6f 62 6a 4e 61 6d 65 2c 20   char *objName, 
31e0: 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 2c 20 69 6e  Tcl_Obj *obj, in
31f0: 74 20 2a 6d 61 73 6b 29 3b 0a 73 74 61 74 69 63  t *mask);.static
3200: 20 54 63 6c 5f 4f 62 6a 20 2a 09 44 65 63 6f 64   Tcl_Obj *.Decod
3210: 65 45 76 65 6e 74 4d 61 73 6b 28 69 6e 74 20 6d  eEventMask(int m
3220: 61 73 6b 29 3b 0a 73 74 61 74 69 63 20 52 65 66  ask);.static Ref
3230: 6c 65 63 74 65 64 54 72 61 6e 73 66 6f 72 6d 20  lectedTransform 
3240: 2a 20 4e 65 77 52 65 66 6c 65 63 74 65 64 54 72  * NewReflectedTr
3250: 61 6e 73 66 6f 72 6d 28 54 63 6c 5f 49 6e 74 65  ansform(Tcl_Inte
3260: 72 70 20 2a 69 6e 74 65 72 70 2c 0a 09 09 09 20  rp *interp,.... 
3270: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 70     Tcl_Obj *cmdp
3280: 66 78 4f 62 6a 2c 20 69 6e 74 20 6d 6f 64 65 2c  fxObj, int mode,
3290: 20 54 63 6c 5f 4f 62 6a 20 2a 68 61 6e 64 6c 65   Tcl_Obj *handle
32a0: 4f 62 6a 2c 0a 09 09 09 20 20 20 20 54 63 6c 5f  Obj,....    Tcl_
32b0: 43 68 61 6e 6e 65 6c 20 70 61 72 65 6e 74 43 68  Channel parentCh
32c0: 61 6e 29 3b 0a 73 74 61 74 69 63 20 54 63 6c 5f  an);.static Tcl_
32d0: 4f 62 6a 20 2a 09 4e 65 78 74 48 61 6e 64 6c 65  Obj *.NextHandle
32e0: 28 76 6f 69 64 29 3b 0a 73 74 61 74 69 63 20 76  (void);.static v
32f0: 6f 69 64 09 09 46 72 65 65 52 65 66 6c 65 63 74  oid..FreeReflect
3300: 65 64 54 72 61 6e 73 66 6f 72 6d 28 52 65 66 6c  edTransform(Refl
3310: 65 63 74 65 64 54 72 61 6e 73 66 6f 72 6d 20 2a  ectedTransform *
3320: 72 74 50 74 72 29 3b 0a 73 74 61 74 69 63 20 69  rtPtr);.static i
3330: 6e 74 09 09 49 6e 76 6f 6b 65 54 63 6c 4d 65 74  nt..InvokeTclMet
3340: 68 6f 64 28 52 65 66 6c 65 63 74 65 64 54 72 61  hod(ReflectedTra
3350: 6e 73 66 6f 72 6d 20 2a 72 74 50 74 72 2c 0a 09  nsform *rtPtr,..
3360: 09 09 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ..    const char
3370: 20 2a 6d 65 74 68 6f 64 2c 20 54 63 6c 5f 4f 62   *method, Tcl_Ob
3380: 6a 20 2a 61 72 67 4f 6e 65 4f 62 6a 2c 0a 09 09  j *argOneObj,...
3390: 09 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 61 72  .    Tcl_Obj *ar
33a0: 67 54 77 6f 4f 62 6a 2c 20 54 63 6c 5f 4f 62 6a  gTwoObj, Tcl_Obj
33b0: 20 2a 2a 72 65 73 75 6c 74 4f 62 6a 50 74 72 29   **resultObjPtr)
33c0: 3b 0a 0a 2f 2a 0a 20 2a 20 47 6c 6f 62 61 6c 20  ;../*. * Global 
33d0: 63 6f 6e 73 74 61 6e 74 20 73 74 72 69 6e 67 73  constant strings
33e0: 20 28 6d 65 73 73 61 67 65 73 29 2e 20 3d 3d 3d   (messages). ===
33f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a  ===============.
3400: 20 2a 20 54 68 65 73 65 20 73 74 72 69 6e 67 20   * These string 
3410: 61 72 65 20 75 73 65 64 20 64 69 72 65 63 74 6c  are used directl
3420: 79 20 61 73 20 62 79 70 61 73 73 20 65 72 72 6f  y as bypass erro
3430: 72 73 2c 20 74 68 75 73 20 74 68 65 79 20 68 61  rs, thus they ha
3440: 76 65 20 74 6f 20 62 65 20 76 61 6c 69 64 0a 20  ve to be valid. 
3450: 2a 20 54 63 6c 20 6c 69 73 74 73 20 77 68 65 72  * Tcl lists wher
3460: 65 20 74 68 65 20 6c 61 73 74 20 65 6c 65 6d 65  e the last eleme
3470: 6e 74 20 69 73 20 74 68 65 20 6d 65 73 73 61 67  nt is the messag
3480: 65 20 69 74 73 65 6c 66 2e 20 48 65 6e 63 65 20  e itself. Hence 
3490: 74 68 65 0a 20 2a 20 6c 69 73 74 2d 71 75 6f 74  the. * list-quot
34a0: 69 6e 67 20 74 6f 20 6b 65 65 70 20 74 68 65 20  ing to keep the 
34b0: 77 6f 72 64 73 20 6f 66 20 74 68 65 20 6d 65 73  words of the mes
34c0: 73 61 67 65 20 74 6f 67 65 74 68 65 72 2e 20 53  sage together. S
34d0: 65 65 20 61 6c 73 6f 20 5b 78 5d 2e 0a 20 2a 2f  ee also [x].. */
34e0: 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  ..static const c
34f0: 68 61 72 20 2a 6d 73 67 5f 72 65 61 64 5f 62 61  har *msg_read_ba
3500: 64 6c 69 6d 69 74 20 3d 20 22 7b 54 63 6c 20 64  dlimit = "{Tcl d
3510: 72 69 76 65 72 20 72 65 74 75 72 6e 65 64 20 62  river returned b
3520: 61 64 20 72 65 61 64 20 6c 69 6d 69 74 20 27 30  ad read limit '0
3530: 27 7d 22 3b 0a 73 74 61 74 69 63 20 63 6f 6e 73  '}";.static cons
3540: 74 20 63 68 61 72 20 2a 6d 73 67 5f 72 65 61 64  t char *msg_read
3550: 5f 75 6e 73 75 70 20 3d 20 22 7b 72 65 61 64 20  _unsup = "{read 
3560: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 20 62 79  not supported by
3570: 20 54 63 6c 20 64 72 69 76 65 72 7d 22 3b 0a 73   Tcl driver}";.s
3580: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
3590: 20 2a 6d 73 67 5f 77 72 69 74 65 5f 75 6e 73 75   *msg_write_unsu
35a0: 70 20 3d 20 22 7b 77 72 69 74 65 20 6e 6f 74 20  p = "{write not 
35b0: 73 75 70 70 6f 72 74 65 64 20 62 79 20 54 63 6c  supported by Tcl
35c0: 20 64 72 69 76 65 72 7d 22 3b 0a 23 69 66 64 65   driver}";.#ifde
35d0: 66 20 54 43 4c 5f 54 48 52 45 41 44 53 0a 73 74  f TCL_THREADS.st
35e0: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
35f0: 2a 6d 73 67 5f 73 65 6e 64 5f 6f 72 69 67 69 6e  *msg_send_origin
3600: 6c 6f 73 74 20 3d 20 22 7b 4f 72 69 67 69 6e 20  lost = "{Origin 
3610: 74 68 72 65 61 64 20 6c 6f 73 74 7d 22 3b 0a 73  thread lost}";.s
3620: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
3630: 20 2a 6d 73 67 5f 73 65 6e 64 5f 64 73 74 6c 6f   *msg_send_dstlo
3640: 73 74 20 3d 20 22 7b 44 65 73 74 69 6e 61 74 69  st = "{Destinati
3650: 6f 6e 20 74 68 72 65 61 64 20 6c 6f 73 74 7d 22  on thread lost}"
3660: 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 54 43 4c 5f  ;.#endif /* TCL_
3670: 54 48 52 45 41 44 53 20 2a 2f 0a 0a 2f 2a 0a 20  THREADS */../*. 
3680: 2a 20 54 69 6d 65 72 20 6d 61 6e 61 67 65 6d 65  * Timer manageme
3690: 6e 74 20 28 66 6c 75 73 68 69 6e 67 20 6f 75 74  nt (flushing out
36a0: 20 62 75 66 66 65 72 65 64 20 64 61 74 61 20 76   buffered data v
36b0: 69 61 20 61 72 74 69 66 69 63 69 61 6c 20 65 76  ia artificial ev
36c0: 65 6e 74 73 29 2e 0a 20 2a 2f 0a 0a 2f 2a 0a 20  ents).. */../*. 
36d0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c  * Number of mill
36e0: 69 73 65 63 6f 6e 64 73 20 74 6f 20 77 61 69 74  iseconds to wait
36f0: 20 62 65 66 6f 72 65 20 66 69 72 69 6e 67 20 61   before firing a
3700: 6e 20 65 76 65 6e 74 20 74 6f 20 74 72 79 20 74  n event to try t
3710: 6f 0a 20 2a 20 66 6c 75 73 68 20 6f 75 74 20 69  o. * flush out i
3720: 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 61 69 74 69  nformation waiti
3730: 6e 67 20 69 6e 20 62 75 66 66 65 72 73 20 28 66  ng in buffers (f
3740: 69 6c 65 65 76 65 6e 74 20 73 75 70 70 6f 72 74  ileevent support
3750: 29 2e 0a 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 20  ).. */..#define 
3760: 46 4c 55 53 48 5f 44 45 4c 41 59 20 28 35 29 0a  FLUSH_DELAY (5).
3770: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 54 69 6d  .static void Tim
3780: 65 72 4b 69 6c 6c 20 20 28 52 65 66 6c 65 63 74  erKill  (Reflect
3790: 65 64 54 72 61 6e 73 66 6f 72 6d 2a 20 72 74 50  edTransform* rtP
37a0: 74 72 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64  tr);.static void
37b0: 20 54 69 6d 65 72 53 65 74 75 70 20 28 52 65 66   TimerSetup (Ref
37c0: 6c 65 63 74 65 64 54 72 61 6e 73 66 6f 72 6d 2a  lectedTransform*
37d0: 20 72 74 50 74 72 29 3b 0a 73 74 61 74 69 63 20   rtPtr);.static 
37e0: 76 6f 69 64 20 54 69 6d 65 72 52 75 6e 20 20 20  void TimerRun   
37f0: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65  (ClientData clie
3800: 6e 74 44 61 74 61 29 3b 0a 0a 2f 2a 0a 20 2a 20  ntData);../*. * 
3810: 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 73  Helper functions
3820: 20 65 6e 63 61 70 73 75 6c 61 74 69 6e 67 20 73   encapsulating s
3830: 6f 6d 65 20 6f 66 20 74 68 65 20 74 68 72 65 61  ome of the threa
3840: 64 20 66 6f 72 77 61 72 64 69 6e 67 20 74 6f 20  d forwarding to 
3850: 6d 61 6b 65 20 74 68 65 0a 20 2a 20 63 6f 6e 74  make the. * cont
3860: 72 6f 6c 20 66 6c 6f 77 20 69 6e 20 63 61 6c 6c  rol flow in call
3870: 65 72 73 20 65 61 73 69 65 72 2e 0a 20 2a 2f 0a  ers easier.. */.
3880: 0a 73 74 61 74 69 63 20 69 6e 74 20 20 54 72 61  .static int  Tra
3890: 6e 73 66 6f 72 6d 52 65 61 64 20 20 28 52 65 66  nsformRead  (Ref
38a0: 6c 65 63 74 65 64 54 72 61 6e 73 66 6f 72 6d 2a  lectedTransform*
38b0: 20 72 74 50 74 72 2c 20 69 6e 74 2a 20 65 72 72   rtPtr, int* err
38c0: 6f 72 43 6f 64 65 50 74 72 2c 20 75 6e 73 69 67  orCodePtr, unsig
38d0: 6e 65 64 20 63 68 61 72 2a 20 62 75 66 2c 20 69  ned char* buf, i
38e0: 6e 74 20 74 6f 52 65 61 64 29 3b 0a 73 74 61 74  nt toRead);.stat
38f0: 69 63 20 69 6e 74 20 20 54 72 61 6e 73 66 6f 72  ic int  Transfor
3900: 6d 57 72 69 74 65 20 28 52 65 66 6c 65 63 74 65  mWrite (Reflecte
3910: 64 54 72 61 6e 73 66 6f 72 6d 2a 20 72 74 50 74  dTransform* rtPt
3920: 72 2c 20 69 6e 74 2a 20 65 72 72 6f 72 43 6f 64  r, int* errorCod
3930: 65 50 74 72 2c 20 75 6e 73 69 67 6e 65 64 20 63  ePtr, unsigned c
3940: 68 61 72 2a 20 62 75 66 2c 20 69 6e 74 20 74 6f  har* buf, int to
3950: 57 72 69 74 65 29 3b 0a 73 74 61 74 69 63 20 69  Write);.static i
3960: 6e 74 20 20 54 72 61 6e 73 66 6f 72 6d 44 72 61  nt  TransformDra
3970: 69 6e 20 28 52 65 66 6c 65 63 74 65 64 54 72 61  in (ReflectedTra
3980: 6e 73 66 6f 72 6d 2a 20 72 74 50 74 72 2c 20 69  nsform* rtPtr, i
3990: 6e 74 2a 20 65 72 72 6f 72 43 6f 64 65 50 74 72  nt* errorCodePtr
39a0: 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 20 54  );.static int  T
39b0: 72 61 6e 73 66 6f 72 6d 46 6c 75 73 68 20 28 52  ransformFlush (R
39c0: 65 66 6c 65 63 74 65 64 54 72 61 6e 73 66 6f 72  eflectedTransfor
39d0: 6d 2a 20 72 74 50 74 72 2c 20 69 6e 74 2a 20 65  m* rtPtr, int* e
39e0: 72 72 6f 72 43 6f 64 65 50 74 72 29 3b 0a 73 74  rrorCodePtr);.st
39f0: 61 74 69 63 20 76 6f 69 64 20 54 72 61 6e 73 66  atic void Transf
3a00: 6f 72 6d 43 6c 65 61 72 20 28 52 65 66 6c 65 63  ormClear (Reflec
3a10: 74 65 64 54 72 61 6e 73 66 6f 72 6d 2a 20 72 74  tedTransform* rt
3a20: 50 74 72 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  Ptr);.static int
3a30: 20 20 54 72 61 6e 73 66 6f 72 6d 4c 69 6d 69 74    TransformLimit
3a40: 20 28 52 65 66 6c 65 63 74 65 64 54 72 61 6e 73   (ReflectedTrans
3a50: 66 6f 72 6d 2a 20 72 74 50 74 72 2c 20 69 6e 74  form* rtPtr, int
3a60: 2a 20 65 72 72 6f 72 43 6f 64 65 50 74 72 2c 20  * errorCodePtr, 
3a70: 69 6e 74 2a 20 6d 61 78 50 74 72 29 3b 0a 73 74  int* maxPtr);.st
3a80: 61 74 69 63 20 69 6e 74 20 20 54 72 61 6e 73 66  atic int  Transf
3a90: 6f 72 6d 4d 61 73 6b 20 20 28 52 65 66 6c 65 63  ormMask  (Reflec
3aa0: 74 65 64 54 72 61 6e 73 66 6f 72 6d 2a 20 72 74  tedTransform* rt
3ab0: 50 74 72 29 3b 0a 0a 2f 2a 0a 20 2a 20 4d 61 69  Ptr);../*. * Mai
3ac0: 6e 20 6d 65 74 68 6f 64 73 20 74 6f 20 70 6c 75  n methods to plu
3ad0: 67 20 69 6e 74 6f 20 74 68 65 20 27 63 68 61 6e  g into the 'chan
3ae0: 27 20 65 6e 73 65 6d 62 6c 65 27 2e 20 3d 3d 3d  ' ensemble'. ===
3af0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a  ===============.
3b00: 20 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d   */../*. *------
3b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3b50: 0a 20 2a 0a 20 2a 20 54 63 6c 43 68 61 6e 50 75  . *. * TclChanPu
3b60: 73 68 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20  shObjCmd --. *. 
3b70: 2a 09 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  *.This function 
3b80: 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72  is invoked to pr
3b90: 6f 63 65 73 73 20 74 68 65 20 22 63 68 61 6e 20  ocess the "chan 
3ba0: 70 75 73 68 22 20 54 63 6c 20 63 6f 6d 6d 61 6e  push" Tcl comman
3bb0: 64 2e 0a 20 2a 09 53 65 65 20 74 68 65 20 75 73  d.. *.See the us
3bc0: 65 72 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e  er documentation
3bd0: 20 66 6f 72 20 64 65 74 61 69 6c 73 20 6f 6e 20   for details on 
3be0: 77 68 61 74 20 69 74 20 64 6f 65 73 2e 0a 20 2a  what it does.. *
3bf0: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
3c00: 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72  A standard Tcl r
3c10: 65 73 75 6c 74 2e 20 54 68 65 20 68 61 6e 64 6c  esult. The handl
3c20: 65 20 6f 66 20 74 68 65 20 6e 65 77 20 63 68 61  e of the new cha
3c30: 6e 6e 65 6c 20 69 73 20 70 6c 61 63 65 64 20 69  nnel is placed i
3c40: 6e 20 74 68 65 0a 20 2a 09 69 6e 74 65 72 70 20  n the. *.interp 
3c50: 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69  result.. *. * Si
3c60: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43  de effects:. *.C
3c70: 72 65 61 74 65 73 20 61 20 6e 65 77 20 63 68 61  reates a new cha
3c80: 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  nnel.. *. *-----
3c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3cd0: 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 63 6c 43 68  -. */..int.TclCh
3ce0: 61 6e 50 75 73 68 4f 62 6a 43 6d 64 28 0a 20 20  anPushObjCmd(.  
3cf0: 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
3d00: 65 6e 74 44 61 74 61 2c 0a 20 20 20 20 54 63 6c  entData,.    Tcl
3d10: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
3d20: 0a 20 20 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  .    int objc,. 
3d30: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73     Tcl_Obj *cons
3d40: 74 20 2a 6f 62 6a 76 29 0a 7b 0a 20 20 20 20 52  t *objv).{.    R
3d50: 65 66 6c 65 63 74 65 64 54 72 61 6e 73 66 6f 72  eflectedTransfor
3d60: 6d 20 2a 72 74 50 74 72 3b 09 2f 2a 20 49 6e 73  m *rtPtr;./* Ins
3d70: 74 61 6e 63 65 20 64 61 74 61 20 6f 66 20 74 68  tance data of th
3d80: 65 20 6e 65 77 20 63 68 61 6e 6e 65 6c 20 2a 2f  e new channel */
3d90: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 2a 20 20 20  .    Tcl_Obj*   
3da0: 20 63 68 61 6e 4f 62 6a 3b 20 20 20 20 20 20 20   chanObj;       
3db0: 20 2f 2a 20 48 61 6e 64 6c 65 20 6f 66 20 70 61   /* Handle of pa
3dc0: 72 65 6e 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a  rent channel */.
3dd0: 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20      Tcl_Channel 
3de0: 70 61 72 65 6e 74 43 68 61 6e 3b 20 20 20 20 20  parentChan;     
3df0: 2f 2a 20 54 6f 6b 65 6e 20 6f 66 20 70 61 72 65  /* Token of pare
3e00: 6e 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20  nt channel */.  
3e10: 20 20 69 6e 74 20 6d 6f 64 65 3b 09 09 09 2f 2a    int mode;.../*
3e20: 20 52 2f 57 20 6d 6f 64 65 20 6f 66 20 70 61 72   R/W mode of par
3e30: 65 6e 74 2c 20 6c 61 74 65 72 20 74 68 65 20 6e  ent, later the n
3e40: 65 77 0a 09 09 09 09 20 2a 20 63 68 61 6e 6e 65  ew..... * channe
3e50: 6c 2e 20 48 61 73 20 74 6f 20 6d 61 74 63 68 20  l. Has to match 
3e60: 74 68 65 20 61 62 69 6c 69 74 69 65 73 20 6f 66  the abilities of
3e70: 20 74 68 65 0a 09 09 09 09 20 2a 20 68 61 6e 64   the..... * hand
3e80: 6c 65 72 20 63 6f 6d 6d 61 6e 64 73 20 2a 2f 0a  ler commands */.
3e90: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64      Tcl_Obj *cmd
3ea0: 4f 62 6a 3b 09 09 2f 2a 20 43 6f 6d 6d 61 6e 64  Obj;../* Command
3eb0: 20 70 72 65 66 69 78 2c 20 6c 69 73 74 20 6f 66   prefix, list of
3ec0: 20 77 6f 72 64 73 20 2a 2f 0a 20 20 20 20 54 63   words */.    Tc
3ed0: 6c 5f 4f 62 6a 20 2a 63 6d 64 4e 61 6d 65 4f 62  l_Obj *cmdNameOb
3ee0: 6a 3b 09 2f 2a 20 43 6f 6d 6d 61 6e 64 20 6e 61  j;./* Command na
3ef0: 6d 65 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62  me */.    Tcl_Ob
3f00: 6a 20 2a 72 63 49 64 3b 09 09 2f 2a 20 48 61 6e  j *rcId;../* Han
3f10: 64 6c 65 20 6f 66 20 74 68 65 20 6e 65 77 20 63  dle of the new c
3f20: 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 54 63  hannel */.    Tc
3f30: 6c 5f 4f 62 6a 20 2a 6d 6f 64 65 4f 62 6a 3b 09  l_Obj *modeObj;.
3f40: 09 2f 2a 20 6d 6f 64 65 20 69 6e 20 6f 62 6a 20  ./* mode in obj 
3f50: 66 6f 72 6d 20 66 6f 72 20 6d 65 74 68 6f 64 20  form for method 
3f60: 63 61 6c 6c 20 2a 2f 0a 0a 20 20 20 20 69 6e 74  call */..    int
3f70: 20 6c 69 73 74 63 3b 09 09 09 2f 2a 20 52 65 73   listc;.../* Res
3f80: 75 6c 74 20 6f 66 20 27 69 6e 69 74 69 61 6c 69  ult of 'initiali
3f90: 7a 65 27 2c 20 61 6e 64 20 6f 66 20 2a 2f 0a 20  ze', and of */. 
3fa0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 6c 69 73     Tcl_Obj **lis
3fb0: 74 76 3b 09 09 2f 2a 20 69 74 73 20 73 75 62 6c  tv;../* its subl
3fc0: 69 73 74 20 69 6e 20 74 68 65 20 32 6e 64 20 65  ist in the 2nd e
3fd0: 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 6e  lement */.    in
3fe0: 74 20 6d 65 74 68 49 6e 64 65 78 3b 09 09 2f 2a  t methIndex;../*
3ff0: 20 45 6e 63 6f 64 65 64 20 6d 65 74 68 6f 64 20   Encoded method 
4000: 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  name */.    int 
4010: 72 65 73 75 6c 74 3b 09 09 09 2f 2a 20 52 65 73  result;.../* Res
4020: 75 6c 74 20 63 6f 64 65 20 66 6f 72 20 27 69 6e  ult code for 'in
4030: 69 74 69 61 6c 69 7a 65 27 20 2a 2f 0a 20 20 20  itialize' */.   
4040: 20 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 4f 62 6a   Tcl_Obj *resObj
4050: 3b 09 09 2f 2a 20 52 65 73 75 6c 74 20 64 61 74  ;../* Result dat
4060: 61 20 66 6f 72 20 27 69 6e 69 74 69 61 6c 69 7a  a for 'initializ
4070: 65 27 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d 65  e' */.    int me
4080: 74 68 6f 64 73 3b 09 09 2f 2a 20 42 69 74 6d 61  thods;../* Bitma
4090: 73 6b 20 66 6f 72 20 73 75 70 70 6f 72 74 65 64  sk for supported
40a0: 20 6d 65 74 68 6f 64 73 2e 20 2a 2f 0a 20 20 20   methods. */.   
40b0: 20 54 63 6c 5f 4f 62 6a 20 2a 65 72 72 3b 09 09   Tcl_Obj *err;..
40c0: 2f 2a 20 45 72 72 6f 72 20 6d 65 73 73 61 67 65  /* Error message
40d0: 20 2a 2f 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20   */..    /*.    
40e0: 20 2a 20 53 79 6e 74 61 78 3a 20 20 20 63 68 61   * Syntax:   cha
40f0: 6e 20 70 75 73 68 20 43 48 41 4e 4e 45 4c 20 43  n push CHANNEL C
4100: 4d 44 50 52 45 46 49 58 0a 20 20 20 20 20 2a 20  MDPREFIX.     * 
4110: 20 20 20 20 20 20 20 20 20 20 5b 30 5d 20 20 5b            [0]  [
4120: 31 5d 20 20 5b 32 5d 20 20 20 20 20 5b 33 5d 0a  1]  [2]     [3].
4130: 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 41 63       *.     * Ac
4140: 74 75 61 6c 6c 79 3a 20 72 50 75 73 68 20 43 48  tually: rPush CH
4150: 41 4e 4e 45 4c 20 43 4d 44 50 52 45 46 49 58 0a  ANNEL CMDPREFIX.
4160: 20 20 20 20 20 2a 20 20 20 20 20 20 20 20 20 20       *          
4170: 20 5b 30 5d 20 20 20 5b 31 5d 20 20 20 20 20 5b   [0]   [1]     [
4180: 32 5d 0a 20 20 20 20 20 2a 2f 0a 0a 23 64 65 66  2].     */..#def
4190: 69 6e 65 20 43 48 41 4e 09 28 31 29 0a 23 64 65  ine CHAN.(1).#de
41a0: 66 69 6e 65 20 43 4d 44 09 28 32 29 0a 0a 20 20  fine CMD.(2)..  
41b0: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 4e 75 6d 62    /*.     * Numb
41c0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e  er of arguments.
41d0: 2e 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20  ...     */..    
41e0: 69 66 20 28 6f 62 6a 63 20 21 3d 20 33 29 20 7b  if (objc != 3) {
41f0: 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72  ..Tcl_WrongNumAr
4200: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
4210: 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 20 63 6d 64  jv, "channel cmd
4220: 70 72 65 66 69 78 22 29 3b 0a 09 72 65 74 75 72  prefix");..retur
4230: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
4240: 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20   }..    /*.     
4250: 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74  * First argument
4260: 20 69 73 20 61 20 63 68 61 6e 6e 65 6c 20 68 61   is a channel ha
4270: 6e 64 6c 65 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20  ndle..     */.. 
4280: 20 20 20 63 68 61 6e 4f 62 6a 20 20 20 20 3d 20     chanObj    = 
4290: 6f 62 6a 76 5b 43 48 41 4e 5d 3b 0a 20 20 20 20  objv[CHAN];.    
42a0: 70 61 72 65 6e 74 43 68 61 6e 20 3d 20 54 63 6c  parentChan = Tcl
42b0: 5f 47 65 74 43 68 61 6e 6e 65 6c 20 28 69 6e 74  _GetChannel (int
42c0: 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
42d0: 6e 67 20 28 63 68 61 6e 4f 62 6a 29 2c 20 26 6d  ng (chanObj), &m
42e0: 6f 64 65 29 3b 0a 20 20 20 20 69 66 20 28 70 61  ode);.    if (pa
42f0: 72 65 6e 74 43 68 61 6e 20 3d 3d 20 4e 55 4c 4c  rentChan == NULL
4300: 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  ) {..return TCL_
4310: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
4320: 20 70 61 72 65 6e 74 43 68 61 6e 20 3d 20 54 63   parentChan = Tc
4330: 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 20  l_GetTopChannel 
4340: 28 70 61 72 65 6e 74 43 68 61 6e 29 3b 0a 0a 20  (parentChan);.. 
4350: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53 65 63     /*.     * Sec
4360: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
4370: 63 6f 6d 6d 61 6e 64 20 70 72 65 66 69 78 2c 20  command prefix, 
4380: 69 2e 65 2e 20 6c 69 73 74 20 6f 66 20 77 6f 72  i.e. list of wor
4390: 64 73 2c 20 66 69 72 73 74 20 77 6f 72 64 20 69  ds, first word i
43a0: 73 0a 20 20 20 20 20 2a 20 6e 61 6d 65 20 6f 66  s.     * name of
43b0: 20 68 61 6e 64 6c 65 72 20 63 6f 6d 6d 61 6e 64   handler command
43c0: 2c 20 6f 74 68 65 72 20 77 6f 72 64 73 20 61 72  , other words ar
43d0: 65 20 66 69 78 65 64 20 61 72 67 75 6d 65 6e 74  e fixed argument
43e0: 73 2e 20 52 75 6e 0a 20 20 20 20 20 2a 20 27 69  s. Run.     * 'i
43f0: 6e 69 74 69 61 6c 69 7a 65 27 20 6d 65 74 68 6f  nitialize' metho
4400: 64 20 74 6f 20 67 65 74 20 74 68 65 20 6c 69 73  d to get the lis
4410: 74 20 6f 66 20 73 75 70 70 6f 72 74 65 64 20 6d  t of supported m
4420: 65 74 68 6f 64 73 2e 20 56 61 6c 69 64 61 74 65  ethods. Validate
4430: 0a 20 20 20 20 20 2a 20 74 68 69 73 2e 0a 20 20  .     * this..  
4440: 20 20 20 2a 2f 0a 0a 20 20 20 20 63 6d 64 4f 62     */..    cmdOb
4450: 6a 20 3d 20 6f 62 6a 76 5b 43 4d 44 5d 3b 0a 0a  j = objv[CMD];..
4460: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 42 61      /*.     * Ba
4470: 73 69 63 20 63 68 65 63 6b 20 74 68 61 74 20 74  sic check that t
4480: 68 65 20 63 6f 6d 6d 61 6e 64 20 70 72 65 66 69  he command prefi
4490: 78 20 74 72 75 6c 79 20 69 73 20 61 20 6c 69 73  x truly is a lis
44a0: 74 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20  t..     */..    
44b0: 69 66 20 28 54 63 6c 5f 4c 69 73 74 4f 62 6a 49  if (Tcl_ListObjI
44c0: 6e 64 65 78 28 69 6e 74 65 72 70 2c 20 63 6d 64  ndex(interp, cmd
44d0: 4f 62 6a 2c 20 30 2c 20 26 63 6d 64 4e 61 6d 65  Obj, 0, &cmdName
44e0: 4f 62 6a 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20  Obj) != TCL_OK) 
44f0: 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  {..return TCL_ER
4500: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
4510: 2f 2a 0a 20 20 20 20 20 2a 20 4e 6f 77 20 63 72  /*.     * Now cr
4520: 65 61 74 65 20 74 68 65 20 74 72 61 6e 73 66 6f  eate the transfo
4530: 72 6d 61 74 69 6f 6e 20 28 63 68 61 6e 6e 65 6c  rmation (channel
4540: 29 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20  )..     */..    
4550: 72 63 49 64 20 20 3d 20 4e 65 78 74 48 61 6e 64  rcId  = NextHand
4560: 6c 65 28 29 3b 0a 20 20 20 20 72 74 50 74 72 20  le();.    rtPtr 
4570: 3d 20 4e 65 77 52 65 66 6c 65 63 74 65 64 54 72  = NewReflectedTr
4580: 61 6e 73 66 6f 72 6d 28 69 6e 74 65 72 70 2c 20  ansform(interp, 
4590: 63 6d 64 4f 62 6a 2c 20 6d 6f 64 65 2c 20 72 63  cmdObj, mode, rc
45a0: 49 64 2c 20 70 61 72 65 6e 74 43 68 61 6e 29 3b  Id, parentChan);
45b0: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20  ..    /*.     * 
45c0: 49 6e 76 6f 6b 65 20 27 69 6e 69 74 69 61 6c 69  Invoke 'initiali
45d0: 7a 65 27 20 61 6e 64 20 76 61 6c 69 64 61 74 65  ze' and validate
45e0: 20 74 68 61 74 20 74 68 65 20 68 61 6e 64 6c 65   that the handle
45f0: 72 20 69 73 20 70 72 65 73 65 6e 74 20 61 6e 64  r is present and
4600: 20 6f 6b 2e 0a 20 20 20 20 20 2a 20 53 71 75 61   ok..     * Squa
4610: 73 68 20 74 68 65 20 74 72 61 6e 73 66 6f 72 6d  sh the transform
4620: 61 74 69 6f 6e 20 69 66 20 6e 6f 74 2e 0a 20 20  ation if not..  
4630: 20 20 20 2a 0a 20 20 20 20 20 2a 20 4e 6f 74 65     *.     * Note
4640: 3a 20 54 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e  : The conversion
4650: 20 6f 66 20 27 6d 6f 64 65 27 20 62 61 63 6b 20   of 'mode' back 
4660: 69 6e 74 6f 20 61 20 54 63 6c 5f 4f 62 6a 20 65  into a Tcl_Obj e
4670: 6e 73 75 72 65 73 20 74 68 61 74 0a 20 20 20 20  nsures that.    
4680: 20 2a 20 27 69 6e 69 74 69 61 6c 69 7a 65 27 20   * 'initialize' 
4690: 69 73 20 69 6e 76 6f 6b 65 64 20 77 69 74 68 20  is invoked with 
46a0: 63 61 6e 6f 6e 69 63 61 6c 20 6d 6f 64 65 20 6e  canonical mode n
46b0: 61 6d 65 73 2c 20 61 6e 64 20 6e 6f 0a 20 20 20  ames, and no.   
46c0: 20 20 2a 20 61 62 62 72 65 76 69 61 74 69 6f 6e    * abbreviation
46d0: 73 2e 20 55 73 69 6e 67 20 6d 6f 64 65 4f 62 6a  s. Using modeObj
46e0: 20 64 69 72 65 63 74 6c 79 20 63 6f 75 6c 64 20   directly could 
46f0: 66 65 65 64 20 61 62 62 72 65 76 69 61 74 69 6f  feed abbreviatio
4700: 6e 73 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20  ns into the.    
4710: 20 2a 20 68 61 6e 64 6c 65 72 2c 20 61 6e 64 20   * handler, and 
4720: 74 68 65 20 68 61 6e 64 6c 65 72 20 69 73 20 6e  the handler is n
4730: 6f 74 20 73 70 65 63 69 66 69 65 64 20 74 6f 20  ot specified to 
4740: 68 61 6e 64 6c 65 20 73 75 63 68 2e 0a 20 20 20  handle such..   
4750: 20 20 2a 2f 0a 0a 20 20 20 20 6d 6f 64 65 4f 62    */..    modeOb
4760: 6a 20 3d 20 44 65 63 6f 64 65 45 76 65 6e 74 4d  j = DecodeEventM
4770: 61 73 6b 28 6d 6f 64 65 29 3b 0a 20 20 20 20 72  ask(mode);.    r
4780: 65 73 75 6c 74 20 20 3d 20 49 6e 76 6f 6b 65 54  esult  = InvokeT
4790: 63 6c 4d 65 74 68 6f 64 28 72 74 50 74 72 2c 20  clMethod(rtPtr, 
47a0: 22 69 6e 69 74 69 61 6c 69 7a 65 22 2c 20 6d 6f  "initialize", mo
47b0: 64 65 4f 62 6a 2c 20 4e 55 4c 4c 2c 20 26 72 65  deObj, NULL, &re
47c0: 73 4f 62 6a 29 3b 0a 20 20 20 20 54 63 6c 5f 44  sObj);.    Tcl_D
47d0: 65 63 72 52 65 66 43 6f 75 6e 74 28 6d 6f 64 65  ecrRefCount(mode
47e0: 4f 62 6a 29 3b 0a 20 20 20 20 69 66 20 28 72 65  Obj);.    if (re
47f0: 73 75 6c 74 20 21 3d 20 54 43 4c 5f 4f 4b 29 20  sult != TCL_OK) 
4800: 7b 0a 09 55 6e 6d 61 72 73 68 61 6c 6c 45 72 72  {..UnmarshallErr
4810: 6f 72 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  orResult(interp,
4820: 20 72 65 73 4f 62 6a 29 3b 0a 09 54 63 6c 5f 44   resObj);..Tcl_D
4830: 65 63 72 52 65 66 43 6f 75 6e 74 28 72 65 73 4f  ecrRefCount(resO
4840: 62 6a 29 3b 09 2f 2a 20 52 65 6d 6f 76 65 20 72  bj);./* Remove r
4850: 65 66 65 72 65 6e 63 65 20 68 65 6c 64 20 66 72  eference held fr
4860: 6f 6d 20 69 6e 76 6f 6b 65 20 2a 2f 0a 09 67 6f  om invoke */..go
4870: 74 6f 20 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a  to error;.    }.
4880: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 56  .    /*.     * V
4890: 65 72 69 66 79 20 74 68 65 20 72 65 73 75 6c 74  erify the result
48a0: 2e 0a 20 20 20 20 20 2a 20 2d 20 4c 69 73 74 2c  ..     * - List,
48b0: 20 6f 66 20 6d 65 74 68 6f 64 20 6e 61 6d 65 73   of method names
48c0: 2e 20 43 6f 6e 76 65 72 74 20 74 6f 20 6d 61 73  . Convert to mas
48d0: 6b 2e 0a 20 20 20 20 20 2a 20 20 20 43 68 65 63  k..     *   Chec
48e0: 6b 20 66 6f 72 20 6e 6f 6e 2d 6f 70 74 69 6f 6e  k for non-option
48f0: 61 6c 73 20 74 68 72 6f 75 67 68 20 74 68 65 20  als through the 
4900: 6d 61 73 6b 2e 0a 20 20 20 20 20 2a 20 20 20 43  mask..     *   C
4910: 6f 6d 70 61 72 65 20 6f 70 65 6e 20 6d 6f 64 65  ompare open mode
4920: 20 61 67 61 69 6e 73 74 20 6f 70 74 69 6f 6e 61   against optiona
4930: 6c 20 72 2f 77 2e 0a 20 20 20 20 20 2a 2f 0a 0a  l r/w..     */..
4940: 20 20 20 20 69 66 20 28 54 63 6c 5f 4c 69 73 74      if (Tcl_List
4950: 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28 4e  ObjGetElements(N
4960: 55 4c 4c 2c 20 72 65 73 4f 62 6a 2c 20 26 6c 69  ULL, resObj, &li
4970: 73 74 63 2c 20 26 6c 69 73 74 76 29 20 21 3d 20  stc, &listv) != 
4980: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 54 63 6c 4e 65  TCL_OK) {..TclNe
4990: 77 4c 69 74 65 72 61 6c 53 74 72 69 6e 67 4f 62  wLiteralStringOb
49a0: 6a 28 65 72 72 2c 20 22 63 68 61 6e 20 68 61 6e  j(err, "chan han
49b0: 64 6c 65 72 20 5c 22 22 29 3b 0a 09 54 63 6c 5f  dler \"");..Tcl_
49c0: 41 70 70 65 6e 64 4f 62 6a 54 6f 4f 62 6a 28 65  AppendObjToObj(e
49d0: 72 72 2c 20 63 6d 64 4f 62 6a 29 3b 0a 09 54 63  rr, cmdObj);..Tc
49e0: 6c 5f 41 70 70 65 6e 64 54 6f 4f 62 6a 28 65 72  l_AppendToObj(er
49f0: 72 2c 20 22 20 69 6e 69 74 69 61 6c 69 7a 65 5c  r, " initialize\
4a00: 22 20 72 65 74 75 72 6e 65 64 20 6e 6f 6e 2d 6c  " returned non-l
4a10: 69 73 74 3a 20 22 2c 20 2d 31 29 3b 0a 09 54 63  ist: ", -1);..Tc
4a20: 6c 5f 41 70 70 65 6e 64 4f 62 6a 54 6f 4f 62 6a  l_AppendObjToObj
4a30: 28 65 72 72 2c 20 72 65 73 4f 62 6a 29 3b 0a 09  (err, resObj);..
4a40: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
4a50: 28 69 6e 74 65 72 70 2c 20 65 72 72 29 3b 0a 09  (interp, err);..
4a60: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
4a70: 28 72 65 73 4f 62 6a 29 3b 0a 09 67 6f 74 6f 20  (resObj);..goto 
4a80: 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 0a 20 20  error;.    }..  
4a90: 20 20 6d 65 74 68 6f 64 73 20 3d 20 30 3b 0a 20    methods = 0;. 
4aa0: 20 20 20 77 68 69 6c 65 20 28 6c 69 73 74 63 20     while (listc 
4ab0: 3e 20 30 29 20 7b 0a 09 69 66 20 28 54 63 6c 5f  > 0) {..if (Tcl_
4ac0: 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28  GetIndexFromObj(
4ad0: 69 6e 74 65 72 70 2c 20 6c 69 73 74 76 5b 6c 69  interp, listv[li
4ae0: 73 74 63 2d 31 5d 2c 20 6d 65 74 68 6f 64 4e 61  stc-1], methodNa
4af0: 6d 65 73 2c 0a 09 09 22 6d 65 74 68 6f 64 22 2c  mes,..."method",
4b00: 20 54 43 4c 5f 45 58 41 43 54 2c 20 26 6d 65 74   TCL_EXACT, &met
4b10: 68 49 6e 64 65 78 29 20 21 3d 20 54 43 4c 5f 4f  hIndex) != TCL_O
4b20: 4b 29 20 7b 0a 09 20 20 20 20 54 63 6c 4e 65 77  K) {..    TclNew
4b30: 4c 69 74 65 72 61 6c 53 74 72 69 6e 67 4f 62 6a  LiteralStringObj
4b40: 28 65 72 72 2c 20 22 63 68 61 6e 20 68 61 6e 64  (err, "chan hand
4b50: 6c 65 72 20 5c 22 22 29 3b 0a 09 20 20 20 20 54  ler \"");..    T
4b60: 63 6c 5f 41 70 70 65 6e 64 4f 62 6a 54 6f 4f 62  cl_AppendObjToOb
4b70: 6a 28 65 72 72 2c 20 63 6d 64 4f 62 6a 29 3b 0a  j(err, cmdObj);.
4b80: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 54  .    Tcl_AppendT
4b90: 6f 4f 62 6a 28 65 72 72 2c 20 22 20 69 6e 69 74  oObj(err, " init
4ba0: 69 61 6c 69 7a 65 5c 22 20 72 65 74 75 72 6e 65  ialize\" returne
4bb0: 64 20 22 2c 20 2d 31 29 3b 0a 09 20 20 20 20 54  d ", -1);..    T
4bc0: 63 6c 5f 41 70 70 65 6e 64 4f 62 6a 54 6f 4f 62  cl_AppendObjToOb
4bd0: 6a 28 65 72 72 2c 20 54 63 6c 5f 47 65 74 4f 62  j(err, Tcl_GetOb
4be0: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 29  jResult(interp))
4bf0: 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 4f 62  ;..    Tcl_SetOb
4c00: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
4c10: 65 72 72 29 3b 0a 09 20 20 20 20 54 63 6c 5f 44  err);..    Tcl_D
4c20: 65 63 72 52 65 66 43 6f 75 6e 74 28 72 65 73 4f  ecrRefCount(resO
4c30: 62 6a 29 3b 0a 09 20 20 20 20 67 6f 74 6f 20 65  bj);..    goto e
4c40: 72 72 6f 72 3b 0a 09 7d 0a 0a 09 6d 65 74 68 6f  rror;..}...metho
4c50: 64 73 20 7c 3d 20 46 4c 41 47 28 6d 65 74 68 49  ds |= FLAG(methI
4c60: 6e 64 65 78 29 3b 0a 09 6c 69 73 74 63 2d 2d 3b  ndex);..listc--;
4c70: 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44  .    }.    Tcl_D
4c80: 65 63 72 52 65 66 43 6f 75 6e 74 28 72 65 73 4f  ecrRefCount(resO
4c90: 62 6a 29 3b 0a 0a 20 20 20 20 69 66 20 28 28 52  bj);..    if ((R
4ca0: 45 51 55 49 52 45 44 5f 4d 45 54 48 4f 44 53 20  EQUIRED_METHODS 
4cb0: 26 20 6d 65 74 68 6f 64 73 29 20 21 3d 20 52 45  & methods) != RE
4cc0: 51 55 49 52 45 44 5f 4d 45 54 48 4f 44 53 29 20  QUIRED_METHODS) 
4cd0: 7b 0a 09 54 63 6c 4e 65 77 4c 69 74 65 72 61 6c  {..TclNewLiteral
4ce0: 53 74 72 69 6e 67 4f 62 6a 28 65 72 72 2c 20 22  StringObj(err, "
4cf0: 63 68 61 6e 20 68 61 6e 64 6c 65 72 20 5c 22 22  chan handler \""
4d00: 29 3b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 4f 62  );..Tcl_AppendOb
4d10: 6a 54 6f 4f 62 6a 28 65 72 72 2c 20 63 6d 64 4f  jToObj(err, cmdO
4d20: 62 6a 29 3b 0a 09 54 63 6c 5f 41 70 70 65 6e 64  bj);..Tcl_Append
4d30: 54 6f 4f 62 6a 28 65 72 72 2c 20 22 5c 22 20 64  ToObj(err, "\" d
4d40: 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20  oes not support 
4d50: 61 6c 6c 20 72 65 71 75 69 72 65 64 20 6d 65 74  all required met
4d60: 68 6f 64 73 22 2c 20 2d 31 29 3b 0a 09 54 63 6c  hods", -1);..Tcl
4d70: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
4d80: 74 65 72 70 2c 20 65 72 72 29 3b 0a 09 67 6f 74  terp, err);..got
4d90: 6f 20 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 0a  o error;.    }..
4da0: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 4d 6f      /*.     * Mo
4db0: 64 65 20 74 65 6c 6c 20 75 73 20 77 68 61 74 20  de tell us what 
4dc0: 74 68 65 20 70 61 72 65 6e 74 20 63 68 61 6e 6e  the parent chann
4dd0: 65 6c 20 73 75 70 70 6f 72 74 73 2e 20 54 68 65  el supports. The
4de0: 20 6d 65 74 68 6f 64 73 20 74 65 6c 6c 20 75 73   methods tell us
4df0: 20 77 68 61 74 0a 20 20 20 20 20 2a 20 74 68 65   what.     * the
4e00: 20 68 61 6e 64 6c 65 72 20 73 75 70 70 6f 72 74   handler support
4e10: 73 2e 20 57 65 20 72 65 6d 6f 76 65 20 74 68 65  s. We remove the
4e20: 20 6e 6f 6e 2d 73 75 70 70 6f 72 74 65 64 20 62   non-supported b
4e30: 69 74 73 20 66 72 6f 6d 20 74 68 65 20 6d 6f 64  its from the mod
4e40: 65 0a 20 20 20 20 20 2a 20 61 6e 64 20 63 68 65  e.     * and che
4e50: 63 6b 20 74 68 61 74 20 74 68 65 20 63 68 61 6e  ck that the chan
4e60: 6e 65 6c 20 69 73 20 6e 6f 74 20 63 6f 6d 70 6c  nel is not compl
4e70: 65 74 65 6c 79 20 69 6e 61 63 65 73 73 69 62 6c  etely inacessibl
4e80: 65 2e 20 41 66 74 65 72 77 61 72 64 20 74 68 65  e. Afterward the
4e90: 0a 20 20 20 20 20 2a 20 6d 6f 64 65 20 74 65 6c  .     * mode tel
4ea0: 6c 73 20 75 73 20 77 68 69 63 68 20 6d 65 74 68  ls us which meth
4eb0: 6f 64 73 20 61 72 65 20 73 74 69 6c 6c 20 72 65  ods are still re
4ec0: 71 75 69 72 65 64 2c 20 61 6e 64 20 74 68 65 73  quired, and thes
4ed0: 65 20 6d 65 74 68 6f 64 73 20 77 69 6c 6c 0a 20  e methods will. 
4ee0: 20 20 20 20 2a 20 61 6c 73 6f 20 62 65 20 73 75      * also be su
4ef0: 70 70 6f 72 74 65 64 20 62 79 20 74 68 65 20 68  pported by the h
4f00: 61 6e 64 6c 65 72 2c 20 62 79 20 64 65 73 69 67  andler, by desig
4f10: 6e 20 6f 66 20 74 68 65 20 63 68 65 63 6b 2e 0a  n of the check..
4f20: 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66 20       */..    if 
4f30: 28 21 48 41 53 28 6d 65 74 68 6f 64 73 2c 20 4d  (!HAS(methods, M
4f40: 45 54 48 5f 52 45 41 44 29 29 20 20 7b 20 6d 6f  ETH_READ))  { mo
4f50: 64 65 20 26 3d 20 7e 54 43 4c 5f 52 45 41 44 41  de &= ~TCL_READA
4f60: 42 4c 45 3b 20 7d 0a 20 20 20 20 69 66 20 28 21  BLE; }.    if (!
4f70: 48 41 53 28 6d 65 74 68 6f 64 73 2c 20 4d 45 54  HAS(methods, MET
4f80: 48 5f 57 52 49 54 45 29 29 20 7b 20 6d 6f 64 65  H_WRITE)) { mode
4f90: 20 26 3d 20 7e 54 43 4c 5f 57 52 49 54 41 42 4c   &= ~TCL_WRITABL
4fa0: 45 3b 20 7d 0a 0a 20 20 20 20 69 66 20 28 21 6d  E; }..    if (!m
4fb0: 6f 64 65 29 20 7b 0a 09 54 63 6c 4e 65 77 4c 69  ode) {..TclNewLi
4fc0: 74 65 72 61 6c 53 74 72 69 6e 67 4f 62 6a 28 65  teralStringObj(e
4fd0: 72 72 2c 20 22 63 68 61 6e 20 68 61 6e 64 6c 65  rr, "chan handle
4fe0: 72 20 5c 22 22 29 3b 0a 09 54 63 6c 5f 41 70 70  r \"");..Tcl_App
4ff0: 65 6e 64 4f 62 6a 54 6f 4f 62 6a 28 65 72 72 2c  endObjToObj(err,
5000: 20 63 6d 64 4f 62 6a 29 3b 0a 09 54 63 6c 5f 41   cmdObj);..Tcl_A
5010: 70 70 65 6e 64 54 6f 4f 62 6a 28 65 72 72 2c 20  ppendToObj(err, 
5020: 22 5c 22 20 6d 61 6b 65 73 20 74 68 65 20 63 68  "\" makes the ch
5030: 61 6e 6e 65 6c 20 69 6e 61 63 65 73 73 69 62 6c  annel inacessibl
5040: 65 22 2c 20 2d 31 29 3b 0a 09 54 63 6c 5f 53 65  e", -1);..Tcl_Se
5050: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
5060: 70 2c 20 65 72 72 29 3b 0a 09 67 6f 74 6f 20 65  p, err);..goto e
5070: 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  rror;.    }..   
5080: 20 2f 2a 0a 20 20 20 20 20 2a 20 54 68 65 20 6d   /*.     * The m
5090: 6f 64 65 20 61 6e 64 20 73 75 70 70 6f 72 74 20  ode and support 
50a0: 66 6f 72 20 69 74 20 69 73 20 6f 6b 2c 20 6e 6f  for it is ok, no
50b0: 77 20 63 68 65 63 6b 20 74 68 65 20 69 6e 74 65  w check the inte
50c0: 72 6e 61 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73  rnal constraints
50d0: 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69  ..     */..    i
50e0: 66 20 28 21 49 4d 50 4c 49 45 53 28 48 41 53 28  f (!IMPLIES(HAS(
50f0: 6d 65 74 68 6f 64 73 2c 20 4d 45 54 48 5f 57 41  methods, METH_WA
5100: 54 43 48 29 2c 20 48 41 53 28 6d 65 74 68 6f 64  TCH), HAS(method
5110: 73 2c 20 4d 45 54 48 5f 45 56 45 4e 54 29 29 29  s, METH_EVENT)))
5120: 20 7b 0a 09 54 63 6c 4e 65 77 4c 69 74 65 72 61   {..TclNewLitera
5130: 6c 53 74 72 69 6e 67 4f 62 6a 28 65 72 72 2c 20  lStringObj(err, 
5140: 22 63 68 61 6e 20 68 61 6e 64 6c 65 72 20 5c 22  "chan handler \"
5150: 22 29 3b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 4f  ");..Tcl_AppendO
5160: 62 6a 54 6f 4f 62 6a 28 65 72 72 2c 20 63 6d 64  bjToObj(err, cmd
5170: 4f 62 6a 29 3b 0a 09 54 63 6c 5f 41 70 70 65 6e  Obj);..Tcl_Appen
5180: 64 54 6f 4f 62 6a 28 65 72 72 2c 20 22 5c 22 20  dToObj(err, "\" 
5190: 73 75 70 70 6f 72 74 73 20 5c 22 77 61 74 63 68  supports \"watch
51a0: 5c 22 20 62 75 74 20 6e 6f 74 20 5c 22 65 76 65  \" but not \"eve
51b0: 6e 74 5c 22 22 2c 20 2d 31 29 3b 0a 09 54 63 6c  nt\"", -1);..Tcl
51c0: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
51d0: 74 65 72 70 2c 20 65 72 72 29 3b 0a 09 67 6f 74  terp, err);..got
51e0: 6f 20 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 0a  o error;.    }..
51f0: 20 20 20 20 69 66 20 28 21 49 4d 50 4c 49 45 53      if (!IMPLIES
5200: 28 48 41 53 28 6d 65 74 68 6f 64 73 2c 20 4d 45  (HAS(methods, ME
5210: 54 48 5f 45 56 45 4e 54 29 2c 20 48 41 53 28 6d  TH_EVENT), HAS(m
5220: 65 74 68 6f 64 73 2c 20 4d 45 54 48 5f 57 41 54  ethods, METH_WAT
5230: 43 48 29 29 29 20 7b 0a 09 54 63 6c 4e 65 77 4c  CH))) {..TclNewL
5240: 69 74 65 72 61 6c 53 74 72 69 6e 67 4f 62 6a 28  iteralStringObj(
5250: 65 72 72 2c 20 22 63 68 61 6e 20 68 61 6e 64 6c  err, "chan handl
5260: 65 72 20 5c 22 22 29 3b 0a 09 54 63 6c 5f 41 70  er \"");..Tcl_Ap
5270: 70 65 6e 64 4f 62 6a 54 6f 4f 62 6a 28 65 72 72  pendObjToObj(err
5280: 2c 20 63 6d 64 4f 62 6a 29 3b 0a 09 54 63 6c 5f  , cmdObj);..Tcl_
5290: 41 70 70 65 6e 64 54 6f 4f 62 6a 28 65 72 72 2c  AppendToObj(err,
52a0: 20 22 5c 22 20 73 75 70 70 6f 72 74 73 20 5c 22   "\" supports \"
52b0: 65 76 65 6e 74 5c 22 20 62 75 74 20 6e 6f 74 20  event\" but not 
52c0: 5c 22 77 61 74 63 68 5c 22 22 2c 20 2d 31 29 3b  \"watch\"", -1);
52d0: 0a 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75  ..Tcl_SetObjResu
52e0: 6c 74 28 69 6e 74 65 72 70 2c 20 65 72 72 29 3b  lt(interp, err);
52f0: 0a 09 67 6f 74 6f 20 65 72 72 6f 72 3b 0a 20 20  ..goto error;.  
5300: 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 21 49 4d    }..    if (!IM
5310: 50 4c 49 45 53 28 48 41 53 28 6d 65 74 68 6f 64  PLIES(HAS(method
5320: 73 2c 20 4d 45 54 48 5f 44 52 41 49 4e 29 2c 20  s, METH_DRAIN), 
5330: 48 41 53 28 6d 65 74 68 6f 64 73 2c 20 4d 45 54  HAS(methods, MET
5340: 48 5f 52 45 41 44 29 29 29 20 7b 0a 09 54 63 6c  H_READ))) {..Tcl
5350: 4e 65 77 4c 69 74 65 72 61 6c 53 74 72 69 6e 67  NewLiteralString
5360: 4f 62 6a 28 65 72 72 2c 20 22 63 68 61 6e 20 68  Obj(err, "chan h
5370: 61 6e 64 6c 65 72 20 5c 22 22 29 3b 0a 09 54 63  andler \"");..Tc
5380: 6c 5f 41 70 70 65 6e 64 4f 62 6a 54 6f 4f 62 6a  l_AppendObjToObj
5390: 28 65 72 72 2c 20 63 6d 64 4f 62 6a 29 3b 0a 09  (err, cmdObj);..
53a0: 54 63 6c 5f 41 70 70 65 6e 64 54 6f 4f 62 6a 28  Tcl_AppendToObj(
53b0: 65 72 72 2c 20 22 5c 22 20 73 75 70 70 6f 72 74  err, "\" support
53c0: 73 20 5c 22 64 72 61 69 6e 5c 22 20 62 75 74 20  s \"drain\" but 
53d0: 6e 6f 74 20 5c 22 72 65 61 64 5c 22 22 2c 20 2d  not \"read\"", -
53e0: 31 29 3b 0a 09 54 63 6c 5f 53 65 74 4f 62 6a 52  1);..Tcl_SetObjR
53f0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 65 72  esult(interp, er
5400: 72 29 3b 0a 09 67 6f 74 6f 20 65 72 72 6f 72 3b  r);..goto error;
5410: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28  .    }..    if (
5420: 21 49 4d 50 4c 49 45 53 28 48 41 53 28 6d 65 74  !IMPLIES(HAS(met
5430: 68 6f 64 73 2c 20 4d 45 54 48 5f 46 4c 55 53 48  hods, METH_FLUSH
5440: 29 2c 20 48 41 53 28 6d 65 74 68 6f 64 73 2c 20  ), HAS(methods, 
5450: 4d 45 54 48 5f 57 52 49 54 45 29 29 29 20 7b 0a  METH_WRITE))) {.
5460: 09 54 63 6c 4e 65 77 4c 69 74 65 72 61 6c 53 74  .TclNewLiteralSt
5470: 72 69 6e 67 4f 62 6a 28 65 72 72 2c 20 22 63 68  ringObj(err, "ch
5480: 61 6e 20 68 61 6e 64 6c 65 72 20 5c 22 22 29 3b  an handler \"");
5490: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 4f 62 6a 54  ..Tcl_AppendObjT
54a0: 6f 4f 62 6a 28 65 72 72 2c 20 63 6d 64 4f 62 6a  oObj(err, cmdObj
54b0: 29 3b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 54 6f  );..Tcl_AppendTo
54c0: 4f 62 6a 28 65 72 72 2c 20 22 5c 22 20 73 75 70  Obj(err, "\" sup
54d0: 70 6f 72 74 73 20 5c 22 66 6c 75 73 68 5c 22 20  ports \"flush\" 
54e0: 62 75 74 20 6e 6f 74 20 5c 22 77 72 69 74 65 5c  but not \"write\
54f0: 22 22 2c 20 2d 31 29 3b 0a 09 54 63 6c 5f 53 65  "", -1);..Tcl_Se
5500: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
5510: 70 2c 20 65 72 72 29 3b 0a 09 67 6f 74 6f 20 65  p, err);..goto e
5520: 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  rror;.    }..   
5530: 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74   Tcl_ResetResult
5540: 28 69 6e 74 65 72 70 29 3b 0a 0a 20 20 20 20 2f  (interp);..    /
5550: 2a 0a 20 20 20 20 20 2a 20 45 76 65 72 79 74 68  *.     * Everyth
5560: 69 6e 67 20 69 73 20 66 69 6e 65 20 6e 6f 77 2e  ing is fine now.
5570: 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 72 74  .     */..    rt
5580: 50 74 72 2d 3e 6d 65 74 68 6f 64 73 20 3d 20 6d  Ptr->methods = m
5590: 65 74 68 6f 64 73 3b 0a 20 20 20 20 72 74 50 74  ethods;.    rtPt
55a0: 72 2d 3e 6d 6f 64 65 20 20 20 20 3d 20 6d 6f 64  r->mode    = mod
55b0: 65 3b 0a 20 20 20 20 72 74 50 74 72 2d 3e 63 68  e;.    rtPtr->ch
55c0: 61 6e 20 20 20 20 3d 20 54 63 6c 5f 53 74 61 63  an    = Tcl_Stac
55d0: 6b 43 68 61 6e 6e 65 6c 20 28 69 6e 74 65 72 70  kChannel (interp
55e0: 2c 20 26 74 63 6c 52 54 72 61 6e 73 66 6f 72 6d  , &tclRTransform
55f0: 54 79 70 65 2c 0a 09 09 09 09 20 20 20 20 20 20  Type,.....      
5600: 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 72 74   (ClientData) rt
5610: 50 74 72 2c 20 6d 6f 64 65 2c 0a 09 09 09 09 20  Ptr, mode,..... 
5620: 20 20 20 20 20 20 72 74 50 74 72 2d 3e 70 61 72        rtPtr->par
5630: 65 6e 74 29 3b 0a 20 20 20 20 2f 2a 0a 20 20 20  ent);.    /*.   
5640: 20 20 2a 20 52 65 74 75 72 6e 20 68 61 6e 64 6c    * Return handl
5650: 65 20 61 73 20 72 65 73 75 6c 74 20 6f 66 20 63  e as result of c
5660: 6f 6d 6d 61 6e 64 2e 0a 20 20 20 20 20 2a 2f 0a  ommand..     */.
5670: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
5680: 65 73 75 6c 74 20 28 69 6e 74 65 72 70 2c 20 54  esult (interp, T
5690: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d  cl_GetChannelNam
56a0: 65 20 28 72 74 50 74 72 2d 3e 63 68 61 6e 29 2c  e (rtPtr->chan),
56b0: 0a 09 09 20 20 20 20 28 63 68 61 72 2a 29 20 4e  ...    (char*) N
56c0: 55 4c 4c 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ULL);.    return
56d0: 20 54 43 4c 5f 4f 4b 3b 0a 0a 20 65 72 72 6f 72   TCL_OK;.. error
56e0: 3a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20  :.    /*.     * 
56f0: 57 65 20 61 72 65 20 6e 6f 74 20 67 6f 69 6e 67  We are not going
5700: 20 74 68 72 6f 75 67 68 20 52 65 66 6c 65 63 74   through Reflect
5710: 43 6c 6f 73 65 20 61 73 20 77 65 20 6e 65 76 65  Close as we neve
5720: 72 20 68 61 64 20 61 20 63 68 61 6e 6e 65 6c 0a  r had a channel.
5730: 20 20 20 20 20 2a 20 73 74 72 75 63 74 75 72 65       * structure
5740: 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 46  ..     */..    F
5750: 72 65 65 52 65 66 6c 65 63 74 65 64 54 72 61 6e  reeReflectedTran
5760: 73 66 6f 72 6d 28 72 74 50 74 72 29 3b 0a 20 20  sform(rtPtr);.  
5770: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
5780: 4f 52 3b 0a 0a 23 75 6e 64 65 66 20 43 48 41 4e  OR;..#undef CHAN
5790: 0a 23 75 6e 64 65 66 20 43 4d 44 0a 7d 0a 0c 0a  .#undef CMD.}...
57a0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
57b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
57c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
57d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
57e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
57f0: 2a 20 54 63 6c 43 68 61 6e 50 6f 70 4f 62 6a 43  * TclChanPopObjC
5800: 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73  md --. *. *.This
5810: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76   function is inv
5820: 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20  oked to process 
5830: 74 68 65 20 22 63 68 61 6e 20 70 6f 70 22 20 54  the "chan pop" T
5840: 63 6c 20 63 6f 6d 6d 61 6e 64 2e 0a 20 2a 09 53  cl command.. *.S
5850: 65 65 20 74 68 65 20 75 73 65 72 20 64 6f 63 75  ee the user docu
5860: 6d 65 6e 74 61 74 69 6f 6e 20 66 6f 72 20 64 65  mentation for de
5870: 74 61 69 6c 73 20 6f 6e 20 77 68 61 74 20 69 74  tails on what it
5880: 20 64 6f 65 73 2e 0a 20 2a 0a 20 2a 20 52 65 73   does.. *. * Res
5890: 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64  ults:. *.A stand
58a0: 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a  ard Tcl result..
58b0: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
58c0: 74 73 3a 0a 20 2a 09 50 6f 73 74 73 20 65 76 65  ts:. *.Posts eve
58d0: 6e 74 73 20 74 6f 20 61 20 72 65 66 6c 65 63 74  nts to a reflect
58e0: 65 64 20 63 68 61 6e 6e 65 6c 2c 20 69 6e 76 6f  ed channel, invo
58f0: 6b 65 73 20 65 76 65 6e 74 20 68 61 6e 64 6c 65  kes event handle
5900: 72 73 2e 20 54 68 65 0a 20 2a 09 6c 61 74 74 65  rs. The. *.latte
5910: 72 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20 61  r implies that a
5920: 72 62 69 74 72 61 72 79 20 73 69 64 65 20 65 66  rbitrary side ef
5930: 66 65 63 74 73 20 61 72 65 20 70 6f 73 73 69 62  fects are possib
5940: 6c 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  le.. *. *-------
5950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
5990: 20 2a 2f 0a 0a 69 6e 74 0a 54 63 6c 43 68 61 6e   */..int.TclChan
59a0: 50 6f 70 4f 62 6a 43 6d 64 28 0a 20 20 20 20 43  PopObjCmd(.    C
59b0: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
59c0: 44 61 74 61 2c 0a 20 20 20 20 54 63 6c 5f 49 6e  Data,.    Tcl_In
59d0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
59e0: 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 20 20    int objc,.    
59f0: 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 2a  Tcl_Obj *const *
5a00: 6f 62 6a 76 29 0a 7b 0a 20 20 20 20 2f 2a 0a 20  objv).{.    /*. 
5a10: 20 20 20 20 2a 20 53 79 6e 74 61 78 3a 20 20 20      * Syntax:   
5a20: 63 68 61 6e 20 70 6f 70 20 43 48 41 4e 4e 45 4c  chan pop CHANNEL
5a30: 0a 20 20 20 20 20 2a 20 20 20 20 20 20 20 20 20  .     *         
5a40: 20 20 5b 30 5d 20 20 5b 31 5d 20 5b 32 5d 0a 20    [0]  [1] [2]. 
5a50: 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 41 63 74      *.     * Act
5a60: 75 61 6c 6c 79 3a 20 72 50 6f 70 20 43 48 41 4e  ually: rPop CHAN
5a70: 4e 45 4c 0a 20 20 20 20 20 2a 20 20 20 20 20 20  NEL.     *      
5a80: 20 20 20 20 20 5b 30 5d 20 20 5b 31 5d 0a 20 20       [0]  [1].  
5a90: 20 20 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 43     */..#define C
5aa0: 48 41 4e 09 28 31 29 0a 0a 20 20 20 20 63 6f 6e  HAN.(1)..    con
5ab0: 73 74 20 63 68 61 72 20 2a 63 68 61 6e 49 64 3b  st char *chanId;
5ac0: 09 09 2f 2a 20 54 63 6c 20 6c 65 76 65 6c 20 63  ../* Tcl level c
5ad0: 68 61 6e 6e 65 6c 20 68 61 6e 64 6c 65 20 2a 2f  hannel handle */
5ae0: 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c  .    Tcl_Channel
5af0: 20 63 68 61 6e 3b 09 09 2f 2a 20 43 68 61 6e 6e   chan;../* Chann
5b00: 65 6c 20 61 73 73 6f 63 69 61 74 65 64 20 74 6f  el associated to
5b10: 20 74 68 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20   the handle */. 
5b20: 20 20 20 69 6e 74 20 20 20 20 20 20 20 20 20 6d     int         m
5b30: 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ode;           /
5b40: 2a 20 43 68 61 6e 6e 65 6c 20 72 2f 77 20 6d 6f  * Channel r/w mo
5b50: 64 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 0a 20 20  de */..    /*.  
5b60: 20 20 20 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61     * Number of a
5b70: 72 67 75 6d 65 6e 74 73 2e 2e 2e 0a 20 20 20 20  rguments....    
5b80: 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a   */..    if (obj
5b90: 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57  c != 2) {..Tcl_W
5ba0: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
5bb0: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68  rp, 1, objv, "ch
5bc0: 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e  annel");..return
5bd0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
5be0: 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a  }..    /*.     *
5bf0: 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   First argument 
5c00: 69 73 20 61 20 63 68 61 6e 6e 65 6c 2c 20 77 68  is a channel, wh
5c10: 69 63 68 20 6d 61 79 20 68 61 76 65 20 61 20 28  ich may have a (
5c20: 72 65 66 6c 65 63 74 65 64 29 0a 20 20 20 20 20  reflected).     
5c30: 2a 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e  * transformation
5c40: 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 63  ..     */..    c
5c50: 68 61 6e 49 64 20 3d 20 54 63 6c 47 65 74 53 74  hanId = TclGetSt
5c60: 72 69 6e 67 28 6f 62 6a 76 5b 43 48 41 4e 5d 29  ring(objv[CHAN])
5c70: 3b 0a 20 20 20 20 63 68 61 6e 20 20 20 3d 20 54  ;.    chan   = T
5c80: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e  cl_GetChannel(in
5c90: 74 65 72 70 2c 20 63 68 61 6e 49 64 2c 20 26 6d  terp, chanId, &m
5ca0: 6f 64 65 29 3b 0a 0a 20 20 20 20 69 66 20 28 63  ode);..    if (c
5cb0: 68 61 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  han == NULL) {..
5cc0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
5cd0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
5ce0: 52 65 6d 6f 76 69 6e 67 20 74 72 61 6e 73 66 6f  Removing transfo
5cf0: 72 6d 61 74 69 6f 6e 73 20 69 73 20 67 65 6e 65  rmations is gene
5d00: 72 69 63 2c 20 61 6e 64 20 6e 6f 74 20 72 65 73  ric, and not res
5d10: 74 72 69 63 74 65 64 20 74 6f 20 72 65 66 6c 65  tricted to refle
5d20: 63 74 65 64 0a 20 20 20 20 20 2a 20 74 72 61 6e  cted.     * tran
5d30: 73 66 6f 72 6d 61 74 69 6f 6e 73 2e 0a 20 20 20  sformations..   
5d40: 20 20 2a 2f 0a 0a 20 20 20 20 54 63 6c 5f 55 6e    */..    Tcl_Un
5d50: 73 74 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74  stackChannel(int
5d60: 65 72 70 2c 20 63 68 61 6e 29 3b 0a 0a 20 20 20  erp, chan);..   
5d70: 20 2f 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20   /* TODO: Check 
5d80: 66 6f 72 20 69 6e 61 63 74 69 76 65 20 72 65 66  for inactive ref
5d90: 6c 65 63 74 65 64 20 74 72 61 6e 73 66 6f 72 6d  lected transform
5da0: 61 74 69 6f 6e 73 20 61 74 20 74 68 65 20 74 6f  ations at the to
5db0: 70 20 61 6e 64 20 2a 2f 0a 20 20 20 20 2f 2a 20  p and */.    /* 
5dc0: 54 4f 44 4f 3a 20 72 65 6d 6f 76 65 20 74 68 65  TODO: remove the
5dd0: 6d 20 61 73 20 77 65 6c 6c 2e 20 2a 2f 0a 0a 20  m as well. */.. 
5de0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b     return TCL_OK
5df0: 3b 0a 0a 23 75 6e 64 65 66 20 43 48 41 4e 0a 7d  ;..#undef CHAN.}
5e00: 0a 0c 0a 2f 2a 0a 20 2a 20 43 68 61 6e 6e 65 6c  .../*. * Channel
5e10: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 6d   error message m
5e20: 61 72 73 68 61 6c 6c 69 6e 67 20 75 74 69 6c 69  arshalling utili
5e30: 74 69 65 73 2e 0a 20 2a 2f 0a 0a 73 74 61 74 69  ties.. */..stati
5e40: 63 20 54 63 6c 5f 4f 62 6a 2a 0a 4d 61 72 73 68  c Tcl_Obj*.Marsh
5e50: 61 6c 6c 45 72 72 6f 72 28 0a 20 20 20 20 54 63  allError(.    Tc
5e60: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
5e70: 29 0a 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20  ).{.    /*.     
5e80: 2a 20 43 61 70 74 75 72 65 20 74 68 65 20 72 65  * Capture the re
5e90: 73 75 6c 74 20 73 74 61 74 75 73 20 6f 66 20 74  sult status of t
5ea0: 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 20 69  he interpreter i
5eb0: 6e 74 6f 20 61 20 73 74 72 69 6e 67 2e 20 3d 3e  nto a string. =>
5ec0: 20 4c 69 73 74 20 6f 66 0a 20 20 20 20 20 2a 20   List of.     * 
5ed0: 6f 70 74 69 6f 6e 73 20 61 6e 64 20 76 61 6c 75  options and valu
5ee0: 65 73 2c 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20  es, followed by 
5ef0: 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  the error messag
5f00: 65 2e 20 54 68 65 20 72 65 73 75 6c 74 20 68 61  e. The result ha
5f10: 73 0a 20 20 20 20 20 2a 20 72 65 66 43 6f 75 6e  s.     * refCoun
5f20: 74 20 30 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20  t 0..     */..  
5f30: 20 20 54 63 6c 5f 4f 62 6a 20 2a 72 65 74 75 72    Tcl_Obj *retur
5f40: 6e 4f 70 74 20 3d 20 54 63 6c 5f 47 65 74 52 65  nOpt = Tcl_GetRe
5f50: 74 75 72 6e 4f 70 74 69 6f 6e 73 28 69 6e 74 65  turnOptions(inte
5f60: 72 70 2c 20 54 43 4c 5f 45 52 52 4f 52 29 3b 0a  rp, TCL_ERROR);.
5f70: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 3d  .    /*.     * =
5f80: 3e 20 72 65 74 75 72 6e 4f 70 74 2e 72 65 66 43  > returnOpt.refC
5f90: 6f 75 6e 74 20 3d 3d 20 30 2e 20 57 65 20 63 61  ount == 0. We ca
5fa0: 6e 20 61 70 70 65 6e 64 20 64 69 72 65 63 74 6c  n append directl
5fb0: 79 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20  y..     */..    
5fc0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
5fd0: 64 45 6c 65 6d 65 6e 74 28 4e 55 4c 4c 2c 20 72  dElement(NULL, r
5fe0: 65 74 75 72 6e 4f 70 74 2c 20 54 63 6c 5f 47 65  eturnOpt, Tcl_Ge
5ff0: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
6000: 70 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  p));.    return 
6010: 72 65 74 75 72 6e 4f 70 74 3b 0a 7d 0a 0a 73 74  returnOpt;.}..st
6020: 61 74 69 63 20 76 6f 69 64 0a 55 6e 6d 61 72 73  atic void.Unmars
6030: 68 61 6c 6c 45 72 72 6f 72 52 65 73 75 6c 74 28  hallErrorResult(
6040: 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  .    Tcl_Interp 
6050: 2a 69 6e 74 65 72 70 2c 0a 20 20 20 20 54 63 6c  *interp,.    Tcl
6060: 5f 4f 62 6a 20 2a 6d 73 67 4f 62 6a 29 0a 7b 0a  _Obj *msgObj).{.
6070: 20 20 20 20 69 6e 74 20 6c 63 3b 0a 20 20 20 20      int lc;.    
6080: 54 63 6c 5f 4f 62 6a 20 2a 2a 6c 76 3b 0a 20 20  Tcl_Obj **lv;.  
6090: 20 20 69 6e 74 20 65 78 70 6c 69 63 69 74 52 65    int explicitRe
60a0: 73 75 6c 74 3b 0a 20 20 20 20 69 6e 74 20 6e 75  sult;.    int nu
60b0: 6d 4f 70 74 69 6f 6e 73 3b 0a 0a 20 20 20 20 2f  mOptions;..    /
60c0: 2a 0a 20 20 20 20 20 2a 20 50 72 6f 63 65 73 73  *.     * Process
60d0: 20 74 68 65 20 63 61 75 67 68 74 20 6d 65 73 73   the caught mess
60e0: 61 67 65 2e 0a 20 20 20 20 20 2a 0a 20 20 20 20  age..     *.    
60f0: 20 2a 20 53 79 6e 74 61 78 20 3d 20 28 6f 70 74   * Syntax = (opt
6100: 69 6f 6e 20 76 61 6c 75 65 29 2e 2e 2e 20 3f 6d  ion value)... ?m
6110: 65 73 73 61 67 65 3f 0a 20 20 20 20 20 2a 0a 20  essage?.     *. 
6120: 20 20 20 20 2a 20 42 61 64 20 73 79 6e 74 61 78      * Bad syntax
6130: 20 63 61 75 73 65 73 20 61 20 70 61 6e 69 63 2e   causes a panic.
6140: 20 54 68 69 73 20 69 73 20 4f 4b 20 62 65 63 61   This is OK beca
6150: 75 73 65 20 74 68 65 20 6f 74 68 65 72 20 73 69  use the other si
6160: 64 65 20 75 73 65 73 0a 20 20 20 20 20 2a 20 54  de uses.     * T
6170: 63 6c 5f 47 65 74 52 65 74 75 72 6e 4f 70 74 69  cl_GetReturnOpti
6180: 6f 6e 73 20 61 6e 64 20 6c 69 73 74 20 63 6f 6e  ons and list con
6190: 73 74 72 75 63 74 69 6f 6e 20 66 75 6e 63 74 69  struction functi
61a0: 6f 6e 73 20 74 6f 20 6d 61 72 73 68 61 6c 6c 20  ons to marshall 
61b0: 74 68 65 0a 20 20 20 20 20 2a 20 69 6e 66 6f 72  the.     * infor
61c0: 6d 61 74 69 6f 6e 3b 20 69 66 20 77 65 20 70 61  mation; if we pa
61d0: 6e 69 63 20 68 65 72 65 2c 20 73 6f 6d 65 74 68  nic here, someth
61e0: 69 6e 67 20 68 61 73 20 67 6f 6e 65 20 62 61 64  ing has gone bad
61f0: 6c 79 20 77 72 6f 6e 67 20 61 6c 72 65 61 64 79  ly wrong already
6200: 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69  ..     */..    i
6210: 66 20 28 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 65  f (Tcl_ListObjGe
6220: 74 45 6c 65 6d 65 6e 74 73 28 69 6e 74 65 72 70  tElements(interp
6230: 2c 20 6d 73 67 4f 62 6a 2c 20 26 6c 63 2c 20 26  , msgObj, &lc, &
6240: 6c 76 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b  lv) != TCL_OK) {
6250: 0a 09 54 63 6c 5f 50 61 6e 69 63 28 22 54 63 6c  ..Tcl_Panic("Tcl
6260: 43 68 61 6e 43 61 75 67 68 74 45 72 72 6f 72 42  ChanCaughtErrorB
6270: 79 70 61 73 73 3a 20 42 61 64 20 73 79 6e 74 61  ypass: Bad synta
6280: 78 20 6f 66 20 63 61 75 67 68 74 20 72 65 73 75  x of caught resu
6290: 6c 74 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  lt");.    }.    
62a0: 69 66 20 28 69 6e 74 65 72 70 20 3d 3d 20 4e 55  if (interp == NU
62b0: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 3b 0a 20  LL) {..return;. 
62c0: 20 20 20 7d 0a 0a 20 20 20 20 65 78 70 6c 69 63     }..    explic
62d0: 69 74 52 65 73 75 6c 74 20 3d 20 6c 63 20 26 20  itResult = lc & 
62e0: 31 3b 09 09 2f 2a 20 4f 64 64 20 6e 75 6d 62 65  1;../* Odd numbe
62f0: 72 20 6f 66 20 76 61 6c 75 65 73 3f 20 2a 2f 0a  r of values? */.
6300: 20 20 20 20 6e 75 6d 4f 70 74 69 6f 6e 73 20 3d      numOptions =
6310: 20 6c 63 20 2d 20 65 78 70 6c 69 63 69 74 52 65   lc - explicitRe
6320: 73 75 6c 74 3b 0a 0a 20 20 20 20 69 66 20 28 65  sult;..    if (e
6330: 78 70 6c 69 63 69 74 52 65 73 75 6c 74 29 20 7b  xplicitResult) {
6340: 0a 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75  ..Tcl_SetObjResu
6350: 6c 74 28 69 6e 74 65 72 70 2c 20 6c 76 5b 6c 63  lt(interp, lv[lc
6360: 2d 31 5d 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  -1]);.    }..   
6370: 20 28 76 6f 69 64 29 20 54 63 6c 5f 53 65 74 52   (void) Tcl_SetR
6380: 65 74 75 72 6e 4f 70 74 69 6f 6e 73 28 69 6e 74  eturnOptions(int
6390: 65 72 70 2c 20 54 63 6c 5f 4e 65 77 4c 69 73 74  erp, Tcl_NewList
63a0: 4f 62 6a 28 6e 75 6d 4f 70 74 69 6f 6e 73 2c 20  Obj(numOptions, 
63b0: 6c 76 29 29 3b 0a 20 20 20 20 28 28 49 6e 74 65  lv));.    ((Inte
63c0: 72 70 20 2a 29 69 6e 74 65 72 70 29 2d 3e 66 6c  rp *)interp)->fl
63d0: 61 67 73 20 26 3d 20 7e 45 52 52 5f 41 4c 52 45  ags &= ~ERR_ALRE
63e0: 41 44 59 5f 4c 4f 47 47 45 44 3b 0a 7d 0a 0c 0a  ADY_LOGGED;.}...
63f0: 2f 2a 0a 20 2a 20 44 72 69 76 65 72 20 66 75 6e  /*. * Driver fun
6400: 63 74 69 6f 6e 73 2e 20 3d 3d 3d 3d 3d 3d 3d 3d  ctions. ========
6410: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
6420: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
6430: 3d 3d 3d 3d 3d 3d 3d 3d 0a 20 2a 2f 0a 0a 2f 2a  ========. */../*
6440: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
6450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
6490: 52 65 66 6c 65 63 74 43 6c 6f 73 65 20 2d 2d 0a  ReflectClose --.
64a0: 20 2a 0a 20 2a 09 54 68 69 73 20 66 75 6e 63 74   *. *.This funct
64b0: 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20 77  ion is invoked w
64c0: 68 65 6e 20 74 68 65 20 63 68 61 6e 6e 65 6c 20  hen the channel 
64d0: 69 73 20 63 6c 6f 73 65 64 2c 20 74 6f 20 64 65  is closed, to de
64e0: 6c 65 74 65 20 74 68 65 0a 20 2a 09 64 72 69 76  lete the. *.driv
64f0: 65 72 20 73 70 65 63 69 66 69 63 20 69 6e 73 74  er specific inst
6500: 61 6e 63 65 20 64 61 74 61 2e 0a 20 2a 0a 20 2a  ance data.. *. *
6510: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 70   Results:. *.A p
6520: 6f 73 69 78 20 65 72 72 6f 72 2e 0a 20 2a 0a 20  osix error.. *. 
6530: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
6540: 20 2a 09 52 65 6c 65 61 73 65 73 20 6d 65 6d 6f   *.Releases memo
6550: 72 79 2e 20 41 72 62 69 74 72 61 72 79 2c 20 61  ry. Arbitrary, a
6560: 73 20 69 74 20 63 61 6c 6c 73 20 75 70 6f 6e 20  s it calls upon 
6570: 61 20 73 63 72 69 70 74 2e 0a 20 2a 0a 20 2a 2d  a script.. *. *-
6580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
65a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
65b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
65c0: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69  -----. */..stati
65d0: 63 20 69 6e 74 0a 52 65 66 6c 65 63 74 43 6c 6f  c int.ReflectClo
65e0: 73 65 28 0a 20 20 20 20 43 6c 69 65 6e 74 44 61  se(.    ClientDa
65f0: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20  ta clientData,. 
6600: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69     Tcl_Interp *i
6610: 6e 74 65 72 70 29 0a 7b 0a 20 20 20 20 52 65 66  nterp).{.    Ref
6620: 6c 65 63 74 65 64 54 72 61 6e 73 66 6f 72 6d 20  lectedTransform 
6630: 2a 72 74 50 74 72 20 3d 20 28 52 65 66 6c 65 63  *rtPtr = (Reflec
6640: 74 65 64 54 72 61 6e 73 66 6f 72 6d 20 2a 29 20  tedTransform *) 
6650: 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 20 20  clientData;.    
6660: 69 6e 74 20 72 65 73 75 6c 74 3b 09 09 09 2f 2a  int result;.../*
6670: 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66 6f 72   Result code for
6680: 20 27 63 6c 6f 73 65 27 20 2a 2f 0a 20 20 20 20   'close' */.    
6690: 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 4f 62 6a 3b  Tcl_Obj *resObj;
66a0: 09 09 2f 2a 20 52 65 73 75 6c 74 20 64 61 74 61  ../* Result data
66b0: 20 66 6f 72 20 27 63 6c 6f 73 65 27 20 2a 2f 0a   for 'close' */.
66c0: 0a 20 20 20 20 69 66 20 28 69 6e 74 65 72 70 20  .    if (interp 
66d0: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 0a 09  == NULL) {../*..
66e0: 20 2a 20 54 68 69 73 20 63 61 6c 6c 20 63 6f 6d   * This call com
66f0: 65 73 20 66 72 6f 6d 20 54 63 6c 46 69 6e 61 6c  es from TclFinal
6700: 69 7a 65 49 4f 53 79 73 74 65 6d 2e 20 54 68 65  izeIOSystem. The
6710: 72 65 20 61 72 65 20 6e 6f 0a 09 20 2a 20 69 6e  re are no.. * in
6720: 74 65 72 70 72 65 74 65 72 73 2c 20 61 6e 64 20  terpreters, and 
6730: 74 68 65 72 65 66 6f 72 65 20 77 65 20 63 61 6e  therefore we can
6740: 6e 6f 74 20 63 61 6c 6c 20 75 70 6f 6e 20 74 68  not call upon th
6750: 65 20 68 61 6e 64 6c 65 72 20 63 6f 6d 6d 61 6e  e handler comman
6760: 64 0a 09 20 2a 20 61 6e 79 6d 6f 72 65 2e 20 54  d.. * anymore. T
6770: 68 72 65 61 64 69 6e 67 20 69 73 20 69 72 72 65  hreading is irre
6780: 6c 65 76 61 6e 74 20 61 73 20 77 65 6c 6c 2e 20  levant as well. 
6790: 57 65 20 73 69 6d 70 6c 79 20 63 6c 65 61 6e 20  We simply clean 
67a0: 75 70 20 61 6c 6c 0a 09 20 2a 20 6f 75 72 20 43  up all.. * our C
67b0: 20 6c 65 76 65 6c 20 64 61 74 61 20 73 74 72 75   level data stru
67c0: 63 74 75 72 65 73 20 61 6e 64 20 6c 65 61 76 65  ctures and leave
67d0: 20 74 68 65 20 54 63 6c 20 6c 65 76 65 6c 20 74   the Tcl level t
67e0: 6f 20 74 68 65 20 6f 74 68 65 72 0a 09 20 2a 20  o the other.. * 
67f0: 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 66 75 6e  finalization fun
6800: 63 74 69 6f 6e 73 2e 0a 09 20 2a 2f 0a 0a 09 2f  ctions... */.../
6810: 2a 0a 09 20 2a 20 54 48 52 45 41 44 45 44 20 3d  *.. * THREADED =
6820: 3e 20 46 6f 72 77 61 72 64 20 74 68 69 73 20 74  > Forward this t
6830: 6f 20 74 68 65 20 6f 72 69 67 69 6e 20 74 68 72  o the origin thr
6840: 65 61 64 0a 09 20 2a 0a 09 20 2a 20 4e 6f 74 65  ead.. *.. * Note
6850: 3a 20 48 61 76 65 20 61 20 74 68 72 65 61 64 20  : Have a thread 
6860: 64 65 6c 65 74 65 20 68 61 6e 64 6c 65 72 20 66  delete handler f
6870: 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 20 74 68  or the origin th
6880: 72 65 61 64 2e 20 55 73 65 20 74 68 69 73 0a 09  read. Use this..
6890: 20 2a 20 74 6f 20 63 6c 65 61 6e 20 75 70 20 74   * to clean up t
68a0: 68 65 20 73 74 72 75 63 74 75 72 65 21 0a 09 20  he structure!.. 
68b0: 2a 2f 0a 0a 23 69 66 64 65 66 20 54 43 4c 5f 54  */..#ifdef TCL_T
68c0: 48 52 45 41 44 53 0a 09 69 66 20 28 72 74 50 74  HREADS..if (rtPt
68d0: 72 2d 3e 74 68 72 65 61 64 20 21 3d 20 54 63 6c  r->thread != Tcl
68e0: 5f 47 65 74 43 75 72 72 65 6e 74 54 68 72 65 61  _GetCurrentThrea
68f0: 64 28 29 29 20 7b 0a 09 20 20 20 20 46 6f 72 77  d()) {..    Forw
6900: 61 72 64 50 61 72 61 6d 20 70 3b 0a 0a 09 20 20  ardParam p;...  
6910: 20 20 46 6f 72 77 61 72 64 4f 70 54 6f 4f 77 6e    ForwardOpToOwn
6920: 65 72 54 68 72 65 61 64 28 72 74 50 74 72 2c 20  erThread(rtPtr, 
6930: 46 6f 72 77 61 72 64 65 64 43 6c 6f 73 65 2c 20  ForwardedClose, 
6940: 26 70 29 3b 0a 09 20 20 20 20 72 65 73 75 6c 74  &p);..    result
6950: 20 3d 20 70 2e 62 61 73 65 2e 63 6f 64 65 3b 0a   = p.base.code;.
6960: 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a  ..    /*..     *
6970: 20 46 72 65 65 52 65 66 6c 65 63 74 65 64 54 72   FreeReflectedTr
6980: 61 6e 73 66 6f 72 6d 20 69 73 20 64 6f 6e 65 20  ansform is done 
6990: 69 6e 20 74 68 65 20 66 6f 72 77 61 72 64 65 64  in the forwarded
69a0: 20 6f 70 65 72 61 74 69 6f 6e 21 2c 20 69 6e 0a   operation!, in.
69b0: 09 20 20 20 20 20 2a 20 74 68 65 20 6f 74 68 65  .     * the othe
69c0: 72 20 74 68 72 65 61 64 2e 20 72 74 50 74 72 20  r thread. rtPtr 
69d0: 68 65 72 65 20 69 73 20 67 6f 6e 65 21 0a 09 20  here is gone!.. 
69e0: 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20 69 66 20      */...    if 
69f0: 28 72 65 73 75 6c 74 20 21 3d 20 54 43 4c 5f 4f  (result != TCL_O
6a00: 4b 29 20 7b 0a 09 09 46 72 65 65 52 65 63 65 69  K) {...FreeRecei
6a10: 76 65 64 45 72 72 6f 72 28 26 70 29 3b 0a 09 20  vedError(&p);.. 
6a20: 20 20 20 7d 0a 09 20 20 20 20 72 65 74 75 72 6e     }..    return
6a30: 20 45 4f 4b 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a   EOK;..}.#endif.
6a40: 0a 09 46 72 65 65 52 65 66 6c 65 63 74 65 64 54  ..FreeReflectedT
6a50: 72 61 6e 73 66 6f 72 6d 28 72 74 50 74 72 29 3b  ransform(rtPtr);
6a60: 0a 09 72 65 74 75 72 6e 20 45 4f 4b 3b 0a 20 20  ..return EOK;.  
6a70: 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20    }..    /*.    
6a80: 20 2a 20 49 6e 20 74 68 65 20 72 65 66 6c 65 63   * In the reflec
6a90: 74 65 64 20 63 68 61 6e 6e 65 6c 20 69 6d 70 6c  ted channel impl
6aa0: 65 6d 65 6e 74 61 74 69 6f 6e 20 61 20 63 6c 65  ementation a cle
6ab0: 61 6e 65 64 20 6d 65 74 68 6f 64 20 6d 61 73 6b  aned method mask
6ac0: 20 68 65 72 65 0a 20 20 20 20 20 2a 20 69 6d 70   here.     * imp
6ad0: 6c 69 65 73 20 74 68 61 74 20 74 68 65 20 63 68  lies that the ch
6ae0: 61 6e 6e 65 6c 20 63 72 65 61 74 69 6f 6e 20 77  annel creation w
6af0: 61 73 20 61 62 6f 72 74 65 64 2c 20 61 6e 64 20  as aborted, and 
6b00: 22 66 69 6e 61 6c 69 7a 65 22 20 6d 75 73 74 20  "finalize" must 
6b10: 6e 6f 74 0a 20 20 20 20 20 2a 20 62 65 20 63 61  not.     * be ca
6b20: 6c 6c 65 64 2e 20 66 6f 72 20 74 72 61 6e 73 66  lled. for transf
6b30: 6f 72 6d 61 74 69 6f 6e 73 20 68 6f 77 65 76 65  ormations howeve
6b40: 72 20 77 65 20 61 72 65 20 6e 6f 74 20 67 6f 69  r we are not goi
6b50: 6e 67 20 74 68 72 6f 75 67 68 20 68 65 72 65 20  ng through here 
6b60: 6f 6e 0a 20 20 20 20 20 2a 20 73 75 63 68 20 61  on.     * such a
6b70: 6e 20 61 62 6f 72 74 2c 20 62 75 74 20 64 69 72  n abort, but dir
6b80: 65 63 74 6c 79 20 74 68 72 6f 75 67 68 20 46 72  ectly through Fr
6b90: 65 65 52 65 66 6c 65 63 74 65 64 54 72 61 6e 73  eeReflectedTrans
6ba0: 66 6f 72 6d 2e 20 53 6f 20 66 6f 72 20 75 73 0a  form. So for us.
6bb0: 20 20 20 20 20 2a 20 74 68 61 74 20 63 68 65 63       * that chec
6bc0: 6b 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  k is not necessa
6bd0: 72 79 2e 20 57 65 20 61 6c 77 61 79 73 20 67 6f  ry. We always go
6be0: 20 74 68 72 6f 75 67 68 20 27 66 69 6e 61 6c 69   through 'finali
6bf0: 7a 65 27 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20  ze'..     */..  
6c00: 20 20 69 66 20 28 48 41 53 28 72 74 50 74 72 2d    if (HAS(rtPtr-
6c10: 3e 6d 65 74 68 6f 64 73 2c 20 4d 45 54 48 5f 44  >methods, METH_D
6c20: 52 41 49 4e 29 20 26 26 20 28 21 72 74 50 74 72  RAIN) && (!rtPtr
6c30: 2d 3e 72 65 61 64 49 73 44 72 61 69 6e 65 64 29  ->readIsDrained)
6c40: 29 20 7b 0a 09 69 6e 74 20 65 72 72 6f 72 43 6f  ) {..int errorCo
6c50: 64 65 3b 0a 09 69 66 20 28 21 54 72 61 6e 73 66  de;..if (!Transf
6c60: 6f 72 6d 44 72 61 69 6e 20 28 72 74 50 74 72 2c  ormDrain (rtPtr,
6c70: 20 26 65 72 72 6f 72 43 6f 64 65 29 29 20 7b 0a   &errorCode)) {.
6c80: 09 20 20 20 20 72 65 74 75 72 6e 20 65 72 72 6f  .    return erro
6c90: 72 43 6f 64 65 3b 0a 09 7d 0a 20 20 20 20 7d 0a  rCode;..}.    }.
6ca0: 0a 20 20 20 20 69 66 20 28 48 41 53 28 72 74 50  .    if (HAS(rtP
6cb0: 74 72 2d 3e 6d 65 74 68 6f 64 73 2c 20 4d 45 54  tr->methods, MET
6cc0: 48 5f 46 4c 55 53 48 29 29 20 7b 0a 09 69 6e 74  H_FLUSH)) {..int
6cd0: 20 65 72 72 6f 72 43 6f 64 65 3b 0a 09 69 66 20   errorCode;..if 
6ce0: 28 21 54 72 61 6e 73 66 6f 72 6d 46 6c 75 73 68  (!TransformFlush
6cf0: 20 28 72 74 50 74 72 2c 20 26 65 72 72 6f 72 43   (rtPtr, &errorC
6d00: 6f 64 65 29 29 20 7b 0a 09 20 20 20 20 72 65 74  ode)) {..    ret
6d10: 75 72 6e 20 65 72 72 6f 72 43 6f 64 65 3b 0a 09  urn errorCode;..
6d20: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  }.    }..    /*.
6d30: 20 20 20 20 20 2a 20 41 72 65 20 77 65 20 69 6e       * Are we in
6d40: 20 74 68 65 20 63 6f 72 72 65 63 74 20 74 68 72   the correct thr
6d50: 65 61 64 3f 0a 20 20 20 20 20 2a 2f 0a 0a 23 69  ead?.     */..#i
6d60: 66 64 65 66 20 54 43 4c 5f 54 48 52 45 41 44 53  fdef TCL_THREADS
6d70: 0a 20 20 20 20 69 66 20 28 72 74 50 74 72 2d 3e  .    if (rtPtr->
6d80: 74 68 72 65 61 64 20 21 3d 20 54 63 6c 5f 47 65  thread != Tcl_Ge
6d90: 74 43 75 72 72 65 6e 74 54 68 72 65 61 64 28 29  tCurrentThread()
6da0: 29 20 7b 0a 09 46 6f 72 77 61 72 64 50 61 72 61  ) {..ForwardPara
6db0: 6d 20 70 3b 0a 0a 09 46 6f 72 77 61 72 64 4f 70  m p;...ForwardOp
6dc0: 54 6f 4f 77 6e 65 72 54 68 72 65 61 64 28 72 74  ToOwnerThread(rt
6dd0: 50 74 72 2c 20 46 6f 72 77 61 72 64 65 64 43 6c  Ptr, ForwardedCl
6de0: 6f 73 65 2c 20 26 70 29 3b 0a 09 72 65 73 75 6c  ose, &p);..resul
6df0: 74 20 3d 20 70 2e 62 61 73 65 2e 63 6f 64 65 3b  t = p.base.code;
6e00: 0a 0a 09 2f 2a 0a 09 20 2a 20 46 72 65 65 52 65  .../*.. * FreeRe
6e10: 66 6c 65 63 74 65 64 54 72 61 6e 73 66 6f 72 6d  flectedTransform
6e20: 20 69 73 20 64 6f 6e 65 20 69 6e 20 74 68 65 20   is done in the 
6e30: 66 6f 72 77 61 72 64 65 64 20 6f 70 65 72 61 74  forwarded operat
6e40: 69 6f 6e 21 2c 20 69 6e 20 74 68 65 0a 09 20 2a  ion!, in the.. *
6e50: 20 6f 74 68 65 72 20 74 68 72 65 61 64 2e 20 72   other thread. r
6e60: 74 50 74 72 20 68 65 72 65 20 69 73 20 67 6f 6e  tPtr here is gon
6e70: 65 21 0a 09 20 2a 2f 0a 0a 09 69 66 20 28 72 65  e!.. */...if (re
6e80: 73 75 6c 74 20 21 3d 20 54 43 4c 5f 4f 4b 29 20  sult != TCL_OK) 
6e90: 7b 0a 09 20 20 20 20 50 61 73 73 52 65 63 65 69  {..    PassRecei
6ea0: 76 65 64 45 72 72 6f 72 49 6e 74 65 72 70 28 69  vedErrorInterp(i
6eb0: 6e 74 65 72 70 2c 20 26 70 29 3b 0a 09 7d 0a 20  nterp, &p);..}. 
6ec0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 23 65 6e 64     } else {.#end
6ed0: 69 66 0a 09 72 65 73 75 6c 74 20 3d 20 49 6e 76  if..result = Inv
6ee0: 6f 6b 65 54 63 6c 4d 65 74 68 6f 64 28 72 74 50  okeTclMethod(rtP
6ef0: 74 72 2c 20 22 66 69 6e 61 6c 69 7a 65 22 2c 20  tr, "finalize", 
6f00: 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 26 72 65 73  NULL, NULL, &res
6f10: 4f 62 6a 29 3b 0a 09 69 66 20 28 28 72 65 73 75  Obj);..if ((resu
6f20: 6c 74 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 26 26  lt != TCL_OK) &&
6f30: 20 28 69 6e 74 65 72 70 20 21 3d 20 4e 55 4c 4c   (interp != NULL
6f40: 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 53 65  )) {..    Tcl_Se
6f50: 74 43 68 61 6e 6e 65 6c 45 72 72 6f 72 49 6e 74  tChannelErrorInt
6f60: 65 72 70 28 69 6e 74 65 72 70 2c 20 72 65 73 4f  erp(interp, resO
6f70: 62 6a 29 3b 0a 09 7d 0a 0a 09 54 63 6c 5f 44 65  bj);..}...Tcl_De
6f80: 63 72 52 65 66 43 6f 75 6e 74 28 72 65 73 4f 62  crRefCount(resOb
6f90: 6a 29 3b 09 2f 2a 20 52 65 6d 6f 76 65 20 72 65  j);./* Remove re
6fa0: 66 65 72 65 6e 63 65 20 77 65 20 68 65 6c 64 20  ference we held 
6fb0: 66 72 6f 6d 20 74 68 65 0a 09 09 09 09 09 20 2a  from the...... *
6fc0: 20 69 6e 76 6f 6b 65 20 2a 2f 0a 09 46 72 65 65   invoke */..Free
6fd0: 52 65 66 6c 65 63 74 65 64 54 72 61 6e 73 66 6f  ReflectedTransfo
6fe0: 72 6d 28 72 74 50 74 72 29 3b 0a 23 69 66 64 65  rm(rtPtr);.#ifde
6ff0: 66 20 54 43 4c 5f 54 48 52 45 41 44 53 0a 20 20  f TCL_THREADS.  
7000: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72    }.#endif.    r
7010: 65 74 75 72 6e 20 28 72 65 73 75 6c 74 20 3d 3d  eturn (result ==
7020: 20 54 43 4c 5f 4f 4b 29 20 3f 20 45 4f 4b 20 3a   TCL_OK) ? EOK :
7030: 20 45 49 4e 56 41 4c 3b 0a 7d 0a 0c 0a 2f 2a 0a   EINVAL;.}.../*.
7040: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
7050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 20 2a 0a 20 2a 20 52  --------. *. * R
7090: 65 66 6c 65 63 74 49 6e 70 75 74 20 2d 2d 0a 20  eflectInput --. 
70a0: 2a 0a 20 2a 09 54 68 69 73 20 66 75 6e 63 74 69  *. *.This functi
70b0: 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20 77 68  on is invoked wh
70c0: 65 6e 20 6d 6f 72 65 20 64 61 74 61 20 69 73 20  en more data is 
70d0: 72 65 71 75 65 73 74 65 64 20 66 72 6f 6d 20 74  requested from t
70e0: 68 65 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20  he channel.. *. 
70f0: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 54 68  * Results:. *.Th
7100: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
7110: 73 20 72 65 61 64 2e 0a 20 2a 0a 20 2a 20 53 69  s read.. *. * Si
7120: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 41  de effects:. *.A
7130: 6c 6c 6f 63 61 74 65 73 20 6d 65 6d 6f 72 79 2e  llocates memory.
7140: 20 41 72 62 69 74 72 61 72 79 2c 20 61 73 20 69   Arbitrary, as i
7150: 74 20 63 61 6c 6c 73 20 75 70 6f 6e 20 61 20 73  t calls upon a s
7160: 63 72 69 70 74 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d  cript.. *. *----
7170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
71a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
71b0: 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69  --. */..static i
71c0: 6e 74 0a 52 65 66 6c 65 63 74 49 6e 70 75 74 28  nt.ReflectInput(
71d0: 0a 09 20 20 20 20 20 43 6c 69 65 6e 74 44 61 74  ..     ClientDat
71e0: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 09 20  a clientData,.. 
71f0: 20 20 20 20 63 68 61 72 20 2a 62 75 66 2c 0a 09      char *buf,..
7200: 20 20 20 20 20 69 6e 74 20 74 6f 52 65 61 64 2c       int toRead,
7210: 0a 09 20 20 20 20 20 69 6e 74 20 2a 65 72 72 6f  ..     int *erro
7220: 72 43 6f 64 65 50 74 72 29 0a 7b 0a 20 20 20 20  rCodePtr).{.    
7230: 52 65 66 6c 65 63 74 65 64 54 72 61 6e 73 66 6f  ReflectedTransfo
7240: 72 6d 20 2a 72 74 50 74 72 20 3d 20 28 52 65 66  rm *rtPtr = (Ref
7250: 6c 65 63 74 65 64 54 72 61 6e 73 66 6f 72 6d 20  lectedTransform 
7260: 2a 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20  *) clientData;. 
7270: 20 20 20 69 6e 74 20 67 6f 74 42 79 74 65 73 2c     int gotBytes,
7280: 20 63 6f 70 69 65 64 2c 20 72 65 61 64 3b 0a 0a   copied, read;..
7290: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 54 68      /*.     * Th
72a0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 65 63  e following chec
72b0: 6b 20 63 61 6e 20 62 65 20 64 6f 6e 65 20 62 65  k can be done be
72c0: 66 6f 72 65 20 74 68 72 65 61 64 20 72 65 64 69  fore thread redi
72d0: 72 65 63 74 69 6f 6e 2c 20 62 65 63 61 75 73 65  rection, because
72e0: 20 77 65 0a 20 20 20 20 20 2a 20 61 72 65 20 72   we.     * are r
72f0: 65 61 64 69 6e 67 20 66 72 6f 6d 20 61 6e 20 69  eading from an i
7300: 74 65 6d 20 77 68 69 63 68 20 69 73 20 72 65 61  tem which is rea
7310: 64 6f 6e 6c 79 2c 20 69 2e 65 2e 20 77 69 6c 6c  donly, i.e. will
7320: 20 6e 65 76 65 72 20 63 68 61 6e 67 65 0a 20 20   never change.  
7330: 20 20 20 2a 20 64 75 72 69 6e 67 20 74 68 65 20     * during the 
7340: 6c 69 66 65 74 69 6d 65 20 6f 66 20 74 68 65 20  lifetime of the 
7350: 63 68 61 6e 6e 65 6c 2e 0a 20 20 20 20 20 2a 2f  channel..     */
7360: 0a 0a 20 20 20 20 69 66 20 28 21 28 72 74 50 74  ..    if (!(rtPt
7370: 72 2d 3e 6d 65 74 68 6f 64 73 20 26 20 46 4c 41  r->methods & FLA
7380: 47 28 4d 45 54 48 5f 52 45 41 44 29 29 29 20 7b  G(METH_READ))) {
7390: 0a 09 53 65 74 43 68 61 6e 6e 65 6c 45 72 72 6f  ..SetChannelErro
73a0: 72 53 74 72 28 72 74 50 74 72 2d 3e 63 68 61 6e  rStr(rtPtr->chan
73b0: 2c 20 6d 73 67 5f 72 65 61 64 5f 75 6e 73 75 70  , msg_read_unsup
73c0: 29 3b 0a 09 2a 65 72 72 6f 72 43 6f 64 65 50 74  );..*errorCodePt
73d0: 72 20 3d 20 45 49 4e 56 41 4c 3b 0a 09 72 65 74  r = EINVAL;..ret
73e0: 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20  urn -1;.    }.. 
73f0: 20 20 20 67 6f 74 42 79 74 65 73 20 3d 20 30 3b     gotBytes = 0;
7400: 0a 0a 20 20 20 20 77 68 69 6c 65 20 28 74 6f 52  ..    while (toR
7410: 65 61 64 20 3e 20 30 29 20 7b 0a 09 2f 2a 20 4c  ead > 0) {../* L
7420: 6f 6f 70 20 75 6e 74 69 6c 20 74 68 65 20 72 65  oop until the re
7430: 71 75 65 73 74 20 69 73 20 73 61 74 69 73 66 69  quest is satisfi
7440: 65 64 20 28 6f 72 20 6e 6f 20 64 61 74 61 20 61  ed (or no data a
7450: 76 61 69 6c 61 62 6c 65 20 66 72 6f 6d 0a 09 20  vailable from.. 
7460: 2a 20 62 65 6c 6f 77 2c 20 70 6f 73 73 69 62 6c  * below, possibl
7470: 79 20 45 4f 46 29 2e 0a 09 20 2a 2f 0a 0a 09 63  y EOF)... */...c
7480: 6f 70 69 65 64 20 20 20 20 3d 20 52 65 73 75 6c  opied    = Resul
7490: 74 43 6f 70 79 20 28 26 72 74 50 74 72 2d 3e 72  tCopy (&rtPtr->r
74a0: 65 73 75 6c 74 2c 20 28 75 6e 73 69 67 6e 65 64  esult, (unsigned
74b0: 20 63 68 61 72 2a 29 20 62 75 66 2c 20 74 6f 52   char*) buf, toR
74c0: 65 61 64 29 3b 0a 09 74 6f 52 65 61 64 20 20 20  ead);..toRead   
74d0: 2d 3d 20 63 6f 70 69 65 64 3b 0a 09 62 75 66 20  -= copied;..buf 
74e0: 20 20 20 20 20 2b 3d 20 63 6f 70 69 65 64 3b 0a       += copied;.
74f0: 09 67 6f 74 42 79 74 65 73 20 2b 3d 20 63 6f 70  .gotBytes += cop
7500: 69 65 64 3b 0a 0a 09 69 66 20 28 74 6f 52 65 61  ied;...if (toRea
7510: 64 20 3d 3d 20 30 29 20 7b 0a 09 20 20 20 20 72  d == 0) {..    r
7520: 65 74 75 72 6e 20 67 6f 74 42 79 74 65 73 3b 0a  eturn gotBytes;.
7530: 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 54 68 65 20  .}.../*.. * The 
7540: 62 75 66 66 65 72 20 69 73 20 65 78 68 61 75 73  buffer is exhaus
7550: 74 65 64 2c 20 62 75 74 20 74 68 65 20 63 61 6c  ted, but the cal
7560: 6c 65 72 20 77 61 6e 74 73 20 65 76 65 6e 20 6d  ler wants even m
7570: 6f 72 65 2e 20 57 65 20 6e 6f 77 0a 09 20 2a 20  ore. We now.. * 
7580: 68 61 76 65 20 74 6f 20 67 6f 20 74 6f 20 74 68  have to go to th
7590: 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 63 68 61  e underlying cha
75a0: 6e 6e 65 6c 2c 20 67 65 74 20 6d 6f 72 65 20 62  nnel, get more b
75b0: 79 74 65 73 20 61 6e 64 20 74 68 65 6e 0a 09 20  ytes and then.. 
75c0: 2a 20 74 72 61 6e 73 66 6f 72 6d 20 74 68 65 6d  * transform them
75d0: 20 66 6f 72 20 64 65 6c 69 76 65 72 79 2e 20 57   for delivery. W
75e0: 65 20 6d 61 79 20 6e 6f 74 20 67 65 74 20 74 68  e may not get th
75f0: 61 74 20 77 65 20 77 61 6e 74 20 28 66 75 6c 6c  at we want (full
7600: 20 45 4f 46 0a 09 20 2a 20 6f 72 20 74 65 6d 70   EOF.. * or temp
7610: 6f 72 61 72 79 20 6f 75 74 20 6f 66 20 64 61 74  orary out of dat
7620: 61 29 2e 0a 09 20 2a 2f 0a 0a 09 2f 2a 0a 09 20  a)... */.../*.. 
7630: 2a 20 4c 65 6e 67 74 68 20 28 72 74 50 74 72 2d  * Length (rtPtr-
7640: 3e 72 65 73 75 6c 74 29 20 3d 3d 20 30 2c 20 74  >result) == 0, t
7650: 6f 52 65 61 64 20 3e 20 30 20 68 65 72 65 2e 20  oRead > 0 here. 
7660: 55 73 65 20 27 62 75 66 27 21 20 61 73 20 74 61  Use 'buf'! as ta
7670: 72 67 65 74 0a 09 20 2a 20 74 6f 20 73 74 6f 72  rget.. * to stor
7680: 65 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61  e the intermedia
7690: 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 72  ry information r
76a0: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 70 61 72  ead from the par
76b0: 65 6e 74 20 63 68 61 6e 6e 65 6c 2e 0a 09 20 2a  ent channel... *
76c0: 0a 09 20 2a 20 41 73 6b 20 74 68 65 20 74 72 61  .. * Ask the tra
76d0: 6e 73 66 6f 72 6d 20 68 6f 77 20 6d 75 63 68 20  nsform how much 
76e0: 64 61 74 61 20 69 74 20 61 6c 6c 6f 77 73 20 75  data it allows u
76f0: 73 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 74  s to read from t
7700: 68 65 0a 09 20 2a 20 75 6e 64 65 72 6c 79 69 6e  he.. * underlyin
7710: 67 20 63 68 61 6e 6e 65 6c 2e 20 54 68 69 73 20  g channel. This 
7720: 66 65 61 74 75 72 65 20 61 6c 6c 6f 77 73 20 74  feature allows t
7730: 68 65 20 74 72 61 6e 73 66 6f 72 6d 20 74 6f 20  he transform to 
7740: 73 69 67 6e 61 6c 20 45 4f 46 0a 09 20 2a 20 75  signal EOF.. * u
7750: 70 73 74 72 65 61 6d 20 61 6c 74 68 6f 75 67 68  pstream although
7760: 20 74 68 65 72 65 20 69 73 20 6e 6f 6e 65 20 64   there is none d
7770: 6f 77 6e 73 74 72 65 61 6d 2e 20 55 73 65 66 75  ownstream. Usefu
7780: 6c 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 61 6e 0a  l to control an.
7790: 09 20 2a 20 75 6e 62 6f 75 6e 64 65 64 20 27 66  . * unbounded 'f
77a0: 63 6f 70 79 27 20 66 6f 72 20 65 78 61 6d 70 6c  copy' for exampl
77b0: 65 2c 20 65 69 74 68 65 72 20 74 68 72 6f 75 67  e, either throug
77c0: 68 20 63 6f 75 6e 74 69 6e 67 20 62 79 74 65 73  h counting bytes
77d0: 2c 20 6f 72 20 62 79 0a 09 20 2a 20 70 61 74 74  , or by.. * patt
77e0: 65 72 6e 20 6d 61 74 63 68 69 6e 67 2e 0a 09 20  ern matching... 
77f0: 2a 2f 0a 0a 09 69 66 20 28 28 72 74 50 74 72 2d  */...if ((rtPtr-
7800: 3e 6d 65 74 68 6f 64 73 20 26 20 46 4c 41 47 28  >methods & FLAG(
7810: 4d 45 54 48 5f 4c 49 4d 49 54 29 29 29 20 7b 0a  METH_LIMIT))) {.
7820: 09 20 20 20 20 69 6e 74 20 6d 61 78 52 65 61 64  .    int maxRead
7830: 20 3d 20 2d 31 3b 0a 09 20 20 20 20 69 66 20 28   = -1;..    if (
7840: 21 54 72 61 6e 73 66 6f 72 6d 4c 69 6d 69 74 20  !TransformLimit 
7850: 28 72 74 50 74 72 2c 20 65 72 72 6f 72 43 6f 64  (rtPtr, errorCod
7860: 65 50 74 72 2c 20 26 6d 61 78 52 65 61 64 29 29  ePtr, &maxRead))
7870: 20 7b 0a 09 09 72 65 74 75 72 6e 20 2d 31 3b 0a   {...return -1;.
7880: 09 20 20 20 20 7d 0a 09 20 20 20 20 69 66 20 28  .    }..    if (
7890: 6d 61 78 52 65 61 64 20 3d 3d 20 30 29 20 7b 0a  maxRead == 0) {.
78a0: 09 09 53 65 74 43 68 61 6e 6e 65 6c 45 72 72 6f  ..SetChannelErro
78b0: 72 53 74 72 28 72 74 50 74 72 2d 3e 63 68 61 6e  rStr(rtPtr->chan
78c0: 2c 20 6d 73 67 5f 72 65 61 64 5f 62 61 64 6c 69  , msg_read_badli
78d0: 6d 69 74 29 3b 0a 09 09 72 65 74 75 72 6e 20 2d  mit);...return -
78e0: 31 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 69  1;..    } else i
78f0: 66 20 28 6d 61 78 52 65 61 64 20 3e 20 30 29 20  f (maxRead > 0) 
7900: 7b 0a 09 09 69 66 20 28 6d 61 78 52 65 61 64 20  {...if (maxRead 
7910: 3c 20 74 6f 52 65 61 64 29 20 7b 0a 09 09 20 20  < toRead) {...  
7920: 20 20 74 6f 52 65 61 64 20 3d 20 6d 61 78 52 65    toRead = maxRe
7930: 61 64 3b 0a 09 09 7d 0a 09 20 20 20 20 7d 20 2f  ad;...}..    } /
7940: 2a 20 65 6c 73 65 3a 20 27 6d 61 78 52 65 61 64  * else: 'maxRead
7950: 20 3c 20 30 27 20 3d 3d 20 41 63 63 65 70 74 20   < 0' == Accept 
7960: 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  the current valu
7970: 65 20 6f 66 20 74 6f 52 65 61 64 20 2a 2f 0a 09  e of toRead */..
7980: 7d 0a 0a 09 69 66 20 28 74 6f 52 65 61 64 20 3c  }...if (toRead <
7990: 3d 20 30 29 20 7b 0a 09 20 20 20 20 72 65 74 75  = 0) {..    retu
79a0: 72 6e 20 67 6f 74 42 79 74 65 73 3b 0a 09 7d 0a  rn gotBytes;..}.
79b0: 0a 09 72 65 61 64 20 3d 20 54 63 6c 5f 52 65 61  ..read = Tcl_Rea
79c0: 64 52 61 77 20 28 72 74 50 74 72 2d 3e 70 61 72  dRaw (rtPtr->par
79d0: 65 6e 74 2c 20 62 75 66 2c 20 74 6f 52 65 61 64  ent, buf, toRead
79e0: 29 3b 0a 09 69 66 20 28 72 65 61 64 20 3c 20 30  );..if (read < 0
79f0: 29 20 7b 0a 09 20 20 20 20 2f 2a 20 52 65 70 6f  ) {..    /* Repo
7a00: 72 74 20 65 72 72 6f 72 73 20 74 6f 20 63 61 6c  rt errors to cal
7a10: 6c 65 72 2e 0a 09 20 20 20 20 20 2a 20 54 68 65  ler...     * The
7a20: 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 73 65   state of the se
7a30: 65 6b 20 73 79 73 74 65 6d 20 69 73 20 75 6e 63  ek system is unc
7a40: 68 61 6e 67 65 64 21 0a 09 20 20 20 20 20 2a 2f  hanged!..     */
7a50: 0a 0a 09 20 20 20 20 69 66 20 28 28 54 63 6c 5f  ...    if ((Tcl_
7a60: 47 65 74 45 72 72 6e 6f 20 28 29 20 3d 3d 20 45  GetErrno () == E
7a70: 41 47 41 49 4e 29 20 26 26 20 28 67 6f 74 42 79  AGAIN) && (gotBy
7a80: 74 65 73 20 3e 20 30 29 29 20 7b 0a 09 09 2f 2a  tes > 0)) {.../*
7a90: 20 45 41 47 41 49 4e 20 69 73 20 61 20 73 70 65   EAGAIN is a spe
7aa0: 63 69 61 6c 20 73 69 74 75 61 74 69 6f 6e 2e 20  cial situation. 
7ab0: 20 49 66 20 77 65 20 68 61 64 20 73 6f 6d 65 20   If we had some 
7ac0: 64 61 74 61 0a 09 09 20 2a 20 62 65 66 6f 72 65  data... * before
7ad0: 20 77 65 20 72 65 70 6f 72 74 20 74 68 61 74 20   we report that 
7ae0: 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 72  instead of the r
7af0: 65 71 75 65 73 74 20 74 6f 20 72 65 2d 74 72 79  equest to re-try
7b00: 2e 0a 09 09 20 2a 2f 0a 0a 09 09 72 65 74 75 72  .... */....retur
7b10: 6e 20 67 6f 74 42 79 74 65 73 3b 0a 09 20 20 20  n gotBytes;..   
7b20: 20 7d 0a 0a 09 20 20 20 20 2a 65 72 72 6f 72 43   }...    *errorC
7b30: 6f 64 65 50 74 72 20 3d 20 54 63 6c 5f 47 65 74  odePtr = Tcl_Get
7b40: 45 72 72 6e 6f 20 28 29 3b 0a 09 20 20 20 20 72  Errno ();..    r
7b50: 65 74 75 72 6e 20 2d 31 3b 20 20 20 20 20 20 0a  eturn -1;      .
7b60: 09 7d 0a 0a 09 69 66 20 28 72 65 61 64 20 3d 3d  .}...if (read ==
7b70: 20 30 29 20 7b 0a 09 20 20 20 20 2f 2a 0a 09 20   0) {..    /*.. 
7b80: 20 20 20 20 2a 20 43 68 65 63 6b 20 77 65 74 68      * Check weth
7b90: 65 72 20 77 65 20 68 69 74 20 6f 6e 20 45 4f 46  er we hit on EOF
7ba0: 20 69 6e 20 27 70 61 72 65 6e 74 27 20 6f 72 20   in 'parent' or 
7bb0: 6e 6f 74 2e 20 49 66 20 6e 6f 74 0a 09 20 20 20  not. If not..   
7bc0: 20 20 2a 20 64 69 66 66 65 72 65 6e 74 69 61 74    * differentiat
7bd0: 65 20 62 65 74 77 65 65 6e 20 62 6c 6f 63 6b 69  e between blocki
7be0: 6e 67 20 61 6e 64 20 6e 6f 6e 2d 62 6c 6f 63 6b  ng and non-block
7bf0: 69 6e 67 20 6d 6f 64 65 73 2e 20 49 6e 0a 09 20  ing modes. In.. 
7c00: 20 20 20 20 2a 20 6e 6f 6e 2d 62 6c 6f 63 6b 69      * non-blocki
7c10: 6e 67 20 6d 6f 64 65 20 77 65 20 72 61 6e 20 74  ng mode we ran t
7c20: 65 6d 70 6f 72 61 72 69 6c 79 20 6f 75 74 20 6f  emporarily out o
7c30: 66 20 64 61 74 61 2e 20 53 69 67 6e 61 6c 20 74  f data. Signal t
7c40: 68 69 73 0a 09 20 20 20 20 20 2a 20 74 6f 20 74  his..     * to t
7c50: 68 65 20 63 61 6c 6c 65 72 20 76 69 61 20 45 57  he caller via EW
7c60: 4f 55 4c 44 42 4c 4f 43 4b 20 61 6e 64 20 65 72  OULDBLOCK and er
7c70: 72 6f 72 20 72 65 74 75 72 6e 20 28 2d 31 29 2e  ror return (-1).
7c80: 20 49 6e 20 74 68 65 0a 09 20 20 20 20 20 2a 20   In the..     * 
7c90: 6f 74 68 65 72 20 63 61 73 65 73 20 77 65 20 73  other cases we s
7ca0: 69 6d 70 6c 79 20 72 65 74 75 72 6e 20 77 68 61  imply return wha
7cb0: 74 20 77 65 20 67 6f 74 20 61 6e 64 20 6c 65 74  t we got and let
7cc0: 20 74 68 65 20 63 61 6c 6c 65 72 0a 09 20 20 20   the caller..   
7cd0: 20 20 2a 20 77 61 69 74 20 66 6f 72 20 6d 6f 72    * wait for mor
7ce0: 65 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20  e. On the other 
7cf0: 68 61 6e 64 2c 20 69 66 20 77 65 20 67 6f 74 20  hand, if we got 
7d00: 61 6e 20 45 4f 46 20 77 65 20 68 61 76 65 20 74  an EOF we have t
7d10: 6f 0a 09 20 20 20 20 20 2a 20 63 6f 6e 76 65 72  o..     * conver
7d20: 74 20 61 6e 64 20 66 6c 75 73 68 20 61 6c 6c 20  t and flush all 
7d30: 77 61 69 74 69 6e 67 20 70 61 72 74 69 61 6c 20  waiting partial 
7d40: 64 61 74 61 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a  data...     */..
7d50: 09 20 20 20 20 69 66 20 28 21 54 63 6c 5f 45 6f  .    if (!Tcl_Eo
7d60: 66 20 28 72 74 50 74 72 2d 3e 70 61 72 65 6e 74  f (rtPtr->parent
7d70: 29 29 20 7b 0a 09 09 2f 2a 20 54 68 65 20 73 74  )) {.../* The st
7d80: 61 74 65 20 6f 66 20 74 68 65 20 73 65 65 6b 20  ate of the seek 
7d90: 73 79 73 74 65 6d 20 69 73 20 75 6e 63 68 61 6e  system is unchan
7da0: 67 65 64 21 20 2a 2f 0a 0a 09 09 69 66 20 28 67  ged! */....if (g
7db0: 6f 74 42 79 74 65 73 20 3d 3d 20 30 20 26 26 20  otBytes == 0 && 
7dc0: 21 72 74 50 74 72 2d 3e 62 6c 6f 63 6b 69 6e 67  !rtPtr->blocking
7dd0: 29 20 7b 0a 09 09 20 20 20 20 2a 65 72 72 6f 72  ) {...    *error
7de0: 43 6f 64 65 50 74 72 20 3d 20 45 57 4f 55 4c 44  CodePtr = EWOULD
7df0: 42 4c 4f 43 4b 3b 0a 09 09 20 20 20 20 72 65 74  BLOCK;...    ret
7e00: 75 72 6e 20 2d 31 3b 0a 09 09 7d 20 65 6c 73 65  urn -1;...} else
7e10: 20 7b 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20   {...    return 
7e20: 67 6f 74 42 79 74 65 73 3b 0a 09 09 7d 0a 09 20  gotBytes;...}.. 
7e30: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 2f 2a     } else {.../*
7e40: 20 45 6f 66 20 69 6e 20 70 61 72 65 6e 74 20 2a   Eof in parent *
7e50: 2f 0a 09 09 69 66 20 28 72 74 50 74 72 2d 3e 72  /...if (rtPtr->r
7e60: 65 61 64 49 73 44 72 61 69 6e 65 64 29 20 7b 0a  eadIsDrained) {.
7e70: 09 09 20 20 20 20 72 65 74 75 72 6e 20 67 6f 74  ..    return got
7e80: 42 79 74 65 73 3b 0a 09 09 7d 0a 0a 09 09 2f 2a  Bytes;...}..../*
7e90: 0a 09 09 20 2a 20 4e 6f 77 20 74 68 69 73 20 69  ... * Now this i
7ea0: 73 20 61 20 62 69 74 20 64 69 66 66 65 72 65 6e  s a bit differen
7eb0: 74 2e 20 54 68 65 20 70 61 72 74 69 61 6c 20 64  t. The partial d
7ec0: 61 74 61 20 77 61 69 74 69 6e 67 20 69 73 0a 09  ata waiting is..
7ed0: 09 20 2a 20 63 6f 6e 76 65 72 74 65 64 20 61 6e  . * converted an
7ee0: 64 20 72 65 74 75 72 6e 65 64 2e 0a 09 09 20 2a  d returned.... *
7ef0: 2f 0a 0a 09 09 69 66 20 28 48 41 53 28 72 74 50  /....if (HAS(rtP
7f00: 74 72 2d 3e 6d 65 74 68 6f 64 73 2c 20 4d 45 54  tr->methods, MET
7f10: 48 5f 44 52 41 49 4e 29 29 20 7b 0a 09 09 20 20  H_DRAIN)) {...  
7f20: 20 20 69 66 28 21 54 72 61 6e 73 66 6f 72 6d 44    if(!TransformD
7f30: 72 61 69 6e 20 28 72 74 50 74 72 2c 20 65 72 72  rain (rtPtr, err
7f40: 6f 72 43 6f 64 65 50 74 72 29 29 20 7b 0a 09 09  orCodePtr)) {...
7f50: 09 72 65 74 75 72 6e 20 2d 31 3b 0a 09 09 20 20  .return -1;...  
7f60: 20 20 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 28 52    }...}....if (R
7f70: 65 73 75 6c 74 4c 65 6e 67 74 68 20 28 26 72 74  esultLength (&rt
7f80: 50 74 72 2d 3e 72 65 73 75 6c 74 29 20 3d 3d 20  Ptr->result) == 
7f90: 30 29 20 7b 0a 09 09 20 20 20 20 2f 2a 20 54 68  0) {...    /* Th
7fa0: 65 20 64 72 61 69 6e 20 64 65 6c 69 76 65 72 65  e drain delivere
7fb0: 64 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 09 09 20  d nothing */... 
7fc0: 20 20 20 72 65 74 75 72 6e 20 67 6f 74 42 79 74     return gotByt
7fd0: 65 73 3b 0a 09 09 7d 0a 09 09 63 6f 6e 74 69 6e  es;...}...contin
7fe0: 75 65 3b 20 2f 2a 20 61 74 3a 20 77 68 69 6c 65  ue; /* at: while
7ff0: 20 28 74 6f 52 65 61 64 20 3e 20 30 29 20 2a 2f   (toRead > 0) */
8000: 0a 09 20 20 20 20 7d 0a 09 7d 20 2f 2a 20 72 65  ..    }..} /* re
8010: 61 64 20 3d 3d 20 30 20 2a 2f 0a 0a 09 2f 2a 0a  ad == 0 */.../*.
8020: 09 20 2a 20 54 72 61 6e 73 66 6f 72 6d 20 74 68  . * Transform th
8030: 65 20 72 65 61 64 20 63 68 75 6e 6b 2c 20 77 68  e read chunk, wh
8040: 69 63 68 20 77 61 73 20 6e 6f 74 20 65 6d 70 74  ich was not empt
8050: 79 2e 20 41 6e 79 74 68 69 6e 67 20 77 65 20 67  y. Anything we g
8060: 6f 74 20 62 61 63 6b 0a 09 20 2a 20 69 73 20 61  ot back.. * is a
8070: 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20   transformation 
8080: 72 65 73 75 6c 74 20 69 73 20 70 75 74 20 69 6e  result is put in
8090: 74 6f 20 6f 75 72 20 62 75 66 66 65 72 73 2c 20  to our buffers, 
80a0: 61 6e 64 20 74 68 65 20 6e 65 78 74 0a 09 20 2a  and the next.. *
80b0: 20 69 74 65 72 61 74 69 6f 6e 20 77 69 6c 6c 20   iteration will 
80c0: 70 75 74 20 69 74 20 69 6e 74 6f 20 74 68 65 20  put it into the 
80d0: 72 65 73 75 6c 74 2e 0a 09 20 2a 2f 0a 0a 09 69  result... */...i
80e0: 66 20 28 21 54 72 61 6e 73 66 6f 72 6d 52 65 61  f (!TransformRea
80f0: 64 20 28 72 74 50 74 72 2c 20 65 72 72 6f 72 43  d (rtPtr, errorC
8100: 6f 64 65 50 74 72 2c 20 62 75 66 2c 20 72 65 61  odePtr, buf, rea
8110: 64 29 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72  d)) {..    retur
8120: 6e 20 2d 31 3b 0a 09 7d 0a 20 20 20 20 7d 20 2f  n -1;..}.    } /
8130: 2a 20 77 68 69 6c 65 20 74 6f 52 65 61 64 20 3e  * while toRead >
8140: 20 30 20 2a 2f 0a 0a 20 20 20 20 72 65 74 75 72   0 */..    retur
8150: 6e 20 67 6f 74 42 79 74 65 73 3b 0a 0a 7d 0a 0c  n gotBytes;..}..
8160: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
8170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
81a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
81b0: 20 2a 20 52 65 66 6c 65 63 74 4f 75 74 70 75 74   * ReflectOutput
81c0: 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 66   --. *. *.This f
81d0: 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b  unction is invok
81e0: 65 64 20 77 68 65 6e 20 64 61 74 61 20 69 73 20  ed when data is 
81f0: 77 72 69 74 65 6e 20 74 6f 20 74 68 65 20 63 68  writen to the ch
8200: 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 20 52 65 73  annel.. *. * Res
8210: 75 6c 74 73 3a 0a 20 2a 09 54 68 65 20 6e 75 6d  ults:. *.The num
8220: 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74  ber of bytes act
8230: 75 61 6c 6c 79 20 77 72 69 74 74 65 6e 2e 0a 20  ually written.. 
8240: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
8250: 73 3a 0a 20 2a 09 41 6c 6c 6f 63 61 74 65 73 20  s:. *.Allocates 
8260: 6d 65 6d 6f 72 79 2e 20 41 72 62 69 74 72 61 72  memory. Arbitrar
8270: 79 2c 20 61 73 20 69 74 20 63 61 6c 6c 73 20 75  y, as it calls u
8280: 70 6f 6e 20 61 20 73 63 72 69 70 74 2e 0a 20 2a  pon a script.. *
8290: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
82a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
82b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
82c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
82d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73  ---------. */..s
82e0: 74 61 74 69 63 20 69 6e 74 0a 52 65 66 6c 65 63  tatic int.Reflec
82f0: 74 4f 75 74 70 75 74 28 0a 20 20 20 20 43 6c 69  tOutput(.    Cli
8300: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
8310: 74 61 2c 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  ta,.    const ch
8320: 61 72 20 2a 62 75 66 2c 0a 20 20 20 20 69 6e 74  ar *buf,.    int
8330: 20 74 6f 57 72 69 74 65 2c 0a 20 20 20 20 69 6e   toWrite,.    in
8340: 74 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 29  t *errorCodePtr)
8350: 0a 7b 0a 20 20 20 20 52 65 66 6c 65 63 74 65 64  .{.    Reflected
8360: 54 72 61 6e 73 66 6f 72 6d 20 2a 72 74 50 74 72  Transform *rtPtr
8370: 20 3d 20 28 52 65 66 6c 65 63 74 65 64 54 72 61   = (ReflectedTra
8380: 6e 73 66 6f 72 6d 20 2a 29 20 63 6c 69 65 6e 74  nsform *) client
8390: 44 61 74 61 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20  Data;..    /*.  
83a0: 20 20 20 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69     * The followi
83b0: 6e 67 20 63 68 65 63 6b 20 63 61 6e 20 62 65 20  ng check can be 
83c0: 64 6f 6e 65 20 62 65 66 6f 72 65 20 74 68 72 65  done before thre
83d0: 61 64 20 72 65 64 69 72 65 63 74 69 6f 6e 2c 20  ad redirection, 
83e0: 62 65 63 61 75 73 65 20 77 65 0a 20 20 20 20 20  because we.     
83f0: 2a 20 61 72 65 20 72 65 61 64 69 6e 67 20 66 72  * are reading fr
8400: 6f 6d 20 61 6e 20 69 74 65 6d 20 77 68 69 63 68  om an item which
8410: 20 69 73 20 72 65 61 64 6f 6e 6c 79 2c 20 69 2e   is readonly, i.
8420: 65 2e 20 77 69 6c 6c 20 6e 65 76 65 72 20 63 68  e. will never ch
8430: 61 6e 67 65 0a 20 20 20 20 20 2a 20 64 75 72 69  ange.     * duri
8440: 6e 67 20 74 68 65 20 6c 69 66 65 74 69 6d 65 20  ng the lifetime 
8450: 6f 66 20 74 68 65 20 63 68 61 6e 6e 65 6c 2e 0a  of the channel..
8460: 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66 20       */..    if 
8470: 28 21 28 72 74 50 74 72 2d 3e 6d 65 74 68 6f 64  (!(rtPtr->method
8480: 73 20 26 20 46 4c 41 47 28 4d 45 54 48 5f 57 52  s & FLAG(METH_WR
8490: 49 54 45 29 29 29 20 7b 0a 09 53 65 74 43 68 61  ITE))) {..SetCha
84a0: 6e 6e 65 6c 45 72 72 6f 72 53 74 72 28 72 74 50  nnelErrorStr(rtP
84b0: 74 72 2d 3e 63 68 61 6e 2c 20 6d 73 67 5f 77 72  tr->chan, msg_wr
84c0: 69 74 65 5f 75 6e 73 75 70 29 3b 0a 09 2a 65 72  ite_unsup);..*er
84d0: 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 49 4e  rorCodePtr = EIN
84e0: 56 41 4c 3b 0a 09 72 65 74 75 72 6e 20 2d 31 3b  VAL;..return -1;
84f0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28  .    }..    if (
8500: 74 6f 57 72 69 74 65 20 3d 3d 20 30 29 20 7b 0a  toWrite == 0) {.
8510: 09 2f 2a 20 4e 6f 74 68 69 6e 67 20 63 61 6d 65  ./* Nothing came
8520: 20 69 6e 20 74 6f 20 77 72 69 74 65 2c 20 69 67   in to write, ig
8530: 6e 6f 72 65 20 74 68 65 20 63 61 6c 6c 0a 09 20  nore the call.. 
8540: 2a 2f 0a 09 72 65 74 75 72 6e 20 30 3b 0a 20 20  */..return 0;.  
8550: 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20    }..    /*.    
8560: 20 2a 20 44 69 73 63 61 72 64 20 70 61 72 74 69   * Discard parti
8570: 61 6c 20 64 61 74 61 20 69 6e 20 74 68 65 20 69  al data in the i
8580: 6e 70 75 74 20 62 75 66 66 65 72 73 2c 20 69 2e  nput buffers, i.
8590: 65 2e 20 6f 6e 20 74 68 65 20 72 65 61 64 20 73  e. on the read s
85a0: 69 64 65 2e 20 4c 69 6b 65 0a 20 20 20 20 20 2a  ide. Like.     *
85b0: 20 77 65 20 64 6f 20 77 68 65 6e 20 65 78 70 6c   we do when expl
85c0: 69 63 69 74 6c 79 20 73 65 65 6b 69 6e 67 20 61  icitly seeking a
85d0: 73 20 77 65 6c 6c 2e 0a 20 20 20 20 20 2a 2f 0a  s well..     */.
85e0: 0a 20 20 20 20 69 66 20 28 28 72 74 50 74 72 2d  .    if ((rtPtr-
85f0: 3e 6d 65 74 68 6f 64 73 20 26 20 46 4c 41 47 28  >methods & FLAG(
8600: 4d 45 54 48 5f 43 4c 45 41 52 29 29 29 20 7b 0a  METH_CLEAR))) {.
8610: 09 54 72 61 6e 73 66 6f 72 6d 43 6c 65 61 72 20  .TransformClear 
8620: 28 72 74 50 74 72 29 3b 0a 20 20 20 20 7d 0a 0a  (rtPtr);.    }..
8630: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 48 61      /*.     * Ha
8640: 6e 64 20 74 68 65 20 64 61 74 61 20 74 6f 20 74  nd the data to t
8650: 68 65 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f  he transformatio
8660: 6e 20 69 74 73 65 6c 66 2e 20 41 6e 79 74 68 69  n itself. Anythi
8670: 6e 67 20 69 74 20 64 65 69 67 6e 65 64 20 74 6f  ng it deigned to
8680: 0a 20 20 20 20 20 2a 20 72 65 74 75 72 6e 20 74  .     * return t
8690: 6f 20 75 73 20 69 73 20 61 20 28 70 61 72 74 69  o us is a (parti
86a0: 61 6c 29 20 74 72 61 6e 73 66 6f 72 6d 61 74 69  al) transformati
86b0: 6f 6e 20 72 65 73 75 6c 74 20 61 6e 64 20 77 72  on result and wr
86c0: 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 20 20 20  itten to the.   
86d0: 20 20 2a 20 70 61 72 65 6e 74 20 63 68 61 6e 6e    * parent chann
86e0: 65 6c 20 66 6f 72 20 66 75 72 74 68 65 72 20 70  el for further p
86f0: 72 6f 63 65 73 73 69 6e 67 2e 0a 20 20 20 20 20  rocessing..     
8700: 2a 2f 0a 0a 20 20 20 20 69 66 20 28 21 54 72 61  */..    if (!Tra
8710: 6e 73 66 6f 72 6d 57 72 69 74 65 20 28 72 74 50  nsformWrite (rtP
8720: 74 72 2c 20 65 72 72 6f 72 43 6f 64 65 50 74 72  tr, errorCodePtr
8730: 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  , (unsigned char
8740: 2a 29 20 62 75 66 2c 20 74 6f 57 72 69 74 65 29  *) buf, toWrite)
8750: 29 20 7b 0a 09 72 65 74 75 72 6e 20 2d 31 3b 0a  ) {..return -1;.
8760: 20 20 20 20 7d 0a 0a 20 20 20 20 2a 65 72 72 6f      }..    *erro
8770: 72 43 6f 64 65 50 74 72 20 3d 20 45 4f 4b 3b 0a  rCodePtr = EOK;.
8780: 20 20 20 20 72 65 74 75 72 6e 20 74 6f 57 72 69      return toWri
8790: 74 65 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d  te;.}.../*. *---
87a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
87b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
87c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
87d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
87e0: 2d 2d 2d 0a 20 2a 0a 20 2a 20 52 65 66 6c 65 63  ---. *. * Reflec
87f0: 74 53 65 65 6b 57 69 64 65 20 2f 20 52 65 66 6c  tSeekWide / Refl
8800: 65 63 74 53 65 65 6b 20 2d 2d 0a 20 2a 0a 20 2a  ectSeek --. *. *
8810: 09 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69  .This function i
8820: 73 20 69 6e 76 6f 6b 65 64 20 77 68 65 6e 20 74  s invoked when t
8830: 68 65 20 75 73 65 72 20 77 69 73 68 65 73 20 74  he user wishes t
8840: 6f 20 73 65 65 6b 20 6f 6e 20 74 68 65 20 63 68  o seek on the ch
8850: 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 20 52 65 73  annel.. *. * Res
8860: 75 6c 74 73 3a 0a 20 2a 09 54 68 65 20 6e 65 77  ults:. *.The new
8870: 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65   location of the
8880: 20 61 63 63 65 73 73 20 70 6f 69 6e 74 2e 0a 20   access point.. 
8890: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
88a0: 73 3a 0a 20 2a 09 41 6c 6c 6f 63 61 74 65 73 20  s:. *.Allocates 
88b0: 6d 65 6d 6f 72 79 2e 20 41 72 62 69 74 72 61 72  memory. Arbitrar
88c0: 79 2c 20 70 65 72 20 74 68 65 20 70 61 72 65 6e  y, per the paren
88d0: 74 20 63 68 61 6e 6e 65 6c 2c 20 61 6e 64 20 74  t channel, and t
88e0: 68 65 20 63 61 6c 6c 65 64 20 73 63 72 69 70 74  he called script
88f0: 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  s.. *. *--------
8900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
8940: 2a 2f 0a 0a 73 74 61 74 69 63 20 54 63 6c 5f 57  */..static Tcl_W
8950: 69 64 65 49 6e 74 0a 52 65 66 6c 65 63 74 53 65  ideInt.ReflectSe
8960: 65 6b 57 69 64 65 28 0a 20 20 20 20 43 6c 69 65  ekWide(.    Clie
8970: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
8980: 61 2c 0a 20 20 20 20 54 63 6c 5f 57 69 64 65 49  a,.    Tcl_WideI
8990: 6e 74 20 6f 66 66 73 65 74 2c 0a 20 20 20 20 69  nt offset,.    i
89a0: 6e 74 20 73 65 65 6b 4d 6f 64 65 2c 0a 20 20 20  nt seekMode,.   
89b0: 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65 50   int *errorCodeP
89c0: 74 72 29 0a 7b 0a 20 20 20 20 52 65 66 6c 65 63  tr).{.    Reflec
89d0: 74 65 64 54 72 61 6e 73 66 6f 72 6d 20 2a 72 74  tedTransform *rt
89e0: 50 74 72 20 3d 20 28 52 65 66 6c 65 63 74 65 64  Ptr = (Reflected
89f0: 54 72 61 6e 73 66 6f 72 6d 20 2a 29 20 63 6c 69  Transform *) cli
8a00: 65 6e 74 44 61 74 61 3b 0a 20 20 20 20 43 68 61  entData;.    Cha
8a10: 6e 6e 65 6c 2a 20 70 61 72 65 6e 74 20 3d 20 28  nnel* parent = (
8a20: 43 68 61 6e 6e 65 6c 2a 29 20 72 74 50 74 72 2d  Channel*) rtPtr-
8a30: 3e 70 61 72 65 6e 74 3b 0a 20 20 20 20 54 63 6c  >parent;.    Tcl
8a40: 5f 57 69 64 65 49 6e 74 20 63 75 72 50 6f 73 3b  _WideInt curPos;
8a50: 09 09 2f 2a 20 50 6f 73 69 74 69 6f 6e 20 6f 6e  ../* Position on
8a60: 20 74 68 65 20 64 65 76 69 63 65 2e 20 2a 2f 0a   the device. */.
8a70: 0a 20 20 20 20 54 63 6c 5f 44 72 69 76 65 72 53  .    Tcl_DriverS
8a80: 65 65 6b 50 72 6f 63 20 2a 73 65 65 6b 50 72 6f  eekProc *seekPro
8a90: 63 20 20 20 20 20 20 3d 0a 09 54 63 6c 5f 43 68  c      =..Tcl_Ch
8aa0: 61 6e 6e 65 6c 53 65 65 6b 50 72 6f 63 28 54 63  annelSeekProc(Tc
8ab0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65  l_GetChannelType
8ac0: 20 28 72 74 50 74 72 2d 3e 70 61 72 65 6e 74 29   (rtPtr->parent)
8ad0: 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20  );..    /*.     
8ae0: 2a 20 46 61 69 6c 20 69 66 20 74 68 65 20 70 61  * Fail if the pa
8af0: 72 65 6e 74 20 63 68 61 6e 6e 65 6c 20 69 73 20  rent channel is 
8b00: 6e 6f 74 20 73 65 65 6b 61 62 6c 65 2e 0a 20 20  not seekable..  
8b10: 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28 73     */..    if (s
8b20: 65 65 6b 50 72 6f 63 20 3d 3d 20 4e 55 4c 4c 29  eekProc == NULL)
8b30: 20 7b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6e 6f   {..Tcl_SetErrno
8b40: 28 45 49 4e 56 41 4c 29 3b 0a 09 72 65 74 75 72  (EINVAL);..retur
8b50: 6e 20 54 63 6c 5f 4c 6f 6e 67 41 73 57 69 64 65  n Tcl_LongAsWide
8b60: 28 2d 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  (-1);.    }..   
8b70: 20 2f 2a 0a 20 20 20 20 20 2a 20 43 68 65 63 6b   /*.     * Check
8b80: 20 69 66 20 77 65 20 63 61 6e 20 6c 65 61 76 65   if we can leave
8b90: 20 6f 75 74 20 69 6e 76 6f 6c 76 69 6e 67 20 74   out involving t
8ba0: 68 65 20 54 63 6c 20 6c 65 76 65 6c 2c 20 69 2e  he Tcl level, i.
8bb0: 65 2e 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f  e. transformatio
8bc0: 6e 0a 20 20 20 20 20 2a 20 68 61 6e 64 6c 65 72  n.     * handler
8bd0: 2e 20 54 68 69 73 20 69 73 20 74 72 75 65 20 66  . This is true f
8be0: 6f 72 20 74 65 6c 6c 20 72 65 71 75 65 73 74 73  or tell requests
8bf0: 2c 20 61 6e 64 20 74 72 61 6e 73 66 6f 72 6d 61  , and transforma
8c00: 74 69 6f 6e 73 20 77 68 69 63 68 0a 20 20 20 20  tions which.    
8c10: 20 2a 20 73 75 70 70 6f 72 74 20 6e 65 69 74 68   * support neith
8c20: 65 72 20 66 6c 75 73 68 2c 20 6e 6f 72 20 64 72  er flush, nor dr
8c30: 61 69 6e 2e 20 46 6f 72 20 74 68 65 73 65 20 63  ain. For these c
8c40: 61 73 65 73 20 77 65 20 63 61 6e 20 70 61 73 73  ases we can pass
8c50: 20 74 68 65 0a 20 20 20 20 20 2a 20 72 65 71 75   the.     * requ
8c60: 65 73 74 20 64 6f 77 6e 20 61 6e 64 20 74 68 65  est down and the
8c70: 20 72 65 73 75 6c 74 20 62 61 63 6b 20 75 70 20   result back up 
8c80: 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20 20 20 20  unchanged..     
8c90: 2a 2f 0a 0a 20 20 20 20 69 66 20 28 0a 09 28 28  */..    if (..((
8ca0: 73 65 65 6b 4d 6f 64 65 20 21 3d 20 53 45 45 4b  seekMode != SEEK
8cb0: 5f 43 55 52 29 20 7c 7c 20 28 6f 66 66 73 65 74  _CUR) || (offset
8cc0: 20 21 3d 20 30 29 29 20 26 26 0a 09 28 48 41 53   != 0)) &&..(HAS
8cd0: 28 72 74 50 74 72 2d 3e 6d 65 74 68 6f 64 73 2c  (rtPtr->methods,
8ce0: 20 4d 45 54 48 5f 43 4c 45 41 52 29 20 7c 7c 0a   METH_CLEAR) ||.
8cf0: 09 20 48 41 53 28 72 74 50 74 72 2d 3e 6d 65 74  . HAS(rtPtr->met
8d00: 68 6f 64 73 2c 20 4d 45 54 48 5f 46 4c 55 53 48  hods, METH_FLUSH
8d10: 29 29 0a 09 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20  ))..) {../*.. * 
8d20: 4e 65 69 74 68 65 72 20 61 20 74 65 6c 6c 20 72  Neither a tell r
8d30: 65 71 75 65 73 74 2c 20 6e 6f 72 20 63 6c 65 61  equest, nor clea
8d40: 72 2f 66 6c 75 73 68 20 62 6f 74 68 20 6e 6f 74  r/flush both not
8d50: 20 73 75 70 70 6f 72 74 65 64 2e 20 20 57 65 0a   supported.  We.
8d60: 09 20 2a 20 68 61 76 65 20 74 6f 20 67 6f 20 74  . * have to go t
8d70: 68 72 6f 75 67 68 20 74 68 65 20 54 63 6c 20 6c  hrough the Tcl l
8d80: 65 76 65 6c 20 74 6f 20 63 6c 65 61 72 20 61 6e  evel to clear an
8d90: 64 2f 6f 72 20 66 6c 75 73 68 20 74 68 65 0a 09  d/or flush the..
8da0: 20 2a 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f   * transformatio
8db0: 6e 2e 0a 09 20 2a 2f 0a 0a 09 69 66 20 28 28 72  n... */...if ((r
8dc0: 74 50 74 72 2d 3e 6d 65 74 68 6f 64 73 20 26 20  tPtr->methods & 
8dd0: 46 4c 41 47 28 4d 45 54 48 5f 43 4c 45 41 52 29  FLAG(METH_CLEAR)
8de0: 29 29 20 7b 0a 09 20 20 20 20 54 72 61 6e 73 66  )) {..    Transf
8df0: 6f 72 6d 43 6c 65 61 72 20 28 72 74 50 74 72 29  ormClear (rtPtr)
8e00: 3b 0a 09 7d 0a 0a 09 69 66 20 28 48 41 53 28 72  ;..}...if (HAS(r
8e10: 74 50 74 72 2d 3e 6d 65 74 68 6f 64 73 2c 20 4d  tPtr->methods, M
8e20: 45 54 48 5f 46 4c 55 53 48 29 29 20 7b 0a 09 20  ETH_FLUSH)) {.. 
8e30: 20 20 20 69 66 20 28 21 54 72 61 6e 73 66 6f 72     if (!Transfor
8e40: 6d 46 6c 75 73 68 20 28 72 74 50 74 72 2c 20 65  mFlush (rtPtr, e
8e50: 72 72 6f 72 43 6f 64 65 50 74 72 29 29 20 7b 0a  rrorCodePtr)) {.
8e60: 09 09 72 65 74 75 72 6e 20 2d 31 3b 0a 09 20 20  ..return -1;..  
8e70: 20 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20    }..}.    }..  
8e80: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 4e 6f 77 20    /*.     * Now 
8e90: 73 65 65 6b 20 74 6f 20 74 68 65 20 6e 65 77 20  seek to the new 
8ea0: 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68 65 20  position in the 
8eb0: 63 68 61 6e 6e 65 6c 20 61 73 20 72 65 71 75 65  channel as reque
8ec0: 73 74 65 64 20 62 79 20 74 68 65 0a 20 20 20 20  sted by the.    
8ed0: 20 2a 20 63 61 6c 6c 65 72 2e 20 4e 6f 74 65 20   * caller. Note 
8ee0: 74 68 61 74 20 77 65 20 70 72 65 66 65 72 20 74  that we prefer t
8ef0: 68 65 20 77 69 64 65 53 65 65 6b 50 72 6f 63 20  he wideSeekProc 
8f00: 69 66 20 74 68 61 74 20 69 73 20 61 76 61 69 6c  if that is avail
8f10: 61 62 6c 65 20 61 6e 64 0a 20 20 20 20 20 2a 20  able and.     * 
8f20: 6e 6f 6e 2d 4e 55 4c 4c 2e 2e 2e 0a 20 20 20 20  non-NULL....    
8f30: 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28 48 61 76   */..    if (Hav
8f40: 65 56 65 72 73 69 6f 6e 28 70 61 72 65 6e 74 2d  eVersion(parent-
8f50: 3e 74 79 70 65 50 74 72 2c 20 54 43 4c 5f 43 48  >typePtr, TCL_CH
8f60: 41 4e 4e 45 4c 5f 56 45 52 53 49 4f 4e 5f 33 29  ANNEL_VERSION_3)
8f70: 20 26 26 0a 09 70 61 72 65 6e 74 2d 3e 74 79 70   &&..parent->typ
8f80: 65 50 74 72 2d 3e 77 69 64 65 53 65 65 6b 50 72  ePtr->wideSeekPr
8f90: 6f 63 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63  oc != NULL) {..c
8fa0: 75 72 50 6f 73 20 3d 20 28 70 61 72 65 6e 74 2d  urPos = (parent-
8fb0: 3e 74 79 70 65 50 74 72 2d 3e 77 69 64 65 53 65  >typePtr->wideSe
8fc0: 65 6b 50 72 6f 63 29 20 28 70 61 72 65 6e 74 2d  ekProc) (parent-
8fd0: 3e 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 0a 09  >instanceData,..
8fe0: 09 09 09 09 09 20 20 6f 66 66 73 65 74 2c 20 73  .....  offset, s
8ff0: 65 65 6b 4d 6f 64 65 2c 20 65 72 72 6f 72 43 6f  eekMode, errorCo
9000: 64 65 50 74 72 29 3b 0a 20 20 20 20 7d 20 65 6c  dePtr);.    } el
9010: 73 65 20 69 66 20 28 6f 66 66 73 65 74 20 3c 20  se if (offset < 
9020: 54 63 6c 5f 4c 6f 6e 67 41 73 57 69 64 65 28 4c  Tcl_LongAsWide(L
9030: 4f 4e 47 5f 4d 49 4e 29 20 7c 7c 0a 09 20 20 20  ONG_MIN) ||..   
9040: 20 20 20 20 6f 66 66 73 65 74 20 3e 20 54 63 6c      offset > Tcl
9050: 5f 4c 6f 6e 67 41 73 57 69 64 65 28 4c 4f 4e 47  _LongAsWide(LONG
9060: 5f 4d 41 58 29 29 20 7b 0a 09 2a 65 72 72 6f 72  _MAX)) {..*error
9070: 43 6f 64 65 50 74 72 20 3d 20 45 4f 56 45 52 46  CodePtr = EOVERF
9080: 4c 4f 57 3b 0a 09 63 75 72 50 6f 73 20 3d 20 54  LOW;..curPos = T
9090: 63 6c 5f 4c 6f 6e 67 41 73 57 69 64 65 28 2d 31  cl_LongAsWide(-1
90a0: 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  );.    } else {.
90b0: 09 63 75 72 50 6f 73 20 3d 20 54 63 6c 5f 4c 6f  .curPos = Tcl_Lo
90c0: 6e 67 41 73 57 69 64 65 28 28 70 61 72 65 6e 74  ngAsWide((parent
90d0: 2d 3e 74 79 70 65 50 74 72 2d 3e 73 65 65 6b 50  ->typePtr->seekP
90e0: 72 6f 63 29 20 28 0a 09 09 09 09 09 09 09 20 20  roc) (........  
90f0: 20 20 20 70 61 72 65 6e 74 2d 3e 69 6e 73 74 61     parent->insta
9100: 6e 63 65 44 61 74 61 2c 20 54 63 6c 5f 57 69 64  nceData, Tcl_Wid
9110: 65 41 73 4c 6f 6e 67 28 6f 66 66 73 65 74 29 2c  eAsLong(offset),
9120: 20 73 65 65 6b 4d 6f 64 65 2c 0a 09 09 09 09 09   seekMode,......
9130: 09 09 20 20 20 20 20 65 72 72 6f 72 43 6f 64 65  ..     errorCode
9140: 50 74 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Ptr));.    }.   
9150: 20 69 66 20 28 63 75 72 50 6f 73 20 3d 3d 20 54   if (curPos == T
9160: 63 6c 5f 4c 6f 6e 67 41 73 57 69 64 65 28 2d 31  cl_LongAsWide(-1
9170: 29 29 20 7b 0a 09 54 63 6c 5f 53 65 74 45 72 72  )) {..Tcl_SetErr
9180: 6e 6f 28 2a 65 72 72 6f 72 43 6f 64 65 50 74 72  no(*errorCodePtr
9190: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2a 65  );.    }..    *e
91a0: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 4f  rrorCodePtr = EO
91b0: 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 63 75  K;.    return cu
91c0: 72 50 6f 73 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  rPos;.}..static 
91d0: 69 6e 74 0a 52 65 66 6c 65 63 74 53 65 65 6b 28  int.ReflectSeek(
91e0: 0a 20 20 20 20 43 6c 69 65 6e 74 44 61 74 61 20  .    ClientData 
91f0: 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 20 20  clientData,.    
9200: 6c 6f 6e 67 20 6f 66 66 73 65 74 2c 0a 20 20 20  long offset,.   
9210: 20 69 6e 74 20 73 65 65 6b 4d 6f 64 65 2c 0a 20   int seekMode,. 
9220: 20 20 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64     int *errorCod
9230: 65 50 74 72 29 0a 7b 0a 20 20 20 20 2f 2a 0a 20  ePtr).{.    /*. 
9240: 20 20 20 20 2a 20 54 68 69 73 20 66 75 6e 63 74      * This funct
9250: 69 6f 6e 20 63 61 6e 20 62 65 20 69 6e 76 6f 6b  ion can be invok
9260: 65 64 20 66 72 6f 6d 20 61 20 74 72 61 6e 73 66  ed from a transf
9270: 6f 72 6d 61 74 69 6f 6e 20 77 68 69 63 68 20 69  ormation which i
9280: 73 20 62 61 73 65 64 20 6f 6e 0a 20 20 20 20 20  s based on.     
9290: 2a 20 73 74 61 6e 64 61 72 64 20 73 65 65 6b 69  * standard seeki
92a0: 6e 67 2c 20 69 2e 65 2e 20 6e 6f 6e 2d 77 69 64  ng, i.e. non-wid
92b0: 65 2e 20 42 65 63 61 75 73 65 20 6f 66 20 74 68  e. Because of th
92c0: 69 73 20 77 65 20 68 61 76 65 20 74 6f 20 69 6d  is we have to im
92d0: 70 6c 65 6d 65 6e 74 0a 20 20 20 20 20 2a 20 69  plement.     * i
92e0: 74 2c 20 61 20 64 75 6d 6d 79 20 69 73 20 6e 6f  t, a dummy is no
92f0: 74 20 65 6e 6f 75 67 68 2e 20 57 65 20 73 69 6d  t enough. We sim
9300: 70 6c 79 20 64 65 6c 65 67 61 74 65 20 74 68 65  ply delegate the
9310: 20 63 61 6c 6c 20 74 6f 20 74 68 65 20 77 69 64   call to the wid
9320: 65 0a 20 20 20 20 20 2a 20 72 6f 75 74 69 6e 65  e.     * routine
9330: 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 72  ..     */..    r
9340: 65 74 75 72 6e 20 28 69 6e 74 29 20 52 65 66 6c  eturn (int) Refl
9350: 65 63 74 53 65 65 6b 57 69 64 65 28 63 6c 69 65  ectSeekWide(clie
9360: 6e 74 44 61 74 61 2c 20 54 63 6c 5f 4c 6f 6e 67  ntData, Tcl_Long
9370: 41 73 57 69 64 65 28 6f 66 66 73 65 74 29 2c 20  AsWide(offset), 
9380: 73 65 65 6b 4d 6f 64 65 2c 0a 09 20 20 20 20 65  seekMode,..    e
9390: 72 72 6f 72 43 6f 64 65 50 74 72 29 3b 0a 7d 0a  rrorCodePtr);.}.
93a0: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
93b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
93c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
93d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
93e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
93f0: 0a 20 2a 20 52 65 66 6c 65 63 74 57 61 74 63 68  . * ReflectWatch
9400: 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 66   --. *. *.This f
9410: 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b  unction is invok
9420: 65 64 20 74 6f 20 74 65 6c 6c 20 74 68 65 20 63  ed to tell the c
9430: 68 61 6e 6e 65 6c 20 77 68 61 74 20 65 76 65 6e  hannel what even
9440: 74 73 20 74 68 65 20 49 2f 4f 0a 20 2a 09 73 79  ts the I/O. *.sy
9450: 73 74 65 6d 20 69 73 20 69 6e 74 65 72 65 73 74  stem is interest
9460: 65 64 20 69 6e 2e 0a 20 2a 0a 20 2a 20 52 65 73  ed in.. *. * Res
9470: 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20  ults:. *.None.. 
9480: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
9490: 73 3a 0a 20 2a 09 41 6c 6c 6f 63 61 74 65 73 20  s:. *.Allocates 
94a0: 6d 65 6d 6f 72 79 2e 20 41 72 62 69 74 72 61 72  memory. Arbitrar
94b0: 79 2c 20 61 73 20 69 74 20 63 61 6c 6c 73 20 75  y, as it calls u
94c0: 70 6f 6e 20 61 20 73 63 72 69 70 74 2e 0a 20 2a  pon a script.. *
94d0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
94e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
94f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73  ---------. */..s
9520: 74 61 74 69 63 20 76 6f 69 64 0a 52 65 66 6c 65  tatic void.Refle
9530: 63 74 57 61 74 63 68 28 0a 20 20 20 20 43 6c 69  ctWatch(.    Cli
9540: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
9550: 74 61 2c 0a 20 20 20 20 69 6e 74 20 6d 61 73 6b  ta,.    int mask
9560: 29 0a 7b 0a 20 20 20 20 52 65 66 6c 65 63 74 65  ).{.    Reflecte
9570: 64 54 72 61 6e 73 66 6f 72 6d 20 2a 72 74 50 74  dTransform *rtPt
9580: 72 20 3d 20 28 52 65 66 6c 65 63 74 65 64 54 72  r = (ReflectedTr
9590: 61 6e 73 66 6f 72 6d 20 2a 29 20 63 6c 69 65 6e  ansform *) clien
95a0: 74 44 61 74 61 3b 0a 20 20 20 20 54 63 6c 5f 44  tData;.    Tcl_D
95b0: 72 69 76 65 72 57 61 74 63 68 50 72 6f 63 2a 20  riverWatchProc* 
95c0: 77 61 74 63 68 50 72 6f 63 3b 0a 0a 20 20 20 20  watchProc;..    
95d0: 2f 2a 20 41 53 53 45 52 54 20 72 74 50 74 72 2d  /* ASSERT rtPtr-
95e0: 3e 6d 65 74 68 6f 64 73 20 26 20 46 4c 41 47 28  >methods & FLAG(
95f0: 4d 45 54 48 5f 57 41 54 43 48 29 20 2a 2f 0a 0a  METH_WATCH) */..
9600: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 57 65      /*.     * We
9610: 20 72 65 73 74 72 69 63 74 20 74 68 65 20 69 6e   restrict the in
9620: 74 65 72 65 73 74 20 74 6f 20 77 68 61 74 20 74  terest to what t
9630: 68 65 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f  he transformatio
9640: 6e 20 63 61 6e 20 73 75 70 70 6f 72 74 2e 20 49  n can support. I
9650: 4f 57 0a 20 20 20 20 20 2a 20 74 68 65 72 65 20  OW.     * there 
9660: 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 77 72  will never be wr
9670: 69 74 65 20 65 76 65 6e 74 73 20 66 6f 72 20 61  ite events for a
9680: 20 63 68 61 6e 6e 65 6c 20 77 68 69 63 68 20 69   channel which i
9690: 73 20 6e 6f 74 20 77 72 69 74 61 62 6c 65 2e 0a  s not writable..
96a0: 20 20 20 20 20 2a 20 41 6e 61 6c 6f 67 75 6f 75       * Analoguou
96b0: 73 6c 79 20 66 6f 72 20 72 65 61 64 20 65 76 65  sly for read eve
96c0: 6e 74 73 20 61 6e 64 20 6e 6f 6e 2d 72 65 61 64  nts and non-read
96d0: 61 62 6c 65 20 63 68 61 6e 6e 65 6c 73 2e 0a 20  able channels.. 
96e0: 20 20 20 20 2a 2f 0a 0a 20 20 20 20 6d 61 73 6b      */..    mask
96f0: 20 26 3d 20 72 74 50 74 72 2d 3e 6d 6f 64 65 3b   &= rtPtr->mode;
9700: 0a 0a 20 20 20 20 69 66 20 28 6d 61 73 6b 20 3d  ..    if (mask =
9710: 3d 20 72 74 50 74 72 2d 3e 69 6e 74 65 72 65 73  = rtPtr->interes
9720: 74 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 53 61 6d  t) {../*.. * Sam
9730: 65 20 6f 6c 64 2c 20 73 61 6d 65 20 6f 6c 64 2c  e old, same old,
9740: 20 77 68 79 20 73 68 6f 75 6c 64 20 77 65 20 64   why should we d
9750: 6f 20 73 6f 6d 65 74 68 69 6e 67 3f 0a 09 20 2a  o something?.. *
9760: 2f 0a 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20 20  /...return;.    
9770: 7d 0a 0a 20 20 20 20 72 74 50 74 72 2d 3e 69 6e  }..    rtPtr->in
9780: 74 65 72 65 73 74 20 3d 20 6d 61 73 6b 3b 0a 0a  terest = mask;..
9790: 20 20 20 20 2f 2a 20 57 65 20 77 69 6c 6c 20 62      /* We will b
97a0: 65 20 6e 6f 74 69 66 69 65 64 20 61 75 74 6f 6d  e notified autom
97b0: 61 74 69 63 61 6c 6c 79 20 61 62 6f 75 74 20 65  atically about e
97c0: 76 65 6e 74 73 20 6f 6e 20 74 68 65 20 63 68 61  vents on the cha
97d0: 6e 6e 65 6c 20 62 65 6c 6f 77 20 76 69 61 0a 20  nnel below via. 
97e0: 20 20 20 20 2a 20 61 20 63 61 6c 6c 20 74 6f 20      * a call to 
97f0: 27 52 65 66 6c 65 63 74 4e 6f 74 69 66 79 27 2e  'ReflectNotify'.
9800: 20 46 6f 72 20 74 68 69 73 20 74 6f 20 77 6f 72   For this to wor
9810: 6b 20 77 65 20 68 61 76 65 20 74 6f 20 70 61 73  k we have to pas
9820: 73 20 74 68 65 0a 20 20 20 20 20 2a 20 69 6e 74  s the.     * int
9830: 65 72 65 73 74 20 74 6f 20 74 68 65 20 70 61 72  erest to the par
9840: 65 6e 74 2c 20 70 6f 73 73 69 62 6c 79 20 77 69  ent, possibly wi
9850: 74 68 20 6d 6f 72 65 20 65 76 65 6e 74 73 20 61  th more events a
9860: 64 64 65 64 20 69 6e 20 62 79 20 74 68 65 0a 20  dded in by the. 
9870: 20 20 20 20 2a 20 74 72 61 6e 73 66 6f 72 6d 61      * transforma
9880: 74 69 6f 6e 20 28 2d 2d 3e 20 54 72 61 6e 73 66  tion (--> Transf
9890: 6f 72 6d 4d 61 73 6b 29 2e 0a 20 20 20 20 20 2a  ormMask)..     *
98a0: 2f 0a 0a 20 20 20 20 77 61 74 63 68 50 72 6f 63  /..    watchProc
98b0: 20 3d 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 57 61   = Tcl_ChannelWa
98c0: 74 63 68 50 72 6f 63 20 28 54 63 6c 5f 47 65 74  tchProc (Tcl_Get
98d0: 43 68 61 6e 6e 65 6c 54 79 70 65 20 28 72 74 50  ChannelType (rtP
98e0: 74 72 2d 3e 70 61 72 65 6e 74 29 29 3b 0a 20 20  tr->parent));.  
98f0: 20 20 28 2a 77 61 74 63 68 50 72 6f 63 29 20 28    (*watchProc) (
9900: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e  Tcl_GetChannelIn
9910: 73 74 61 6e 63 65 44 61 74 61 28 72 74 50 74 72  stanceData(rtPtr
9920: 2d 3e 70 61 72 65 6e 74 29 2c 0a 09 09 20 20 6d  ->parent),...  m
9930: 61 73 6b 20 7c 20 54 72 61 6e 73 66 6f 72 6d 4d  ask | TransformM
9940: 61 73 6b 20 28 72 74 50 74 72 29 29 3b 0a 0a 20  ask (rtPtr));.. 
9950: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 4d 61 6e     /*.     * Man
9960: 61 67 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 69  agement of the i
9970: 6e 74 65 72 6e 61 6c 20 74 69 6d 65 72 2e 0a 20  nternal timer.. 
9980: 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28      */..    if (
9990: 21 28 6d 61 73 6b 20 26 20 54 43 4c 5f 52 45 41  !(mask & TCL_REA
99a0: 44 41 42 4c 45 29 20 7c 7c 20 28 52 65 73 75 6c  DABLE) || (Resul
99b0: 74 4c 65 6e 67 74 68 28 26 72 74 50 74 72 2d 3e  tLength(&rtPtr->
99c0: 72 65 73 75 6c 74 29 20 3d 3d 20 30 29 29 20 7b  result) == 0)) {
99d0: 0a 09 2f 2a 0a 09 20 2a 20 41 20 70 65 6e 64 69  ../*.. * A pendi
99e0: 6e 67 20 74 69 6d 65 72 20 6d 61 79 20 65 78 69  ng timer may exi
99f0: 73 74 2c 20 62 75 74 20 65 69 74 68 65 72 20 69  st, but either i
9a00: 73 20 74 68 65 72 65 20 6e 6f 20 28 6d 6f 72 65  s there no (more
9a10: 29 20 69 6e 74 65 72 65 73 74 0a 09 20 2a 20 69  ) interest.. * i
9a20: 6e 20 74 68 65 20 65 76 65 6e 74 73 20 69 74 20  n the events it 
9a30: 67 65 6e 65 72 61 74 65 73 20 6f 72 20 6e 6f 74  generates or not
9a40: 68 69 6e 67 20 69 73 20 61 76 61 69 6c 61 62 6c  hing is availabl
9a50: 65 20 66 6f 72 0a 09 20 2a 20 72 65 61 64 69 6e  e for.. * readin
9a60: 67 2e 20 52 65 6d 6f 76 65 20 69 74 2c 20 69 66  g. Remove it, if
9a70: 20 65 78 69 73 74 69 6e 67 2e 0a 09 20 2a 2f 0a   existing... */.
9a80: 0a 09 54 69 6d 65 72 4b 69 6c 6c 20 28 72 74 50  ..TimerKill (rtP
9a90: 74 72 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  tr);.    } else 
9aa0: 7b 0a 09 2f 2a 0a 09 20 2a 20 54 68 65 72 65 20  {../*.. * There 
9ab0: 6d 69 67 68 74 20 62 65 20 6e 6f 20 70 65 6e 64  might be no pend
9ac0: 69 6e 67 20 74 69 6d 65 72 2c 20 62 75 74 20 74  ing timer, but t
9ad0: 68 65 72 65 20 69 73 20 69 6e 74 65 72 65 73 74  here is interest
9ae0: 20 69 6e 20 72 65 61 64 61 62 6c 65 0a 09 20 2a   in readable.. *
9af0: 20 65 76 65 6e 74 73 20 61 6e 64 20 77 65 20 61   events and we a
9b00: 63 74 75 61 6c 6c 79 20 68 61 76 65 20 64 61 74  ctually have dat
9b10: 61 20 77 61 69 74 69 6e 67 2c 20 73 6f 20 67 65  a waiting, so ge
9b20: 6e 65 72 61 74 65 20 61 20 74 69 6d 65 72 20 74  nerate a timer t
9b30: 6f 0a 09 20 2a 20 66 6c 75 73 68 20 74 68 61 74  o.. * flush that
9b40: 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20   if it does not 
9b50: 65 78 69 73 74 2e 0a 09 20 2a 2f 0a 0a 09 54 69  exist... */...Ti
9b60: 6d 65 72 53 65 74 75 70 20 28 72 74 50 74 72 29  merSetup (rtPtr)
9b70: 3b 0a 20 20 20 20 7d 0a 7d 0a 0a 73 74 61 74 69  ;.    }.}..stati
9b80: 63 20 69 6e 74 0a 54 72 61 6e 73 66 6f 72 6d 4d  c int.TransformM
9b90: 61 73 6b 20 28 52 65 66 6c 65 63 74 65 64 54 72  ask (ReflectedTr
9ba0: 61 6e 73 66 6f 72 6d 2a 20 72 74 50 74 72 29 0a  ansform* rtPtr).
9bb0: 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 72  {.    Tcl_Obj *r
9bc0: 65 73 4f 62 6a 3b 0a 20 20 20 20 69 6e 74 20 6d  esObj;.    int m
9bd0: 61 73 6b 3b 0a 0a 20 20 20 20 2f 2a 20 57 65 20  ask;..    /* We 
9be0: 61 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 61  are allowed to a
9bf0: 64 64 20 61 64 64 69 74 69 6f 6e 61 6c 20 65 76  dd additional ev
9c00: 65 6e 74 73 20 6f 66 20 69 6e 74 65 72 65 73 74  ents of interest
9c10: 20 74 6f 20 61 20 77 61 74 63 68 20 6d 61 73 6b   to a watch mask
9c20: 20 69 66 0a 20 20 20 20 20 2a 20 77 65 20 77 61   if.     * we wa
9c30: 6e 74 20 74 6f 2c 20 69 66 20 74 68 65 20 74 72  nt to, if the tr
9c40: 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 6e 65 65  ansformation nee
9c50: 64 73 20 74 68 65 6d 2e 20 46 6f 72 20 74 68 69  ds them. For thi
9c60: 73 20 77 65 20 68 61 76 65 20 74 6f 20 61 73 6b  s we have to ask
9c70: 0a 20 20 20 20 20 2a 20 69 74 2c 20 77 69 74 68  .     * it, with
9c80: 20 61 6c 6c 20 74 68 61 74 20 65 6e 74 61 69 6c   all that entail
9c90: 73 20 28 74 68 72 65 61 64 20 66 6f 72 77 61 72  s (thread forwar
9ca0: 64 69 6e 67 29 2e 0a 20 20 20 20 20 2a 2f 0a 0a  ding)..     */..
9cb0: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 41 72      /*.     * Ar
9cc0: 65 20 77 65 20 69 6e 20 74 68 65 20 63 6f 72 72  e we in the corr
9cd0: 65 63 74 20 74 68 72 65 61 64 3f 0a 20 20 20 20  ect thread?.    
9ce0: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 54 43 4c 5f   */..#ifdef TCL_
9cf0: 54 48 52 45 41 44 53 0a 20 20 20 20 69 66 20 28  THREADS.    if (
9d00: 72 74 50 74 72 2d 3e 74 68 72 65 61 64 20 21 3d  rtPtr->thread !=
9d10: 20 54 63 6c 5f 47 65 74 43 75 72 72 65 6e 74 54   Tcl_GetCurrentT
9d20: 68 72 65 61 64 28 29 29 20 7b 0a 09 46 6f 72 77  hread()) {..Forw
9d30: 61 72 64 50 61 72 61 6d 20 70 3b 0a 0a 09 46 6f  ardParam p;...Fo
9d40: 72 77 61 72 64 4f 70 54 6f 4f 77 6e 65 72 54 68  rwardOpToOwnerTh
9d50: 72 65 61 64 28 72 74 50 74 72 2c 20 46 6f 72 77  read(rtPtr, Forw
9d60: 61 72 64 65 64 57 61 74 63 68 2c 20 26 70 29 3b  ardedWatch, &p);
9d70: 0a 0a 09 72 65 74 75 72 6e 20 70 2e 6d 61 73 6b  ...return p.mask
9d80: 2e 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  .mask;.    }.#en
9d90: 64 69 66 0a 0a 20 20 20 20 69 66 20 28 49 6e 76  dif..    if (Inv
9da0: 6f 6b 65 54 63 6c 4d 65 74 68 6f 64 28 72 74 50  okeTclMethod(rtP
9db0: 74 72 2c 20 22 77 61 74 63 68 22 2c 20 4e 55 4c  tr, "watch", NUL
9dc0: 4c 2c 20 4e 55 4c 4c 2c 20 26 72 65 73 4f 62 6a  L, NULL, &resObj
9dd0: 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09  ) != TCL_OK) {..
9de0: 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 45 72  Tcl_SetChannelEr
9df0: 72 6f 72 28 72 74 50 74 72 2d 3e 63 68 61 6e 2c  ror(rtPtr->chan,
9e00: 20 72 65 73 4f 62 6a 29 3b 0a 09 54 63 6c 5f 44   resObj);..Tcl_D
9e10: 65 63 72 52 65 66 43 6f 75 6e 74 28 72 65 73 4f  ecrRefCount(resO
9e20: 62 6a 29 3b 09 2f 2a 20 52 65 6d 6f 76 65 20 72  bj);./* Remove r
9e30: 65 66 65 72 65 6e 63 65 20 68 65 6c 64 20 66 72  eference held fr
9e40: 6f 6d 20 69 6e 76 6f 6b 65 20 2a 2f 0a 09 72 65  om invoke */..re
9e50: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a 20  turn 0;.    }.. 
9e60: 20 20 20 69 66 20 28 45 6e 63 6f 64 65 45 76 65     if (EncodeEve
9e70: 6e 74 4d 61 73 6b 28 72 74 50 74 72 2d 3e 69 6e  ntMask(rtPtr->in
9e80: 74 65 72 70 2c 20 22 6d 61 73 6b 22 2c 20 72 65  terp, "mask", re
9e90: 73 4f 62 6a 2c 20 26 6d 61 73 6b 29 20 21 3d 20  sObj, &mask) != 
9ea0: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 54 63 6c 5f 53  TCL_OK) {..Tcl_S
9eb0: 65 74 43 68 61 6e 6e 65 6c 45 72 72 6f 72 20 28  etChannelError (
9ec0: 72 74 50 74 72 2d 3e 63 68 61 6e 2c 20 54 63 6c  rtPtr->chan, Tcl
9ed0: 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 72 74  _GetObjResult(rt
9ee0: 50 74 72 2d 3e 69 6e 74 65 72 70 29 29 3b 0a 09  Ptr->interp));..
9ef0: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
9f00: 28 72 65 73 4f 62 6a 29 3b 0a 09 72 65 74 75 72  (resObj);..retur
9f10: 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  n 0;.    }..    
9f20: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
9f30: 28 72 65 73 4f 62 6a 29 3b 0a 20 20 20 20 72 65  (resObj);.    re
9f40: 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 0c 0a 2f  turn mask;.}.../
9f50: 2a 0a 20 2a 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 2d 2d 2d  ----------------
9f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
9fa0: 20 52 65 66 6c 65 63 74 42 6c 6f 63 6b 20 2d 2d   ReflectBlock --
9fb0: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 66 75 6e 63  . *. *.This func
9fc0: 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20  tion is invoked 
9fd0: 74 6f 20 74 65 6c 6c 20 74 68 65 20 63 68 61 6e  to tell the chan
9fe0: 6e 65 6c 20 77 68 69 63 68 20 62 6c 6f 63 6b 69  nel which blocki
9ff0: 6e 67 20 62 65 68 61 76 69 6f 75 72 0a 20 2a 09  ng behaviour. *.
a000: 69 73 20 72 65 71 75 69 72 65 64 20 6f 66 20 69  is required of i
a010: 74 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  t.. *. * Results
a020: 3a 0a 20 2a 09 41 20 70 6f 73 69 78 20 65 72 72  :. *.A posix err
a030: 6f 72 20 6e 75 6d 62 65 72 2e 0a 20 2a 0a 20 2a  or number.. *. *
a040: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
a050: 2a 09 41 6c 6c 6f 63 61 74 65 73 20 6d 65 6d 6f  *.Allocates memo
a060: 72 79 2e 20 41 72 62 69 74 72 61 72 79 2c 20 61  ry. Arbitrary, a
a070: 73 20 69 74 20 63 61 6c 6c 73 20 75 70 6f 6e 20  s it calls upon 
a080: 61 20 73 63 72 69 70 74 2e 0a 20 2a 0a 20 2a 2d  a script.. *. *-
a090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a0a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a0b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a0c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a0d0: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69  -----. */..stati
a0e0: 63 20 69 6e 74 0a 52 65 66 6c 65 63 74 42 6c 6f  c int.ReflectBlo
a0f0: 63 6b 28 0a 20 20 20 20 43 6c 69 65 6e 74 44 61  ck(.    ClientDa
a100: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20  ta clientData,. 
a110: 20 20 20 69 6e 74 20 6e 6f 6e 62 6c 6f 63 6b 69     int nonblocki
a120: 6e 67 29 0a 7b 0a 20 20 20 20 52 65 66 6c 65 63  ng).{.    Reflec
a130: 74 65 64 54 72 61 6e 73 66 6f 72 6d 20 2a 72 74  tedTransform *rt
a140: 50 74 72 20 3d 20 28 52 65 66 6c 65 63 74 65 64  Ptr = (Reflected
a150: 54 72 61 6e 73 66 6f 72 6d 20 2a 29 20 63 6c 69  Transform *) cli
a160: 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 2f 2a  entData;..    /*
a170: 0a 20 20 20 20 20 2a 20 54 72 61 6e 73 66 6f 72  .     * Transfor
a180: 6d 61 74 69 6f 6e 73 20 73 69 6d 70 6c 79 20 72  mations simply r
a190: 65 63 6f 72 64 20 74 68 65 20 62 6c 6f 63 6b 69  ecord the blocki
a1a0: 6e 67 20 6d 6f 64 65 20 69 6e 20 74 68 65 69 72  ng mode in their
a1b0: 20 43 20 6c 65 76 65 6c 0a 20 20 20 20 20 2a 20   C level.     * 
a1c0: 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 75 73  structure for us
a1d0: 65 20 62 79 20 2d 2d 3e 20 52 65 66 6c 65 63 74  e by --> Reflect
a1e0: 49 6e 70 75 74 2e 20 54 68 65 20 54 63 6c 20 6c  Input. The Tcl l
a1f0: 65 76 65 6c 20 64 6f 65 73 6e 27 74 20 73 65 65  evel doesn't see
a200: 20 74 68 69 73 0a 20 20 20 20 20 2a 20 69 6e 66   this.     * inf
a210: 6f 72 6d 61 74 69 6f 6e 20 6f 72 20 63 68 61 6e  ormation or chan
a220: 67 65 2e 20 41 73 20 73 75 63 68 20 74 68 72 65  ge. As such thre
a230: 61 64 20 66 6f 72 77 61 72 64 69 6e 67 20 69 73  ad forwarding is
a240: 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 0a 20   not required.. 
a250: 20 20 20 20 2a 2f 0a 0a 20 20 20 20 72 74 50 74      */..    rtPt
a260: 72 2d 3e 62 6c 6f 63 6b 69 6e 67 20 3d 20 21 6e  r->blocking = !n
a270: 6f 6e 62 6c 6f 63 6b 69 6e 67 3b 0a 20 20 20 20  onblocking;.    
a280: 72 65 74 75 72 6e 20 45 4f 4b 3b 0a 7d 0a 0c 0a  return EOK;.}...
a290: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
a2a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a2b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a2c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a2d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
a2e0: 2a 20 52 65 66 6c 65 63 74 53 65 74 4f 70 74 69  * ReflectSetOpti
a2f0: 6f 6e 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73  on --. *. *.This
a300: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76   function is inv
a310: 6f 6b 65 64 20 74 6f 20 63 6f 6e 66 69 67 75 72  oked to configur
a320: 65 20 61 20 63 68 61 6e 6e 65 6c 20 6f 70 74 69  e a channel opti
a330: 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  on.. *. * Result
a340: 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64  s:. *.A standard
a350: 20 54 63 6c 20 72 65 73 75 6c 74 20 63 6f 64 65   Tcl result code
a360: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  .. *. * Side eff
a370: 65 63 74 73 3a 0a 20 2a 09 41 72 62 69 74 72 61  ects:. *.Arbitra
a380: 72 79 2c 20 70 65 72 20 74 68 65 20 70 61 72 65  ry, per the pare
a390: 6e 74 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20  nt channel.. *. 
a3a0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
a3b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a3c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a3d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a3e0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61  -------. */..sta
a3f0: 74 69 63 20 69 6e 74 0a 52 65 66 6c 65 63 74 53  tic int.ReflectS
a400: 65 74 4f 70 74 69 6f 6e 28 0a 20 20 20 20 43 6c  etOption(.    Cl
a410: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
a420: 61 74 61 2c 09 2f 2a 20 43 68 61 6e 6e 65 6c 20  ata,./* Channel 
a430: 74 6f 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20  to query */.    
a440: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
a450: 72 70 2c 09 09 2f 2a 20 49 6e 74 65 72 70 72 65  rp,../* Interpre
a460: 74 65 72 20 74 6f 20 6c 65 61 76 65 20 65 72 72  ter to leave err
a470: 6f 72 20 6d 65 73 73 61 67 65 73 20 69 6e 20 2a  or messages in *
a480: 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  /.    const char
a490: 20 2a 6f 70 74 69 6f 6e 4e 61 6d 65 2c 09 2f 2a   *optionName,./*
a4a0: 20 4e 61 6d 65 20 6f 66 20 72 65 71 75 65 73 74   Name of request
a4b0: 65 64 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20 20  ed option */.   
a4c0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6e 65 77   const char *new
a4d0: 56 61 6c 75 65 29 09 2f 2a 20 54 68 65 20 6e 65  Value)./* The ne
a4e0: 77 20 76 61 6c 75 65 20 2a 2f 0a 7b 0a 20 20 20  w value */.{.   
a4f0: 20 52 65 66 6c 65 63 74 65 64 54 72 61 6e 73 66   ReflectedTransf
a500: 6f 72 6d 20 2a 72 74 50 74 72 20 3d 20 28 52 65  orm *rtPtr = (Re
a510: 66 6c 65 63 74 65 64 54 72 61 6e 73 66 6f 72 6d  flectedTransform
a520: 20 2a 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a   *) clientData;.
a530: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 54  .    /*.     * T
a540: 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 73 20 68  ransformations h
a550: 61 76 65 20 6e 6f 20 6f 70 74 69 6f 6e 73 2e 20  ave no options. 
a560: 54 68 75 73 20 74 68 65 20 63 61 6c 6c 20 69 73  Thus the call is
a570: 20 70 61 73 73 65 64 20 64 6f 77 6e 20 75 6e 63   passed down unc
a580: 68 61 6e 67 65 64 0a 20 20 20 20 20 2a 20 74 6f  hanged.     * to
a590: 20 74 68 65 20 70 61 72 65 6e 74 20 63 68 61 6e   the parent chan
a5a0: 6e 65 6c 20 66 6f 72 20 70 72 6f 63 65 73 73 69  nel for processi
a5b0: 6e 67 2e 20 49 74 73 20 72 65 73 75 6c 74 73 20  ng. Its results 
a5c0: 61 72 65 20 70 61 73 73 65 64 20 62 61 63 6b 0a  are passed back.
a5d0: 20 20 20 20 20 2a 20 75 6e 63 68 61 6e 67 65 64       * unchanged
a5e0: 20 61 73 20 77 65 6c 6c 2e 20 54 68 69 73 20 61   as well. This a
a5f0: 6c 6c 20 68 61 70 70 65 6e 73 20 69 6e 20 74 68  ll happens in th
a600: 65 20 74 68 72 65 61 64 20 77 65 20 61 72 65 20  e thread we are 
a610: 69 6e 2e 20 41 73 20 74 68 65 20 54 63 6c 0a 20  in. As the Tcl. 
a620: 20 20 20 20 2a 20 6c 65 76 65 6c 20 69 73 20 6e      * level is n
a630: 6f 74 20 69 6e 76 6f 6c 76 65 64 20 74 68 65 72  ot involved ther
a640: 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72  e is no need for
a650: 20 74 68 72 65 61 64 20 66 6f 72 77 61 72 64 69   thread forwardi
a660: 6e 67 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20  ng..     */..   
a670: 20 54 63 6c 5f 44 72 69 76 65 72 53 65 74 4f 70   Tcl_DriverSetOp
a680: 74 69 6f 6e 50 72 6f 63 20 2a 73 65 74 4f 70 74  tionProc *setOpt
a690: 69 6f 6e 50 72 6f 63 20 3d 20 0a 20 20 20 20 20  ionProc = .     
a6a0: 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 53 65 74 4f   Tcl_ChannelSetO
a6b0: 70 74 69 6f 6e 50 72 6f 63 20 28 54 63 6c 5f 47  ptionProc (Tcl_G
a6c0: 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 20 28 72  etChannelType (r
a6d0: 74 50 74 72 2d 3e 70 61 72 65 6e 74 29 29 3b 0a  tPtr->parent));.
a6e0: 0a 20 20 20 20 69 66 20 28 73 65 74 4f 70 74 69  .    if (setOpti
a6f0: 6f 6e 50 72 6f 63 20 21 3d 20 4e 55 4c 4c 29 20  onProc != NULL) 
a700: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 28  {.      return (
a710: 2a 73 65 74 4f 70 74 69 6f 6e 50 72 6f 63 29 20  *setOptionProc) 
a720: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49  (Tcl_GetChannelI
a730: 6e 73 74 61 6e 63 65 44 61 74 61 20 28 72 74 50  nstanceData (rtP
a740: 74 72 2d 3e 70 61 72 65 6e 74 29 2c 0a 09 09 09  tr->parent),....
a750: 20 20 20 20 20 20 20 69 6e 74 65 72 70 2c 20 6f         interp, o
a760: 70 74 69 6f 6e 4e 61 6d 65 2c 20 6e 65 77 56 61  ptionName, newVa
a770: 6c 75 65 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65  lue);.    } else
a780: 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
a790: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
a7a0: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
a7b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a7c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a7d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a7e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a7f0: 0a 20 2a 0a 20 2a 20 52 65 66 6c 65 63 74 47 65  . *. * ReflectGe
a800: 74 4f 70 74 69 6f 6e 20 2d 2d 0a 20 2a 0a 20 2a  tOption --. *. *
a810: 09 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69  .This function i
a820: 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 72 65 74  s invoked to ret
a830: 72 69 65 76 65 20 61 6c 6c 20 6f 72 20 61 20 63  rieve all or a c
a840: 68 61 6e 6e 65 6c 20 6f 70 74 69 6f 6e 73 2e 0a  hannel options..
a850: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
a860: 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c  *.A standard Tcl
a870: 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a 20 2a   result code.. *
a880: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
a890: 3a 0a 20 2a 09 41 72 62 69 74 72 61 72 79 2c 20  :. *.Arbitrary, 
a8a0: 70 65 72 20 74 68 65 20 70 61 72 65 6e 74 20 63  per the parent c
a8b0: 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d  hannel.. *. *---
a8c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a8d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a8e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a8f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a900: 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20  ---. */..static 
a910: 69 6e 74 0a 52 65 66 6c 65 63 74 47 65 74 4f 70  int.ReflectGetOp
a920: 74 69 6f 6e 28 0a 20 20 20 20 43 6c 69 65 6e 74  tion(.    Client
a930: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
a940: 09 2f 2a 20 43 68 61 6e 6e 65 6c 20 74 6f 20 71  ./* Channel to q
a950: 75 65 72 79 20 2a 2f 0a 20 20 20 20 54 63 6c 5f  uery */.    Tcl_
a960: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 09  Interp *interp,.
a970: 09 2f 2a 20 49 6e 74 65 72 70 72 65 74 65 72 20  ./* Interpreter 
a980: 74 6f 20 6c 65 61 76 65 20 65 72 72 6f 72 20 6d  to leave error m
a990: 65 73 73 61 67 65 73 20 69 6e 20 2a 2f 0a 20 20  essages in */.  
a9a0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6f 70    const char *op
a9b0: 74 69 6f 6e 4e 61 6d 65 2c 09 2f 2a 20 4e 61 6d  tionName,./* Nam
a9c0: 65 20 6f 66 20 72 65 75 71 65 73 74 65 64 20 6f  e of reuqested o
a9d0: 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 54 63 6c  ption */.    Tcl
a9e0: 5f 44 53 74 72 69 6e 67 20 2a 64 73 50 74 72 29  _DString *dsPtr)
a9f0: 09 09 2f 2a 20 53 74 72 69 6e 67 20 74 6f 20 70  ../* String to p
aa00: 6c 61 63 65 20 74 68 65 20 72 65 73 75 6c 74 20  lace the result 
aa10: 69 6e 74 6f 20 2a 2f 0a 7b 0a 20 20 20 20 52 65  into */.{.    Re
aa20: 66 6c 65 63 74 65 64 54 72 61 6e 73 66 6f 72 6d  flectedTransform
aa30: 20 2a 72 74 50 74 72 20 3d 20 28 52 65 66 6c 65   *rtPtr = (Refle
aa40: 63 74 65 64 54 72 61 6e 73 66 6f 72 6d 20 2a 29  ctedTransform *)
aa50: 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20   clientData;..  
aa60: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 54 72 61 6e    /*.     * Tran
aa70: 73 66 6f 72 6d 61 74 69 6f 6e 73 20 68 61 76 65  sformations have
aa80: 20 6e 6f 20 6f 70 74 69 6f 6e 73 2e 20 54 68 75   no options. Thu
aa90: 73 20 74 68 65 20 63 61 6c 6c 20 69 73 20 70 61  s the call is pa
aaa0: 73 73 65 64 20 64 6f 77 6e 20 75 6e 63 68 61 6e  ssed down unchan
aab0: 67 65 64 0a 20 20 20 20 20 2a 20 74 6f 20 74 68  ged.     * to th
aac0: 65 20 70 61 72 65 6e 74 20 63 68 61 6e 6e 65 6c  e parent channel
aad0: 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 2e   for processing.
aae0: 20 49 74 73 20 72 65 73 75 6c 74 73 20 61 72 65   Its results are
aaf0: 20 70 61 73 73 65 64 20 62 61 63 6b 0a 20 20 20   passed back.   
ab00: 20 20 2a 20 75 6e 63 68 61 6e 67 65 64 20 61 73    * unchanged as
ab10: 20 77 65 6c 6c 2e 20 54 68 69 73 20 61 6c 6c 20   well. This all 
ab20: 68 61 70 70 65 6e 73 20 69 6e 20 74 68 65 20 74  happens in the t
ab30: 68 72 65 61 64 20 77 65 20 61 72 65 20 69 6e 2e  hread we are in.
ab40: 20 41 73 20 74 68 65 20 54 63 6c 0a 20 20 20 20   As the Tcl.    
ab50: 20 2a 20 6c 65 76 65 6c 20 69 73 20 6e 6f 74 20   * level is not 
ab60: 69 6e 76 6f 6c 76 65 64 20 74 68 65 72 65 20 69  involved there i
ab70: 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 74 68  s no need for th
ab80: 72 65 61 64 20 66 6f 72 77 61 72 64 69 6e 67 2e  read forwarding.
ab90: 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 4e  .     *.     * N
aba0: 6f 74 65 20 74 68 61 74 20 74 68 65 20 70 61 72  ote that the par
abb0: 65 6e 74 20 6e 6f 74 20 68 61 76 69 6e 67 20 61  ent not having a
abc0: 20 64 72 69 76 65 72 20 66 6f 72 20 6f 70 74 69   driver for opti
abd0: 6f 6e 20 72 65 74 72 69 65 76 61 6c 20 69 73 20  on retrieval is 
abe0: 6e 6f 74 20 61 6e 0a 20 20 20 20 20 2a 20 69 6d  not an.     * im
abf0: 6d 65 64 69 61 74 65 20 65 72 72 6f 72 2e 20 41  mediate error. A
ac00: 20 71 75 65 72 79 20 66 6f 72 20 61 6c 6c 20 6f   query for all o
ac10: 70 74 69 6f 6e 73 20 69 73 20 6f 6b 2e 20 4f 6e  ptions is ok. On
ac20: 6c 79 20 61 20 72 65 71 75 65 73 74 20 66 6f 72  ly a request for
ac30: 20 61 0a 20 20 20 20 20 2a 20 73 70 65 63 69 66   a.     * specif
ac40: 69 63 20 6f 70 74 69 6f 6e 20 68 61 73 20 74 6f  ic option has to
ac50: 20 66 61 69 6c 2e 0a 20 20 20 20 20 2a 2f 0a 0a   fail..     */..
ac60: 20 20 20 20 54 63 6c 5f 44 72 69 76 65 72 47 65      Tcl_DriverGe
ac70: 74 4f 70 74 69 6f 6e 50 72 6f 63 20 2a 67 65 74  tOptionProc *get
ac80: 4f 70 74 69 6f 6e 50 72 6f 63 20 3d 20 0a 20 20  OptionProc = .  
ac90: 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 47      Tcl_ChannelG
aca0: 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 28 54 63  etOptionProc (Tc
acb0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65  l_GetChannelType
acc0: 20 28 72 74 50 74 72 2d 3e 70 61 72 65 6e 74 29   (rtPtr->parent)
acd0: 29 3b 0a 0a 20 20 20 20 69 66 20 28 67 65 74 4f  );..    if (getO
ace0: 70 74 69 6f 6e 50 72 6f 63 20 21 3d 20 4e 55 4c  ptionProc != NUL
acf0: 4c 29 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72  L) {.      retur
ad00: 6e 20 28 2a 67 65 74 4f 70 74 69 6f 6e 50 72 6f  n (*getOptionPro
ad10: 63 29 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e  c) (Tcl_GetChann
ad20: 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 20 28  elInstanceData (
ad30: 72 74 50 74 72 2d 3e 70 61 72 65 6e 74 29 2c 0a  rtPtr->parent),.
ad40: 09 09 09 20 20 20 20 20 20 20 69 6e 74 65 72 70  ...       interp
ad50: 2c 20 6f 70 74 69 6f 6e 4e 61 6d 65 2c 20 64 73  , optionName, ds
ad60: 50 74 72 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65  Ptr);.    } else
ad70: 20 69 66 20 28 6f 70 74 69 6f 6e 4e 61 6d 65 20   if (optionName 
ad80: 3d 3d 20 28 63 68 61 72 2a 29 20 4e 55 4c 4c 29  == (char*) NULL)
ad90: 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
ada0: 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c  TCL_OK;.    } el
adb0: 73 65 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72  se {.      retur
adc0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
add0: 20 7d 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d   }.}.../*. *----
ade0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
adf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 20 2a 0a 20 2a 20 52 65 66 6c 65 63 74  --. *. * Reflect
ae30: 48 61 6e 64 6c 65 20 2d 2d 0a 20 2a 0a 20 2a 09  Handle --. *. *.
ae40: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
ae50: 20 69 6e 76 6f 6b 65 64 20 74 6f 20 72 65 74 72   invoked to retr
ae60: 69 65 76 65 20 74 68 65 20 61 73 73 6f 63 69 61  ieve the associa
ae70: 74 65 64 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e  ted file handle.
ae80: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
ae90: 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63   *.A standard Tc
aea0: 6c 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a 20  l result code.. 
aeb0: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
aec0: 73 3a 0a 20 2a 09 41 72 62 69 74 72 61 72 79 2c  s:. *.Arbitrary,
aed0: 20 70 65 72 20 74 68 65 20 70 61 72 65 6e 74 20   per the parent 
aee0: 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d  channel.. *. *--
aef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
af00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
af10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
af20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
af30: 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63  ----. */..static
af40: 20 69 6e 74 0a 52 65 66 6c 65 63 74 48 61 6e 64   int.ReflectHand
af50: 6c 65 28 0a 09 20 20 20 20 20 20 43 6c 69 65 6e  le(..      Clien
af60: 74 44 61 74 61 20 20 63 6c 69 65 6e 74 44 61 74  tData  clientDat
af70: 61 2c 0a 09 20 20 20 20 20 20 69 6e 74 20 20 20  a,..      int   
af80: 20 20 20 20 20 20 64 69 72 65 63 74 69 6f 6e 2c        direction,
af90: 0a 09 20 20 20 20 20 20 43 6c 69 65 6e 74 44 61  ..      ClientDa
afa0: 74 61 2a 20 68 61 6e 64 6c 65 50 74 72 29 0a 7b  ta* handlePtr).{
afb0: 0a 20 20 20 20 52 65 66 6c 65 63 74 65 64 54 72  .    ReflectedTr
afc0: 61 6e 73 66 6f 72 6d 20 2a 72 74 50 74 72 20 3d  ansform *rtPtr =
afd0: 20 28 52 65 66 6c 65 63 74 65 64 54 72 61 6e 73   (ReflectedTrans
afe0: 66 6f 72 6d 20 2a 29 20 63 6c 69 65 6e 74 44 61  form *) clientDa
aff0: 74 61 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20  ta;..    /*.    
b000: 20 2a 20 54 72 61 6e 73 66 6f 72 6d 61 74 69 6f   * Transformatio
b010: 6e 73 20 68 61 76 65 20 6e 6f 20 68 61 6e 64 6c  ns have no handl
b020: 65 20 6f 66 20 74 68 65 69 72 20 6f 77 6e 2e 20  e of their own. 
b030: 41 73 20 73 75 63 68 20 77 65 20 73 69 6d 70 6c  As such we simpl
b040: 79 20 71 75 65 72 79 0a 20 20 20 20 20 2a 20 74  y query.     * t
b050: 68 65 20 70 61 72 65 6e 74 20 63 68 61 6e 6e 65  he parent channe
b060: 6c 20 66 6f 72 20 69 74 2e 20 54 68 69 73 20 77  l for it. This w
b070: 61 79 20 74 68 65 20 71 65 72 79 20 77 69 6c 6c  ay the qery will
b080: 20 72 69 70 70 6c 65 20 64 6f 77 6e 20 74 68 72   ripple down thr
b090: 6f 75 67 68 0a 20 20 20 20 20 2a 20 61 6c 6c 20  ough.     * all 
b0a0: 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 73 20  transformations 
b0b0: 75 6e 74 69 6c 20 72 65 61 63 68 65 73 20 74 68  until reaches th
b0c0: 65 20 62 61 73 65 20 63 68 61 6e 6e 65 6c 2e 20  e base channel. 
b0d0: 57 68 69 63 68 20 74 68 65 6e 20 72 65 74 75 72  Which then retur
b0e0: 6e 73 0a 20 20 20 20 20 2a 20 69 74 73 20 68 61  ns.     * its ha
b0f0: 6e 64 6c 65 2c 20 6f 72 20 66 61 69 6c 73 2e 20  ndle, or fails. 
b100: 54 68 65 20 66 6f 72 6d 65 72 20 77 69 6c 6c 20  The former will 
b110: 74 68 65 6e 20 72 69 70 70 6c 65 20 75 70 20 74  then ripple up t
b120: 68 65 20 73 74 61 63 6b 2e 0a 20 20 20 20 20 2a  he stack..     *
b130: 0a 20 20 20 20 20 2a 20 54 68 69 73 20 61 6c 6c  .     * This all
b140: 20 68 61 70 70 65 6e 73 20 69 6e 20 74 68 65 20   happens in the 
b150: 74 68 72 65 61 64 20 77 65 20 61 72 65 20 69 6e  thread we are in
b160: 2e 20 41 73 20 74 68 65 20 54 63 6c 20 6c 65 76  . As the Tcl lev
b170: 65 6c 20 69 73 20 6e 6f 74 0a 20 20 20 20 20 2a  el is not.     *
b180: 20 69 6e 76 6f 6c 76 65 64 20 6e 6f 20 66 6f 72   involved no for
b190: 77 61 72 64 69 6e 67 20 69 73 20 72 65 71 75 69  warding is requi
b1a0: 72 65 64 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20  red..     */..  
b1b0: 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 47 65 74    return Tcl_Get
b1c0: 43 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 20 28 72  ChannelHandle (r
b1d0: 74 50 74 72 2d 3e 70 61 72 65 6e 74 2c 20 64 69  tPtr->parent, di
b1e0: 72 65 63 74 69 6f 6e 2c 20 68 61 6e 64 6c 65 50  rection, handleP
b1f0: 74 72 29 3b 0a 7d 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  tr);.}./*. *----
b200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b240: 2d 2d 0a 20 2a 0a 20 2a 20 52 65 66 6c 65 63 74  --. *. * Reflect
b250: 4e 6f 74 69 66 79 20 2d 2d 0a 20 2a 0a 20 2a 09  Notify --. *. *.
b260: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
b270: 20 69 6e 76 6f 6b 65 64 20 74 6f 20 72 65 70 6f   invoked to repo
b280: 72 74 65 64 20 69 6e 63 6f 6d 69 6e 67 20 65 76  rted incoming ev
b290: 65 6e 74 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75  ents.. *. * Resu
b2a0: 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61  lts:. *.A standa
b2b0: 72 64 20 54 63 6c 20 72 65 73 75 6c 74 20 63 6f  rd Tcl result co
b2c0: 64 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  de.. *. * Side e
b2d0: 66 66 65 63 74 73 3a 0a 20 2a 09 41 72 62 69 74  ffects:. *.Arbit
b2e0: 72 61 72 79 2c 20 70 65 72 20 74 68 65 20 70 61  rary, per the pa
b2f0: 72 65 6e 74 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a  rent channel.. *
b300: 0a 20 2a 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 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73  ---------. */..s
b350: 74 61 74 69 63 20 69 6e 74 0a 52 65 66 6c 65 63  tatic int.Reflec
b360: 74 4e 6f 74 69 66 79 28 0a 09 20 20 20 20 20 20  tNotify(..      
b370: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
b380: 74 44 61 74 61 2c 0a 09 20 20 20 20 20 20 69 6e  tData,..      in
b390: 74 20 6d 61 73 6b 29 0a 7b 0a 20 20 20 20 52 65  t mask).{.    Re
b3a0: 66 6c 65 63 74 65 64 54 72 61 6e 73 66 6f 72 6d  flectedTransform
b3b0: 20 2a 72 74 50 74 72 20 3d 20 28 52 65 66 6c 65   *rtPtr = (Refle
b3c0: 63 74 65 64 54 72 61 6e 73 66 6f 72 6d 20 2a 29  ctedTransform *)
b3d0: 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 20   clientData;.   
b3e0: 20 54 63 6c 5f 4f 62 6a 2a 20 6d 61 73 6b 4f 62   Tcl_Obj* maskOb
b3f0: 6a 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20  j;..    /*.     
b400: 2a 20 41 6e 20 65 76 65 6e 74 20 6f 63 63 75 72  * An event occur
b410: 65 64 20 69 6e 20 74 68 65 20 75 6e 64 65 72 6c  ed in the underl
b420: 79 69 6e 67 20 63 68 61 6e 6e 65 6c 2e 20 20 54  ying channel.  T
b430: 68 69 73 20 74 72 61 6e 73 66 6f 72 6d 61 74 69  his transformati
b440: 6f 6e 20 6d 61 79 20 6f 72 0a 20 20 20 20 20 2a  on may or.     *
b450: 20 6d 61 6e 79 20 6e 6f 74 20 70 72 6f 63 65 73   many not proces
b460: 73 20 73 75 63 68 20 65 76 65 6e 74 73 2e 20 49  s such events. I
b470: 66 20 6e 6f 74 20 77 65 20 72 65 74 75 72 6e 20  f not we return 
b480: 74 68 65 20 69 6e 63 6f 6d 69 6e 67 20 6d 61 73  the incoming mas
b490: 6b 0a 20 20 20 20 20 2a 20 75 6e 63 68 61 6e 67  k.     * unchang
b4a0: 65 64 20 66 6f 72 20 66 75 72 74 68 65 72 20 70  ed for further p
b4b0: 72 6f 63 65 73 73 69 6e 67 20 62 79 20 74 68 65  rocessing by the
b4c0: 20 63 6f 72 65 2e 0a 20 20 20 20 20 2a 0a 20 20   core..     *.  
b4d0: 20 20 20 2a 20 57 65 20 64 6f 20 64 65 6c 65 74     * We do delet
b4e0: 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20 74 69  e an existing ti
b4f0: 6d 65 72 2e 20 49 74 20 77 61 73 20 6e 6f 74 20  mer. It was not 
b500: 66 69 72 65 64 2c 20 79 65 74 20 77 65 20 61 72  fired, yet we ar
b510: 65 20 68 65 72 65 2c 20 73 6f 0a 20 20 20 20 20  e here, so.     
b520: 2a 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 62 65  * the channel be
b530: 6c 6f 77 20 67 65 6e 65 72 61 74 65 64 20 73 75  low generated su
b540: 63 68 20 61 6e 20 65 76 65 6e 74 20 61 6e 64 20  ch an event and 
b550: 77 65 20 64 6f 6e 27 74 20 68 61 76 65 20 74 6f  we don't have to
b560: 2e 20 54 68 65 0a 20 20 20 20 20 2a 20 72 65 6e  . The.     * ren
b570: 65 77 61 6c 20 6f 66 20 74 68 65 20 69 6e 74 65  ewal of the inte
b580: 72 65 73 74 20 61 66 74 65 72 20 74 68 65 20 65  rest after the e
b590: 78 65 63 75 74 69 6f 6e 20 6f 66 20 63 68 61 6e  xecution of chan
b5a0: 6e 65 6c 20 68 61 6e 64 6c 65 72 73 20 77 69 6c  nel handlers wil
b5b0: 6c 0a 20 20 20 20 20 2a 20 65 76 65 6e 74 75 61  l.     * eventua
b5c0: 6c 6c 79 20 63 61 75 73 65 20 75 73 20 74 6f 20  lly cause us to 
b5d0: 72 65 63 72 65 61 74 65 20 74 68 65 20 74 69 6d  recreate the tim
b5e0: 65 72 20 28 69 6e 20 52 65 66 6c 65 63 74 57 61  er (in ReflectWa
b5f0: 74 63 68 29 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20  tch)..     */.. 
b600: 20 20 20 54 69 6d 65 72 4b 69 6c 6c 20 28 72 74     TimerKill (rt
b610: 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20  Ptr);..    /*.  
b620: 20 20 20 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69     * The followi
b630: 6e 67 20 63 68 65 63 6b 20 63 61 6e 20 62 65 20  ng check can be 
b640: 64 6f 6e 65 20 62 65 66 6f 72 65 20 74 68 72 65  done before thre
b650: 61 64 20 72 65 64 69 72 65 63 74 69 6f 6e 2c 20  ad redirection, 
b660: 62 65 63 61 75 73 65 20 77 65 0a 20 20 20 20 20  because we.     
b670: 2a 20 61 72 65 20 72 65 61 64 69 6e 67 20 66 72  * are reading fr
b680: 6f 6d 20 61 6e 20 69 74 65 6d 20 77 68 69 63 68  om an item which
b690: 20 69 73 20 72 65 61 64 6f 6e 6c 79 2c 20 69 2e   is readonly, i.
b6a0: 65 2e 20 77 69 6c 6c 20 6e 65 76 65 72 20 63 68  e. will never ch
b6b0: 61 6e 67 65 0a 20 20 20 20 20 2a 20 64 75 72 69  ange.     * duri
b6c0: 6e 67 20 74 68 65 20 6c 69 66 65 74 69 6d 65 20  ng the lifetime 
b6d0: 6f 66 20 74 68 65 20 63 68 61 6e 6e 65 6c 2e 0a  of the channel..
b6e0: 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66 20       */..    if 
b6f0: 28 21 28 72 74 50 74 72 2d 3e 6d 65 74 68 6f 64  (!(rtPtr->method
b700: 73 20 26 20 46 4c 41 47 28 4d 45 54 48 5f 45 56  s & FLAG(METH_EV
b710: 45 4e 54 29 29 29 20 7b 0a 09 2f 2a 0a 09 20 2a  ENT))) {../*.. *
b720: 20 4e 6f 20 70 72 6f 63 65 73 73 69 6e 67 20 62   No processing b
b730: 79 20 74 68 65 20 74 72 61 6e 73 66 6f 72 6d 61  y the transforma
b740: 74 69 6f 6e 2c 20 70 61 73 73 20 75 6e 63 68 61  tion, pass uncha
b750: 6e 67 65 64 0a 09 20 2a 2f 0a 0a 09 72 65 74 75  nged.. */...retu
b760: 72 6e 20 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a  rn mask;.    }..
b770: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 41 6e      /*.     * An
b780: 6f 74 68 65 72 20 71 75 69 63 6b 20 63 68 65 63  other quick chec
b790: 6b 20 77 65 20 63 61 6e 20 64 6f 2c 20 64 6f 65  k we can do, doe
b7a0: 73 20 74 68 65 20 6d 61 73 6b 20 63 6f 6e 74 61  s the mask conta
b7b0: 69 6e 20 65 76 65 6e 74 73 20 77 68 69 63 68 20  in events which 
b7c0: 61 72 65 0a 20 20 20 20 20 2a 20 6f 66 20 69 6e  are.     * of in
b7d0: 74 65 72 65 73 74 20 74 6f 20 74 68 65 20 74 72  terest to the tr
b7e0: 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 3f 20 46  ansformation ? F
b7f0: 6f 72 20 69 66 20 6e 6f 74 20 77 65 20 63 61 6e  or if not we can
b800: 20 73 69 6d 70 6c 79 20 70 61 73 73 20 74 68 65   simply pass the
b810: 0a 20 20 20 20 20 2a 20 64 61 74 61 20 75 70 20  .     * data up 
b820: 77 69 74 68 6f 75 74 20 69 6e 63 75 72 72 69 6e  without incurrin
b830: 67 20 74 68 65 20 65 78 70 65 6e 73 65 20 6f 66  g the expense of
b840: 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 54 63   invoking the Tc
b850: 6c 20 68 61 6e 64 6c 65 72 2e 0a 20 20 20 20 20  l handler..     
b860: 2a 0a 20 20 20 20 20 2a 20 4e 4f 54 45 20 74 68  *.     * NOTE th
b870: 61 74 20 2d 2d 3e 20 52 65 66 6c 65 63 74 57 61  at --> ReflectWa
b880: 74 63 68 20 75 70 64 61 74 65 73 20 74 68 65 20  tch updates the 
b890: 27 69 6e 74 65 72 65 73 74 27 20 66 69 65 6c 64  'interest' field
b8a0: 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 0a   in the current.
b8b0: 20 20 20 20 20 2a 20 74 68 72 65 61 64 20 61 73       * thread as
b8c0: 20 77 65 6c 6c 2c 20 73 6f 20 6e 6f 20 6d 75 74   well, so no mut
b8d0: 65 78 20 65 78 63 6c 75 73 69 6f 6e 20 69 73 20  ex exclusion is 
b8e0: 72 65 71 75 69 72 65 64 20 77 68 65 6e 20 71 75  required when qu
b8f0: 65 72 79 69 6e 67 20 74 68 65 0a 20 20 20 20 20  erying the.     
b900: 2a 20 66 69 65 6c 64 2e 0a 20 20 20 20 20 2a 2f  * field..     */
b910: 0a 0a 20 20 20 20 69 66 20 28 28 6d 61 73 6b 20  ..    if ((mask 
b920: 26 20 72 74 50 74 72 2d 3e 69 6e 74 65 72 65 73  & rtPtr->interes
b930: 74 29 20 3d 3d 20 30 29 20 7b 0a 09 72 65 74 75  t) == 0) {..retu
b940: 72 6e 20 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a  rn mask;.    }..
b950: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 41 72      /*.     * Ar
b960: 65 20 77 65 20 69 6e 20 74 68 65 20 63 6f 72 72  e we in the corr
b970: 65 63 74 20 74 68 72 65 61 64 3f 0a 20 20 20 20  ect thread?.    
b980: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 54 43 4c 5f   */..#ifdef TCL_
b990: 54 48 52 45 41 44 53 0a 20 20 20 20 69 66 20 28  THREADS.    if (
b9a0: 72 74 50 74 72 2d 3e 74 68 72 65 61 64 20 21 3d  rtPtr->thread !=
b9b0: 20 54 63 6c 5f 47 65 74 43 75 72 72 65 6e 74 54   Tcl_GetCurrentT
b9c0: 68 72 65 61 64 28 29 29 20 7b 0a 09 46 6f 72 77  hread()) {..Forw
b9d0: 61 72 64 50 61 72 61 6d 20 70 3b 0a 0a 09 70 2e  ardParam p;...p.
b9e0: 6d 61 73 6b 2e 6d 61 73 6b 20 3d 20 6d 61 73 6b  mask.mask = mask
b9f0: 20 26 20 72 74 50 74 72 2d 3e 69 6e 74 65 72 65   & rtPtr->intere
ba00: 73 74 3b 0a 0a 09 46 6f 72 77 61 72 64 4f 70 54  st;...ForwardOpT
ba10: 6f 4f 77 6e 65 72 54 68 72 65 61 64 28 72 74 50  oOwnerThread(rtP
ba20: 74 72 2c 20 46 6f 72 77 61 72 64 65 64 45 76 65  tr, ForwardedEve
ba30: 6e 74 2c 20 26 70 29 3b 0a 0a 09 72 65 74 75 72  nt, &p);...retur
ba40: 6e 20 6d 61 73 6b 20 26 20 7e 72 74 50 74 72 2d  n mask & ~rtPtr-
ba50: 3e 69 6e 74 65 72 65 73 74 3b 0a 20 20 20 20 7d  >interest;.    }
ba60: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 0a  .#endif..    /*.
ba70: 20 20 20 20 20 2a 20 57 65 20 63 61 6c 6c 20 74       * We call t
ba80: 68 65 20 54 63 6c 20 6c 65 76 65 6c 20 6f 6e 6c  he Tcl level onl
ba90: 79 20 77 69 74 68 20 65 76 65 6e 74 73 20 6f 66  y with events of
baa0: 20 69 6e 74 65 72 65 73 74 20 74 6f 20 74 68 65   interest to the
bab0: 0a 20 20 20 20 20 2a 20 74 72 61 6e 73 66 6f 72  .     * transfor
bac0: 6d 61 74 69 6f 6e 2c 20 61 6e 64 20 70 61 73 73  mation, and pass
bad0: 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20 75   the remainder u
bae0: 70 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20  p..     */..    
baf0: 6d 61 73 6b 4f 62 6a 20 3d 20 44 65 63 6f 64 65  maskObj = Decode
bb00: 45 76 65 6e 74 4d 61 73 6b 28 6d 61 73 6b 20 26  EventMask(mask &
bb10: 20 72 74 50 74 72 2d 3e 69 6e 74 65 72 65 73 74   rtPtr->interest
bb20: 29 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 49 6e  );.    (void) In
bb30: 76 6f 6b 65 54 63 6c 4d 65 74 68 6f 64 28 72 74  vokeTclMethod(rt
bb40: 50 74 72 2c 20 22 65 76 65 6e 74 22 2c 20 6d 61  Ptr, "event", ma
bb50: 73 6b 4f 62 6a 2c 20 4e 55 4c 4c 2c 20 4e 55 4c  skObj, NULL, NUL
bb60: 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72  L);.    Tcl_Decr
bb70: 52 65 66 43 6f 75 6e 74 28 6d 61 73 6b 4f 62 6a  RefCount(maskObj
bb80: 29 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 6d  );..    return m
bb90: 61 73 6b 20 26 20 7e 72 74 50 74 72 2d 3e 69 6e  ask & ~rtPtr->in
bba0: 74 65 72 65 73 74 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  terest;.}.../*. 
bbb0: 2a 20 48 65 6c 70 65 72 73 2e 20 3d 3d 3d 3d 3d  * Helpers. =====
bbc0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
bbd0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
bbe0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
bbf0: 3d 3d 3d 3d 0a 20 2a 2f 0a 0a 2f 2a 0a 20 2a 2d  ====. */../*. *-
bc00: 2d 2d 2d 2d 2d 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 0a 20 2a 0a 20 2a 20 45 6e 63 6f  -----. *. * Enco
bc50: 64 65 45 76 65 6e 74 4d 61 73 6b 20 2d 2d 0a 20  deEventMask --. 
bc60: 2a 0a 20 2a 09 54 68 69 73 20 66 75 6e 63 74 69  *. *.This functi
bc70: 6f 6e 20 74 61 6b 65 73 20 61 20 6c 69 73 74 20  on takes a list 
bc80: 6f 66 20 65 76 65 6e 74 20 69 74 65 6d 73 20 61  of event items a
bc90: 6e 64 20 63 6f 6e 73 74 72 75 63 74 73 20 74 68  nd constructs th
bca0: 65 0a 20 2a 09 65 71 75 69 76 61 6c 65 6e 74 20  e. *.equivalent 
bcb0: 69 6e 74 65 72 6e 61 6c 20 62 69 74 6d 61 73 6b  internal bitmask
bcc0: 2e 20 54 68 65 20 6c 69 73 74 20 68 61 73 20 74  . The list has t
bcd0: 6f 20 63 6f 6e 74 61 69 6e 20 61 74 20 6c 65 61  o contain at lea
bce0: 73 74 20 6f 6e 65 0a 20 2a 09 65 6c 65 6d 65 6e  st one. *.elemen
bcf0: 74 2e 20 45 6c 65 6d 65 6e 74 73 20 61 72 65 20  t. Elements are 
bd00: 22 72 65 61 64 22 2c 20 22 77 72 69 74 65 22 2c  "read", "write",
bd10: 20 6f 72 20 61 6e 79 20 75 6e 69 71 75 65 20 61   or any unique a
bd20: 62 62 72 65 76 69 61 74 69 6f 6e 0a 20 2a 09 74  bbreviation. *.t
bd30: 68 65 72 65 6f 66 2e 20 4e 6f 74 65 20 74 68 61  hereof. Note tha
bd40: 74 20 74 68 65 20 62 69 74 6d 61 73 6b 20 69 73  t the bitmask is
bd50: 20 6e 6f 74 20 63 68 61 6e 67 65 64 20 69 66 20   not changed if 
bd60: 70 72 6f 62 6c 65 6d 73 20 61 72 65 0a 20 2a 09  problems are. *.
bd70: 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 20 2a 0a  encountered.. *.
bd80: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41   * Results:. *.A
bd90: 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 65 72   standard Tcl er
bda0: 72 6f 72 20 63 6f 64 65 2e 20 41 20 62 69 74 6d  ror code. A bitm
bdb0: 61 73 6b 20 77 68 65 72 65 20 54 43 4c 5f 52 45  ask where TCL_RE
bdc0: 41 44 41 42 4c 45 20 61 6e 64 2f 6f 72 0a 20 2a  ADABLE and/or. *
bdd0: 09 54 43 4c 5f 57 52 49 54 41 42 4c 45 20 63 61  .TCL_WRITABLE ca
bde0: 6e 20 62 65 20 73 65 74 2e 0a 20 2a 0a 20 2a 20  n be set.. *. * 
bdf0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
be00: 09 4d 61 79 20 73 68 69 6d 6d 65 72 20 27 6f 62  .May shimmer 'ob
be10: 6a 27 20 74 6f 20 61 20 6c 69 73 74 20 72 65 70  j' to a list rep
be20: 72 65 73 65 6e 74 61 74 69 6f 6e 2e 20 4d 61 79  resentation. May
be30: 20 70 6c 61 63 65 20 61 6e 20 65 72 72 6f 72 20   place an error 
be40: 6d 65 73 73 61 67 65 0a 20 2a 09 69 6e 74 6f 20  message. *.into 
be50: 74 68 65 20 69 6e 74 65 72 70 20 72 65 73 75 6c  the interp resul
be60: 74 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  t.. *. *--------
be70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
be80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
be90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
beb0: 2a 20 44 55 50 4c 49 43 41 54 45 20 6f 66 20 27  * DUPLICATE of '
bec0: 45 6e 63 6f 64 65 45 76 65 6e 74 4d 61 73 6b 27  EncodeEventMask'
bed0: 20 69 6e 20 74 63 6c 49 4f 52 43 68 61 6e 2e 63   in tclIORChan.c
bee0: 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74  . */..static int
bef0: 0a 45 6e 63 6f 64 65 45 76 65 6e 74 4d 61 73 6b  .EncodeEventMask
bf00: 28 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70  (.    Tcl_Interp
bf10: 20 2a 69 6e 74 65 72 70 2c 0a 20 20 20 20 63 6f   *interp,.    co
bf20: 6e 73 74 20 63 68 61 72 20 2a 6f 62 6a 4e 61 6d  nst char *objNam
bf30: 65 2c 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  e,.    Tcl_Obj *
bf40: 6f 62 6a 2c 0a 20 20 20 20 69 6e 74 20 2a 6d 61  obj,.    int *ma
bf50: 73 6b 29 0a 7b 0a 20 20 20 20 69 6e 74 20 65 76  sk).{.    int ev
bf60: 65 6e 74 73 3b 09 09 09 2f 2a 20 4d 61 73 6b 20  ents;.../* Mask 
bf70: 6f 66 20 65 76 65 6e 74 73 20 74 6f 20 70 6f 73  of events to pos
bf80: 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 69 73  t */.    int lis
bf90: 74 63 3b 09 09 09 2f 2a 20 23 65 6c 65 6d 65 6e  tc;.../* #elemen
bfa0: 74 73 20 69 6e 20 65 76 65 6e 74 73 70 65 63 20  ts in eventspec 
bfb0: 6c 69 73 74 20 2a 2f 0a 20 20 20 20 54 63 6c 5f  list */.    Tcl_
bfc0: 4f 62 6a 20 2a 2a 6c 69 73 74 76 3b 09 09 2f 2a  Obj **listv;../*
bfd0: 20 45 6c 65 6d 65 6e 74 73 20 6f 66 20 65 76 65   Elements of eve
bfe0: 6e 74 73 70 65 63 20 6c 69 73 74 20 2a 2f 0a 20  ntspec list */. 
bff0: 20 20 20 69 6e 74 20 65 76 49 6e 64 65 78 3b 09     int evIndex;.
c000: 09 2f 2a 20 49 64 20 6f 66 20 65 76 65 6e 74 20  ./* Id of event 
c010: 66 6f 72 20 61 6e 20 65 6c 65 6d 65 6e 74 20 6f  for an element o
c020: 66 20 74 68 65 20 65 76 65 6e 74 73 70 65 63 0a  f the eventspec.
c030: 09 09 09 09 20 2a 20 6c 69 73 74 2e 20 2a 2f 0a  .... * list. */.
c040: 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 4c 69 73  .    if (Tcl_Lis
c050: 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28  tObjGetElements(
c060: 69 6e 74 65 72 70 2c 20 6f 62 6a 2c 20 26 6c 69  interp, obj, &li
c070: 73 74 63 2c 20 26 6c 69 73 74 76 29 20 21 3d 20  stc, &listv) != 
c080: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72  TCL_OK) {..retur
c090: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
c0a0: 20 7d 0a 0a 20 20 20 20 69 66 20 28 6c 69 73 74   }..    if (list
c0b0: 63 20 3c 20 31 29 20 7b 0a 09 54 63 6c 5f 41 70  c < 1) {..Tcl_Ap
c0c0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
c0d0: 70 2c 20 22 62 61 64 20 22 2c 20 6f 62 6a 4e 61  p, "bad ", objNa
c0e0: 6d 65 2c 20 22 20 6c 69 73 74 3a 20 69 73 20 65  me, " list: is e
c0f0: 6d 70 74 79 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72  mpty", NULL);..r
c100: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
c110: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 65 76 65 6e  .    }..    even
c120: 74 73 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c  ts = 0;.    whil
c130: 65 20 28 6c 69 73 74 63 20 3e 20 30 29 20 7b 0a  e (listc > 0) {.
c140: 09 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 65  .if (Tcl_GetInde
c150: 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  xFromObj(interp,
c160: 20 6c 69 73 74 76 5b 6c 69 73 74 63 2d 31 5d 2c   listv[listc-1],
c170: 20 65 76 65 6e 74 4f 70 74 69 6f 6e 73 2c 0a 09   eventOptions,..
c180: 09 6f 62 6a 4e 61 6d 65 2c 20 30 2c 20 26 65 76  .objName, 0, &ev
c190: 49 6e 64 65 78 29 20 21 3d 20 54 43 4c 5f 4f 4b  Index) != TCL_OK
c1a0: 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  ) {..    return 
c1b0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 09 73  TCL_ERROR;..}..s
c1c0: 77 69 74 63 68 20 28 65 76 49 6e 64 65 78 29 20  witch (evIndex) 
c1d0: 7b 0a 09 63 61 73 65 20 45 56 45 4e 54 5f 52 45  {..case EVENT_RE
c1e0: 41 44 3a 0a 09 20 20 20 20 65 76 65 6e 74 73 20  AD:..    events 
c1f0: 7c 3d 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 3b  |= TCL_READABLE;
c200: 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61  ..    break;..ca
c210: 73 65 20 45 56 45 4e 54 5f 57 52 49 54 45 3a 0a  se EVENT_WRITE:.
c220: 09 20 20 20 20 65 76 65 6e 74 73 20 7c 3d 20 54  .    events |= T
c230: 43 4c 5f 57 52 49 54 41 42 4c 45 3b 0a 09 20 20  CL_WRITABLE;..  
c240: 20 20 62 72 65 61 6b 3b 0a 09 7d 0a 09 6c 69 73    break;..}..lis
c250: 74 63 20 2d 2d 3b 0a 20 20 20 20 7d 0a 0a 20 20  tc --;.    }..  
c260: 20 20 2a 6d 61 73 6b 20 3d 20 65 76 65 6e 74 73    *mask = events
c270: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
c280: 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  _OK;.}.../*. *--
c290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c2a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c2b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c2c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c2d0: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 65 63 6f 64  ----. *. * Decod
c2e0: 65 45 76 65 6e 74 4d 61 73 6b 20 2d 2d 0a 20 2a  eEventMask --. *
c2f0: 0a 20 2a 09 54 68 69 73 20 66 75 6e 63 74 69 6f  . *.This functio
c300: 6e 20 74 61 6b 65 73 20 61 6e 20 69 6e 74 65 72  n takes an inter
c310: 6e 61 6c 20 62 69 74 6d 61 73 6b 20 6f 66 20 65  nal bitmask of e
c320: 76 65 6e 74 73 20 61 6e 64 20 63 6f 6e 73 74 72  vents and constr
c330: 75 63 74 73 20 74 68 65 0a 20 2a 09 65 71 75 69  ucts the. *.equi
c340: 76 61 6c 65 6e 74 20 6c 69 73 74 20 6f 66 20 65  valent list of e
c350: 76 65 6e 74 20 69 74 65 6d 73 2e 0a 20 2a 0a 20  vent items.. *. 
c360: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20  * Results:. *.A 
c370: 54 63 6c 5f 4f 62 6a 20 72 65 66 65 72 65 6e 63  Tcl_Obj referenc
c380: 65 2e 20 54 68 65 20 6f 62 6a 65 63 74 20 77 69  e. The object wi
c390: 6c 6c 20 68 61 76 65 20 61 20 72 65 66 43 6f 75  ll have a refCou
c3a0: 6e 74 20 6f 66 20 6f 6e 65 2e 20 54 68 65 20 75  nt of one. The u
c3b0: 73 65 72 0a 20 2a 09 68 61 73 20 74 6f 20 64 65  ser. *.has to de
c3c0: 63 72 65 6d 65 6e 74 20 69 74 20 74 6f 20 72 65  crement it to re
c3d0: 6c 65 61 73 65 20 74 68 65 20 6f 62 6a 65 63 74  lease the object
c3e0: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  .. *. * Side eff
c3f0: 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20  ects:. *.None.. 
c400: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
c410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 20 44 55  ----------. * DU
c450: 50 4c 49 43 41 54 45 20 6f 66 20 27 44 65 63 6f  PLICATE of 'Deco
c460: 64 65 45 76 65 6e 74 4d 61 73 6b 27 20 69 6e 20  deEventMask' in 
c470: 74 63 6c 49 4f 52 43 68 61 6e 2e 63 0a 20 2a 2f  tclIORChan.c. */
c480: 0a 0a 73 74 61 74 69 63 20 54 63 6c 5f 4f 62 6a  ..static Tcl_Obj
c490: 20 2a 0a 44 65 63 6f 64 65 45 76 65 6e 74 4d 61   *.DecodeEventMa
c4a0: 73 6b 28 0a 20 20 20 20 69 6e 74 20 6d 61 73 6b  sk(.    int mask
c4b0: 29 0a 7b 0a 20 20 20 20 72 65 67 69 73 74 65 72  ).{.    register
c4c0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 65 76 65   const char *eve
c4d0: 6e 74 53 74 72 3b 0a 20 20 20 20 54 63 6c 5f 4f  ntStr;.    Tcl_O
c4e0: 62 6a 20 2a 65 76 4f 62 6a 3b 0a 0a 20 20 20 20  bj *evObj;..    
c4f0: 73 77 69 74 63 68 20 28 6d 61 73 6b 20 26 20 52  switch (mask & R
c500: 41 4e 44 57 29 20 7b 0a 20 20 20 20 63 61 73 65  ANDW) {.    case
c510: 20 52 41 4e 44 57 3a 0a 09 65 76 65 6e 74 53 74   RANDW:..eventSt
c520: 72 20 3d 20 22 72 65 61 64 20 77 72 69 74 65 22  r = "read write"
c530: 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  ;..break;.    ca
c540: 73 65 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 3a  se TCL_READABLE:
c550: 0a 09 65 76 65 6e 74 53 74 72 20 3d 20 22 72 65  ..eventStr = "re
c560: 61 64 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20  ad";..break;.   
c570: 20 63 61 73 65 20 54 43 4c 5f 57 52 49 54 41 42   case TCL_WRITAB
c580: 4c 45 3a 0a 09 65 76 65 6e 74 53 74 72 20 3d 20  LE:..eventStr = 
c590: 22 77 72 69 74 65 22 3b 0a 09 62 72 65 61 6b 3b  "write";..break;
c5a0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 65  .    default:..e
c5b0: 76 65 6e 74 53 74 72 20 3d 20 22 22 3b 0a 09 62  ventStr = "";..b
c5c0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
c5d0: 20 65 76 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77   evObj = Tcl_New
c5e0: 53 74 72 69 6e 67 4f 62 6a 28 65 76 65 6e 74 53  StringObj(eventS
c5f0: 74 72 2c 20 2d 31 29 3b 0a 20 20 20 20 54 63 6c  tr, -1);.    Tcl
c600: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 65 76  _IncrRefCount(ev
c610: 4f 62 6a 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Obj);.    return
c620: 20 65 76 4f 62 6a 3b 0a 7d 0a 0c 0a 2f 2a 0a 20   evObj;.}.../*. 
c630: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
c640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c670: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4e 65  -------. *. * Ne
c680: 77 52 65 66 6c 65 63 74 65 64 54 72 61 6e 73 66  wReflectedTransf
c690: 6f 72 6d 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69  orm --. *. *.Thi
c6a0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e  s function is in
c6b0: 76 6f 6b 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74  voked to allocat
c6c0: 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  e and initialize
c6d0: 20 74 68 65 20 69 6e 73 74 61 6e 63 65 20 64 61   the instance da
c6e0: 74 61 0a 20 2a 09 6f 66 20 61 20 6e 65 77 20 72  ta. *.of a new r
c6f0: 65 66 6c 65 63 74 65 64 20 63 68 61 6e 6e 65 6c  eflected channel
c700: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
c710: 0a 20 2a 09 41 20 68 65 61 70 2d 61 6c 6c 6f 63  . *.A heap-alloc
c720: 61 74 65 64 20 63 68 61 6e 6e 65 6c 20 69 6e 73  ated channel ins
c730: 74 61 6e 63 65 2e 0a 20 2a 0a 20 2a 20 53 69 64  tance.. *. * Sid
c740: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 41 6c  e effects:. *.Al
c750: 6c 6f 63 61 74 65 73 20 6d 65 6d 6f 72 79 2e 0a  locates memory..
c760: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
c770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c7a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
c7b0: 0a 73 74 61 74 69 63 20 52 65 66 6c 65 63 74 65  .static Reflecte
c7c0: 64 54 72 61 6e 73 66 6f 72 6d 20 2a 0a 4e 65 77  dTransform *.New
c7d0: 52 65 66 6c 65 63 74 65 64 54 72 61 6e 73 66 6f  ReflectedTransfo
c7e0: 72 6d 28 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65  rm(.    Tcl_Inte
c7f0: 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 20 20  rp *interp,.    
c800: 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 70 66 78 4f  Tcl_Obj *cmdpfxO
c810: 62 6a 2c 0a 20 20 20 20 69 6e 74 20 6d 6f 64 65  bj,.    int mode
c820: 2c 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 68  ,.    Tcl_Obj *h
c830: 61 6e 64 6c 65 4f 62 6a 2c 0a 20 20 20 20 54 63  andleObj,.    Tc
c840: 6c 5f 43 68 61 6e 6e 65 6c 20 70 61 72 65 6e 74  l_Channel parent
c850: 43 68 61 6e 29 0a 7b 0a 20 20 20 20 52 65 66 6c  Chan).{.    Refl
c860: 65 63 74 65 64 54 72 61 6e 73 66 6f 72 6d 20 2a  ectedTransform *
c870: 72 74 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 6c  rtPtr;.    int l
c880: 69 73 74 63 3b 0a 20 20 20 20 54 63 6c 5f 4f 62  istc;.    Tcl_Ob
c890: 6a 20 2a 2a 6c 69 73 74 76 3b 0a 20 20 20 20 69  j **listv;.    i
c8a0: 6e 74 20 69 3b 0a 0a 20 20 20 20 72 74 50 74 72  nt i;..    rtPtr
c8b0: 20 3d 20 28 52 65 66 6c 65 63 74 65 64 54 72 61   = (ReflectedTra
c8c0: 6e 73 66 6f 72 6d 20 2a 29 20 63 6b 61 6c 6c 6f  nsform *) ckallo
c8d0: 63 28 73 69 7a 65 6f 66 28 52 65 66 6c 65 63 74  c(sizeof(Reflect
c8e0: 65 64 54 72 61 6e 73 66 6f 72 6d 29 29 3b 0a 0a  edTransform));..
c8f0: 20 20 20 20 2f 2a 20 72 74 50 74 72 2d 3e 63 68      /* rtPtr->ch
c900: 61 6e 3a 20 41 73 73 69 67 6e 65 64 20 62 79 20  an: Assigned by 
c910: 63 61 6c 6c 65 72 2e 20 44 75 6d 6d 79 20 64 61  caller. Dummy da
c920: 74 61 20 68 65 72 65 2e 20 2a 2f 0a 20 20 20 20  ta here. */.    
c930: 2f 2a 20 72 74 50 74 72 2d 3e 6d 65 74 68 6f 64  /* rtPtr->method
c940: 73 3a 20 41 73 73 69 67 6e 65 64 20 62 79 20 63  s: Assigned by c
c950: 61 6c 6c 65 72 2e 20 44 75 6d 6d 79 20 64 61 74  aller. Dummy dat
c960: 61 20 68 65 72 65 2e 20 2a 2f 0a 0a 20 20 20 20  a here. */..    
c970: 72 74 50 74 72 2d 3e 63 68 61 6e 20 3d 20 4e 55  rtPtr->chan = NU
c980: 4c 4c 3b 0a 20 20 20 20 72 74 50 74 72 2d 3e 70  LL;.    rtPtr->p
c990: 61 72 65 6e 74 20 3d 20 70 61 72 65 6e 74 43 68  arent = parentCh
c9a0: 61 6e 3b 0a 20 20 20 20 72 74 50 74 72 2d 3e 69  an;.    rtPtr->i
c9b0: 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a  nterp = interp;.
c9c0: 23 69 66 64 65 66 20 54 43 4c 5f 54 48 52 45 41  #ifdef TCL_THREA
c9d0: 44 53 0a 20 20 20 20 72 74 50 74 72 2d 3e 74 68  DS.    rtPtr->th
c9e0: 72 65 61 64 20 3d 20 54 63 6c 5f 47 65 74 43 75  read = Tcl_GetCu
c9f0: 72 72 65 6e 74 54 68 72 65 61 64 28 29 3b 0a 23  rrentThread();.#
ca00: 65 6e 64 69 66 0a 20 20 20 20 72 74 50 74 72 2d  endif.    rtPtr-
ca10: 3e 74 69 6d 65 72 20 20 3d 20 28 54 63 6c 5f 54  >timer  = (Tcl_T
ca20: 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 3b  imerToken) NULL;
ca30: 0a 20 20 20 20 72 74 50 74 72 2d 3e 6d 65 74 68  .    rtPtr->meth
ca40: 6f 64 73 20 3d 20 30 3b 0a 20 20 20 20 72 74 50  ods = 0;.    rtP
ca50: 74 72 2d 3e 6d 6f 64 65 20 3d 20 30 3b 0a 20 20  tr->mode = 0;.  
ca60: 20 20 72 74 50 74 72 2d 3e 69 6e 74 65 72 65 73    rtPtr->interes
ca70: 74 20 3d 20 30 3b 09 09 2f 2a 20 49 6e 69 74 69  t = 0;../* Initi
ca80: 61 6c 6c 79 20 6e 6f 20 69 6e 74 65 72 65 73 74  ally no interest
ca90: 20 72 65 67 69 73 74 65 72 65 64 20 2a 2f 0a 20   registered */. 
caa0: 20 20 20 72 74 50 74 72 2d 3e 72 65 61 64 49 73     rtPtr->readIs
cab0: 44 72 61 69 6e 65 64 20 3d 20 30 3b 0a 20 20 20  Drained = 0;.   
cac0: 20 72 74 50 74 72 2d 3e 62 6c 6f 63 6b 69 6e 67   rtPtr->blocking
cad0: 20 3d 20 31 3b 20 2f 2a 20 49 6e 69 74 69 61 6c   = 1; /* Initial
cae0: 6c 79 20 61 20 62 6c 6f 63 6b 69 6e 67 20 63 68  ly a blocking ch
caf0: 61 6e 6e 65 6c 20 3f 0a 09 09 09 20 20 2a 20 54  annel ?....  * T
cb00: 4f 44 4f 20 2f 2f 20 51 75 65 72 79 20 70 61 72  ODO // Query par
cb10: 65 6e 74 20 66 6f 72 20 63 75 72 72 65 6e 74 20  ent for current 
cb20: 6d 6f 64 65 2e 0a 09 09 09 20 20 2a 2f 0a 0a 20  mode.....  */.. 
cb30: 20 20 20 52 65 73 75 6c 74 49 6e 69 74 20 28 26     ResultInit (&
cb40: 72 74 50 74 72 2d 3e 72 65 73 75 6c 74 29 3b 0a  rtPtr->result);.
cb50: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 4d  .    /*.     * M
cb60: 65 74 68 6f 64 20 70 6c 61 63 65 68 6f 6c 64 65  ethod placeholde
cb70: 72 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20  r..     */..    
cb80: 2f 2a 20 41 53 53 45 52 54 3a 20 63 6d 64 70 66  /* ASSERT: cmdpf
cb90: 78 4f 62 6a 20 69 73 20 61 20 54 63 6c 20 4c 69  xObj is a Tcl Li
cba0: 73 74 20 2a 2f 0a 0a 20 20 20 20 54 63 6c 5f 4c  st */..    Tcl_L
cbb0: 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74  istObjGetElement
cbc0: 73 28 69 6e 74 65 72 70 2c 20 63 6d 64 70 66 78  s(interp, cmdpfx
cbd0: 4f 62 6a 2c 20 26 6c 69 73 74 63 2c 20 26 6c 69  Obj, &listc, &li
cbe0: 73 74 76 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20  stv);..    /*.  
cbf0: 20 20 20 2a 20 53 65 65 20 5b 3d 3d 5d 20 61 73     * See [==] as
cc00: 20 77 65 6c 6c 2e 0a 20 20 20 20 20 2a 20 53 74   well..     * St
cc10: 6f 72 61 67 65 20 66 6f 72 20 74 68 65 20 63 6f  orage for the co
cc20: 6d 6d 61 6e 64 20 70 72 65 66 69 78 20 61 6e 64  mmand prefix and
cc30: 20 74 68 65 20 61 64 64 69 74 69 6f 6e 61 6c 20   the additional 
cc40: 77 6f 72 64 73 20 72 65 71 75 69 72 65 64 20 66  words required f
cc50: 6f 72 0a 20 20 20 20 20 2a 20 74 68 65 20 69 6e  or.     * the in
cc60: 76 6f 63 61 74 69 6f 6e 20 6f 66 20 6d 65 74 68  vocation of meth
cc70: 6f 64 73 20 69 6e 20 74 68 65 20 63 6f 6d 6d 61  ods in the comma
cc80: 6e 64 20 68 61 6e 64 6c 65 72 2e 0a 20 20 20 20  nd handler..    
cc90: 20 2a 0a 20 20 20 20 20 2a 20 6c 69 73 74 76 20   *.     * listv 
cca0: 5b 30 5d 20 5b 6c 69 73 74 63 2d 31 5d 20 7c 20  [0] [listc-1] | 
ccb0: 5b 6c 69 73 74 63 5d 20 20 5b 6c 69 73 74 63 2b  [listc]  [listc+
ccc0: 31 5d 20 7c 0a 20 20 20 20 20 2a 20 61 72 67 76  1] |.     * argv
ccd0: 20 20 5b 30 5d 20 20 20 2e 2e 2e 20 5b 2e 5d 20    [0]   ... [.] 
cce0: 7c 20 5b 61 72 67 63 2d 32 5d 20 5b 61 72 67 63  | [argc-2] [argc
ccf0: 2d 31 5d 20 20 7c 20 5b 61 72 67 63 5d 20 20 5b  -1]  | [argc]  [
cd00: 61 72 67 63 2b 32 5d 0a 20 20 20 20 20 2a 20 20  argc+2].     *  
cd10: 20 20 20 20 20 63 6d 64 20 20 20 2e 2e 2e 20 70       cmd   ... p
cd20: 66 78 20 7c 20 6d 65 74 68 6f 64 20 20 20 63 68  fx | method   ch
cd30: 61 6e 20 20 20 20 20 20 7c 20 64 65 74 61 69 6c  an      | detail
cd40: 31 20 64 65 74 61 69 6c 32 0a 20 20 20 20 20 2a  1 detail2.     *
cd50: 2f 0a 0a 20 20 20 20 72 74 50 74 72 2d 3e 61 72  /..    rtPtr->ar
cd60: 67 63 20 3d 20 6c 69 73 74 63 20 2b 20 32 3b 0a  gc = listc + 2;.
cd70: 20 20 20 20 72 74 50 74 72 2d 3e 61 72 67 76 20      rtPtr->argv 
cd80: 3d 20 28 54 63 6c 5f 4f 62 6a 2a 2a 29 20 63 6b  = (Tcl_Obj**) ck
cd90: 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 54 63 6c  alloc(sizeof(Tcl
cda0: 5f 4f 62 6a 2a 29 20 2a 20 28 6c 69 73 74 63 2b  _Obj*) * (listc+
cdb0: 34 29 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20  4));..    /*.   
cdc0: 20 20 2a 20 44 75 70 6c 69 63 61 74 65 20 6f 62    * Duplicate ob
cdd0: 6a 65 63 74 20 72 65 66 65 72 65 6e 63 65 73 2e  ject references.
cde0: 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 66 6f  .     */..    fo
cdf0: 72 20 28 69 3d 30 3b 20 69 3c 6c 69 73 74 63 20  r (i=0; i<listc 
ce00: 3b 20 69 2b 2b 29 20 7b 0a 09 54 63 6c 5f 4f 62  ; i++) {..Tcl_Ob
ce10: 6a 20 2a 77 6f 72 64 20 3d 20 72 74 50 74 72 2d  j *word = rtPtr-
ce20: 3e 61 72 67 76 5b 69 5d 20 3d 20 6c 69 73 74 76  >argv[i] = listv
ce30: 5b 69 5d 3b 0a 09 54 63 6c 5f 49 6e 63 72 52 65  [i];..Tcl_IncrRe
ce40: 66 43 6f 75 6e 74 28 77 6f 72 64 29 3b 0a 20 20  fCount(word);.  
ce50: 20 20 7d 0a 0a 20 20 20 20 69 2b 2b 3b 09 09 09    }..    i++;...
ce60: 09 2f 2a 20 53 6b 69 70 20 70 6c 61 63 65 68 6f  ./* Skip placeho
ce70: 6c 64 65 72 20 66 6f 72 20 6d 65 74 68 6f 64 20  lder for method 
ce80: 2a 2f 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20  */..    /*.     
ce90: 2a 20 53 65 65 20 5b 78 5d 20 69 6e 20 46 72 65  * See [x] in Fre
cea0: 65 52 65 66 6c 65 63 74 65 64 54 72 61 6e 73 66  eReflectedTransf
ceb0: 6f 72 6d 20 66 6f 72 20 72 65 6c 65 61 73 65 0a  orm for release.
cec0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 72 74 50 74       */.    rtPt
ced0: 72 2d 3e 61 72 67 76 5b 69 5d 20 3d 20 68 61 6e  r->argv[i] = han
cee0: 64 6c 65 4f 62 6a 3b 0a 20 20 20 20 54 63 6c 5f  dleObj;.    Tcl_
cef0: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 68 61 6e  IncrRefCount(han
cf00: 64 6c 65 4f 62 6a 29 3b 0a 0a 20 20 20 20 2f 2a  dleObj);..    /*
cf10: 0a 20 20 20 20 20 2a 20 54 68 65 20 6e 65 78 74  .     * The next
cf20: 20 74 77 6f 20 6f 62 6a 65 63 74 73 20 61 72 65   two objects are
cf30: 20 6b 65 70 74 20 65 6d 70 74 79 2c 20 76 61 72   kept empty, var
cf40: 79 69 6e 67 20 61 72 67 75 6d 65 6e 74 73 2e 0a  ying arguments..
cf50: 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 2f 2a 0a       */..    /*.
cf60: 20 20 20 20 20 2a 20 49 6e 69 74 69 61 6c 69 7a       * Initializ
cf70: 61 74 69 6f 6e 20 63 6f 6d 70 6c 65 74 65 2e 0a  ation complete..
cf80: 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 72 65 74       */..    ret
cf90: 75 72 6e 20 72 74 50 74 72 3b 0a 7d 0a 0c 0a 2f  urn rtPtr;.}.../
cfa0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
cfb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cfc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cfd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cfe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
cff0: 20 4e 65 78 74 48 61 6e 64 6c 65 20 2d 2d 0a 20   NextHandle --. 
d000: 2a 0a 20 2a 09 54 68 69 73 20 66 75 6e 63 74 69  *. *.This functi
d010: 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f  on is invoked to
d020: 20 67 65 6e 65 72 61 74 65 20 61 20 63 68 61 6e   generate a chan
d030: 6e 65 6c 20 68 61 6e 64 6c 65 20 66 6f 72 20 61  nel handle for a
d040: 20 6e 65 77 0a 20 2a 09 72 65 66 6c 65 63 74 65   new. *.reflecte
d050: 64 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a  d channel.. *. *
d060: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 54   Results:. *.A T
d070: 63 6c 5f 4f 62 6a 20 63 6f 6e 74 61 69 6e 69 6e  cl_Obj containin
d080: 67 20 74 68 65 20 73 74 72 69 6e 67 20 6f 66 20  g the string of 
d090: 74 68 65 20 6e 65 77 20 63 68 61 6e 6e 65 6c 20  the new channel 
d0a0: 68 61 6e 64 6c 65 2e 20 54 68 65 0a 20 2a 09 72  handle. The. *.r
d0b0: 65 66 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 72  efcount of the r
d0c0: 65 74 75 72 6e 65 64 20 6f 62 6a 65 63 74 20 69  eturned object i
d0d0: 73 20 2d 2d 20 7a 65 72 6f 20 2d 2d 2e 0a 20 2a  s -- zero --.. *
d0e0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
d0f0: 3a 0a 20 2a 09 4d 61 79 20 61 6c 6c 6f 63 61 74  :. *.May allocat
d100: 65 20 6d 65 6d 6f 72 79 2e 20 4d 75 74 65 78 20  e memory. Mutex 
d110: 70 72 6f 74 65 63 74 65 64 20 63 72 69 74 69 63  protected critic
d120: 61 6c 20 73 65 63 74 69 6f 6e 20 6c 6f 63 6b 73  al section locks
d130: 20 6f 75 74 20 6f 74 68 65 72 0a 20 2a 09 74 68   out other. *.th
d140: 72 65 61 64 73 20 66 6f 72 20 61 20 73 68 6f 72  reads for a shor
d150: 74 20 74 69 6d 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d  t time.. *. *---
d160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d1a0: 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20  ---. */..static 
d1b0: 54 63 6c 5f 4f 62 6a 20 2a 0a 4e 65 78 74 48 61  Tcl_Obj *.NextHa
d1c0: 6e 64 6c 65 28 76 6f 69 64 29 0a 7b 0a 20 20 20  ndle(void).{.   
d1d0: 20 2f 2a 0a 20 20 20 20 20 2a 20 43 6f 75 6e 74   /*.     * Count
d1e0: 20 6e 75 6d 62 65 72 20 6f 66 20 67 65 6e 65 72   number of gener
d1f0: 61 74 65 64 20 72 65 66 6c 65 63 74 65 64 20 63  ated reflected c
d200: 68 61 6e 6e 65 6c 73 2e 20 55 73 65 64 20 66 6f  hannels. Used fo
d210: 72 20 69 64 20 67 65 6e 65 72 61 74 69 6f 6e 2e  r id generation.
d220: 0a 20 20 20 20 20 2a 20 49 64 73 20 61 72 65 20  .     * Ids are 
d230: 6e 65 76 65 72 20 72 65 63 6c 61 69 6d 65 64 20  never reclaimed 
d240: 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20  and there is no 
d250: 64 65 61 6c 69 6e 67 20 77 69 74 68 20 77 72 61  dealing with wra
d260: 70 20 61 72 6f 75 6e 64 2e 20 4f 6e 0a 20 20 20  p around. On.   
d270: 20 20 2a 20 74 68 65 20 6f 74 68 65 72 20 68 61    * the other ha
d280: 6e 64 2c 20 22 75 6e 73 69 67 6e 65 64 20 6c 6f  nd, "unsigned lo
d290: 6e 67 22 20 73 68 6f 75 6c 64 20 62 65 20 62 69  ng" should be bi
d2a0: 67 20 65 6e 6f 75 67 68 20 65 78 63 65 70 74 20  g enough except 
d2b0: 66 6f 72 0a 20 20 20 20 20 2a 20 61 62 73 6f 6c  for.     * absol
d2c0: 75 74 65 20 6c 6f 6e 67 72 75 6e 6e 65 72 73 20  ute longrunners 
d2d0: 28 67 65 6e 65 72 61 74 65 20 61 20 31 30 30 20  (generate a 100 
d2e0: 69 64 73 20 70 65 72 20 73 65 63 6f 6e 64 20 3d  ids per second =
d2f0: 3e 20 6f 76 65 72 66 6c 6f 77 20 77 69 6c 6c 0a  > overflow will.
d300: 20 20 20 20 20 2a 20 6f 63 63 75 72 20 69 6e 20       * occur in 
d310: 31 20 31 2f 33 20 79 65 61 72 73 29 2e 0a 20 20  1 1/3 years)..  
d320: 20 20 20 2a 2f 0a 0a 20 20 20 20 54 43 4c 5f 44     */..    TCL_D
d330: 45 43 4c 41 52 45 5f 4d 55 54 45 58 28 72 74 43  ECLARE_MUTEX(rtC
d340: 6f 75 6e 74 65 72 4d 75 74 65 78 29 0a 20 20 20  ounterMutex).   
d350: 20 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64   static unsigned
d360: 20 6c 6f 6e 67 20 72 74 43 6f 75 6e 74 65 72 20   long rtCounter 
d370: 3d 20 30 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  = 0;.    Tcl_Obj
d380: 20 2a 72 65 73 4f 62 6a 3b 0a 0a 20 20 20 20 54   *resObj;..    T
d390: 63 6c 5f 4d 75 74 65 78 4c 6f 63 6b 28 26 72 74  cl_MutexLock(&rt
d3a0: 43 6f 75 6e 74 65 72 4d 75 74 65 78 29 3b 0a 20  CounterMutex);. 
d3b0: 20 20 20 72 65 73 4f 62 6a 20 3d 20 54 63 6c 5f     resObj = Tcl_
d3c0: 4f 62 6a 50 72 69 6e 74 66 28 22 72 74 25 6c 75  ObjPrintf("rt%lu
d3d0: 22 2c 20 72 74 43 6f 75 6e 74 65 72 29 3b 0a 20  ", rtCounter);. 
d3e0: 20 20 20 72 74 43 6f 75 6e 74 65 72 2b 2b 3b 0a     rtCounter++;.
d3f0: 20 20 20 20 54 63 6c 5f 4d 75 74 65 78 55 6e 6c      Tcl_MutexUnl
d400: 6f 63 6b 28 26 72 74 43 6f 75 6e 74 65 72 4d 75  ock(&rtCounterMu
d410: 74 65 78 29 3b 0a 0a 20 20 20 20 72 65 74 75 72  tex);..    retur
d420: 6e 20 72 65 73 4f 62 6a 3b 0a 7d 0a 0c 0a 73 74  n resObj;.}...st
d430: 61 74 69 63 20 76 6f 69 64 0a 46 72 65 65 52 65  atic void.FreeRe
d440: 66 6c 65 63 74 65 64 54 72 61 6e 73 66 6f 72 6d  flectedTransform
d450: 28 0a 20 20 20 20 52 65 66 6c 65 63 74 65 64 54  (.    ReflectedT
d460: 72 61 6e 73 66 6f 72 6d 20 2a 72 74 50 74 72 29  ransform *rtPtr)
d470: 0a 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6e 3b  .{.    int i, n;
d480: 0a 0a 20 20 20 20 54 69 6d 65 72 4b 69 6c 6c 20  ..    TimerKill 
d490: 20 20 28 72 74 50 74 72 29 3b 0a 20 20 20 20 52    (rtPtr);.    R
d4a0: 65 73 75 6c 74 43 6c 65 61 72 20 28 26 72 74 50  esultClear (&rtP
d4b0: 74 72 2d 3e 72 65 73 75 6c 74 29 3b 0a 0a 20 20  tr->result);..  
d4c0: 20 20 6e 20 3d 20 72 74 50 74 72 2d 3e 61 72 67    n = rtPtr->arg
d4d0: 63 20 2d 20 32 3b 0a 20 20 20 20 66 6f 72 20 28  c - 2;.    for (
d4e0: 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 20 7b  i=0; i<n; i++) {
d4f0: 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75  ..Tcl_DecrRefCou
d500: 6e 74 28 72 74 50 74 72 2d 3e 61 72 67 76 5b 69  nt(rtPtr->argv[i
d510: 5d 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ]);.    }..    /
d520: 2a 0a 20 20 20 20 20 2a 20 53 65 65 20 5b 78 5d  *.     * See [x]
d530: 20 69 6e 20 4e 65 77 52 65 66 6c 65 63 74 65 64   in NewReflected
d540: 54 72 61 6e 73 66 6f 72 6d 20 66 6f 72 20 6c 6f  Transform for lo
d550: 63 6b 0a 20 20 20 20 20 2a 20 6e 2b 31 20 3d 20  ck.     * n+1 = 
d560: 61 72 67 63 2d 31 2e 0a 20 20 20 20 20 2a 2f 0a  argc-1..     */.
d570: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
d580: 6f 75 6e 74 28 72 74 50 74 72 2d 3e 61 72 67 76  ount(rtPtr->argv
d590: 5b 6e 2b 31 5d 29 3b 0a 0a 20 20 20 20 63 6b 66  [n+1]);..    ckf
d5a0: 72 65 65 28 28 63 68 61 72 2a 29 20 72 74 50 74  ree((char*) rtPt
d5b0: 72 2d 3e 61 72 67 76 29 3b 0a 20 20 20 20 63 6b  r->argv);.    ck
d5c0: 66 72 65 65 28 28 63 68 61 72 2a 29 20 72 74 50  free((char*) rtP
d5d0: 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  tr);.}.../*. *--
d5e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d5f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d620: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 49 6e 76 6f 6b  ----. *. * Invok
d630: 65 54 63 6c 4d 65 74 68 6f 64 20 2d 2d 0a 20 2a  eTclMethod --. *
d640: 0a 20 2a 09 54 68 69 73 20 66 75 6e 63 74 69 6f  . *.This functio
d650: 6e 20 69 73 20 75 73 65 64 20 74 6f 20 69 6e 76  n is used to inv
d660: 6f 6b 65 20 74 68 65 20 54 63 6c 20 6c 65 76 65  oke the Tcl leve
d670: 6c 20 6f 66 20 61 20 72 65 66 6c 65 63 74 65 64  l of a reflected
d680: 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 09 49 74 20   channel.. *.It 
d690: 68 61 6e 64 6c 65 73 20 61 6c 6c 20 74 68 65 20  handles all the 
d6a0: 63 6f 6d 6d 61 6e 64 20 61 73 73 65 6d 62 6c 79  command assembly
d6b0: 2c 20 69 6e 76 6f 6b 61 74 69 6f 6e 2c 20 61 6e  , invokation, an
d6c0: 64 20 67 65 6e 65 72 69 63 20 73 74 61 74 65 20  d generic state 
d6d0: 61 6e 64 0a 20 2a 09 72 65 73 75 6c 74 20 6d 67  and. *.result mg
d6e0: 6d 74 2e 20 49 74 20 64 6f 65 73 20 2a 6e 6f 74  mt. It does *not
d6f0: 2a 20 68 61 6e 64 6c 65 20 74 68 72 65 61 64 20  * handle thread 
d700: 72 65 64 69 72 65 63 74 69 6f 6e 3b 20 74 68 61  redirection; tha
d710: 74 20 69 73 20 74 68 65 0a 20 2a 09 72 65 73 70  t is the. *.resp
d720: 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 63 6c  onsibility of cl
d730: 69 65 6e 74 73 20 6f 66 20 74 68 69 73 20 66 75  ients of this fu
d740: 6e 63 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65  nction.. *. * Re
d750: 73 75 6c 74 73 3a 0a 20 2a 09 52 65 73 75 6c 74  sults:. *.Result
d760: 20 63 6f 64 65 20 61 6e 64 20 64 61 74 61 20 61   code and data a
d770: 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  s returned by th
d780: 65 20 6d 65 74 68 6f 64 2e 0a 20 2a 0a 20 2a 20  e method.. *. * 
d790: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
d7a0: 09 41 72 62 69 74 72 61 72 79 2c 20 61 73 20 69  .Arbitrary, as i
d7b0: 74 20 63 61 6c 6c 73 20 75 70 6f 6e 20 61 20 54  t calls upon a T
d7c0: 63 6c 20 73 63 72 69 70 74 2e 0a 20 2a 0a 20 2a  cl script.. *. *
d7d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d7e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d7f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d810: 2d 2d 2d 2d 2d 2d 0a 20 2a 20 53 65 6d 69 2d 44  ------. * Semi-D
d820: 55 50 4c 49 43 41 54 45 20 6f 66 20 27 49 6e 76  UPLICATE of 'Inv
d830: 6f 6b 65 54 63 6c 4d 65 74 68 6f 64 27 20 69 6e  okeTclMethod' in
d840: 20 74 63 6c 49 4f 52 43 68 61 6e 2e 63 0a 20 2a   tclIORChan.c. *
d850: 20 2d 20 53 65 6d 69 20 62 65 63 61 75 73 65 20   - Semi because 
d860: 64 69 66 66 65 72 65 6e 74 20 73 74 72 75 63 74  different struct
d870: 75 72 65 73 20 61 72 65 20 75 73 65 64 2e 0a 20  ures are used.. 
d880: 2a 20 2d 20 53 74 69 6c 6c 20 70 6f 73 73 69 62  * - Still possib
d890: 6c 65 20 74 6f 20 66 61 63 74 6f 72 20 6f 75 74  le to factor out
d8a0: 20 74 68 65 20 63 6f 6d 6d 6f 6e 61 6c 69 74 69   the commonaliti
d8b0: 65 73 20 69 6e 74 6f 20 61 20 73 65 70 61 72 61  es into a separa
d8c0: 74 65 20 73 74 72 75 63 74 75 72 65 2e 0a 20 2a  te structure.. *
d8d0: 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 49 6e  /..static int.In
d8e0: 76 6f 6b 65 54 63 6c 4d 65 74 68 6f 64 28 0a 20  vokeTclMethod(. 
d8f0: 20 20 20 52 65 66 6c 65 63 74 65 64 54 72 61 6e     ReflectedTran
d900: 73 66 6f 72 6d 20 2a 72 74 50 74 72 2c 0a 20 20  sform *rtPtr,.  
d910: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6d 65    const char *me
d920: 74 68 6f 64 2c 0a 20 20 20 20 54 63 6c 5f 4f 62  thod,.    Tcl_Ob
d930: 6a 20 2a 61 72 67 4f 6e 65 4f 62 6a 2c 09 09 2f  j *argOneObj,../
d940: 2a 20 4e 55 4c 4c 27 61 62 6c 65 20 2a 2f 0a 20  * NULL'able */. 
d950: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 61 72 67 54     Tcl_Obj *argT
d960: 77 6f 4f 62 6a 2c 09 09 2f 2a 20 4e 55 4c 4c 27  woObj,../* NULL'
d970: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 54 63 6c 5f  able */.    Tcl_
d980: 4f 62 6a 20 2a 2a 72 65 73 75 6c 74 4f 62 6a 50  Obj **resultObjP
d990: 74 72 29 09 2f 2a 20 4e 55 4c 4c 27 61 62 6c 65  tr)./* NULL'able
d9a0: 20 2a 2f 0a 7b 0a 20 20 20 20 69 6e 74 20 63 6d   */.{.    int cm
d9b0: 64 63 3b 09 09 09 2f 2a 20 23 77 6f 72 64 73 20  dc;.../* #words 
d9c0: 69 6e 20 63 6f 6e 73 74 72 75 63 74 65 64 20 63  in constructed c
d9d0: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63  ommand */.    Tc
d9e0: 6c 5f 4f 62 6a 20 2a 6d 65 74 68 4f 62 6a 20 3d  l_Obj *methObj =
d9f0: 20 4e 55 4c 4c 3b 09 2f 2a 20 4d 65 74 68 6f 64   NULL;./* Method
da00: 20 6e 61 6d 65 20 69 6e 20 6f 62 6a 65 63 74 20   name in object 
da10: 66 6f 72 6d 20 2a 2f 0a 20 20 20 20 54 63 6c 5f  form */.    Tcl_
da20: 49 6e 74 65 72 70 53 74 61 74 65 20 73 72 3b 09  InterpState sr;.
da30: 09 2f 2a 20 53 74 61 74 65 20 6f 66 20 68 61 6e  ./* State of han
da40: 64 6c 65 72 20 69 6e 74 65 72 70 20 2a 2f 0a 20  dler interp */. 
da50: 20 20 20 69 6e 74 20 72 65 73 75 6c 74 3b 09 09     int result;..
da60: 09 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20  ./* Result code 
da70: 6f 66 20 6d 65 74 68 6f 64 20 69 6e 76 6f 6b 61  of method invoka
da80: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f  tion */.    Tcl_
da90: 4f 62 6a 20 2a 72 65 73 4f 62 6a 20 3d 20 4e 55  Obj *resObj = NU
daa0: 4c 4c 3b 09 2f 2a 20 52 65 73 75 6c 74 20 6f 66  LL;./* Result of
dab0: 20 6d 65 74 68 6f 64 20 69 6e 76 6f 6b 61 74 69   method invokati
dac0: 6f 6e 2e 20 2a 2f 0a 0a 20 20 20 20 2f 2a 0a 20  on. */..    /*. 
dad0: 20 20 20 20 2a 20 4e 4f 54 45 20 28 35 29 3a 20      * NOTE (5): 
dae0: 44 65 63 69 64 65 20 69 6d 70 6c 2e 20 69 73 73  Decide impl. iss
daf0: 75 65 3a 20 43 61 63 68 65 20 6f 62 6a 65 63 74  ue: Cache object
db00: 73 20 77 69 74 68 20 6d 65 74 68 6f 64 20 6e 61  s with method na
db10: 6d 65 73 3f 0a 20 20 20 20 20 2a 20 52 65 71 75  mes?.     * Requ
db20: 69 72 65 73 20 54 53 44 20 64 61 74 61 20 61 73  ires TSD data as
db30: 20 72 65 66 6c 65 63 74 69 6f 6e 73 20 63 61 6e   reflections can
db40: 20 62 65 20 63 72 65 61 74 65 64 20 69 6e 20 6d   be created in m
db50: 61 6e 79 20 64 69 66 66 65 72 65 6e 74 0a 20 20  any different.  
db60: 20 20 20 2a 20 74 68 72 65 61 64 73 2e 0a 20 20     * threads..  
db70: 20 20 20 2a 2f 0a 0a 20 20 20 20 2f 2a 0a 20 20     */..    /*.  
db80: 20 20 20 2a 20 49 6e 73 65 72 74 20 6d 65 74 68     * Insert meth
db90: 6f 64 20 69 6e 74 6f 20 74 68 65 20 70 72 65 2d  od into the pre-
dba0: 61 6c 6c 6f 63 61 74 65 64 20 61 72 65 61 2c 20  allocated area, 
dbb0: 61 66 74 65 72 20 74 68 65 20 63 6f 6d 6d 61 6e  after the comman
dbc0: 64 20 70 72 65 66 69 78 2c 0a 20 20 20 20 20 2a  d prefix,.     *
dbd0: 20 62 65 66 6f 72 65 20 74 68 65 20 63 68 61 6e   before the chan
dbe0: 6e 65 6c 20 69 64 2e 0a 20 20 20 20 20 2a 2f 0a  nel id..     */.
dbf0: 0a 20 20 20 20 6d 65 74 68 4f 62 6a 20 3d 20 54  .    methObj = T
dc00: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
dc10: 6d 65 74 68 6f 64 2c 20 2d 31 29 3b 0a 20 20 20  method, -1);.   
dc20: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
dc30: 74 28 6d 65 74 68 4f 62 6a 29 3b 0a 20 20 20 20  t(methObj);.    
dc40: 72 74 50 74 72 2d 3e 61 72 67 76 5b 72 74 50 74  rtPtr->argv[rtPt
dc50: 72 2d 3e 61 72 67 63 20 2d 20 32 5d 20 3d 20 6d  r->argc - 2] = m
dc60: 65 74 68 4f 62 6a 3b 0a 0a 20 20 20 20 2f 2a 0a  ethObj;..    /*.
dc70: 20 20 20 20 20 2a 20 41 70 70 65 6e 64 20 74 68       * Append th
dc80: 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 61 72 67  e additional arg
dc90: 75 6d 65 6e 74 20 63 6f 6e 74 61 69 6e 69 6e 67  ument containing
dca0: 20 6d 65 74 68 6f 64 20 73 70 65 63 69 66 69 63   method specific
dcb0: 20 64 65 74 61 69 6c 73 0a 20 20 20 20 20 2a 20   details.     * 
dcc0: 62 65 68 69 6e 64 20 74 68 65 20 63 68 61 6e 6e  behind the chann
dcd0: 65 6c 20 69 64 2e 20 49 66 20 73 70 65 63 69 66  el id. If specif
dce0: 69 65 64 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20  ied..     */..  
dcf0: 20 20 63 6d 64 63 20 3d 20 72 74 50 74 72 2d 3e    cmdc = rtPtr->
dd00: 61 72 67 63 3b 0a 20 20 20 20 69 66 20 28 61 72  argc;.    if (ar
dd10: 67 4f 6e 65 4f 62 6a 29 20 7b 0a 09 54 63 6c 5f  gOneObj) {..Tcl_
dd20: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 61 72 67  IncrRefCount(arg
dd30: 4f 6e 65 4f 62 6a 29 3b 0a 09 72 74 50 74 72 2d  OneObj);..rtPtr-
dd40: 3e 61 72 67 76 5b 63 6d 64 63 5d 20 3d 20 61 72  >argv[cmdc] = ar
dd50: 67 4f 6e 65 4f 62 6a 3b 0a 09 63 6d 64 63 2b 2b  gOneObj;..cmdc++
dd60: 3b 0a 09 69 66 20 28 61 72 67 54 77 6f 4f 62 6a  ;..if (argTwoObj
dd70: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63  ) {..    Tcl_Inc
dd80: 72 52 65 66 43 6f 75 6e 74 28 61 72 67 54 77 6f  rRefCount(argTwo
dd90: 4f 62 6a 29 3b 0a 09 20 20 20 20 72 74 50 74 72  Obj);..    rtPtr
dda0: 2d 3e 61 72 67 76 5b 63 6d 64 63 5d 20 3d 20 61  ->argv[cmdc] = a
ddb0: 72 67 54 77 6f 4f 62 6a 3b 0a 09 20 20 20 20 63  rgTwoObj;..    c
ddc0: 6d 64 63 2b 2b 3b 0a 09 7d 0a 20 20 20 20 7d 0a  mdc++;..}.    }.
ddd0: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 41  .    /*.     * A
dde0: 6e 64 20 72 75 6e 20 74 68 65 20 68 61 6e 64 6c  nd run the handl
ddf0: 65 72 2e 2e 2e 20 54 68 69 73 20 69 73 20 64 6f  er... This is do
de00: 6e 65 20 69 6e 20 61 75 63 68 20 61 20 6d 61 6e  ne in auch a man
de10: 6e 65 72 20 77 68 69 63 68 20 6c 65 61 76 65 73  ner which leaves
de20: 20 61 6e 79 0a 20 20 20 20 20 2a 20 65 78 69 73   any.     * exis
de30: 74 69 6e 67 20 73 74 61 74 65 20 69 6e 74 61 63  ting state intac
de40: 74 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20  t..     */..    
de50: 73 72 20 3d 20 54 63 6c 5f 53 61 76 65 49 6e 74  sr = Tcl_SaveInt
de60: 65 72 70 53 74 61 74 65 28 72 74 50 74 72 2d 3e  erpState(rtPtr->
de70: 69 6e 74 65 72 70 2c 20 30 20 2f 2a 20 44 75 6d  interp, 0 /* Dum
de80: 6d 79 20 2a 2f 29 3b 0a 20 20 20 20 54 63 6c 5f  my */);.    Tcl_
de90: 50 72 65 73 65 72 76 65 28 72 74 50 74 72 2d 3e  Preserve(rtPtr->
dea0: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 72 65 73  interp);.    res
deb0: 75 6c 74 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62  ult = Tcl_EvalOb
dec0: 6a 76 28 72 74 50 74 72 2d 3e 69 6e 74 65 72 70  jv(rtPtr->interp
ded0: 2c 20 63 6d 64 63 2c 20 72 74 50 74 72 2d 3e 61  , cmdc, rtPtr->a
dee0: 72 67 76 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c  rgv, TCL_EVAL_GL
def0: 4f 42 41 4c 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20  OBAL);..    /*. 
df00: 20 20 20 20 2a 20 57 65 20 64 6f 20 6e 6f 74 20      * We do not 
df10: 74 72 79 20 74 6f 20 65 78 74 72 61 63 74 20 74  try to extract t
df20: 68 65 20 72 65 73 75 6c 74 20 69 6e 66 6f 72 6d  he result inform
df30: 61 74 69 6f 6e 20 69 66 20 74 68 65 20 63 61 6c  ation if the cal
df40: 6c 65 72 20 68 61 73 20 6e 6f 0a 20 20 20 20 20  ler has no.     
df50: 2a 20 69 6e 74 65 72 65 73 74 20 69 6e 20 69 74  * interest in it
df60: 2e 20 49 2e 65 2e 20 74 68 65 72 65 20 69 73 20  . I.e. there is 
df70: 6e 6f 20 6e 65 65 64 20 74 6f 20 70 75 74 20 65  no need to put e
df80: 66 66 6f 72 74 20 69 6e 74 6f 20 63 72 65 61 74  ffort into creat
df90: 69 6e 67 0a 20 20 20 20 20 2a 20 73 6f 6d 65 74  ing.     * somet
dfa0: 68 69 6e 67 20 77 68 69 63 68 20 69 73 20 64 69  hing which is di
dfb0: 73 63 61 72 64 65 64 20 69 6d 6d 65 64 69 61 74  scarded immediat
dfc0: 65 6c 79 20 61 66 74 65 72 2e 0a 20 20 20 20 20  ely after..     
dfd0: 2a 2f 0a 0a 20 20 20 20 69 66 20 28 72 65 73 75  */..    if (resu
dfe0: 6c 74 4f 62 6a 50 74 72 29 20 7b 0a 09 69 66 20  ltObjPtr) {..if 
dff0: 28 72 65 73 75 6c 74 20 3d 3d 20 54 43 4c 5f 4f  (result == TCL_O
e000: 4b 29 20 7b 0a 09 20 20 20 20 2f 2a 0a 09 20 20  K) {..    /*..  
e010: 20 20 20 2a 20 4f 6b 20 72 65 73 75 6c 74 20 74     * Ok result t
e020: 61 6b 65 6e 20 61 73 20 69 73 2c 20 61 6c 73 6f  aken as is, also
e030: 20 69 66 20 74 68 65 20 63 61 6c 6c 65 72 20 72   if the caller r
e040: 65 71 75 65 73 74 73 20 74 68 61 74 20 74 68 65  equests that the
e050: 72 65 0a 09 20 20 20 20 20 2a 20 69 73 20 6e 6f  re..     * is no
e060: 20 63 61 70 74 75 72 65 2e 0a 09 20 20 20 20 20   capture...     
e070: 2a 2f 0a 0a 09 20 20 20 20 72 65 73 4f 62 6a 20  */...    resObj 
e080: 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75  = Tcl_GetObjResu
e090: 6c 74 28 72 74 50 74 72 2d 3e 69 6e 74 65 72 70  lt(rtPtr->interp
e0a0: 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20  );..} else {..  
e0b0: 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20 4e 6f 6e    /*..     * Non
e0c0: 2d 6f 6b 20 72 65 73 75 6c 74 20 69 73 20 61 6c  -ok result is al
e0d0: 77 61 79 73 20 74 72 65 61 74 65 64 20 61 73 20  ways treated as 
e0e0: 61 6e 20 65 72 72 6f 72 2e 20 57 65 20 68 61 76  an error. We hav
e0f0: 65 20 74 6f 20 63 61 70 74 75 72 65 0a 09 20 20  e to capture..  
e100: 20 20 20 2a 20 74 68 65 20 66 75 6c 6c 20 73 74     * the full st
e110: 61 74 65 20 6f 66 20 74 68 65 20 72 65 73 75 6c  ate of the resul
e120: 74 2c 20 69 6e 63 6c 75 64 69 6e 67 20 61 64 64  t, including add
e130: 69 74 69 6f 6e 61 6c 20 6f 70 74 69 6f 6e 73 2e  itional options.
e140: 0a 09 20 20 20 20 20 2a 0a 09 20 20 20 20 20 2a  ..     *..     *
e150: 20 54 68 69 73 20 69 73 20 63 6f 6d 70 6c 65 78   This is complex
e160: 20 61 6e 64 20 75 67 6c 79 2c 20 61 6e 64 20 77   and ugly, and w
e170: 6f 75 6c 64 20 62 65 20 63 6f 6d 70 6c 65 74 65  ould be complete
e180: 6c 79 20 75 6e 6e 65 63 65 73 73 61 72 79 0a 09  ly unnecessary..
e190: 20 20 20 20 20 2a 20 69 66 20 77 65 20 6f 6e 6c       * if we onl
e1a0: 79 20 61 64 64 65 64 20 73 75 70 70 6f 72 74 20  y added support 
e1b0: 66 6f 72 20 61 20 54 43 4c 5f 46 4f 52 42 49 44  for a TCL_FORBID
e1c0: 5f 45 58 43 45 50 54 49 4f 4e 53 20 66 6c 61 67  _EXCEPTIONS flag
e1d0: 2e 0a 09 20 20 20 20 20 2a 2f 0a 09 20 20 20 20  ...     */..    
e1e0: 69 66 20 28 72 65 73 75 6c 74 20 21 3d 20 54 43  if (result != TC
e1f0: 4c 5f 45 52 52 4f 52 29 20 7b 0a 09 09 54 63 6c  L_ERROR) {...Tcl
e200: 5f 4f 62 6a 20 2a 63 6d 64 20 3d 20 54 63 6c 5f  _Obj *cmd = Tcl_
e210: 4e 65 77 4c 69 73 74 4f 62 6a 28 63 6d 64 63 2c  NewListObj(cmdc,
e220: 20 72 74 50 74 72 2d 3e 61 72 67 76 29 3b 0a 09   rtPtr->argv);..
e230: 09 69 6e 74 20 63 6d 64 4c 65 6e 3b 0a 09 09 63  .int cmdLen;...c
e240: 6f 6e 73 74 20 63 68 61 72 20 2a 63 6d 64 53 74  onst char *cmdSt
e250: 72 69 6e 67 20 3d 20 54 63 6c 5f 47 65 74 53 74  ring = Tcl_GetSt
e260: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 63 6d 64 2c  ringFromObj(cmd,
e270: 20 26 63 6d 64 4c 65 6e 29 3b 0a 0a 09 09 54 63   &cmdLen);....Tc
e280: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63  l_IncrRefCount(c
e290: 6d 64 29 3b 0a 09 09 54 63 6c 5f 52 65 73 65 74  md);...Tcl_Reset
e2a0: 52 65 73 75 6c 74 28 72 74 50 74 72 2d 3e 69 6e  Result(rtPtr->in
e2b0: 74 65 72 70 29 3b 0a 09 09 54 63 6c 5f 53 65 74  terp);...Tcl_Set
e2c0: 4f 62 6a 52 65 73 75 6c 74 28 72 74 50 74 72 2d  ObjResult(rtPtr-
e2d0: 3e 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a  >interp, Tcl_Obj
e2e0: 50 72 69 6e 74 66 28 0a 09 09 09 22 63 68 61 6e  Printf(...."chan
e2f0: 20 68 61 6e 64 6c 65 72 20 72 65 74 75 72 6e 65   handler returne
e300: 64 20 62 61 64 20 63 6f 64 65 3a 20 25 64 22 2c  d bad code: %d",
e310: 20 72 65 73 75 6c 74 29 29 3b 0a 09 09 54 63 6c   result));...Tcl
e320: 5f 4c 6f 67 43 6f 6d 6d 61 6e 64 49 6e 66 6f 28  _LogCommandInfo(
e330: 72 74 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20 63  rtPtr->interp, c
e340: 6d 64 53 74 72 69 6e 67 2c 20 63 6d 64 53 74 72  mdString, cmdStr
e350: 69 6e 67 2c 20 63 6d 64 4c 65 6e 29 3b 0a 09 09  ing, cmdLen);...
e360: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
e370: 28 63 6d 64 29 3b 0a 09 09 72 65 73 75 6c 74 20  (cmd);...result 
e380: 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20  = TCL_ERROR;..  
e390: 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f 41 70 70    }..    Tcl_App
e3a0: 65 6e 64 4f 62 6a 54 6f 45 72 72 6f 72 49 6e 66  endObjToErrorInf
e3b0: 6f 28 72 74 50 74 72 2d 3e 69 6e 74 65 72 70 2c  o(rtPtr->interp,
e3c0: 20 54 63 6c 5f 4f 62 6a 50 72 69 6e 74 66 28 0a   Tcl_ObjPrintf(.
e3d0: 09 09 20 20 20 20 22 5c 6e 20 20 20 20 28 63 68  ..    "\n    (ch
e3e0: 61 6e 20 68 61 6e 64 6c 65 72 20 73 75 62 63 6f  an handler subco
e3f0: 6d 6d 61 6e 64 20 5c 22 25 73 5c 22 29 22 2c 20  mmand \"%s\")", 
e400: 6d 65 74 68 6f 64 29 29 3b 0a 09 20 20 20 20 72  method));..    r
e410: 65 73 4f 62 6a 20 3d 20 4d 61 72 73 68 61 6c 6c  esObj = Marshall
e420: 45 72 72 6f 72 28 72 74 50 74 72 2d 3e 69 6e 74  Error(rtPtr->int
e430: 65 72 70 29 3b 0a 09 7d 0a 09 54 63 6c 5f 49 6e  erp);..}..Tcl_In
e440: 63 72 52 65 66 43 6f 75 6e 74 28 72 65 73 4f 62  crRefCount(resOb
e450: 6a 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63  j);.    }.    Tc
e460: 6c 5f 52 65 73 74 6f 72 65 49 6e 74 65 72 70 53  l_RestoreInterpS
e470: 74 61 74 65 28 72 74 50 74 72 2d 3e 69 6e 74 65  tate(rtPtr->inte
e480: 72 70 2c 20 73 72 29 3b 0a 20 20 20 20 54 63 6c  rp, sr);.    Tcl
e490: 5f 52 65 6c 65 61 73 65 28 72 74 50 74 72 2d 3e  _Release(rtPtr->
e4a0: 69 6e 74 65 72 70 29 3b 0a 0a 20 20 20 20 2f 2a  interp);..    /*
e4b0: 0a 20 20 20 20 20 2a 20 43 6c 65 61 6e 75 70 20  .     * Cleanup 
e4c0: 6f 66 20 74 68 65 20 64 79 6e 61 6d 69 63 20 70  of the dynamic p
e4d0: 61 72 74 73 20 6f 66 20 74 68 65 20 63 6f 6d 6d  arts of the comm
e4e0: 61 6e 64 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20  and..     */..  
e4f0: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
e500: 6e 74 28 6d 65 74 68 4f 62 6a 29 3b 0a 20 20 20  nt(methObj);.   
e510: 20 69 66 20 28 61 72 67 4f 6e 65 4f 62 6a 29 20   if (argOneObj) 
e520: 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f  {..Tcl_DecrRefCo
e530: 75 6e 74 28 61 72 67 4f 6e 65 4f 62 6a 29 3b 0a  unt(argOneObj);.
e540: 09 69 66 20 28 61 72 67 54 77 6f 4f 62 6a 29 20  .if (argTwoObj) 
e550: 7b 0a 09 20 20 20 20 54 63 6c 5f 44 65 63 72 52  {..    Tcl_DecrR
e560: 65 66 43 6f 75 6e 74 28 61 72 67 54 77 6f 4f 62  efCount(argTwoOb
e570: 6a 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20  j);..}.    }..  
e580: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 54 68 65 20    /*.     * The 
e590: 72 65 73 4f 62 6a 20 68 61 73 20 61 20 72 65 66  resObj has a ref
e5a0: 20 63 6f 75 6e 74 20 6f 66 20 31 20 61 74 20 74   count of 1 at t
e5b0: 68 69 73 20 6c 6f 63 61 74 69 6f 6e 2e 20 54 68  his location. Th
e5c0: 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  is means that th
e5d0: 65 0a 20 20 20 20 20 2a 20 63 61 6c 6c 65 72 20  e.     * caller 
e5e0: 6f 66 20 49 6e 76 6f 6b 65 54 63 6c 4d 65 74 68  of InvokeTclMeth
e5f0: 6f 64 20 68 61 73 20 74 6f 20 64 69 73 70 6f 73  od has to dispos
e600: 65 20 6f 66 20 69 74 20 28 62 75 74 20 6f 6e 6c  e of it (but onl
e610: 79 20 69 66 20 69 74 20 77 61 73 0a 20 20 20 20  y if it was.    
e620: 20 2a 20 72 65 74 75 72 6e 65 64 20 74 6f 20 69   * returned to i
e630: 74 29 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20  t)..     */..   
e640: 20 69 66 20 28 72 65 73 75 6c 74 4f 62 6a 50 74   if (resultObjPt
e650: 72 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 2a 72  r != NULL) {..*r
e660: 65 73 75 6c 74 4f 62 6a 50 74 72 20 3d 20 72 65  esultObjPtr = re
e670: 73 4f 62 6a 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  sObj;.    }..   
e680: 20 2f 2a 0a 20 20 20 20 20 2a 20 54 68 65 72 65   /*.     * There
e690: 20 6e 6f 20 6e 65 65 64 20 74 6f 20 68 61 6e 64   no need to hand
e6a0: 6c 65 20 74 68 65 20 63 61 73 65 20 77 68 65 72  le the case wher
e6b0: 65 20 6e 6f 74 68 69 6e 67 20 69 73 20 72 65 74  e nothing is ret
e6c0: 75 72 6e 65 64 2c 20 62 65 63 61 75 73 65 20 66  urned, because f
e6d0: 6f 72 0a 20 20 20 20 20 2a 20 74 68 61 74 20 63  or.     * that c
e6e0: 61 73 65 20 72 65 73 4f 62 6a 20 77 61 73 20 6e  ase resObj was n
e6f0: 6f 74 20 73 65 74 20 61 6e 79 77 61 79 2e 0a 20  ot set anyway.. 
e700: 20 20 20 20 2a 2f 0a 0a 20 20 20 20 72 65 74 75      */..    retu
e710: 72 6e 20 72 65 73 75 6c 74 3b 0a 7d 0a 0c 0a 23  rn result;.}...#
e720: 69 66 64 65 66 20 54 43 4c 5f 54 48 52 45 41 44  ifdef TCL_THREAD
e730: 53 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 46 6f  S.static void.Fo
e740: 72 77 61 72 64 4f 70 54 6f 4f 77 6e 65 72 54 68  rwardOpToOwnerTh
e750: 72 65 61 64 28 0a 20 20 20 20 52 65 66 6c 65 63  read(.    Reflec
e760: 74 65 64 54 72 61 6e 73 66 6f 72 6d 20 2a 72 74  tedTransform *rt
e770: 50 74 72 2c 09 2f 2a 20 43 68 61 6e 6e 65 6c 20  Ptr,./* Channel 
e780: 69 6e 73 74 61 6e 63 65 20 2a 2f 0a 20 20 20 20  instance */.    
e790: 46 6f 72 77 61 72 64 65 64 4f 70 65 72 61 74 69  ForwardedOperati
e7a0: 6f 6e 20 6f 70 2c 09 2f 2a 20 46 6f 72 77 61 72  on op,./* Forwar
e7b0: 64 65 64 20 64 72 69 76 65 72 20 6f 70 65 72 61  ded driver opera
e7c0: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 63 6f 6e 73  tion */.    cons
e7d0: 74 20 56 4f 49 44 20 2a 70 61 72 61 6d 29 09 09  t VOID *param)..
e7e0: 2f 2a 20 41 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  /* Arguments */.
e7f0: 7b 0a 20 20 20 20 54 63 6c 5f 54 68 72 65 61 64  {.    Tcl_Thread
e800: 49 64 20 64 73 74 20 3d 20 72 74 50 74 72 2d 3e  Id dst = rtPtr->
e810: 74 68 72 65 61 64 3b 0a 20 20 20 20 46 6f 72 77  thread;.    Forw
e820: 61 72 64 69 6e 67 45 76 65 6e 74 20 2a 65 76 50  ardingEvent *evP
e830: 74 72 3b 0a 20 20 20 20 46 6f 72 77 61 72 64 69  tr;.    Forwardi
e840: 6e 67 52 65 73 75 6c 74 20 2a 72 65 73 75 6c 74  ngResult *result
e850: 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 72 65 73  Ptr;.    int res
e860: 75 6c 74 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20  ult;..    /*.   
e870: 20 20 2a 20 43 72 65 61 74 65 20 61 6e 64 20 69    * Create and i
e880: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 65 76  nitialize the ev
e890: 65 6e 74 20 61 6e 64 20 64 61 74 61 20 73 74 72  ent and data str
e8a0: 75 63 74 75 72 65 73 2e 0a 20 20 20 20 20 2a 2f  uctures..     */
e8b0: 0a 0a 20 20 20 20 65 76 50 74 72 20 3d 20 28 46  ..    evPtr = (F
e8c0: 6f 72 77 61 72 64 69 6e 67 45 76 65 6e 74 20 2a  orwardingEvent *
e8d0: 29 20 63 6b 61 6c 6c 6f 63 28 73 69 7a 65 6f 66  ) ckalloc(sizeof
e8e0: 28 46 6f 72 77 61 72 64 69 6e 67 45 76 65 6e 74  (ForwardingEvent
e8f0: 29 29 3b 0a 20 20 20 20 72 65 73 75 6c 74 50 74  ));.    resultPt
e900: 72 20 3d 20 28 46 6f 72 77 61 72 64 69 6e 67 52  r = (ForwardingR
e910: 65 73 75 6c 74 20 2a 29 20 63 6b 61 6c 6c 6f 63  esult *) ckalloc
e920: 28 73 69 7a 65 6f 66 28 46 6f 72 77 61 72 64 69  (sizeof(Forwardi
e930: 6e 67 52 65 73 75 6c 74 29 29 3b 0a 0a 20 20 20  ngResult));..   
e940: 20 65 76 50 74 72 2d 3e 65 76 65 6e 74 2e 70 72   evPtr->event.pr
e950: 6f 63 20 3d 20 46 6f 72 77 61 72 64 50 72 6f 63  oc = ForwardProc
e960: 3b 0a 20 20 20 20 65 76 50 74 72 2d 3e 72 65 73  ;.    evPtr->res
e970: 75 6c 74 50 74 72 20 3d 20 72 65 73 75 6c 74 50  ultPtr = resultP
e980: 74 72 3b 0a 20 20 20 20 65 76 50 74 72 2d 3e 6f  tr;.    evPtr->o
e990: 70 20 3d 20 6f 70 3b 0a 20 20 20 20 65 76 50 74  p = op;.    evPt
e9a0: 72 2d 3e 72 74 50 74 72 20 3d 20 72 74 50 74 72  r->rtPtr = rtPtr
e9b0: 3b 0a 20 20 20 20 65 76 50 74 72 2d 3e 70 61 72  ;.    evPtr->par
e9c0: 61 6d 20 3d 20 28 46 6f 72 77 61 72 64 50 61 72  am = (ForwardPar
e9d0: 61 6d 20 2a 29 20 70 61 72 61 6d 3b 0a 0a 20 20  am *) param;..  
e9e0: 20 20 72 65 73 75 6c 74 50 74 72 2d 3e 73 72 63    resultPtr->src
e9f0: 20 3d 20 54 63 6c 5f 47 65 74 43 75 72 72 65 6e   = Tcl_GetCurren
ea00: 74 54 68 72 65 61 64 28 29 3b 0a 20 20 20 20 72  tThread();.    r
ea10: 65 73 75 6c 74 50 74 72 2d 3e 64 73 74 20 3d 20  esultPtr->dst = 
ea20: 64 73 74 3b 0a 20 20 20 20 72 65 73 75 6c 74 50  dst;.    resultP
ea30: 74 72 2d 3e 64 6f 6e 65 20 3d 20 4e 55 4c 4c 3b  tr->done = NULL;
ea40: 0a 20 20 20 20 72 65 73 75 6c 74 50 74 72 2d 3e  .    resultPtr->
ea50: 72 65 73 75 6c 74 20 3d 20 2d 31 3b 0a 20 20 20  result = -1;.   
ea60: 20 72 65 73 75 6c 74 50 74 72 2d 3e 65 76 50 74   resultPtr->evPt
ea70: 72 20 3d 20 65 76 50 74 72 3b 0a 0a 20 20 20 20  r = evPtr;..    
ea80: 2f 2a 0a 20 20 20 20 20 2a 20 4e 6f 77 20 65 78  /*.     * Now ex
ea90: 65 63 75 74 65 20 74 68 65 20 66 6f 72 77 61 72  ecute the forwar
eaa0: 64 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20  d..     */..    
eab0: 54 63 6c 5f 4d 75 74 65 78 4c 6f 63 6b 28 26 72  Tcl_MutexLock(&r
eac0: 63 46 6f 72 77 61 72 64 4d 75 74 65 78 29 3b 0a  cForwardMutex);.
ead0: 20 20 20 20 54 63 6c 53 70 6c 69 63 65 49 6e 28      TclSpliceIn(
eae0: 72 65 73 75 6c 74 50 74 72 2c 20 66 6f 72 77 61  resultPtr, forwa
eaf0: 72 64 4c 69 73 74 29 3b 0a 0a 20 20 20 20 2f 2a  rdList);..    /*
eb00: 0a 20 20 20 20 20 2a 20 45 6e 73 75 72 65 20 63  .     * Ensure c
eb10: 6c 65 61 6e 75 70 20 6f 66 20 74 68 65 20 65 76  leanup of the ev
eb20: 65 6e 74 20 69 66 20 61 6e 79 20 6f 66 20 74 68  ent if any of th
eb30: 65 20 74 77 6f 20 69 6e 76 6f 6c 76 65 64 20 74  e two involved t
eb40: 68 72 65 61 64 73 20 65 78 69 74 73 0a 20 20 20  hreads exits.   
eb50: 20 20 2a 20 77 68 69 6c 65 20 74 68 69 73 20 65    * while this e
eb60: 76 65 6e 74 20 69 73 20 70 65 6e 64 69 6e 67 20  vent is pending 
eb70: 6f 72 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a  or in progress..
eb80: 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 54 63 6c       */..    Tcl
eb90: 5f 43 72 65 61 74 65 54 68 72 65 61 64 45 78 69  _CreateThreadExi
eba0: 74 48 61 6e 64 6c 65 72 28 53 72 63 45 78 69 74  tHandler(SrcExit
ebb0: 50 72 6f 63 2c 20 28 43 6c 69 65 6e 74 44 61 74  Proc, (ClientDat
ebc0: 61 29 20 65 76 50 74 72 29 3b 0a 20 20 20 20 54  a) evPtr);.    T
ebd0: 63 6c 5f 43 72 65 61 74 65 54 68 72 65 61 64 45  cl_CreateThreadE
ebe0: 78 69 74 48 61 6e 64 6c 65 72 28 44 73 74 45 78  xitHandler(DstEx
ebf0: 69 74 50 72 6f 63 2c 20 28 43 6c 69 65 6e 74 44  itProc, (ClientD
ec00: 61 74 61 29 20 65 76 50 74 72 29 3b 0a 0a 20 20  ata) evPtr);..  
ec10: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 51 75 65 75    /*.     * Queu
ec20: 65 20 74 68 65 20 65 76 65 6e 74 20 61 6e 64 20  e the event and 
ec30: 70 6f 6b 65 20 74 68 65 20 6f 74 68 65 72 20 74  poke the other t
ec40: 68 72 65 61 64 27 73 20 6e 6f 74 69 66 69 65 72  hread's notifier
ec50: 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 54  ..     */..    T
ec60: 63 6c 5f 54 68 72 65 61 64 51 75 65 75 65 45 76  cl_ThreadQueueEv
ec70: 65 6e 74 28 64 73 74 2c 20 28 54 63 6c 5f 45 76  ent(dst, (Tcl_Ev
ec80: 65 6e 74 20 2a 29 65 76 50 74 72 2c 20 54 43 4c  ent *)evPtr, TCL
ec90: 5f 51 55 45 55 45 5f 54 41 49 4c 29 3b 0a 20 20  _QUEUE_TAIL);.  
eca0: 20 20 54 63 6c 5f 54 68 72 65 61 64 41 6c 65 72    Tcl_ThreadAler
ecb0: 74 28 64 73 74 29 3b 0a 0a 20 20 20 20 2f 2a 0a  t(dst);..    /*.
ecc0: 20 20 20 20 20 2a 20 28 2a 29 20 42 6c 6f 63 6b       * (*) Block
ecd0: 20 75 6e 74 69 6c 20 74 68 65 20 6f 74 68 65 72   until the other
ece0: 20 74 68 72 65 61 64 20 68 61 73 20 65 69 74 68   thread has eith
ecf0: 65 72 20 70 72 6f 63 65 73 73 65 64 20 74 68 65  er processed the
ed00: 20 74 72 61 6e 73 66 65 72 20 6f 72 0a 20 20 20   transfer or.   
ed10: 20 20 2a 20 72 65 6a 65 63 74 65 64 20 69 74 2e    * rejected it.
ed20: 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 77 68  .     */..    wh
ed30: 69 6c 65 20 28 72 65 73 75 6c 74 50 74 72 2d 3e  ile (resultPtr->
ed40: 72 65 73 75 6c 74 20 3c 20 30 29 20 7b 0a 09 2f  result < 0) {../
ed50: 2a 0a 09 20 2a 20 4e 4f 54 45 20 28 31 29 3a 20  *.. * NOTE (1): 
ed60: 49 73 20 69 74 20 70 6f 73 73 69 62 6c 65 20 74  Is it possible t
ed70: 68 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 20  hat the current 
ed80: 74 68 72 65 61 64 20 67 6f 65 73 20 61 77 61 79  thread goes away
ed90: 20 77 68 69 6c 65 0a 09 20 2a 20 77 61 69 74 69   while.. * waiti
eda0: 6e 67 20 68 65 72 65 3f 20 49 4f 57 20 49 73 20  ng here? IOW Is 
edb0: 69 74 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74  it possible that
edc0: 20 22 53 72 63 45 78 69 74 50 72 6f 63 22 20 69   "SrcExitProc" i
edd0: 73 20 63 61 6c 6c 65 64 0a 09 20 2a 20 77 68 69  s called.. * whi
ede0: 6c 65 20 77 65 20 61 72 65 20 68 65 72 65 3f 20  le we are here? 
edf0: 53 65 65 20 63 6f 6d 70 6c 65 6d 65 6e 74 61 72  See complementar
ee00: 79 20 6e 6f 74 65 20 28 32 29 20 69 6e 20 22 53  y note (2) in "S
ee10: 72 63 45 78 69 74 50 72 6f 63 22 0a 09 20 2a 2f  rcExitProc".. */
ee20: 0a 0a 09 54 63 6c 5f 43 6f 6e 64 69 74 69 6f 6e  ...Tcl_Condition
ee30: 57 61 69 74 28 26 72 65 73 75 6c 74 50 74 72 2d  Wait(&resultPtr-
ee40: 3e 64 6f 6e 65 2c 20 26 72 63 46 6f 72 77 61 72  >done, &rcForwar
ee50: 64 4d 75 74 65 78 2c 20 4e 55 4c 4c 29 3b 0a 20  dMutex, NULL);. 
ee60: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
ee70: 20 20 2a 20 55 6e 6c 69 6e 6b 20 72 65 73 75 6c    * Unlink resul
ee80: 74 20 66 72 6f 6d 20 74 68 65 20 66 6f 72 77 61  t from the forwa
ee90: 72 64 65 72 20 6c 69 73 74 2e 0a 20 20 20 20 20  rder list..     
eea0: 2a 2f 0a 0a 20 20 20 20 54 63 6c 53 70 6c 69 63  */..    TclSplic
eeb0: 65 4f 75 74 28 72 65 73 75 6c 74 50 74 72 2c 20  eOut(resultPtr, 
eec0: 66 6f 72 77 61 72 64 4c 69 73 74 29 3b 0a 0a 20  forwardList);.. 
eed0: 20 20 20 72 65 73 75 6c 74 50 74 72 2d 3e 6e 65     resultPtr->ne
eee0: 78 74 50 74 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20  xtPtr = NULL;.  
eef0: 20 20 72 65 73 75 6c 74 50 74 72 2d 3e 70 72 65    resultPtr->pre
ef00: 76 50 74 72 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20  vPtr = NULL;..  
ef10: 20 20 54 63 6c 5f 4d 75 74 65 78 55 6e 6c 6f 63    Tcl_MutexUnloc
ef20: 6b 28 26 72 63 46 6f 72 77 61 72 64 4d 75 74 65  k(&rcForwardMute
ef30: 78 29 3b 0a 20 20 20 20 54 63 6c 5f 43 6f 6e 64  x);.    Tcl_Cond
ef40: 69 74 69 6f 6e 46 69 6e 61 6c 69 7a 65 28 26 72  itionFinalize(&r
ef50: 65 73 75 6c 74 50 74 72 2d 3e 64 6f 6e 65 29 3b  esultPtr->done);
ef60: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20  ..    /*.     * 
ef70: 4b 69 6c 6c 20 74 68 65 20 63 6c 65 61 6e 75 70  Kill the cleanup
ef80: 20 68 61 6e 64 6c 65 72 73 20 6e 6f 77 2c 20 61   handlers now, a
ef90: 6e 64 20 74 68 65 20 72 65 73 75 6c 74 20 73 74  nd the result st
efa0: 72 75 63 74 75 72 65 20 61 73 20 77 65 6c 6c 2c  ructure as well,
efb0: 20 62 65 66 6f 72 65 0a 20 20 20 20 20 2a 20 72   before.     * r
efc0: 65 74 75 72 6e 69 6e 67 20 74 68 65 20 73 75 63  eturning the suc
efd0: 63 65 73 73 20 63 6f 64 65 2e 0a 20 20 20 20 20  cess code..     
efe0: 2a 0a 20 20 20 20 20 2a 20 4e 6f 74 65 3a 20 54  *.     * Note: T
eff0: 68 65 20 65 76 65 6e 74 20 73 74 72 75 63 74 75  he event structu
f000: 72 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  re has already b
f010: 65 65 6e 20 64 65 6c 65 74 65 64 2e 0a 20 20 20  een deleted..   
f020: 20 20 2a 2f 0a 0a 20 20 20 20 54 63 6c 5f 44 65    */..    Tcl_De
f030: 6c 65 74 65 54 68 72 65 61 64 45 78 69 74 48 61  leteThreadExitHa
f040: 6e 64 6c 65 72 28 53 72 63 45 78 69 74 50 72 6f  ndler(SrcExitPro
f050: 63 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20  c, (ClientData) 
f060: 65 76 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f  evPtr);.    Tcl_
f070: 44 65 6c 65 74 65 54 68 72 65 61 64 45 78 69 74  DeleteThreadExit
f080: 48 61 6e 64 6c 65 72 28 44 73 74 45 78 69 74 50  Handler(DstExitP
f090: 72 6f 63 2c 20 28 43 6c 69 65 6e 74 44 61 74 61  roc, (ClientData
f0a0: 29 20 65 76 50 74 72 29 3b 0a 0a 20 20 20 20 72  ) evPtr);..    r
f0b0: 65 73 75 6c 74 20 3d 20 72 65 73 75 6c 74 50 74  esult = resultPt
f0c0: 72 2d 3e 72 65 73 75 6c 74 3b 0a 20 20 20 20 63  r->result;.    c
f0d0: 6b 66 72 65 65 28 28 63 68 61 72 2a 29 20 72 65  kfree((char*) re
f0e0: 73 75 6c 74 50 74 72 29 3b 0a 7d 0a 0c 0a 73 74  sultPtr);.}...st
f0f0: 61 74 69 63 20 69 6e 74 0a 46 6f 72 77 61 72 64  atic int.Forward
f100: 50 72 6f 63 28 0a 20 20 20 20 54 63 6c 5f 45 76  Proc(.    Tcl_Ev
f110: 65 6e 74 20 2a 65 76 47 50 74 72 2c 0a 20 20 20  ent *evGPtr,.   
f120: 20 69 6e 74 20 6d 61 73 6b 29 0a 7b 0a 20 20 20   int mask).{.   
f130: 20 2f 2a 0a 20 20 20 20 20 2a 20 4e 6f 74 65 73   /*.     * Notes
f140: 20 72 65 67 61 72 64 69 6e 67 20 61 63 63 65 73   regarding acces
f150: 73 20 74 6f 20 74 68 65 20 72 65 66 65 72 65 6e  s to the referen
f160: 63 65 64 20 64 61 74 61 2e 0a 20 20 20 20 20 2a  ced data..     *
f170: 0a 20 20 20 20 20 2a 20 49 6e 20 70 72 69 6e 63  .     * In princ
f180: 69 70 6c 65 20 74 68 65 20 64 61 74 61 20 62 65  iple the data be
f190: 6c 6f 6e 67 73 20 74 6f 20 74 68 65 20 6f 72 69  longs to the ori
f1a0: 67 69 6e 61 74 69 6e 67 20 74 68 72 65 61 64 20  ginating thread 
f1b0: 28 73 65 65 0a 20 20 20 20 20 2a 20 65 76 50 74  (see.     * evPt
f1c0: 72 2d 3e 73 72 63 29 2c 20 68 6f 77 65 76 65 72  r->src), however
f1d0: 20 74 68 69 73 20 74 68 72 65 61 64 20 69 73 20   this thread is 
f1e0: 63 75 72 72 65 6e 74 6c 79 20 62 6c 6f 63 6b 65  currently blocke
f1f0: 64 20 61 74 20 28 2a 29 2c 20 69 2e 65 2e 0a 20  d at (*), i.e.. 
f200: 20 20 20 20 2a 20 71 75 69 65 73 63 65 6e 74 2e      * quiescent.
f210: 20 42 65 63 61 75 73 65 20 6f 66 20 74 68 69 73   Because of this
f220: 20 77 65 20 63 61 6e 20 74 72 65 61 74 20 74 68   we can treat th
f230: 65 20 64 61 74 61 20 61 73 20 62 65 6c 6f 6e 67  e data as belong
f240: 69 6e 67 20 74 6f 20 75 73 2c 0a 20 20 20 20 20  ing to us,.     
f250: 2a 20 77 69 74 68 6f 75 74 20 66 65 61 72 20 6f  * without fear o
f260: 66 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e  f race condition
f270: 73 2e 20 49 2e 65 2e 20 77 65 20 63 61 6e 20 72  s. I.e. we can r
f280: 65 61 64 20 61 6e 64 20 77 72 69 74 65 20 61 73  ead and write as
f290: 20 77 65 20 6c 69 6b 65 2e 0a 20 20 20 20 20 2a   we like..     *
f2a0: 0a 20 20 20 20 20 2a 20 54 68 65 20 6f 6e 6c 79  .     * The only
f2b0: 20 74 68 69 6e 67 20 77 65 20 63 61 6e 6e 6f 74   thing we cannot
f2c0: 20 62 65 20 73 75 72 65 20 6f 66 20 69 73 20 74   be sure of is t
f2d0: 68 65 20 72 65 73 75 6c 74 50 74 72 2e 20 54 68  he resultPtr. Th
f2e0: 69 73 20 63 61 6e 20 62 65 20 62 65 0a 20 20 20  is can be be.   
f2f0: 20 20 2a 20 4e 55 4c 4c 65 64 20 69 66 20 74 68    * NULLed if th
f300: 65 20 6f 72 69 67 69 6e 61 74 69 6e 67 20 74 68  e originating th
f310: 72 65 61 64 20 77 65 6e 74 20 61 77 61 79 20 77  read went away w
f320: 68 69 6c 65 20 74 68 65 20 65 76 65 6e 74 20 69  hile the event i
f330: 73 20 68 61 6e 64 6c 65 64 0a 20 20 20 20 20 2a  s handled.     *
f340: 20 68 65 72 65 20 6e 6f 77 2e 0a 20 20 20 20 20   here now..     
f350: 2a 2f 0a 0a 20 20 20 20 46 6f 72 77 61 72 64 69  */..    Forwardi
f360: 6e 67 45 76 65 6e 74 20 2a 65 76 50 74 72 20 3d  ngEvent *evPtr =
f370: 20 28 46 6f 72 77 61 72 64 69 6e 67 45 76 65 6e   (ForwardingEven
f380: 74 20 2a 29 20 65 76 47 50 74 72 3b 0a 20 20 20  t *) evGPtr;.   
f390: 20 46 6f 72 77 61 72 64 69 6e 67 52 65 73 75 6c   ForwardingResul
f3a0: 74 20 2a 72 65 73 75 6c 74 50 74 72 20 3d 20 65  t *resultPtr = e
f3b0: 76 50 74 72 2d 3e 72 65 73 75 6c 74 50 74 72 3b  vPtr->resultPtr;
f3c0: 0a 20 20 20 20 52 65 66 6c 65 63 74 65 64 54 72  .    ReflectedTr
f3d0: 61 6e 73 66 6f 72 6d 20 2a 72 74 50 74 72 20 3d  ansform *rtPtr =
f3e0: 20 65 76 50 74 72 2d 3e 72 74 50 74 72 3b 0a 20   evPtr->rtPtr;. 
f3f0: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69     Tcl_Interp *i
f400: 6e 74 65 72 70 20 3d 20 72 74 50 74 72 2d 3e 69  nterp = rtPtr->i
f410: 6e 74 65 72 70 3b 0a 20 20 20 20 46 6f 72 77 61  nterp;.    Forwa
f420: 72 64 50 61 72 61 6d 20 2a 70 61 72 61 6d 50 74  rdParam *paramPt
f430: 72 20 3d 20 65 76 50 74 72 2d 3e 70 61 72 61 6d  r = evPtr->param
f440: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 72  ;.    Tcl_Obj *r
f450: 65 73 4f 62 6a 20 3d 20 4e 55 4c 4c 3b 09 2f 2a  esObj = NULL;./*
f460: 20 49 6e 74 65 72 70 20 72 65 73 75 6c 74 20 6f   Interp result o
f470: 66 20 49 6e 76 6f 6b 65 54 63 6c 4d 65 74 68 6f  f InvokeTclMetho
f480: 64 20 2a 2f 0a 0a 20 20 20 20 2f 2a 0a 20 20 20  d */..    /*.   
f490: 20 20 2a 20 49 67 6e 6f 72 65 20 74 68 65 20 65    * Ignore the e
f4a0: 76 65 6e 74 20 69 66 20 6e 6f 20 6f 6e 65 20 69  vent if no one i
f4b0: 73 20 77 61 69 74 69 6e 67 20 66 6f 72 20 69 74  s waiting for it
f4c0: 73 20 72 65 73 75 6c 74 20 61 6e 79 6d 6f 72 65  s result anymore
f4d0: 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69  ..     */..    i
f4e0: 66 20 28 21 72 65 73 75 6c 74 50 74 72 29 20 7b  f (!resultPtr) {
f4f0: 0a 09 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20  ..return 1;.    
f500: 7d 0a 0a 20 20 20 20 70 61 72 61 6d 50 74 72 2d  }..    paramPtr-
f510: 3e 62 61 73 65 2e 63 6f 64 65 20 3d 20 54 43 4c  >base.code = TCL
f520: 5f 4f 4b 3b 0a 20 20 20 20 70 61 72 61 6d 50 74  _OK;.    paramPt
f530: 72 2d 3e 62 61 73 65 2e 6d 73 67 53 74 72 20 3d  r->base.msgStr =
f540: 20 4e 55 4c 4c 3b 0a 20 20 20 20 70 61 72 61 6d   NULL;.    param
f550: 50 74 72 2d 3e 62 61 73 65 2e 6d 75 73 74 46 72  Ptr->base.mustFr
f560: 65 65 20 3d 20 30 3b 0a 0a 20 20 20 20 73 77 69  ee = 0;..    swi
f570: 74 63 68 20 28 65 76 50 74 72 2d 3e 6f 70 29 20  tch (evPtr->op) 
f580: 7b 0a 09 2f 2a 0a 09 20 2a 20 54 68 65 20 64 65  {../*.. * The de
f590: 73 74 69 6e 61 74 69 6f 6e 20 74 68 72 65 61 64  stination thread
f5a0: 20 66 6f 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69   for the followi
f5b0: 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 20 69 73  ng operations is
f5c0: 0a 09 20 2a 20 72 74 50 74 72 2d 3e 74 68 72 65  .. * rtPtr->thre
f5d0: 61 64 2c 20 77 68 69 63 68 20 63 6f 6e 74 61 69  ad, which contai
f5e0: 6e 73 20 72 74 50 74 72 2d 3e 69 6e 74 65 72 70  ns rtPtr->interp
f5f0: 2c 20 74 68 65 20 69 6e 74 65 72 70 20 77 65 20  , the interp we 
f600: 68 61 76 65 20 74 6f 0a 09 20 2a 20 63 61 6c 6c  have to.. * call
f610: 20 75 70 6f 6e 20 66 6f 72 20 74 68 65 20 64 72   upon for the dr
f620: 69 76 65 72 2e 0a 09 20 2a 2f 0a 0a 20 20 20 20  iver... */..    
f630: 63 61 73 65 20 46 6f 72 77 61 72 64 65 64 43 6c  case ForwardedCl
f640: 6f 73 65 3a 0a 09 2f 2a 0a 09 20 2a 20 4e 6f 20  ose:../*.. * No 
f650: 70 61 72 61 6d 65 74 65 72 73 2f 72 65 73 75 6c  parameters/resul
f660: 74 73 2e 0a 09 20 2a 2f 0a 0a 09 69 66 20 28 49  ts... */...if (I
f670: 6e 76 6f 6b 65 54 63 6c 4d 65 74 68 6f 64 28 72  nvokeTclMethod(r
f680: 74 50 74 72 2c 20 22 66 69 6e 61 6c 69 7a 65 22  tPtr, "finalize"
f690: 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 26 72  , NULL, NULL, &r
f6a0: 65 73 4f 62 6a 29 20 21 3d 20 54 43 4c 5f 4f 4b  esObj) != TCL_OK
f6b0: 29 20 7b 0a 09 20 20 20 20 46 6f 72 77 61 72 64  ) {..    Forward
f6c0: 53 65 74 4f 62 6a 45 72 72 6f 72 28 70 61 72 61  SetObjError(para
f6d0: 6d 50 74 72 2c 20 72 65 73 4f 62 6a 29 3b 0a 09  mPtr, resObj);..
f6e0: 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 46 72 65 65 69  }.../*.. * Freei
f6f0: 6e 67 20 69 73 20 64 6f 6e 65 20 68 65 72 65 2c  ng is done here,
f700: 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 20 74   in the origin t
f710: 68 72 65 61 64 2c 20 62 65 63 61 75 73 65 20 74  hread, because t
f720: 68 65 20 61 72 67 76 5b 5d 0a 09 20 2a 20 6f 62  he argv[].. * ob
f730: 6a 65 63 74 73 20 62 65 6c 6f 6e 67 20 74 6f 20  jects belong to 
f740: 74 68 69 73 20 74 68 72 65 61 64 2e 20 44 65 61  this thread. Dea
f750: 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65 6d 20 69  llocating them i
f760: 6e 20 61 20 64 69 66 66 65 72 65 6e 74 0a 09 20  n a different.. 
f770: 2a 20 74 68 72 65 61 64 20 69 73 20 6e 6f 74 20  * thread is not 
f780: 61 6c 6c 6f 77 65 64 0a 09 20 2a 2f 0a 0a 09 46  allowed.. */...F
f790: 72 65 65 52 65 66 6c 65 63 74 65 64 54 72 61 6e  reeReflectedTran
f7a0: 73 66 6f 72 6d 28 72 74 50 74 72 29 3b 0a 09 62  sform(rtPtr);..b
f7b0: 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20  reak;..    case 
f7c0: 46 6f 72 77 61 72 64 65 64 49 6e 70 75 74 3a 20  ForwardedInput: 
f7d0: 7b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 62 75 66 4f  {..Tcl_Obj *bufO
f7e0: 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 42 79 74 65  bj = Tcl_NewByte
f7f0: 41 72 72 61 79 4f 62 6a 28 28 75 6e 73 69 67 6e  ArrayObj((unsign
f800: 65 64 20 63 68 61 72 20 2a 29 20 70 61 72 61 6d  ed char *) param
f810: 50 74 72 2d 3e 74 72 61 6e 73 66 6f 72 6d 2e 62  Ptr->transform.b
f820: 75 66 2c 0a 09 09 09 09 09 20 20 20 20 20 20 70  uf,......      p
f830: 61 72 61 6d 50 74 72 2d 3e 74 72 61 6e 73 66 6f  aramPtr->transfo
f840: 72 6d 2e 73 69 7a 65 29 3b 0a 0a 09 69 66 20 28  rm.size);...if (
f850: 49 6e 76 6f 6b 65 54 63 6c 4d 65 74 68 6f 64 28  InvokeTclMethod(
f860: 72 74 50 74 72 2c 20 22 72 65 61 64 22 2c 20 62  rtPtr, "read", b
f870: 75 66 4f 62 6a 2c 20 4e 55 4c 4c 2c 20 26 72 65  ufObj, NULL, &re
f880: 73 4f 62 6a 29 20 21 3d 20 54 43 4c 5f 4f 4b 29  sObj) != TCL_OK)
f890: 20 7b 0a 09 20 20 20 20 46 6f 72 77 61 72 64 53   {..    ForwardS
f8a0: 65 74 4f 62 6a 45 72 72 6f 72 28 70 61 72 61 6d  etObjError(param
f8b0: 50 74 72 2c 20 72 65 73 4f 62 6a 29 3b 0a 09 20  Ptr, resObj);.. 
f8c0: 20 20 20 70 61 72 61 6d 50 74 72 2d 3e 74 72 61     paramPtr->tra
f8d0: 6e 73 66 6f 72 6d 2e 73 69 7a 65 20 3d 20 2d 31  nsform.size = -1
f8e0: 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20  ;..} else {..   
f8f0: 20 2f 2a 0a 09 20 20 20 20 20 2a 20 50 72 6f 63   /*..     * Proc
f900: 65 73 73 20 61 20 72 65 67 75 6c 61 72 20 72 65  ess a regular re
f910: 74 75 72 6e 2e 20 43 6f 6e 74 61 69 6e 73 20 74  turn. Contains t
f920: 68 65 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f  he transformatio
f930: 6e 20 72 65 73 75 6c 74 2e 0a 09 20 20 20 20 20  n result...     
f940: 2a 20 53 65 6e 74 20 69 74 20 62 61 63 6b 20 74  * Sent it back t
f950: 6f 20 74 68 65 20 72 65 71 75 65 73 74 20 6f 72  o the request or
f960: 69 67 69 6e 61 74 6f 72 2e 0a 09 20 20 20 20 20  iginator...     
f970: 2a 2f 0a 0a 09 20 20 20 20 69 6e 74 20 62 79 74  */...    int byt
f980: 65 63 3b 09 09 2f 2a 20 4e 75 6d 62 65 72 20 6f  ec;../* Number o
f990: 66 20 72 65 74 75 72 6e 65 64 20 62 79 74 65 73  f returned bytes
f9a0: 20 2a 2f 0a 09 20 20 20 20 75 6e 73 69 67 6e 65   */..    unsigne
f9b0: 64 20 63 68 61 72 20 2a 62 79 74 65 76 3b 20 2f  d char *bytev; /
f9c0: 2a 20 41 72 72 61 79 20 6f 66 20 72 65 74 75 72  * Array of retur
f9d0: 6e 65 64 20 62 79 74 65 73 20 2a 2f 0a 0a 09 20  ned bytes */... 
f9e0: 20 20 20 62 79 74 65 76 20 3d 20 54 63 6c 5f 47     bytev = Tcl_G
f9f0: 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f  etByteArrayFromO
fa00: 62 6a 28 72 65 73 4f 62 6a 2c 20 26 62 79 74 65  bj(resObj, &byte
fa10: 63 29 3b 0a 0a 09 20 20 20 20 70 61 72 61 6d 50  c);...    paramP
fa20: 74 72 2d 3e 74 72 61 6e 73 66 6f 72 6d 2e 73 69  tr->transform.si
fa30: 7a 65 20 3d 20 62 79 74 65 63 3b 0a 0a 09 20 20  ze = bytec;...  
fa40: 20 20 69 66 20 28 62 79 74 65 63 20 3e 20 30 29    if (bytec > 0)
fa50: 20 7b 0a 09 09 70 61 72 61 6d 50 74 72 2d 3e 74   {...paramPtr->t
fa60: 72 61 6e 73 66 6f 72 6d 2e 62 75 66 20 3d 20 63  ransform.buf = c
fa70: 6b 61 6c 6c 6f 63 20 28 62 79 74 65 63 29 3b 0a  kalloc (bytec);.
fa80: 09 09 6d 65 6d 63 70 79 28 70 61 72 61 6d 50 74  ..memcpy(paramPt
fa90: 72 2d 3e 74 72 61 6e 73 66 6f 72 6d 2e 62 75 66  r->transform.buf
faa0: 2c 20 62 79 74 65 76 2c 20 28 73 69 7a 65 5f 74  , bytev, (size_t
fab0: 29 62 79 74 65 63 29 3b 0a 09 20 20 20 20 7d 20  )bytec);..    } 
fac0: 65 6c 73 65 20 7b 0a 09 09 70 61 72 61 6d 50 74  else {...paramPt
fad0: 72 2d 3e 74 72 61 6e 73 66 6f 72 6d 2e 62 75 66  r->transform.buf
fae0: 20 3d 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a   = NULL;..    }.
faf0: 09 7d 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d  .}..break;.    }
fb00: 0a 0a 20 20 20 20 63 61 73 65 20 46 6f 72 77 61  ..    case Forwa
fb10: 72 64 65 64 4f 75 74 70 75 74 3a 20 7b 0a 09 54  rdedOutput: {..T
fb20: 63 6c 5f 4f 62 6a 20 2a 62 75 66 4f 62 6a 20 3d  cl_Obj *bufObj =
fb30: 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61   Tcl_NewByteArra
fb40: 79 4f 62 6a 28 28 75 6e 73 69 67 6e 65 64 20 63  yObj((unsigned c
fb50: 68 61 72 20 2a 29 20 70 61 72 61 6d 50 74 72 2d  har *) paramPtr-
fb60: 3e 74 72 61 6e 73 66 6f 72 6d 2e 62 75 66 2c 0a  >transform.buf,.
fb70: 09 09 09 09 09 20 20 20 20 20 20 70 61 72 61 6d  .....      param
fb80: 50 74 72 2d 3e 74 72 61 6e 73 66 6f 72 6d 2e 73  Ptr->transform.s
fb90: 69 7a 65 29 3b 0a 0a 09 69 66 20 28 49 6e 76 6f  ize);...if (Invo
fba0: 6b 65 54 63 6c 4d 65 74 68 6f 64 28 72 74 50 74  keTclMethod(rtPt
fbb0: 72 2c 20 22 77 72 69 74 65 22 2c 20 62 75 66 4f  r, "write", bufO
fbc0: 62 6a 2c 20 4e 55 4c 4c 2c 20 26 72 65 73 4f 62  bj, NULL, &resOb
fbd0: 6a 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a  j) != TCL_OK) {.
fbe0: 09 20 20 20 20 46 6f 72 77 61 72 64 53 65 74 4f  .    ForwardSetO
fbf0: 62 6a 45 72 72 6f 72 28 70 61 72 61 6d 50 74 72  bjError(paramPtr
fc00: 2c 20 72 65 73 4f 62 6a 29 3b 0a 09 20 20 20 20  , resObj);..    
fc10: 70 61 72 61 6d 50 74 72 2d 3e 74 72 61 6e 73 66  paramPtr->transf
fc20: 6f 72 6d 2e 73 69 7a 65 20 3d 20 2d 31 3b 0a 09  orm.size = -1;..
fc30: 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 2f 2a  } else {..    /*
fc40: 0a 09 20 20 20 20 20 2a 20 50 72 6f 63 65 73 73  ..     * Process
fc50: 20 61 20 72 65 67 75 6c 61 72 20 72 65 74 75 72   a regular retur
fc60: 6e 2e 20 43 6f 6e 74 61 69 6e 73 20 74 68 65 20  n. Contains the 
fc70: 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 72  transformation r
fc80: 65 73 75 6c 74 2e 0a 09 20 20 20 20 20 2a 20 53  esult...     * S
fc90: 65 6e 74 20 69 74 20 62 61 63 6b 20 74 6f 20 74  ent it back to t
fca0: 68 65 20 72 65 71 75 65 73 74 20 6f 72 69 67 69  he request origi
fcb0: 6e 61 74 6f 72 2e 0a 09 20 20 20 20 20 2a 2f 0a  nator...     */.
fcc0: 0a 09 20 20 20 20 69 6e 74 20 62 79 74 65 63 3b  ..    int bytec;
fcd0: 09 09 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72  ../* Number of r
fce0: 65 74 75 72 6e 65 64 20 62 79 74 65 73 20 2a 2f  eturned bytes */
fcf0: 0a 09 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  ..    unsigned c
fd00: 68 61 72 20 2a 62 79 74 65 76 3b 20 2f 2a 20 41  har *bytev; /* A
fd10: 72 72 61 79 20 6f 66 20 72 65 74 75 72 6e 65 64  rray of returned
fd20: 20 62 79 74 65 73 20 2a 2f 0a 0a 09 20 20 20 20   bytes */...    
fd30: 62 79 74 65 76 20 3d 20 54 63 6c 5f 47 65 74 42  bytev = Tcl_GetB
fd40: 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28  yteArrayFromObj(
fd50: 72 65 73 4f 62 6a 2c 20 26 62 79 74 65 63 29 3b  resObj, &bytec);
fd60: 0a 0a 09 20 20 20 20 70 61 72 61 6d 50 74 72 2d  ...    paramPtr-
fd70: 3e 74 72 61 6e 73 66 6f 72 6d 2e 73 69 7a 65 20  >transform.size 
fd80: 3d 20 62 79 74 65 63 3b 0a 0a 09 20 20 20 20 69  = bytec;...    i
fd90: 66 20 28 62 79 74 65 63 20 3e 20 30 29 20 7b 0a  f (bytec > 0) {.
fda0: 09 09 70 61 72 61 6d 50 74 72 2d 3e 74 72 61 6e  ..paramPtr->tran
fdb0: 73 66 6f 72 6d 2e 62 75 66 20 3d 20 63 6b 61 6c  sform.buf = ckal
fdc0: 6c 6f 63 20 28 62 79 74 65 63 29 3b 0a 09 09 6d  loc (bytec);...m
fdd0: 65 6d 63 70 79 28 70 61 72 61 6d 50 74 72 2d 3e  emcpy(paramPtr->
fde0: 74 72 61 6e 73 66 6f 72 6d 2e 62 75 66 2c 20 62  transform.buf, b
fdf0: 79 74 65 76 2c 20 28 73 69 7a 65 5f 74 29 62 79  ytev, (size_t)by
fe00: 74 65 63 29 3b 0a 09 20 20 20 20 7d 20 65 6c 73  tec);..    } els
fe10: 65 20 7b 0a 09 09 70 61 72 61 6d 50 74 72 2d 3e  e {...paramPtr->
fe20: 74 72 61 6e 73 66 6f 72 6d 2e 62 75 66 20 3d 20  transform.buf = 
fe30: 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a  NULL;..    }..}.
fe40: 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20  .break;.    }.. 
fe50: 20 20 20 63 61 73 65 20 46 6f 72 77 61 72 64 65     case Forwarde
fe60: 64 44 72 61 69 6e 3a 20 7b 0a 09 69 66 20 28 49  dDrain: {..if (I
fe70: 6e 76 6f 6b 65 54 63 6c 4d 65 74 68 6f 64 28 72  nvokeTclMethod(r
fe80: 74 50 74 72 2c 20 22 64 72 61 69 6e 22 2c 20 4e  tPtr, "drain", N
fe90: 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 26 72 65 73 4f  ULL, NULL, &resO
fea0: 62 6a 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b  bj) != TCL_OK) {
feb0: 0a 09 20 20 20 20 46 6f 72 77 61 72 64 53 65 74  ..    ForwardSet
fec0: 4f 62 6a 45 72 72 6f 72 28 70 61 72 61 6d 50 74  ObjError(paramPt
fed0: 72 2c 20 72 65 73 4f 62 6a 29 3b 0a 09 20 20 20  r, resObj);..   
fee0: 20 70 61 72 61 6d 50 74 72 2d 3e 74 72 61 6e 73   paramPtr->trans
fef0: 66 6f 72 6d 2e 73 69 7a 65 20 3d 20 2d 31 3b 0a  form.size = -1;.
ff00: 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 2f  .} else {..    /
ff10: 2a 0a 09 20 20 20 20 20 2a 20 50 72 6f 63 65 73  *..     * Proces
ff20: 73 20 61 20 72 65 67 75 6c 61 72 20 72 65 74 75  s a regular retu
ff30: 72 6e 2e 20 43 6f 6e 74 61 69 6e 73 20 74 68 65  rn. Contains the
ff40: 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20   transformation 
ff50: 72 65 73 75 6c 74 2e 0a 09 20 20 20 20 20 2a 20  result...     * 
ff60: 53 65 6e 74 20 69 74 20 62 61 63 6b 20 74 6f 20  Sent it back to 
ff70: 74 68 65 20 72 65 71 75 65 73 74 20 6f 72 69 67  the request orig
ff80: 69 6e 61 74 6f 72 2e 0a 09 20 20 20 20 20 2a 2f  inator...     */
ff90: 0a 0a 09 20 20 20 20 69 6e 74 20 62 79 74 65 63  ...    int bytec
ffa0: 3b 09 09 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20  ;../* Number of 
ffb0: 72 65 74 75 72 6e 65 64 20 62 79 74 65 73 20 2a  returned bytes *
ffc0: 2f 0a 09 20 20 20 20 75 6e 73 69 67 6e 65 64 20  /..    unsigned 
ffd0: 63 68 61 72 20 2a 62 79 74 65 76 3b 20 2f 2a 20  char *bytev; /* 
ffe0: 41 72 72 61 79 20 6f 66 20 72 65 74 75 72 6e 65  Array of returne
fff0: 64 20 62 79 74 65 73 20 2a 2f 0a 0a 09 20 20 20  d bytes */...   
10000 20 62 79 74 65 76 20 3d 20 54 63 6c 5f 47 65 74   bytev = Tcl_Get
10010 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a  ByteArrayFromObj
10020 28 72 65 73 4f 62 6a 2c 20 26 62 79 74 65 63 29  (resObj, &bytec)
10030 3b 0a 0a 09 20 20 20 20 70 61 72 61 6d 50 74 72  ;...    paramPtr
10040 2d 3e 74 72 61 6e 73 66 6f 72 6d 2e 73 69 7a 65  ->transform.size
10050 20 3d 20 62 79 74 65 63 3b 0a 0a 09 20 20 20 20   = bytec;...    
10060 69 66 20 28 62 79 74 65 63 20 3e 20 30 29 20 7b  if (bytec > 0) {
10070 0a 09 09 70 61 72 61 6d 50 74 72 2d 3e 74 72 61  ...paramPtr->tra
10080 6e 73 66 6f 72 6d 2e 62 75 66 20 3d 20 63 6b 61  nsform.buf = cka
10090 6c 6c 6f 63 20 28 62 79 74 65 63 29 3b 0a 09 09  lloc (bytec);...
100a0 6d 65 6d 63 70 79 28 70 61 72 61 6d 50 74 72 2d  memcpy(paramPtr-
100b0 3e 74 72 61 6e 73 66 6f 72 6d 2e 62 75 66 2c 20  >transform.buf, 
100c0 62 79 74 65 76 2c 20 28 73 69 7a 65 5f 74 29 62  bytev, (size_t)b
100d0 79 74 65 63 29 3b 0a 09 20 20 20 20 7d 20 65 6c  ytec);..    } el
100e0 73 65 20 7b 0a 09 09 70 61 72 61 6d 50 74 72 2d  se {...paramPtr-
100f0 3e 74 72 61 6e 73 66 6f 72 6d 2e 62 75 66 20 3d  >transform.buf =
10100 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 7d   NULL;..    }..}
10110 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a  ..break;.    }..
10120 20 20 20 20 63 61 73 65 20 46 6f 72 77 61 72 64      case Forward
10130 65 64 46 6c 75 73 68 3a 20 7b 0a 09 69 66 20 28  edFlush: {..if (
10140 49 6e 76 6f 6b 65 54 63 6c 4d 65 74 68 6f 64 28  InvokeTclMethod(
10150 72 74 50 74 72 2c 20 22 66 6c 75 73 68 22 2c 20  rtPtr, "flush", 
10160 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 26 72 65 73  NULL, NULL, &res
10170 4f 62 6a 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20  Obj) != TCL_OK) 
10180 7b 0a 09 20 20 20 20 46 6f 72 77 61 72 64 53 65  {..    ForwardSe
10190 74 4f 62 6a 45 72 72 6f 72 28 70 61 72 61 6d 50  tObjError(paramP
101a0 74 72 2c 20 72 65 73 4f 62 6a 29 3b 0a 09 20 20  tr, resObj);..  
101b0 20 20 70 61 72 61 6d 50 74 72 2d 3e 74 72 61 6e    paramPtr->tran
101c0 73 66 6f 72 6d 2e 73 69 7a 65 20 3d 20 2d 31 3b  sform.size = -1;
101d0 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20  ..} else {..    
101e0 2f 2a 0a 09 20 20 20 20 20 2a 20 50 72 6f 63 65  /*..     * Proce
101f0 73 73 20 61 20 72 65 67 75 6c 61 72 20 72 65 74  ss a regular ret
10200 75 72 6e 2e 20 43 6f 6e 74 61 69 6e 73 20 74 68  urn. Contains th
10210 65 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e  e transformation
10220 20 72 65 73 75 6c 74 2e 0a 09 20 20 20 20 20 2a   result...     *
10230 20 53 65 6e 74 20 69 74 20 62 61 63 6b 20 74 6f   Sent it back to
10240 20 74 68 65 20 72 65 71 75 65 73 74 20 6f 72 69   the request ori
10250 67 69 6e 61 74 6f 72 2e 0a 09 20 20 20 20 20 2a  ginator...     *
10260 2f 0a 0a 09 20 20 20 20 69 6e 74 20 62 79 74 65  /...    int byte
10270 63 3b 09 09 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  c;../* Number of
10280 20 72 65 74 75 72 6e 65 64 20 62 79 74 65 73 20   returned bytes 
10290 2a 2f 0a 09 20 20 20 20 75 6e 73 69 67 6e 65 64  */..    unsigned
102a0 20 63 68 61 72 20 2a 62 79 74 65 76 3b 20 2f 2a   char *bytev; /*
102b0 20 41 72 72 61 79 20 6f 66 20 72 65 74 75 72 6e   Array of return
102c0 65 64 20 62 79 74 65 73 20 2a 2f 0a 0a 09 20 20  ed bytes */...  
102d0 20 20 62 79 74 65 76 20 3d 20 54 63 6c 5f 47 65    bytev = Tcl_Ge
102e0 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62  tByteArrayFromOb
102f0 6a 28 72 65 73 4f 62 6a 2c 20 26 62 79 74 65 63  j(resObj, &bytec
10300 29 3b 0a 0a 09 20 20 20 20 70 61 72 61 6d 50 74  );...    paramPt
10310 72 2d 3e 74 72 61 6e 73 66 6f 72 6d 2e 73 69 7a  r->transform.siz
10320 65 20 3d 20 62 79 74 65 63 3b 0a 0a 09 20 20 20  e = bytec;...   
10330 20 69 66 20 28 62 79 74 65 63 20 3e 20 30 29 20   if (bytec > 0) 
10340 7b 0a 09 09 70 61 72 61 6d 50 74 72 2d 3e 74 72  {...paramPtr->tr
10350 61 6e 73 66 6f 72 6d 2e 62 75 66 20 3d 20 63 6b  ansform.buf = ck
10360 61 6c 6c 6f 63 20 28 62 79 74 65 63 29 3b 0a 09  alloc (bytec);..
10370 09 6d 65 6d 63 70 79 28 70 61 72 61 6d 50 74 72  .memcpy(paramPtr
10380 2d 3e 74 72 61 6e 73 66 6f 72 6d 2e 62 75 66 2c  ->transform.buf,
10390 20 62 79 74 65 76 2c 20 28 73 69 7a 65 5f 74 29   bytev, (size_t)
103a0 62 79 74 65 63 29 3b 0a 09 20 20 20 20 7d 20 65  bytec);..    } e
103b0 6c 73 65 20 7b 0a 09 09 70 61 72 61 6d 50 74 72  lse {...paramPtr
103c0 2d 3e 74 72 61 6e 73 66 6f 72 6d 2e 62 75 66 20  ->transform.buf 
103d0 3d 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09  = NULL;..    }..
103e0 7d 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a  }..break;.    }.
103f0 0a 20 20 20 20 63 61 73 65 20 46 6f 72 77 61 72  .    case Forwar
10400 64 65 64 45 76 65 6e 74 3a 20 7b 0a 09 54 63 6c  dedEvent: {..Tcl
10410 5f 4f 62 6a 20 2a 6d 61 73 6b 4f 62 6a 20 3d 20  _Obj *maskObj = 
10420 44 65 63 6f 64 65 45 76 65 6e 74 4d 61 73 6b 28  DecodeEventMask(
10430 70 61 72 61 6d 50 74 72 2d 3e 6d 61 73 6b 2e 6d  paramPtr->mask.m
10440 61 73 6b 29 3b 0a 0a 09 28 76 6f 69 64 29 20 49  ask);...(void) I
10450 6e 76 6f 6b 65 54 63 6c 4d 65 74 68 6f 64 28 72  nvokeTclMethod(r
10460 74 50 74 72 2c 20 22 65 76 65 6e 74 22 2c 20 6d  tPtr, "event", m
10470 61 73 6b 4f 62 6a 2c 20 4e 55 4c 4c 2c 20 4e 55  askObj, NULL, NU
10480 4c 4c 29 3b 0a 09 54 63 6c 5f 44 65 63 72 52 65  LL);..Tcl_DecrRe
10490 66 43 6f 75 6e 74 28 6d 61 73 6b 4f 62 6a 29 3b  fCount(maskObj);
104a0 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a  ..break;.    }..
104b0 20 20 20 20 63 61 73 65 20 46 6f 72 77 61 72 64      case Forward
104c0 65 64 43 6c 65 61 72 3a 20 7b 0a 09 28 76 6f 69  edClear: {..(voi
104d0 64 29 20 49 6e 76 6f 6b 65 54 63 6c 4d 65 74 68  d) InvokeTclMeth
104e0 6f 64 28 72 74 50 74 72 2c 20 22 63 6c 65 61 72  od(rtPtr, "clear
104f0 22 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e  ", NULL, NULL, N
10500 55 4c 4c 29 3b 0a 09 62 72 65 61 6b 3b 0a 20 20  ULL);..break;.  
10510 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 46 6f    }..    case Fo
10520 72 77 61 72 64 65 64 4c 69 6d 69 74 3a 20 7b 0a  rwardedLimit: {.
10530 09 54 63 6c 5f 4f 62 6a 2a 20 72 65 73 4f 62 6a  .Tcl_Obj* resObj
10540 3b 0a 0a 09 69 66 20 28 49 6e 76 6f 6b 65 54 63  ;...if (InvokeTc
10550 6c 4d 65 74 68 6f 64 28 72 74 50 74 72 2c 20 22  lMethod(rtPtr, "
10560 6c 69 6d 69 74 22 2c 20 4e 55 4c 4c 2c 20 4e 55  limit", NULL, NU
10570 4c 4c 2c 20 26 72 65 73 4f 62 6a 29 20 21 3d 20  LL, &resObj) != 
10580 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 46  TCL_OK) {..    F
10590 6f 72 77 61 72 64 53 65 74 4f 62 6a 45 72 72 6f  orwardSetObjErro
105a0 72 28 70 61 72 61 6d 50 74 72 2c 20 72 65 73 4f  r(paramPtr, resO
105b0 62 6a 29 3b 0a 09 20 20 20 20 70 61 72 61 6d 50  bj);..    paramP
105c0 74 72 2d 3e 6c 69 6d 69 74 2e 6d 61 78 20 3d 20  tr->limit.max = 
105d0 2d 31 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28  -1;..} else if (
105e0 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
105f0 6a 28 69 6e 74 65 72 70 2c 20 72 65 73 4f 62 6a  j(interp, resObj
10600 2c 20 26 70 61 72 61 6d 50 74 72 2d 3e 6c 69 6d  , &paramPtr->lim
10610 69 74 2e 6d 61 78 29 20 21 3d 20 54 43 4c 5f 4f  it.max) != TCL_O
10620 4b 29 20 7b 0a 09 20 20 20 20 46 6f 72 77 61 72  K) {..    Forwar
10630 64 53 65 74 4f 62 6a 45 72 72 6f 72 28 70 61 72  dSetObjError(par
10640 61 6d 50 74 72 2c 20 4d 61 72 73 68 61 6c 6c 45  amPtr, MarshallE
10650 72 72 6f 72 28 69 6e 74 65 72 70 29 29 3b 0a 09  rror(interp));..
10660 20 20 20 20 70 61 72 61 6d 50 74 72 2d 3e 6c 69      paramPtr->li
10670 6d 69 74 2e 6d 61 78 20 3d 20 2d 31 3b 0a 09 7d  mit.max = -1;..}
10680 0a 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f  ...Tcl_DecrRefCo
10690 75 6e 74 28 72 65 73 4f 62 6a 29 3b 0a 09 62 72  unt(resObj);..br
106a0 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
106b0 63 61 73 65 20 46 6f 72 77 61 72 64 65 64 57 61  case ForwardedWa
106c0 74 63 68 3a 20 7b 0a 09 54 63 6c 5f 4f 62 6a 2a  tch: {..Tcl_Obj*
106d0 20 72 65 73 4f 62 6a 3b 0a 0a 09 69 66 20 28 49   resObj;...if (I
106e0 6e 76 6f 6b 65 54 63 6c 4d 65 74 68 6f 64 28 72  nvokeTclMethod(r
106f0 74 50 74 72 2c 20 22 77 61 74 63 68 22 2c 20 4e  tPtr, "watch", N
10700 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 26 72 65 73 4f  ULL, NULL, &resO
10710 62 6a 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b  bj) != TCL_OK) {
10720 0a 09 20 20 20 20 46 6f 72 77 61 72 64 53 65 74  ..    ForwardSet
10730 4f 62 6a 45 72 72 6f 72 28 70 61 72 61 6d 50 74  ObjError(paramPt
10740 72 2c 20 72 65 73 4f 62 6a 29 3b 0a 09 20 20 20  r, resObj);..   
10750 20 70 61 72 61 6d 50 74 72 2d 3e 6d 61 73 6b 2e   paramPtr->mask.
10760 6d 61 73 6b 20 3d 20 30 3b 0a 09 7d 20 65 6c 73  mask = 0;..} els
10770 65 20 69 66 20 28 45 6e 63 6f 64 65 45 76 65 6e  e if (EncodeEven
10780 74 4d 61 73 6b 28 72 74 50 74 72 2d 3e 69 6e 74  tMask(rtPtr->int
10790 65 72 70 2c 20 22 6d 61 73 6b 22 2c 20 72 65 73  erp, "mask", res
107a0 4f 62 6a 2c 20 26 70 61 72 61 6d 50 74 72 2d 3e  Obj, &paramPtr->
107b0 6d 61 73 6b 2e 6d 61 73 6b 29 20 21 3d 20 54 43  mask.mask) != TC
107c0 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 46 6f 72  L_OK) {..    For
107d0 77 61 72 64 53 65 74 4f 62 6a 45 72 72 6f 72 28  wardSetObjError(
107e0 70 61 72 61 6d 50 74 72 2c 20 4d 61 72 73 68 61  paramPtr, Marsha
107f0 6c 6c 45 72 72 6f 72 28 69 6e 74 65 72 70 29 29  llError(interp))
10800 3b 0a 09 20 20 20 20 70 61 72 61 6d 50 74 72 2d  ;..    paramPtr-
10810 3e 6d 61 73 6b 2e 6d 61 73 6b 20 3d 20 30 3b 0a  >mask.mask = 0;.
10820 09 7d 0a 0a 09 54 63 6c 5f 44 65 63 72 52 65 66  .}...Tcl_DecrRef
10830 43 6f 75 6e 74 28 72 65 73 4f 62 6a 29 3b 0a 09  Count(resObj);..
10840 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
10850 20 20 64 65 66 61 75 6c 74 3a 0a 09 2f 2a 0a 09    default:../*..
10860 20 2a 20 42 61 64 20 6f 70 65 72 61 74 69 6f 6e   * Bad operation
10870 20 63 6f 64 65 2e 0a 09 20 2a 2f 0a 09 54 63 6c   code... */..Tcl
10880 5f 50 61 6e 69 63 28 22 42 61 64 20 6f 70 65 72  _Panic("Bad oper
10890 61 74 69 6f 6e 20 63 6f 64 65 20 69 6e 20 46 6f  ation code in Fo
108a0 72 77 61 72 64 50 72 6f 63 22 29 3b 0a 09 62 72  rwardProc");..br
108b0 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
108c0 2f 2a 0a 20 20 20 20 20 2a 20 52 65 6d 6f 76 65  /*.     * Remove
108d0 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 77   the reference w
108e0 65 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 72 65  e held on the re
108f0 73 75 6c 74 20 6f 66 20 74 68 65 20 69 6e 76 6f  sult of the invo
10900 6b 65 2c 20 69 66 20 77 65 20 68 61 64 0a 20 20  ke, if we had.  
10910 20 20 20 2a 20 73 75 63 68 2e 0a 20 20 20 20 20     * such..     
10920 2a 2f 0a 0a 20 20 20 20 69 66 20 28 72 65 73 4f  */..    if (resO
10930 62 6a 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54  bj != NULL) {..T
10940 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
10950 72 65 73 4f 62 6a 29 3b 0a 20 20 20 20 7d 0a 0a  resObj);.    }..
10960 20 20 20 20 69 66 20 28 72 65 73 75 6c 74 50 74      if (resultPt
10970 72 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 52 65 70  r) {../*.. * Rep
10980 6f 72 74 20 74 68 65 20 66 6f 72 77 61 72 64 69  ort the forwardi
10990 6e 67 20 72 65 73 75 6c 74 20 73 79 6e 63 68 72  ng result synchr
109a0 6f 6e 6f 75 73 6c 79 20 74 6f 20 74 68 65 20 77  onously to the w
109b0 61 69 74 69 6e 67 20 63 61 6c 6c 65 72 2e 0a 09  aiting caller...
109c0 20 2a 20 54 68 69 73 20 75 6e 62 6c 6f 63 6b 73   * This unblocks
109d0 20 28 2a 29 20 61 73 20 77 65 6c 6c 2e 20 54 68   (*) as well. Th
109e0 69 73 20 69 73 20 77 72 61 70 70 65 64 20 69 6e  is is wrapped in
109f0 74 6f 20 61 20 63 6f 6e 64 69 74 69 6f 6e 61 6c  to a conditional
10a00 0a 09 20 2a 20 62 65 63 61 75 73 65 20 74 68 65  .. * because the
10a10 20 63 61 6c 6c 65 72 20 6d 61 79 20 68 61 76 65   caller may have
10a20 20 65 78 69 74 65 64 20 69 6e 20 74 68 65 20 6d   exited in the m
10a30 65 61 6e 20 74 69 6d 65 2e 0a 09 20 2a 2f 0a 0a  ean time... */..
10a40 09 54 63 6c 5f 4d 75 74 65 78 4c 6f 63 6b 28 26  .Tcl_MutexLock(&
10a50 72 63 46 6f 72 77 61 72 64 4d 75 74 65 78 29 3b  rcForwardMutex);
10a60 0a 09 72 65 73 75 6c 74 50 74 72 2d 3e 72 65 73  ..resultPtr->res
10a70 75 6c 74 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 09 54  ult = TCL_OK;..T
10a80 63 6c 5f 43 6f 6e 64 69 74 69 6f 6e 4e 6f 74 69  cl_ConditionNoti
10a90 66 79 28 26 72 65 73 75 6c 74 50 74 72 2d 3e 64  fy(&resultPtr->d
10aa0 6f 6e 65 29 3b 0a 09 54 63 6c 5f 4d 75 74 65 78  one);..Tcl_Mutex
10ab0 55 6e 6c 6f 63 6b 28 26 72 63 46 6f 72 77 61 72  Unlock(&rcForwar
10ac0 64 4d 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a 0a  dMutex);.    }..
10ad0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a      return 1;.}.
10ae0 0c 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 53 72  ..static void.Sr
10af0 63 45 78 69 74 50 72 6f 63 28 0a 20 20 20 20 43  cExitProc(.    C
10b00 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
10b10 44 61 74 61 29 0a 7b 0a 20 20 20 20 46 6f 72 77  Data).{.    Forw
10b20 61 72 64 69 6e 67 45 76 65 6e 74 20 2a 65 76 50  ardingEvent *evP
10b30 74 72 20 3d 20 28 46 6f 72 77 61 72 64 69 6e 67  tr = (Forwarding
10b40 45 76 65 6e 74 20 2a 29 20 63 6c 69 65 6e 74 44  Event *) clientD
10b50 61 74 61 3b 0a 20 20 20 20 46 6f 72 77 61 72 64  ata;.    Forward
10b60 69 6e 67 52 65 73 75 6c 74 20 2a 72 65 73 75 6c  ingResult *resul
10b70 74 50 74 72 3b 0a 20 20 20 20 46 6f 72 77 61 72  tPtr;.    Forwar
10b80 64 50 61 72 61 6d 20 2a 70 61 72 61 6d 50 74 72  dParam *paramPtr
10b90 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a  ;..    /*.     *
10ba0 20 4e 4f 54 45 20 28 32 29 3a 20 43 61 6e 20 74   NOTE (2): Can t
10bb0 68 69 73 20 68 61 6e 64 6c 65 72 20 62 65 20 63  his handler be c
10bc0 61 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 6f  alled with the o
10bd0 72 69 67 69 6e 61 74 6f 72 20 62 6c 6f 63 6b 65  riginator blocke
10be0 64 3f 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20  d?.     */..    
10bf0 2f 2a 0a 20 20 20 20 20 2a 20 54 68 65 20 6f 72  /*.     * The or
10c00 69 67 69 6e 61 74 6f 72 20 66 6f 72 20 74 68 65  iginator for the
10c10 20 65 76 65 6e 74 20 65 78 69 74 65 64 2e 20 49   event exited. I
10c20 74 20 69 73 20 6e 6f 74 20 73 75 72 65 20 69 66  t is not sure if
10c30 20 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e   this can happen
10c40 2c 0a 20 20 20 20 20 2a 20 61 73 20 74 68 65 20  ,.     * as the 
10c50 6f 72 69 67 69 6e 61 74 6f 72 20 73 68 6f 75 6c  originator shoul
10c60 64 20 62 65 20 62 6c 6f 63 6b 65 64 20 61 74 20  d be blocked at 
10c70 28 2a 29 20 77 68 69 6c 65 20 74 68 65 20 65 76  (*) while the ev
10c80 65 6e 74 20 69 73 20 69 6e 0a 20 20 20 20 20 2a  ent is in.     *
10c90 20 74 72 61 6e 73 69 74 2f 70 65 6e 64 69 6e 67   transit/pending
10ca0 2e 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 20  ..     *.     * 
10cb0 57 65 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  We make sure tha
10cc0 74 20 74 68 65 20 65 76 65 6e 74 20 63 61 6e 6e  t the event cann
10cd0 6f 74 20 72 65 66 65 72 20 74 6f 20 74 68 65 20  ot refer to the 
10ce0 72 65 73 75 6c 74 20 61 6e 79 6d 6f 72 65 2c 20  result anymore, 
10cf0 72 65 6d 6f 76 65 0a 20 20 20 20 20 2a 20 69 74  remove.     * it
10d00 20 66 72 6f 6d 20 74 68 65 20 6c 69 73 74 20 6f   from the list o
10d10 66 20 70 65 6e 64 69 6e 67 20 72 65 73 75 6c 74  f pending result
10d20 73 20 61 6e 64 20 66 72 65 65 20 74 68 65 20 73  s and free the s
10d30 74 72 75 63 74 75 72 65 2e 20 4c 6f 63 6b 69 6e  tructure. Lockin
10d40 67 20 74 68 65 0a 20 20 20 20 20 2a 20 61 63 63  g the.     * acc
10d50 65 73 73 20 65 6e 73 75 72 65 73 20 74 68 61 74  ess ensures that
10d60 20 77 65 20 63 61 6e 6e 6f 74 20 67 65 74 20 69   we cannot get i
10d70 6e 20 63 6f 6e 66 6c 69 63 74 20 77 69 74 68 20  n conflict with 
10d80 22 46 6f 72 77 61 72 64 50 72 6f 63 22 2c 0a 20  "ForwardProc",. 
10d90 20 20 20 20 2a 20 73 68 6f 75 6c 64 20 69 74 20      * should it 
10da0 61 6c 72 65 61 64 79 20 65 78 65 63 75 74 65 20  already execute 
10db0 74 68 65 20 65 76 65 6e 74 2e 0a 20 20 20 20 20  the event..     
10dc0 2a 2f 0a 0a 20 20 20 20 54 63 6c 5f 4d 75 74 65  */..    Tcl_Mute
10dd0 78 4c 6f 63 6b 28 26 72 63 46 6f 72 77 61 72 64  xLock(&rcForward
10de0 4d 75 74 65 78 29 3b 0a 0a 20 20 20 20 72 65 73  Mutex);..    res
10df0 75 6c 74 50 74 72 20 3d 20 65 76 50 74 72 2d 3e  ultPtr = evPtr->
10e00 72 65 73 75 6c 74 50 74 72 3b 0a 20 20 20 20 70  resultPtr;.    p
10e10 61 72 61 6d 50 74 72 20 3d 20 65 76 50 74 72 2d  aramPtr = evPtr-
10e20 3e 70 61 72 61 6d 3b 0a 0a 20 20 20 20 65 76 50  >param;..    evP
10e30 74 72 2d 3e 72 65 73 75 6c 74 50 74 72 20 3d 20  tr->resultPtr = 
10e40 4e 55 4c 4c 3b 0a 20 20 20 20 72 65 73 75 6c 74  NULL;.    result
10e50 50 74 72 2d 3e 65 76 50 74 72 20 3d 20 4e 55 4c  Ptr->evPtr = NUL
10e60 4c 3b 0a 20 20 20 20 72 65 73 75 6c 74 50 74 72  L;.    resultPtr
10e70 2d 3e 72 65 73 75 6c 74 20 3d 20 54 43 4c 5f 45  ->result = TCL_E
10e80 52 52 4f 52 3b 0a 0a 20 20 20 20 46 6f 72 77 61  RROR;..    Forwa
10e90 72 64 53 65 74 53 74 61 74 69 63 45 72 72 6f 72  rdSetStaticError
10ea0 28 70 61 72 61 6d 50 74 72 2c 20 6d 73 67 5f 73  (paramPtr, msg_s
10eb0 65 6e 64 5f 6f 72 69 67 69 6e 6c 6f 73 74 29 3b  end_originlost);
10ec0 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20  ..    /*.     * 
10ed0 53 65 65 20 62 65 6c 6f 77 3a 20 54 63 6c 53 70  See below: TclSp
10ee0 6c 69 63 65 4f 75 74 28 72 65 73 75 6c 74 50 74  liceOut(resultPt
10ef0 72 2c 20 66 6f 72 77 61 72 64 4c 69 73 74 29 3b  r, forwardList);
10f00 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 54 63  .     */..    Tc
10f10 6c 5f 4d 75 74 65 78 55 6e 6c 6f 63 6b 28 26 72  l_MutexUnlock(&r
10f20 63 46 6f 72 77 61 72 64 4d 75 74 65 78 29 3b 0a  cForwardMutex);.
10f30 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 54  .    /*.     * T
10f40 68 69 73 20 75 6e 6c 6f 63 6b 73 20 28 2a 29 2e  his unlocks (*).
10f50 20 54 68 65 20 73 74 72 75 63 74 75 72 65 20 77   The structure w
10f60 69 6c 6c 20 62 65 20 73 70 6c 69 63 65 64 20 6f  ill be spliced o
10f70 75 74 20 61 6e 64 20 66 72 65 65 64 20 62 79 0a  ut and freed by.
10f80 20 20 20 20 20 2a 20 22 46 6f 72 77 61 72 64 50       * "ForwardP
10f90 72 6f 63 22 2e 20 4d 61 79 62 65 2e 0a 20 20 20  roc". Maybe..   
10fa0 20 20 2a 2f 0a 0a 20 20 20 20 54 63 6c 5f 43 6f    */..    Tcl_Co
10fb0 6e 64 69 74 69 6f 6e 4e 6f 74 69 66 79 28 26 72  nditionNotify(&r
10fc0 65 73 75 6c 74 50 74 72 2d 3e 64 6f 6e 65 29 3b  esultPtr->done);
10fd0 0a 7d 0a 0c 0a 73 74 61 74 69 63 20 76 6f 69 64  .}...static void
10fe0 0a 44 73 74 45 78 69 74 50 72 6f 63 28 0a 20 20  .DstExitProc(.  
10ff0 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
11000 65 6e 74 44 61 74 61 29 0a 7b 0a 20 20 20 20 46  entData).{.    F
11010 6f 72 77 61 72 64 69 6e 67 45 76 65 6e 74 20 2a  orwardingEvent *
11020 65 76 50 74 72 20 3d 20 28 46 6f 72 77 61 72 64  evPtr = (Forward
11030 69 6e 67 45 76 65 6e 74 20 2a 29 20 63 6c 69 65  ingEvent *) clie
11040 6e 74 44 61 74 61 3b 0a 20 20 20 20 46 6f 72 77  ntData;.    Forw
11050 61 72 64 69 6e 67 52 65 73 75 6c 74 20 2a 72 65  ardingResult *re
11060 73 75 6c 74 50 74 72 20 3d 20 65 76 50 74 72 2d  sultPtr = evPtr-
11070 3e 72 65 73 75 6c 74 50 74 72 3b 0a 20 20 20 20  >resultPtr;.    
11080 46 6f 72 77 61 72 64 50 61 72 61 6d 20 2a 70 61  ForwardParam *pa
11090 72 61 6d 50 74 72 20 3d 20 65 76 50 74 72 2d 3e  ramPtr = evPtr->
110a0 70 61 72 61 6d 3b 0a 0a 20 20 20 20 2f 2a 0a 20  param;..    /*. 
110b0 20 20 20 20 2a 20 4e 4f 54 45 20 28 33 29 3a 20      * NOTE (3): 
110c0 49 74 20 69 73 20 6e 6f 74 20 63 6c 65 61 72 20  It is not clear 
110d0 69 66 20 74 68 65 20 65 76 65 6e 74 20 73 74 69  if the event sti
110e0 6c 6c 20 65 78 69 73 74 73 20 77 68 65 6e 20 74  ll exists when t
110f0 68 69 73 20 68 61 6e 64 6c 65 72 0a 20 20 20 20  his handler.    
11100 20 2a 20 69 73 20 63 61 6c 6c 65 64 2e 20 57 65   * is called. We
11110 20 6d 69 67 68 74 20 68 61 76 65 20 74 6f 20 75   might have to u
11120 73 65 20 27 72 65 73 75 6c 74 50 74 72 27 20 61  se 'resultPtr' a
11130 73 20 6f 75 72 20 63 6c 69 65 6e 74 44 61 74 61  s our clientData
11140 20 69 6e 73 74 65 61 64 2e 0a 20 20 20 20 20 2a   instead..     *
11150 2f 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a  /..    /*.     *
11160 20 54 68 65 20 72 65 63 65 69 76 65 72 20 66 6f   The receiver fo
11170 72 20 74 68 65 20 65 76 65 6e 74 20 65 78 69 74  r the event exit
11180 65 64 2c 20 62 65 66 6f 72 65 20 70 72 6f 63 65  ed, before proce
11190 73 73 69 6e 67 20 74 68 65 20 65 76 65 6e 74 2e  ssing the event.
111a0 20 57 65 0a 20 20 20 20 20 2a 20 64 65 74 61 63   We.     * detac
111b0 68 20 74 68 65 20 72 65 73 75 6c 74 20 6e 6f 77  h the result now
111c0 2c 20 77 61 6b 65 20 74 68 65 20 6f 72 69 67 69  , wake the origi
111d0 6e 61 74 6f 72 20 75 70 20 61 6e 64 20 73 69 67  nator up and sig
111e0 6e 61 6c 20 66 61 69 6c 75 72 65 2e 0a 20 20 20  nal failure..   
111f0 20 20 2a 2f 0a 0a 20 20 20 20 65 76 50 74 72 2d    */..    evPtr-
11200 3e 72 65 73 75 6c 74 50 74 72 20 3d 20 4e 55 4c  >resultPtr = NUL
11210 4c 3b 0a 20 20 20 20 72 65 73 75 6c 74 50 74 72  L;.    resultPtr
11220 2d 3e 65 76 50 74 72 20 3d 20 4e 55 4c 4c 3b 0a  ->evPtr = NULL;.
11230 20 20 20 20 72 65 73 75 6c 74 50 74 72 2d 3e 72      resultPtr->r
11240 65 73 75 6c 74 20 3d 20 54 43 4c 5f 45 52 52 4f  esult = TCL_ERRO
11250 52 3b 0a 0a 20 20 20 20 46 6f 72 77 61 72 64 53  R;..    ForwardS
11260 65 74 53 74 61 74 69 63 45 72 72 6f 72 28 70 61  etStaticError(pa
11270 72 61 6d 50 74 72 2c 20 6d 73 67 5f 73 65 6e 64  ramPtr, msg_send
11280 5f 64 73 74 6c 6f 73 74 29 3b 0a 0a 20 20 20 20  _dstlost);..    
11290 54 63 6c 5f 43 6f 6e 64 69 74 69 6f 6e 4e 6f 74  Tcl_ConditionNot
112a0 69 66 79 28 26 72 65 73 75 6c 74 50 74 72 2d 3e  ify(&resultPtr->
112b0 64 6f 6e 65 29 3b 0a 7d 0a 0c 0a 73 74 61 74 69  done);.}...stati
112c0 63 20 76 6f 69 64 0a 46 6f 72 77 61 72 64 53 65  c void.ForwardSe
112d0 74 4f 62 6a 45 72 72 6f 72 28 0a 20 20 20 20 46  tObjError(.    F
112e0 6f 72 77 61 72 64 50 61 72 61 6d 20 2a 70 61 72  orwardParam *par
112f0 61 6d 50 74 72 2c 0a 20 20 20 20 54 63 6c 5f 4f  amPtr,.    Tcl_O
11300 62 6a 20 2a 6f 62 6a 29 0a 7b 0a 20 20 20 20 69  bj *obj).{.    i
11310 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 63 6f 6e 73  nt len;.    cons
11320 74 20 63 68 61 72 20 2a 6d 73 67 53 74 72 20 3d  t char *msgStr =
11330 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
11340 6f 6d 4f 62 6a 28 6f 62 6a 2c 20 26 6c 65 6e 29  omObj(obj, &len)
11350 3b 0a 0a 20 20 20 20 6c 65 6e 2b 2b 3b 0a 20 20  ;..    len++;.  
11360 20 20 46 6f 72 77 61 72 64 53 65 74 44 79 6e 61    ForwardSetDyna
11370 6d 69 63 45 72 72 6f 72 28 70 61 72 61 6d 50 74  micError(paramPt
11380 72 2c 20 63 6b 61 6c 6c 6f 63 28 28 75 6e 73 69  r, ckalloc((unsi
11390 67 6e 65 64 29 20 6c 65 6e 29 29 3b 0a 20 20 20  gned) len));.   
113a0 20 6d 65 6d 63 70 79 28 70 61 72 61 6d 50 74 72   memcpy(paramPtr
113b0 2d 3e 62 61 73 65 2e 6d 73 67 53 74 72 2c 20 6d  ->base.msgStr, m
113c0 73 67 53 74 72 2c 20 28 75 6e 73 69 67 6e 65 64  sgStr, (unsigned
113d0 29 20 6c 65 6e 29 3b 0a 7d 0a 23 65 6e 64 69 66  ) len);.}.#endif
113e0 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
113f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11400 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11410 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11420 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
11430 2a 0a 20 2a 09 54 69 6d 65 72 4b 69 6c 6c 20 2d  *. *.TimerKill -
11440 2d 0a 20 2a 0a 20 2a 09 54 69 6d 65 72 20 6d 61  -. *. *.Timer ma
11450 6e 61 67 65 6d 65 6e 74 2e 20 52 65 6d 6f 76 65  nagement. Remove
11460 73 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 74  s the internal t
11470 69 6d 65 72 0a 20 2a 09 69 66 20 69 74 20 65 78  imer. *.if it ex
11480 69 73 74 73 2e 0a 20 2a 0a 20 2a 09 53 69 64 65  ists.. *. *.Side
11490 65 66 66 65 63 74 73 3a 0a 20 2a 09 09 53 65 65  effects:. *..See
114a0 20 61 62 6f 76 65 2e 0a 20 2a 0a 20 2a 09 52 65   above.. *. *.Re
114b0 73 75 6c 74 3a 0a 20 2a 09 09 4e 6f 6e 65 2e 0a  sult:. *..None..
114c0 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
114d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
114e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
114f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11500 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
11510 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 54 69 6d  .static void.Tim
11520 65 72 4b 69 6c 6c 20 28 52 65 66 6c 65 63 74 65  erKill (Reflecte
11530 64 54 72 61 6e 73 66 6f 72 6d 2a 20 72 74 50 74  dTransform* rtPt
11540 72 29 0a 7b 0a 20 20 20 20 69 66 20 28 72 74 50  r).{.    if (rtP
11550 74 72 2d 3e 74 69 6d 65 72 20 3d 3d 20 28 54 63  tr->timer == (Tc
11560 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55  l_TimerToken) NU
11570 4c 4c 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 20  LL) return;..   
11580 20 2f 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 78   /* Delete an ex
11590 69 73 74 69 6e 67 20 66 6c 75 73 68 2d 6f 75 74  isting flush-out
115a0 20 74 69 6d 65 72 2c 20 70 72 65 76 65 6e 74 20   timer, prevent 
115b0 69 74 20 66 72 6f 6d 20 66 69 72 69 6e 67 20 6f  it from firing o
115c0 6e 20 61 0a 20 20 20 20 20 2a 20 72 65 6d 6f 76  n a.     * remov
115d0 65 64 2f 64 65 61 64 20 63 68 61 6e 6e 65 6c 2e  ed/dead channel.
115e0 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 54 63  .     */..    Tc
115f0 6c 5f 44 65 6c 65 74 65 54 69 6d 65 72 48 61 6e  l_DeleteTimerHan
11600 64 6c 65 72 20 28 72 74 50 74 72 2d 3e 74 69 6d  dler (rtPtr->tim
11610 65 72 29 3b 0a 20 20 20 20 72 74 50 74 72 2d 3e  er);.    rtPtr->
11620 74 69 6d 65 72 20 3d 20 28 54 63 6c 5f 54 69 6d  timer = (Tcl_Tim
11630 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 3b 0a 7d  erToken) NULL;.}
11640 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
11650 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11660 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11670 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11680 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
11690 2a 0a 20 2a 09 54 69 6d 65 72 53 65 74 75 70 20  *. *.TimerSetup 
116a0 2d 2d 0a 20 2a 0a 20 2a 09 54 69 6d 65 72 20 6d  --. *. *.Timer m
116b0 61 6e 61 67 65 6d 65 6e 74 2e 20 43 72 65 61 74  anagement. Creat
116c0 65 73 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  es the internal 
116d0 74 69 6d 65 72 0a 20 2a 09 69 66 20 69 74 20 64  timer. *.if it d
116e0 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a 20  oes not exist.. 
116f0 2a 0a 20 2a 09 53 69 64 65 65 66 66 65 63 74 73  *. *.Sideeffects
11700 3a 0a 20 2a 09 09 53 65 65 20 61 62 6f 76 65 2e  :. *..See above.
11710 0a 20 2a 0a 20 2a 09 52 65 73 75 6c 74 3a 0a 20  . *. *.Result:. 
11720 2a 09 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d  *..None.. *. *--
11730 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11740 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11750 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11760 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11770 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63  ----. */..static
11780 20 76 6f 69 64 0a 54 69 6d 65 72 53 65 74 75 70   void.TimerSetup
11790 20 28 52 65 66 6c 65 63 74 65 64 54 72 61 6e 73   (ReflectedTrans
117a0 66 6f 72 6d 2a 20 72 74 50 74 72 29 0a 7b 0a 20  form* rtPtr).{. 
117b0 20 20 20 69 66 20 28 72 74 50 74 72 2d 3e 74 69     if (rtPtr->ti
117c0 6d 65 72 20 21 3d 20 28 54 63 6c 5f 54 69 6d 65  mer != (Tcl_Time
117d0 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20 72 65  rToken) NULL) re
117e0 74 75 72 6e 3b 0a 0a 20 20 20 20 72 74 50 74 72  turn;..    rtPtr
117f0 2d 3e 74 69 6d 65 72 20 3d 20 54 63 6c 5f 43 72  ->timer = Tcl_Cr
11800 65 61 74 65 54 69 6d 65 72 48 61 6e 64 6c 65 72  eateTimerHandler
11810 20 28 46 4c 55 53 48 5f 44 45 4c 41 59 2c 20 54   (FLUSH_DELAY, T
11820 69 6d 65 72 52 75 6e 2c 0a 09 09 09 09 09 20 20  imerRun,......  
11830 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 72 74   (ClientData) rt
11840 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d  Ptr);.}.../*. *-
11850 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11860 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11870 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11880 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11890 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 09 54 69 6d 65  -----. *. *.Time
118a0 72 52 75 6e 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61  rRun --. *. *.Ca
118b0 6c 6c 65 64 20 62 79 20 74 68 65 20 6e 6f 74 69  lled by the noti
118c0 66 69 65 72 20 28 2d 3e 20 74 69 6d 65 72 29 20  fier (-> timer) 
118d0 74 6f 20 66 6c 75 73 68 20 6f 75 74 0a 20 2a 09  to flush out. *.
118e0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 61 69 74  information wait
118f0 69 6e 67 20 69 6e 20 63 68 61 6e 6e 65 6c 20 62  ing in channel b
11900 75 66 66 65 72 73 2e 0a 20 2a 0a 20 2a 09 53 69  uffers.. *. *.Si
11910 64 65 65 66 66 65 63 74 73 3a 0a 20 2a 09 09 41  deeffects:. *..A
11920 73 20 6f 66 20 27 54 63 6c 5f 4e 6f 74 69 66 79  s of 'Tcl_Notify
11930 43 68 61 6e 6e 65 6c 27 2e 0a 20 2a 0a 20 2a 09  Channel'.. *. *.
11940 52 65 73 75 6c 74 3a 0a 20 2a 09 09 4e 6f 6e 65  Result:. *..None
11950 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  .. *. *---------
11960 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11970 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11980 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11990 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
119a0 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 54  /..static void.T
119b0 69 6d 65 72 52 75 6e 20 28 43 6c 69 65 6e 74 44  imerRun (ClientD
119c0 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 29 0a  ata clientData).
119d0 7b 0a 20 20 20 20 52 65 66 6c 65 63 74 65 64 54  {.    ReflectedT
119e0 72 61 6e 73 66 6f 72 6d 2a 20 72 74 50 74 72 20  ransform* rtPtr 
119f0 3d 20 28 52 65 66 6c 65 63 74 65 64 54 72 61 6e  = (ReflectedTran
11a00 73 66 6f 72 6d 2a 29 20 63 6c 69 65 6e 74 44 61  sform*) clientDa
11a10 74 61 3b 0a 0a 20 20 20 20 72 74 50 74 72 2d 3e  ta;..    rtPtr->
11a20 74 69 6d 65 72 20 3d 20 28 54 63 6c 5f 54 69 6d  timer = (Tcl_Tim
11a30 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 3b 0a 20  erToken) NULL;. 
11a40 20 20 20 54 63 6c 5f 4e 6f 74 69 66 79 43 68 61     Tcl_NotifyCha
11a50 6e 6e 65 6c 20 28 72 74 50 74 72 2d 3e 63 68 61  nnel (rtPtr->cha
11a60 6e 2c 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 29  n, TCL_READABLE)
11a70 3b 0a 7d 0a 0c 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d  ;.}...../*. *---
11a80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11a90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11aa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11ab0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11ac0 2d 2d 2d 0a 20 2a 0a 20 2a 09 52 65 73 75 6c 74  ---. *. *.Result
11ad0 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 49 6e  Init --. *. *.In
11ae0 69 74 69 61 6c 69 7a 65 73 20 74 68 65 20 73 70  itializes the sp
11af0 65 63 69 66 69 65 64 20 62 75 66 66 65 72 20 73  ecified buffer s
11b00 74 72 75 63 74 75 72 65 2e 20 54 68 65 0a 20 2a  tructure. The. *
11b10 09 73 74 72 75 63 74 75 72 65 20 77 69 6c 6c 20  .structure will 
11b20 63 6f 6e 74 61 69 6e 20 76 61 6c 69 64 20 69 6e  contain valid in
11b30 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 6e  formation for an
11b40 0a 20 2a 09 65 6d 74 70 79 20 62 75 66 66 65 72  . *.emtpy buffer
11b50 2e 0a 20 2a 0a 20 2a 09 53 69 64 65 65 66 66 65  .. *. *.Sideeffe
11b60 63 74 73 3a 0a 20 2a 09 09 53 65 65 20 61 62 6f  cts:. *..See abo
11b70 76 65 2e 0a 20 2a 0a 20 2a 09 52 65 73 75 6c 74  ve.. *. *.Result
11b80 3a 0a 20 2a 09 09 4e 6f 6e 65 2e 0a 20 2a 0a 20  :. *..None.. *. 
11b90 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
11ba0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11bb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11bc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11bd0 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61  -------. */..sta
11be0 74 69 63 20 76 6f 69 64 0a 52 65 73 75 6c 74 49  tic void.ResultI
11bf0 6e 69 74 20 28 52 65 73 75 6c 74 42 75 66 66 65  nit (ResultBuffe
11c00 72 2a 20 72 29 20 2f 2a 20 52 65 66 65 72 65 6e  r* r) /* Referen
11c10 63 65 20 74 6f 20 74 68 65 20 73 74 72 75 63 74  ce to the struct
11c20 75 72 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  ure to initializ
11c30 65 20 2a 2f 0a 7b 0a 20 20 20 20 72 2d 3e 75 73  e */.{.    r->us
11c40 65 64 20 20 20 20 20 20 3d 20 30 3b 0a 20 20 20  ed      = 0;.   
11c50 20 72 2d 3e 61 6c 6c 6f 63 61 74 65 64 20 3d 20   r->allocated = 
11c60 30 3b 0a 20 20 20 20 72 2d 3e 62 75 66 20 20 20  0;.    r->buf   
11c70 20 20 20 20 3d 20 28 75 6e 73 69 67 6e 65 64 20      = (unsigned 
11c80 63 68 61 72 2a 29 20 4e 55 4c 4c 3b 0a 7d 0a 2f  char*) NULL;.}./
11c90 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
11ca0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11cb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11cc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11cd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
11ce0 09 52 65 73 75 6c 74 43 6c 65 61 72 20 2d 2d 0a  .ResultClear --.
11cf0 20 2a 0a 20 2a 09 44 65 61 6c 6c 6f 63 61 74 65   *. *.Deallocate
11d00 73 20 61 6e 79 20 6d 65 6d 6f 72 79 20 61 6c 6c  s any memory all
11d10 6f 63 61 74 65 64 20 62 79 20 27 52 65 73 75 6c  ocated by 'Resul
11d20 74 41 64 64 27 2e 0a 20 2a 0a 20 2a 09 53 69 64  tAdd'.. *. *.Sid
11d30 65 65 66 66 65 63 74 73 3a 0a 20 2a 09 09 53 65  eeffects:. *..Se
11d40 65 20 61 62 6f 76 65 2e 0a 20 2a 0a 20 2a 09 52  e above.. *. *.R
11d50 65 73 75 6c 74 3a 0a 20 2a 09 09 4e 6f 6e 65 2e  esult:. *..None.
11d60 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
11d70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11d80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11d90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11da0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
11db0 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 52 65  ..static void.Re
11dc0 73 75 6c 74 43 6c 65 61 72 20 28 52 65 73 75 6c  sultClear (Resul
11dd0 74 42 75 66 66 65 72 2a 20 72 29 20 2f 2a 20 52  tBuffer* r) /* R
11de0 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
11df0 62 75 66 66 65 72 20 74 6f 20 63 6c 65 61 72 20  buffer to clear 
11e00 6f 75 74 20 2a 2f 0a 7b 0a 20 20 20 20 72 2d 3e  out */.{.    r->
11e10 75 73 65 64 20 3d 20 30 3b 0a 0a 20 20 20 20 69  used = 0;..    i
11e20 66 20 28 21 72 2d 3e 61 6c 6c 6f 63 61 74 65 64  f (!r->allocated
11e30 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 54  ) return;..    T
11e40 63 6c 5f 46 72 65 65 20 28 28 63 68 61 72 2a 29  cl_Free ((char*)
11e50 20 72 2d 3e 62 75 66 29 3b 0a 20 20 20 20 72 2d   r->buf);.    r-
11e60 3e 62 75 66 20 20 20 20 20 20 20 3d 20 28 75 6e  >buf       = (un
11e70 73 69 67 6e 65 64 20 63 68 61 72 2a 29 20 4e 55  signed char*) NU
11e80 4c 4c 3b 0a 20 20 20 20 72 2d 3e 61 6c 6c 6f 63  LL;.    r->alloc
11e90 61 74 65 64 20 3d 20 30 3b 0a 7d 0a 0c 0a 2f 2a  ated = 0;.}.../*
11ea0 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
11eb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11ec0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11ed0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11ee0 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 09  ---------. *. *.
11ef0 52 65 73 75 6c 74 41 64 64 20 2d 2d 0a 20 2a 0a  ResultAdd --. *.
11f00 20 2a 09 41 64 64 73 20 74 68 65 20 62 79 74 65   *.Adds the byte
11f10 73 20 69 6e 20 74 68 65 20 73 70 65 63 69 66 69  s in the specifi
11f20 65 64 20 61 72 72 61 79 20 74 6f 20 74 68 65 0a  ed array to the.
11f30 20 2a 09 62 75 66 66 65 72 2c 20 62 79 20 61 70   *.buffer, by ap
11f40 70 65 6e 64 69 6e 67 20 69 74 2e 0a 20 2a 0a 20  pending it.. *. 
11f50 2a 09 53 69 64 65 65 66 66 65 63 74 73 3a 0a 20  *.Sideeffects:. 
11f60 2a 09 09 53 65 65 20 61 62 6f 76 65 2e 0a 20 2a  *..See above.. *
11f70 0a 20 2a 09 52 65 73 75 6c 74 3a 0a 20 2a 09 09  . *.Result:. *..
11f80 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  None.. *. *-----
11f90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11fa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11fb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11fc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11fd0 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f  -. */..static vo
11fe0 69 64 0a 52 65 73 75 6c 74 41 64 64 20 28 72 2c  id.ResultAdd (r,
11ff0 20 62 75 66 2c 20 74 6f 57 72 69 74 65 29 0a 20   buf, toWrite). 
12000 20 20 20 20 52 65 73 75 6c 74 42 75 66 66 65 72      ResultBuffer
12010 2a 20 20 72 3b 20 20 20 20 20 20 20 2f 2a 20 54  *  r;       /* T
12020 68 65 20 62 75 66 66 65 72 20 74 6f 20 65 78 74  he buffer to ext
12030 65 6e 64 20 2a 2f 0a 20 20 20 20 20 75 6e 73 69  end */.     unsi
12040 67 6e 65 64 20 63 68 61 72 2a 20 62 75 66 3b 20  gned char* buf; 
12050 20 20 20 20 2f 2a 20 54 68 65 20 62 75 66 66 65      /* The buffe
12060 72 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a  r to read from *
12070 2f 0a 20 20 20 20 20 69 6e 74 20 20 20 20 20 20  /.     int      
12080 20 20 20 20 20 20 74 6f 57 72 69 74 65 3b 20 2f        toWrite; /
12090 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * The number of 
120a0 62 79 74 65 73 20 69 6e 20 27 62 75 66 27 20 2a  bytes in 'buf' *
120b0 2f 0a 7b 0a 20 20 20 20 69 66 20 28 28 72 2d 3e  /.{.    if ((r->
120c0 75 73 65 64 20 2b 20 74 6f 57 72 69 74 65 20 2b  used + toWrite +
120d0 20 31 29 20 3e 20 72 2d 3e 61 6c 6c 6f 63 61 74   1) > r->allocat
120e0 65 64 29 20 7b 0a 09 2f 2a 20 45 78 74 65 6e 73  ed) {../* Extens
120f0 69 6f 6e 20 6f 66 20 74 68 65 20 69 6e 74 65 72  ion of the inter
12100 6e 61 6c 20 62 75 66 66 65 72 20 69 73 20 72 65  nal buffer is re
12110 71 75 69 72 65 64 2e 0a 09 20 2a 20 4e 4f 54 45  quired... * NOTE
12120 3a 20 43 75 72 72 65 6e 74 6c 79 20 6c 69 6e 65  : Currently line
12130 61 72 2e 20 53 68 6f 75 6c 64 20 62 65 20 64 6f  ar. Should be do
12140 75 62 6c 69 6e 67 20 74 6f 20 61 6d 6f 72 74 69  ubling to amorti
12150 7a 65 2e 0a 09 20 2a 2f 0a 0a 09 69 66 20 28 72  ze... */...if (r
12160 2d 3e 61 6c 6c 6f 63 61 74 65 64 20 3d 3d 20 30  ->allocated == 0
12170 29 20 7b 0a 09 20 20 20 20 72 2d 3e 61 6c 6c 6f  ) {..    r->allo
12180 63 61 74 65 64 20 3d 20 74 6f 57 72 69 74 65 20  cated = toWrite 
12190 2b 20 52 42 5f 49 4e 43 52 45 4d 45 4e 54 3b 0a  + RB_INCREMENT;.
121a0 09 20 20 20 20 72 2d 3e 62 75 66 20 20 20 20 20  .    r->buf     
121b0 20 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68    = (unsigned ch
121c0 61 72 2a 29 20 54 63 6c 5f 41 6c 6c 6f 63 20 28  ar*) Tcl_Alloc (
121d0 72 2d 3e 61 6c 6c 6f 63 61 74 65 64 29 3b 0a 09  r->allocated);..
121e0 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 72 2d  } else {..    r-
121f0 3e 61 6c 6c 6f 63 61 74 65 64 20 2b 3d 20 74 6f  >allocated += to
12200 57 72 69 74 65 20 2b 20 52 42 5f 49 4e 43 52 45  Write + RB_INCRE
12210 4d 45 4e 54 3b 0a 09 20 20 20 20 72 2d 3e 62 75  MENT;..    r->bu
12220 66 20 20 20 20 20 20 20 20 3d 20 28 75 6e 73 69  f        = (unsi
12230 67 6e 65 64 20 63 68 61 72 2a 29 20 54 63 6c 5f  gned char*) Tcl_
12240 52 65 61 6c 6c 6f 63 28 28 63 68 61 72 2a 29 20  Realloc((char*) 
12250 72 2d 3e 62 75 66 2c 0a 09 09 09 09 09 09 09 20  r->buf,........ 
12260 72 2d 3e 61 6c 6c 6f 63 61 74 65 64 29 3b 0a 09  r->allocated);..
12270 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
12280 6e 6f 77 20 63 6f 70 79 20 64 61 74 61 20 2a 2f  now copy data */
12290 0a 20 20 20 20 6d 65 6d 63 70 79 20 28 72 2d 3e  .    memcpy (r->
122a0 62 75 66 20 2b 20 72 2d 3e 75 73 65 64 2c 20 62  buf + r->used, b
122b0 75 66 2c 20 74 6f 57 72 69 74 65 29 3b 0a 20 20  uf, toWrite);.  
122c0 20 20 72 2d 3e 75 73 65 64 20 2b 3d 20 74 6f 57    r->used += toW
122d0 72 69 74 65 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d  rite;.}.../*. *-
122e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
122f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12300 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12310 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12320 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 09 52 65 73 75  -----. *. *.Resu
12330 6c 74 43 6f 70 79 20 2d 2d 0a 20 2a 0a 20 2a 09  ltCopy --. *. *.
12340 43 6f 70 69 65 73 20 74 68 65 20 72 65 71 75 65  Copies the reque
12350 73 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 62  sted number of b
12360 79 74 65 73 20 66 72 6f 6d 20 74 68 65 0a 20 2a  ytes from the. *
12370 09 62 75 66 66 65 72 20 69 6e 74 6f 20 74 68 65  .buffer into the
12380 20 73 70 65 63 69 66 69 65 64 20 61 72 72 61 79   specified array
12390 20 61 6e 64 20 72 65 6d 6f 76 65 73 20 74 68 65   and removes the
123a0 6d 0a 20 2a 09 66 72 6f 6d 20 74 68 65 20 62 75  m. *.from the bu
123b0 66 66 65 72 20 61 66 74 65 72 77 61 72 64 2e 20  ffer afterward. 
123c0 43 6f 70 69 65 73 20 6c 65 73 73 20 69 66 20 74  Copies less if t
123d0 68 65 72 65 0a 20 2a 09 69 73 20 6e 6f 74 20 65  here. *.is not e
123e0 6e 6f 75 67 68 20 64 61 74 61 20 69 6e 20 74 68  nough data in th
123f0 65 20 62 75 66 66 65 72 2e 0a 20 2a 0a 20 2a 09  e buffer.. *. *.
12400 53 69 64 65 65 66 66 65 63 74 73 3a 0a 20 2a 09  Sideeffects:. *.
12410 09 53 65 65 20 61 62 6f 76 65 2e 0a 20 2a 0a 20  .See above.. *. 
12420 2a 09 52 65 73 75 6c 74 3a 0a 20 2a 09 09 54 68  *.Result:. *..Th
12430 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 63 74 75  e number of actu
12440 61 6c 6c 79 20 63 6f 70 69 65 64 20 62 79 74 65  ally copied byte
12450 73 2c 0a 20 2a 09 09 70 6f 73 73 69 62 6c 79 20  s,. *..possibly 
12460 6c 65 73 73 20 74 68 61 6e 20 27 74 6f 52 65 61  less than 'toRea
12470 64 27 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  d'.. *. *-------
12480 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12490 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
124a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
124b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
124c0 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a   */..static int.
124d0 52 65 73 75 6c 74 43 6f 70 79 20 28 52 65 73 75  ResultCopy (Resu
124e0 6c 74 42 75 66 66 65 72 2a 20 20 72 2c 20 20 20  ltBuffer*  r,   
124f0 20 20 20 2f 2a 20 54 68 65 20 62 75 66 66 65 72     /* The buffer
12500 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f   to read from */
12510 0a 09 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  ..    unsigned c
12520 68 61 72 2a 20 62 75 66 2c 20 20 20 20 2f 2a 20  har* buf,    /* 
12530 54 68 65 20 62 75 66 66 65 72 20 74 6f 20 63 6f  The buffer to co
12540 70 79 20 69 6e 74 6f 20 2a 2f 0a 09 20 20 20 20  py into */..    
12550 69 6e 74 20 20 20 20 20 20 20 20 20 20 20 20 74  int            t
12560 6f 52 65 61 64 29 20 2f 2a 20 4e 75 6d 62 65 72  oRead) /* Number
12570 20 6f 66 20 72 65 71 75 65 73 74 65 64 20 62 79   of requested by
12580 74 65 73 20 2a 2f 0a 7b 0a 20 20 20 20 69 6e 74  tes */.{.    int
12590 20 63 6f 70 69 65 64 3b 0a 0a 20 20 20 20 69 66   copied;..    if
125a0 20 28 72 2d 3e 75 73 65 64 20 3d 3d 20 30 29 20   (r->used == 0) 
125b0 7b 0a 09 2f 2a 20 4e 6f 74 68 69 6e 67 20 74 6f  {../* Nothing to
125c0 20 63 6f 70 79 20 69 6e 20 74 68 65 20 63 61 73   copy in the cas
125d0 65 20 6f 66 20 61 6e 20 65 6d 70 74 79 20 62 75  e of an empty bu
125e0 66 66 65 72 2e 0a 09 20 2a 2f 0a 0a 09 63 6f 70  ffer... */...cop
125f0 69 65 64 20 3d 20 30 3b 0a 09 67 6f 74 6f 20 64  ied = 0;..goto d
12600 6f 6e 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  one;.    }..    
12610 69 66 20 28 72 2d 3e 75 73 65 64 20 3d 3d 20 74  if (r->used == t
12620 6f 52 65 61 64 29 20 7b 0a 09 2f 2a 20 57 65 20  oRead) {../* We 
12630 68 61 76 65 20 6a 75 73 74 20 65 6e 6f 75 67 68  have just enough
12640 2e 20 43 6f 70 79 20 65 76 65 72 79 74 68 69 6e  . Copy everythin
12650 67 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  g to the caller.
12660 0a 09 20 2a 2f 0a 0a 09 6d 65 6d 63 70 79 20 28  .. */...memcpy (
12670 28 56 4f 49 44 2a 29 20 62 75 66 2c 20 28 56 4f  (VOID*) buf, (VO
12680 49 44 2a 29 20 72 2d 3e 62 75 66 2c 20 74 6f 52  ID*) r->buf, toR
12690 65 61 64 29 3b 0a 09 72 2d 3e 75 73 65 64 20 3d  ead);..r->used =
126a0 20 30 3b 0a 09 63 6f 70 69 65 64 20 20 3d 20 74   0;..copied  = t
126b0 6f 52 65 61 64 3b 0a 09 67 6f 74 6f 20 64 6f 6e  oRead;..goto don
126c0 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  e;.    }..    if
126d0 20 28 72 2d 3e 75 73 65 64 20 3e 20 74 6f 52 65   (r->used > toRe
126e0 61 64 29 20 7b 0a 09 2f 2a 20 54 68 65 20 69 6e  ad) {../* The in
126f0 74 65 72 6e 61 6c 20 62 75 66 66 65 72 20 63 6f  ternal buffer co
12700 6e 74 61 69 6e 73 20 6d 6f 72 65 20 74 68 61 6e  ntains more than
12710 20 72 65 71 75 65 73 74 65 64 2e 0a 09 20 2a 20   requested... * 
12720 43 6f 70 79 20 74 68 65 20 72 65 71 75 65 73 74  Copy the request
12730 65 64 20 73 75 62 73 65 74 20 74 6f 20 74 68 65  ed subset to the
12740 20 63 61 6c 6c 65 72 2c 20 61 6e 64 20 73 68 69   caller, and shi
12750 66 74 0a 09 20 2a 20 74 68 65 20 72 65 6d 61 69  ft.. * the remai
12760 6e 69 6e 67 20 62 79 74 65 73 20 64 6f 77 6e 2e  ning bytes down.
12770 0a 09 20 2a 2f 0a 0a 09 6d 65 6d 63 70 79 20 20  .. */...memcpy  
12780 28 28 56 4f 49 44 2a 29 20 62 75 66 2c 20 20 20  ((VOID*) buf,   
12790 20 28 56 4f 49 44 2a 29 20 72 2d 3e 62 75 66 2c   (VOID*) r->buf,
127a0 20 20 20 20 20 20 20 20 20 20 20 20 74 6f 52 65              toRe
127b0 61 64 29 3b 0a 09 6d 65 6d 6d 6f 76 65 20 28 28  ad);..memmove ((
127c0 56 4f 49 44 2a 29 20 72 2d 3e 62 75 66 2c 20 28  VOID*) r->buf, (
127d0 56 4f 49 44 2a 29 20 28 72 2d 3e 62 75 66 20 2b  VOID*) (r->buf +
127e0 20 74 6f 52 65 61 64 29 2c 20 72 2d 3e 75 73 65   toRead), r->use
127f0 64 20 2d 20 74 6f 52 65 61 64 29 3b 0a 0a 09 72  d - toRead);...r
12800 2d 3e 75 73 65 64 20 2d 3d 20 74 6f 52 65 61 64  ->used -= toRead
12810 3b 0a 09 63 6f 70 69 65 64 20 20 20 3d 20 74 6f  ;..copied   = to
12820 52 65 61 64 3b 0a 09 67 6f 74 6f 20 64 6f 6e 65  Read;..goto done
12830 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
12840 54 68 65 72 65 20 69 73 20 6e 6f 74 20 65 6e 6f  There is not eno
12850 75 67 68 20 69 6e 20 74 68 65 20 62 75 66 66 65  ugh in the buffe
12860 72 20 74 6f 20 73 61 74 69 73 66 79 20 74 68 65  r to satisfy the
12870 20 63 61 6c 6c 65 72 2c 20 73 6f 0a 20 20 20 20   caller, so.    
12880 20 2a 20 74 61 6b 65 20 65 76 65 72 79 74 68 69   * take everythi
12890 6e 67 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20  ng..     */..   
128a0 20 6d 65 6d 63 70 79 20 28 28 56 4f 49 44 2a 29   memcpy ((VOID*)
128b0 20 62 75 66 2c 20 28 56 4f 49 44 2a 29 20 72 2d   buf, (VOID*) r-
128c0 3e 62 75 66 2c 20 72 2d 3e 75 73 65 64 29 3b 0a  >buf, r->used);.
128d0 20 20 20 20 74 6f 52 65 61 64 20 20 3d 20 72 2d      toRead  = r-
128e0 3e 75 73 65 64 3b 0a 20 20 20 20 72 2d 3e 75 73  >used;.    r->us
128f0 65 64 20 3d 20 30 3b 0a 20 20 20 20 63 6f 70 69  ed = 0;.    copi
12900 65 64 20 20 3d 20 74 6f 52 65 61 64 3b 0a 0a 20  ed  = toRead;.. 
12910 20 20 20 2f 2a 20 2d 2d 20 63 6f 6d 6d 6f 6e 20     /* -- common 
12920 70 6f 73 74 77 6f 72 6b 20 63 6f 64 65 20 2d 2d  postwork code --
12930 2d 2d 2d 2d 2d 20 2a 2f 0a 0a 20 64 6f 6e 65 3a  ----- */.. done:
12940 0a 20 20 20 20 72 65 74 75 72 6e 20 63 6f 70 69  .    return copi
12950 65 64 3b 0a 7d 0a 0c 0a 0a 73 74 61 74 69 63 20  ed;.}....static 
12960 69 6e 74 0a 54 72 61 6e 73 66 6f 72 6d 52 65 61  int.TransformRea
12970 64 20 28 0a 20 20 20 20 20 20 20 52 65 66 6c 65  d (.       Refle
12980 63 74 65 64 54 72 61 6e 73 66 6f 72 6d 2a 20 72  ctedTransform* r
12990 74 50 74 72 2c 0a 20 20 20 20 20 20 20 69 6e 74  tPtr,.       int
129a0 2a 20 65 72 72 6f 72 43 6f 64 65 50 74 72 2c 0a  * errorCodePtr,.
129b0 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20         unsigned 
129c0 63 68 61 72 2a 20 62 75 66 2c 0a 20 20 20 20 20  char* buf,.     
129d0 20 20 69 6e 74 20 74 6f 52 65 61 64 29 0a 7b 0a    int toRead).{.
129e0 20 20 20 20 54 63 6c 5f 4f 62 6a 2a 20 62 75 66      Tcl_Obj* buf
129f0 4f 62 6a 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  Obj;.    Tcl_Obj
12a00 2a 20 72 65 73 4f 62 6a 3b 0a 20 20 20 20 69 6e  * resObj;.    in
12a10 74 20 62 79 74 65 63 3b 09 09 09 2f 2a 20 4e 75  t bytec;.../* Nu
12a20 6d 62 65 72 20 6f 66 20 72 65 74 75 72 6e 65 64  mber of returned
12a30 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 75 6e   bytes */.    un
12a40 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 79 74  signed char *byt
12a50 65 76 3b 09 2f 2a 20 41 72 72 61 79 20 6f 66 20  ev;./* Array of 
12a60 72 65 74 75 72 6e 65 64 20 62 79 74 65 73 20 2a  returned bytes *
12a70 2f 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a  /..    /*.     *
12a80 20 41 72 65 20 77 65 20 69 6e 20 74 68 65 20 63   Are we in the c
12a90 6f 72 72 65 63 74 20 74 68 72 65 61 64 3f 0a 20  orrect thread?. 
12aa0 20 20 20 20 2a 2f 0a 0a 23 69 66 64 65 66 20 54      */..#ifdef T
12ab0 43 4c 5f 54 48 52 45 41 44 53 0a 20 20 20 20 69  CL_THREADS.    i
12ac0 66 20 28 72 74 50 74 72 2d 3e 74 68 72 65 61 64  f (rtPtr->thread
12ad0 20 21 3d 20 54 63 6c 5f 47 65 74 43 75 72 72 65   != Tcl_GetCurre
12ae0 6e 74 54 68 72 65 61 64 28 29 29 20 7b 0a 09 46  ntThread()) {..F
12af0 6f 72 77 61 72 64 50 61 72 61 6d 20 70 3b 0a 0a  orwardParam p;..
12b00 09 70 2e 74 72 61 6e 73 66 6f 72 6d 2e 62 75 66  .p.transform.buf
12b10 20 20 3d 20 62 75 66 3b 0a 09 70 2e 74 72 61 6e    = buf;..p.tran
12b20 73 66 6f 72 6d 2e 73 69 7a 65 20 3d 20 74 6f 52  sform.size = toR
12b30 65 61 64 3b 0a 0a 09 46 6f 72 77 61 72 64 4f 70  ead;...ForwardOp
12b40 54 6f 4f 77 6e 65 72 54 68 72 65 61 64 28 72 74  ToOwnerThread(rt
12b50 50 74 72 2c 20 46 6f 72 77 61 72 64 65 64 49 6e  Ptr, ForwardedIn
12b60 70 75 74 2c 20 26 70 29 3b 0a 0a 09 69 66 20 28  put, &p);...if (
12b70 70 2e 62 61 73 65 2e 63 6f 64 65 20 21 3d 20 54  p.base.code != T
12b80 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 50 61  CL_OK) {..    Pa
12b90 73 73 52 65 63 65 69 76 65 64 45 72 72 6f 72 28  ssReceivedError(
12ba0 72 74 50 74 72 2d 3e 63 68 61 6e 2c 20 26 70 29  rtPtr->chan, &p)
12bb0 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64  ;..    *errorCod
12bc0 65 50 74 72 20 3d 20 45 49 4e 56 41 4c 3b 0a 09  ePtr = EINVAL;..
12bd0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 09 7d      return 0;..}
12be0 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 2a 65 72   else {..    *er
12bf0 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 4f 4b  rorCodePtr = EOK
12c00 3b 0a 09 7d 0a 0a 09 52 65 73 75 6c 74 41 64 64  ;..}...ResultAdd
12c10 20 28 26 72 74 50 74 72 2d 3e 72 65 73 75 6c 74   (&rtPtr->result
12c20 2c 20 70 2e 74 72 61 6e 73 66 6f 72 6d 2e 62 75  , p.transform.bu
12c30 66 2c 20 70 2e 74 72 61 6e 73 66 6f 72 6d 2e 73  f, p.transform.s
12c40 69 7a 65 29 3b 0a 09 63 6b 66 72 65 65 20 28 70  ize);..ckfree (p
12c50 2e 74 72 61 6e 73 66 6f 72 6d 2e 62 75 66 29 3b  .transform.buf);
12c60 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 23 65  .    } else {.#e
12c70 6e 64 69 66 0a 09 2f 2a 20 41 53 53 45 52 54 3a  ndif../* ASSERT:
12c80 20 72 74 50 74 72 2d 3e 6d 65 74 68 6f 64 20 26   rtPtr->method &
12c90 20 46 4c 41 47 28 4d 45 54 48 5f 52 45 41 44 29   FLAG(METH_READ)
12ca0 20 2a 2f 0a 09 2f 2a 20 41 53 53 45 52 54 3a 20   */../* ASSERT: 
12cb0 72 74 50 74 72 2d 3e 6d 6f 64 65 20 26 20 54 43  rtPtr->mode & TC
12cc0 4c 5f 52 45 41 44 41 42 4c 45 20 2a 2f 0a 0a 09  L_READABLE */...
12cd0 62 75 66 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77  bufObj = Tcl_New
12ce0 42 79 74 65 41 72 72 61 79 4f 62 6a 28 28 75 6e  ByteArrayObj((un
12cf0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 62  signed char *) b
12d00 75 66 2c 20 74 6f 52 65 61 64 29 3b 0a 09 69 66  uf, toRead);..if
12d10 20 28 49 6e 76 6f 6b 65 54 63 6c 4d 65 74 68 6f   (InvokeTclMetho
12d20 64 28 72 74 50 74 72 2c 20 22 72 65 61 64 22 2c  d(rtPtr, "read",
12d30 20 62 75 66 4f 62 6a 2c 20 4e 55 4c 4c 2c 20 26   bufObj, NULL, &
12d40 72 65 73 4f 62 6a 29 20 21 3d 20 54 43 4c 5f 4f  resObj) != TCL_O
12d50 4b 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 53 65  K) {..    Tcl_Se
12d60 74 43 68 61 6e 6e 65 6c 45 72 72 6f 72 28 72 74  tChannelError(rt
12d70 50 74 72 2d 3e 63 68 61 6e 2c 20 72 65 73 4f 62  Ptr->chan, resOb
12d80 6a 29 3b 0a 09 20 20 20 20 54 63 6c 5f 44 65 63  j);..    Tcl_Dec
12d90 72 52 65 66 43 6f 75 6e 74 28 72 65 73 4f 62 6a  rRefCount(resObj
12da0 29 3b 09 2f 2a 20 52 65 6d 6f 76 65 20 72 65 66  );./* Remove ref
12db0 65 72 65 6e 63 65 20 68 65 6c 64 20 66 72 6f 6d  erence held from
12dc0 20 69 6e 76 6f 6b 65 20 2a 2f 0a 09 20 20 20 20   invoke */..    
12dd0 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20  *errorCodePtr = 
12de0 45 49 4e 56 41 4c 3b 0a 09 20 20 20 20 72 65 74  EINVAL;..    ret
12df0 75 72 6e 20 30 3b 0a 09 7d 0a 0a 09 62 79 74 65  urn 0;..}...byte
12e00 76 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41  v = Tcl_GetByteA
12e10 72 72 61 79 46 72 6f 6d 4f 62 6a 28 72 65 73 4f  rrayFromObj(resO
12e20 62 6a 2c 20 26 62 79 74 65 63 29 3b 0a 09 52 65  bj, &bytec);..Re
12e30 73 75 6c 74 41 64 64 20 28 26 72 74 50 74 72 2d  sultAdd (&rtPtr-
12e40 3e 72 65 73 75 6c 74 2c 20 62 79 74 65 76 2c 20  >result, bytev, 
12e50 62 79 74 65 63 29 3b 0a 09 54 63 6c 5f 44 65 63  bytec);..Tcl_Dec
12e60 72 52 65 66 43 6f 75 6e 74 28 72 65 73 4f 62 6a  rRefCount(resObj
12e70 29 3b 09 2f 2a 20 52 65 6d 6f 76 65 20 72 65 66  );./* Remove ref
12e80 65 72 65 6e 63 65 20 68 65 6c 64 20 66 72 6f 6d  erence held from
12e90 20 69 6e 76 6f 6b 65 20 2a 2f 0a 23 69 66 64 65   invoke */.#ifde
12ea0 66 20 54 43 4c 5f 54 48 52 45 41 44 53 0a 20 20  f TCL_THREADS.  
12eb0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
12ec0 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0c 0a 73 74  return 1;.}...st
12ed0 61 74 69 63 20 69 6e 74 0a 54 72 61 6e 73 66 6f  atic int.Transfo
12ee0 72 6d 57 72 69 74 65 20 28 0a 09 52 65 66 6c 65  rmWrite (..Refle
12ef0 63 74 65 64 54 72 61 6e 73 66 6f 72 6d 2a 20 72  ctedTransform* r
12f00 74 50 74 72 2c 0a 09 69 6e 74 2a 20 65 72 72 6f  tPtr,..int* erro
12f10 72 43 6f 64 65 50 74 72 2c 0a 09 75 6e 73 69 67  rCodePtr,..unsig
12f20 6e 65 64 20 63 68 61 72 2a 20 62 75 66 2c 0a 09  ned char* buf,..
12f30 69 6e 74 20 74 6f 57 72 69 74 65 29 0a 7b 0a 20  int toWrite).{. 
12f40 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 62 75 66 4f     Tcl_Obj *bufO
12f50 62 6a 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  bj;.    Tcl_Obj 
12f60 2a 72 65 73 4f 62 6a 3b 0a 20 20 20 20 69 6e 74  *resObj;.    int
12f70 20 62 79 74 65 63 3b 09 09 09 2f 2a 20 4e 75 6d   bytec;.../* Num
12f80 62 65 72 20 6f 66 20 72 65 74 75 72 6e 65 64 20  ber of returned 
12f90 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 75 6e 73  bytes */.    uns
12fa0 69 67 6e 65 64 20 63 68 61 72 20 2a 62 79 74 65  igned char *byte
12fb0 76 3b 09 2f 2a 20 41 72 72 61 79 20 6f 66 20 72  v;./* Array of r
12fc0 65 74 75 72 6e 65 64 20 62 79 74 65 73 20 2a 2f  eturned bytes */
12fd0 0a 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20  .    int res;.. 
12fe0 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 41 72 65     /*.     * Are
12ff0 20 77 65 20 69 6e 20 74 68 65 20 63 6f 72 72 65   we in the corre
13000 63 74 20 74 68 72 65 61 64 3f 0a 20 20 20 20 20  ct thread?.     
13010 2a 2f 0a 0a 23 69 66 64 65 66 20 54 43 4c 5f 54  */..#ifdef TCL_T
13020 48 52 45 41 44 53 0a 20 20 20 20 69 66 20 28 72  HREADS.    if (r
13030 74 50 74 72 2d 3e 74 68 72 65 61 64 20 21 3d 20  tPtr->thread != 
13040 54 63 6c 5f 47 65 74 43 75 72 72 65 6e 74 54 68  Tcl_GetCurrentTh
13050 72 65 61 64 28 29 29 20 7b 0a 09 46 6f 72 77 61  read()) {..Forwa
13060 72 64 50 61 72 61 6d 20 70 3b 0a 0a 09 70 2e 74  rdParam p;...p.t
13070 72 61 6e 73 66 6f 72 6d 2e 62 75 66 20 20 3d 20  ransform.buf  = 
13080 62 75 66 3b 0a 09 70 2e 74 72 61 6e 73 66 6f 72  buf;..p.transfor
13090 6d 2e 73 69 7a 65 20 3d 20 74 6f 57 72 69 74 65  m.size = toWrite
130a0 3b 0a 0a 09 46 6f 72 77 61 72 64 4f 70 54 6f 4f  ;...ForwardOpToO
130b0 77 6e 65 72 54 68 72 65 61 64 28 72 74 50 74 72  wnerThread(rtPtr
130c0 2c 20 46 6f 72 77 61 72 64 65 64 4f 75 74 70 75  , ForwardedOutpu
130d0 74 2c 20 26 70 29 3b 0a 0a 09 69 66 20 28 70 2e  t, &p);...if (p.
130e0 62 61 73 65 2e 63 6f 64 65 20 21 3d 20 54 43 4c  base.code != TCL
130f0 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 50 61 73 73  _OK) {..    Pass
13100 52 65 63 65 69 76 65 64 45 72 72 6f 72 28 72 74  ReceivedError(rt
13110 50 74 72 2d 3e 63 68 61 6e 2c 20 26 70 29 3b 0a  Ptr->chan, &p);.
13120 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50  .    *errorCodeP
13130 74 72 20 3d 20 45 49 4e 56 41 4c 3b 0a 09 20 20  tr = EINVAL;..  
13140 20 20 72 65 74 75 72 6e 20 30 3b 0a 09 7d 20 65    return 0;..} e
13150 6c 73 65 20 7b 0a 09 20 20 20 20 2a 65 72 72 6f  lse {..    *erro
13160 72 43 6f 64 65 50 74 72 20 3d 20 45 4f 4b 3b 0a  rCodePtr = EOK;.
13170 09 7d 0a 0a 09 72 65 73 20 3d 20 54 63 6c 5f 57  .}...res = Tcl_W
13180 72 69 74 65 52 61 77 20 28 72 74 50 74 72 2d 3e  riteRaw (rtPtr->
13190 70 61 72 65 6e 74 2c 0a 09 09 09 20 20 20 20 28  parent,....    (
131a0 63 68 61 72 2a 29 20 70 2e 74 72 61 6e 73 66 6f  char*) p.transfo
131b0 72 6d 2e 62 75 66 2c 20 70 2e 74 72 61 6e 73 66  rm.buf, p.transf
131c0 6f 72 6d 2e 73 69 7a 65 29 3b 0a 09 63 6b 66 72  orm.size);..ckfr
131d0 65 65 20 28 70 2e 74 72 61 6e 73 66 6f 72 6d 2e  ee (p.transform.
131e0 62 75 66 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65  buf);.    } else
131f0 20 7b 0a 23 65 6e 64 69 66 0a 09 2f 2a 20 41 53   {.#endif../* AS
13200 53 45 52 54 3a 20 72 74 50 74 72 2d 3e 6d 65 74  SERT: rtPtr->met
13210 68 6f 64 20 26 20 46 4c 41 47 28 4d 45 54 48 5f  hod & FLAG(METH_
13220 57 52 49 54 45 29 20 2a 2f 0a 09 2f 2a 20 41 53  WRITE) */../* AS
13230 53 45 52 54 3a 20 72 74 50 74 72 2d 3e 6d 6f 64  SERT: rtPtr->mod
13240 65 20 26 20 54 43 4c 5f 57 52 49 54 41 42 4c 45  e & TCL_WRITABLE
13250 20 2a 2f 0a 0a 09 62 75 66 4f 62 6a 20 3d 20 54   */...bufObj = T
13260 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f  cl_NewByteArrayO
13270 62 6a 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61  bj((unsigned cha
13280 72 20 2a 29 20 62 75 66 2c 20 74 6f 57 72 69 74  r *) buf, toWrit
13290 65 29 3b 0a 09 69 66 20 28 49 6e 76 6f 6b 65 54  e);..if (InvokeT
132a0 63 6c 4d 65 74 68 6f 64 28 72 74 50 74 72 2c 20  clMethod(rtPtr, 
132b0 22 77 72 69 74 65 22 2c 20 62 75 66 4f 62 6a 2c  "write", bufObj,
132c0 20 4e 55 4c 4c 2c 20 26 72 65 73 4f 62 6a 29 20   NULL, &resObj) 
132d0 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20  != TCL_OK) {..  
132e0 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c    Tcl_SetChannel
132f0 45 72 72 6f 72 28 72 74 50 74 72 2d 3e 63 68 61  Error(rtPtr->cha
13300 6e 2c 20 72 65 73 4f 62 6a 29 3b 0a 09 20 20 20  n, resObj);..   
13310 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
13320 74 28 72 65 73 4f 62 6a 29 3b 09 2f 2a 20 52 65  t(resObj);./* Re
13330 6d 6f 76 65 20 72 65 66 65 72 65 6e 63 65 20 68  move reference h
13340 65 6c 64 20 66 72 6f 6d 20 69 6e 76 6f 6b 65 20  eld from invoke 
13350 2a 2f 0a 09 20 20 20 20 72 65 74 75 72 6e 20 30  */..    return 0
13360 3b 0a 09 7d 0a 0a 09 2a 65 72 72 6f 72 43 6f 64  ;..}...*errorCod
13370 65 50 74 72 20 3d 20 45 4f 4b 3b 0a 0a 09 62 79  ePtr = EOK;...by
13380 74 65 76 20 3d 20 54 63 6c 5f 47 65 74 42 79 74  tev = Tcl_GetByt
13390 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 72 65  eArrayFromObj(re
133a0 73 4f 62 6a 2c 20 26 62 79 74 65 63 29 3b 0a 09  sObj, &bytec);..
133b0 72 65 73 20 20 20 3d 20 54 63 6c 5f 57 72 69 74  res   = Tcl_Writ
133c0 65 52 61 77 20 28 72 74 50 74 72 2d 3e 70 61 72  eRaw (rtPtr->par
133d0 65 6e 74 2c 20 20 28 63 68 61 72 2a 29 20 62 79  ent,  (char*) by
133e0 74 65 76 2c 20 62 79 74 65 63 29 3b 0a 09 54 63  tev, bytec);..Tc
133f0 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 72  l_DecrRefCount(r
13400 65 73 4f 62 6a 29 3b 09 09 2f 2a 20 52 65 6d 6f  esObj);../* Remo
13410 76 65 20 72 65 66 65 72 65 6e 63 65 20 68 65 6c  ve reference hel
13420 64 20 66 72 6f 6d 20 69 6e 76 6f 6b 65 20 2a 2f  d from invoke */
13430 0a 23 69 66 64 65 66 20 54 43 4c 5f 54 48 52 45  .#ifdef TCL_THRE
13440 41 44 53 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ADS.    }.#endif
13450 0a 0a 20 20 20 20 69 66 20 28 72 65 73 20 3c 20  ..    if (res < 
13460 30 29 20 7b 0a 09 2a 65 72 72 6f 72 43 6f 64 65  0) {..*errorCode
13470 50 74 72 20 3d 20 45 49 4e 56 41 4c 3b 0a 09 72  Ptr = EINVAL;..r
13480 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a  eturn 0;.    }..
13490 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a      return 1;.}.
134a0 0c 0a 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 54  ....static int.T
134b0 72 61 6e 73 66 6f 72 6d 44 72 61 69 6e 28 0a 20  ransformDrain(. 
134c0 20 20 20 20 20 52 65 66 6c 65 63 74 65 64 54 72       ReflectedTr
134d0 61 6e 73 66 6f 72 6d 2a 20 72 74 50 74 72 2c 0a  ansform* rtPtr,.
134e0 20 20 20 20 20 20 69 6e 74 2a 20 65 72 72 6f 72        int* error
134f0 43 6f 64 65 50 74 72 29 0a 7b 0a 20 20 20 20 54  CodePtr).{.    T
13500 63 6c 5f 4f 62 6a 2a 20 72 65 73 4f 62 6a 3b 0a  cl_Obj* resObj;.
13510 20 20 20 20 69 6e 74 20 62 79 74 65 63 3b 09 09      int bytec;..
13520 09 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65  ./* Number of re
13530 74 75 72 6e 65 64 20 62 79 74 65 73 20 2a 2f 0a  turned bytes */.
13540 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
13550 72 20 2a 62 79 74 65 76 3b 09 2f 2a 20 41 72 72  r *bytev;./* Arr
13560 61 79 20 6f 66 20 72 65 74 75 72 6e 65 64 20 62  ay of returned b
13570 79 74 65 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a 0a  ytes */..    /*.
13580 20 20 20 20 20 2a 20 41 72 65 20 77 65 20 69 6e       * Are we in
13590 20 74 68 65 20 63 6f 72 72 65 63 74 20 74 68 72   the correct thr
135a0 65 61 64 3f 0a 20 20 20 20 20 2a 2f 0a 0a 23 69  ead?.     */..#i
135b0 66 64 65 66 20 54 43 4c 5f 54 48 52 45 41 44 53  fdef TCL_THREADS
135c0 0a 20 20 20 20 69 66 20 28 72 74 50 74 72 2d 3e  .    if (rtPtr->
135d0 74 68 72 65 61 64 20 21 3d 20 54 63 6c 5f 47 65  thread != Tcl_Ge
135e0 74 43 75 72 72 65 6e 74 54 68 72 65 61 64 28 29  tCurrentThread()
135f0 29 20 7b 0a 09 46 6f 72 77 61 72 64 50 61 72 61  ) {..ForwardPara
13600 6d 20 70 3b 0a 0a 09 46 6f 72 77 61 72 64 4f 70  m p;...ForwardOp
13610 54 6f 4f 77 6e 65 72 54 68 72 65 61 64 28 72 74  ToOwnerThread(rt
13620 50 74 72 2c 20 46 6f 72 77 61 72 64 65 64 44 72  Ptr, ForwardedDr
13630 61 69 6e 2c 20 26 70 29 3b 0a 0a 09 69 66 20 28  ain, &p);...if (
13640 70 2e 62 61 73 65 2e 63 6f 64 65 20 21 3d 20 54  p.base.code != T
13650 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 50 61  CL_OK) {..    Pa
13660 73 73 52 65 63 65 69 76 65 64 45 72 72 6f 72 28  ssReceivedError(
13670 72 74 50 74 72 2d 3e 63 68 61 6e 2c 20 26 70 29  rtPtr->chan, &p)
13680 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64  ;..    *errorCod
13690 65 50 74 72 20 3d 20 45 49 4e 56 41 4c 3b 0a 09  ePtr = EINVAL;..
136a0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 09 7d      return 0;..}
136b0 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 2a 65 72   else {..    *er
136c0 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 4f 4b  rorCodePtr = EOK
136d0 3b 0a 09 7d 0a 0a 09 52 65 73 75 6c 74 41 64 64  ;..}...ResultAdd
136e0 20 28 26 72 74 50 74 72 2d 3e 72 65 73 75 6c 74   (&rtPtr->result
136f0 2c 20 70 2e 74 72 61 6e 73 66 6f 72 6d 2e 62 75  , p.transform.bu
13700 66 2c 20 70 2e 74 72 61 6e 73 66 6f 72 6d 2e 73  f, p.transform.s
13710 69 7a 65 29 3b 0a 09 63 6b 66 72 65 65 20 28 70  ize);..ckfree (p
13720 2e 74 72 61 6e 73 66 6f 72 6d 2e 62 75 66 29 3b  .transform.buf);
13730 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 23 65  .    } else {.#e
13740 6e 64 69 66 0a 09 69 66 20 28 49 6e 76 6f 6b 65  ndif..if (Invoke
13750 54 63 6c 4d 65 74 68 6f 64 28 72 74 50 74 72 2c  TclMethod(rtPtr,
13760 20 22 64 72 61 69 6e 22 2c 20 4e 55 4c 4c 2c 20   "drain", NULL, 
13770 4e 55 4c 4c 2c 20 26 72 65 73 4f 62 6a 29 21 3d  NULL, &resObj)!=
13780 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 54  TCL_OK) {..    T
13790 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 45 72 72  cl_SetChannelErr
137a0 6f 72 28 72 74 50 74 72 2d 3e 63 68 61 6e 2c 20  or(rtPtr->chan, 
137b0 72 65 73 4f 62 6a 29 3b 0a 09 20 20 20 20 54 63  resObj);..    Tc
137c0 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 72  l_DecrRefCount(r
137d0 65 73 4f 62 6a 29 3b 09 2f 2a 20 52 65 6d 6f 76  esObj);./* Remov
137e0 65 20 72 65 66 65 72 65 6e 63 65 20 68 65 6c 64  e reference held
137f0 20 66 72 6f 6d 20 69 6e 76 6f 6b 65 20 2a 2f 0a   from invoke */.
13800 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50  .    *errorCodeP
13810 74 72 20 3d 20 45 49 4e 56 41 4c 3b 0a 09 20 20  tr = EINVAL;..  
13820 20 20 72 65 74 75 72 6e 20 30 3b 0a 09 7d 0a 0a    return 0;..}..
13830 09 62 79 74 65 76 20 3d 20 54 63 6c 5f 47 65 74  .bytev = Tcl_Get
13840 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a  ByteArrayFromObj
13850 28 72 65 73 4f 62 6a 2c 20 26 62 79 74 65 63 29  (resObj, &bytec)
13860 3b 0a 09 52 65 73 75 6c 74 41 64 64 20 28 26 72  ;..ResultAdd (&r
13870 74 50 74 72 2d 3e 72 65 73 75 6c 74 2c 20 62 79  tPtr->result, by
13880 74 65 76 2c 20 62 79 74 65 63 29 3b 0a 0a 09 54  tev, bytec);...T
13890 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
138a0 72 65 73 4f 62 6a 29 3b 09 2f 2a 20 52 65 6d 6f  resObj);./* Remo
138b0 76 65 20 72 65 66 65 72 65 6e 63 65 20 68 65 6c  ve reference hel
138c0 64 20 66 72 6f 6d 20 69 6e 76 6f 6b 65 20 2a 2f  d from invoke */
138d0 0a 0a 23 69 66 64 65 66 20 54 43 4c 5f 54 48 52  ..#ifdef TCL_THR
138e0 45 41 44 53 0a 20 20 20 20 7d 0a 23 65 6e 64 69  EADS.    }.#endi
138f0 66 0a 0a 20 20 20 20 72 74 50 74 72 2d 3e 72 65  f..    rtPtr->re
13900 61 64 49 73 44 72 61 69 6e 65 64 20 3d 20 31 3b  adIsDrained = 1;
13910 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d  .    return 1;.}
13920 0a 0c 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 54  ....static int.T
13930 72 61 6e 73 66 6f 72 6d 46 6c 75 73 68 28 0a 20  ransformFlush(. 
13940 20 20 20 20 20 52 65 66 6c 65 63 74 65 64 54 72       ReflectedTr
13950 61 6e 73 66 6f 72 6d 2a 20 72 74 50 74 72 2c 0a  ansform* rtPtr,.
13960 20 20 20 20 20 20 69 6e 74 2a 20 65 72 72 6f 72        int* error
13970 43 6f 64 65 50 74 72 29 0a 7b 0a 20 20 20 20 54  CodePtr).{.    T
13980 63 6c 5f 4f 62 6a 2a 20 72 65 73 4f 62 6a 3b 0a  cl_Obj* resObj;.
13990 20 20 20 20 69 6e 74 20 62 79 74 65 63 3b 09 09      int bytec;..
139a0 09 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65  ./* Number of re
139b0 74 75 72 6e 65 64 20 62 79 74 65 73 20 2a 2f 0a  turned bytes */.
139c0 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
139d0 72 20 2a 62 79 74 65 76 3b 09 2f 2a 20 41 72 72  r *bytev;./* Arr
139e0 61 79 20 6f 66 20 72 65 74 75 72 6e 65 64 20 62  ay of returned b
139f0 79 74 65 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ytes */.    int 
13a00 72 65 73 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20  res;..    /*.   
13a10 20 20 2a 20 41 72 65 20 77 65 20 69 6e 20 74 68    * Are we in th
13a20 65 20 63 6f 72 72 65 63 74 20 74 68 72 65 61 64  e correct thread
13a30 3f 0a 20 20 20 20 20 2a 2f 0a 0a 23 69 66 64 65  ?.     */..#ifde
13a40 66 20 54 43 4c 5f 54 48 52 45 41 44 53 0a 20 20  f TCL_THREADS.  
13a50 20 20 69 66 20 28 72 74 50 74 72 2d 3e 74 68 72    if (rtPtr->thr
13a60 65 61 64 20 21 3d 20 54 63 6c 5f 47 65 74 43 75  ead != Tcl_GetCu
13a70 72 72 65 6e 74 54 68 72 65 61 64 28 29 29 20 7b  rrentThread()) {
13a80 0a 09 46 6f 72 77 61 72 64 50 61 72 61 6d 20 70  ..ForwardParam p
13a90 3b 0a 0a 09 46 6f 72 77 61 72 64 4f 70 54 6f 4f  ;...ForwardOpToO
13aa0 77 6e 65 72 54 68 72 65 61 64 28 72 74 50 74 72  wnerThread(rtPtr
13ab0 2c 20 46 6f 72 77 61 72 64 65 64 46 6c 75 73 68  , ForwardedFlush
13ac0 2c 20 26 70 29 3b 0a 0a 09 69 66 20 28 70 2e 62  , &p);...if (p.b
13ad0 61 73 65 2e 63 6f 64 65 20 21 3d 20 54 43 4c 5f  ase.code != TCL_
13ae0 4f 4b 29 20 7b 0a 09 20 20 20 20 50 61 73 73 52  OK) {..    PassR
13af0 65 63 65 69 76 65 64 45 72 72 6f 72 28 72 74 50  eceivedError(rtP
13b00 74 72 2d 3e 63 68 61 6e 2c 20 26 70 29 3b 0a 09  tr->chan, &p);..
13b10 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74      *errorCodePt
13b20 72 20 3d 20 45 49 4e 56 41 4c 3b 0a 09 20 20 20  r = EINVAL;..   
13b30 20 72 65 74 75 72 6e 20 30 3b 0a 09 7d 20 65 6c   return 0;..} el
13b40 73 65 20 7b 0a 09 20 20 20 20 2a 65 72 72 6f 72  se {..    *error
13b50 43 6f 64 65 50 74 72 20 3d 20 45 4f 4b 3b 0a 09  CodePtr = EOK;..
13b60 7d 0a 0a 09 72 65 73 20 3d 20 54 63 6c 5f 57 72  }...res = Tcl_Wr
13b70 69 74 65 52 61 77 20 28 72 74 50 74 72 2d 3e 70  iteRaw (rtPtr->p
13b80 61 72 65 6e 74 2c 0a 09 09 09 20 20 20 20 28 63  arent,....    (c
13b90 68 61 72 2a 29 20 70 2e 74 72 61 6e 73 66 6f 72  har*) p.transfor
13ba0 6d 2e 62 75 66 2c 20 70 2e 74 72 61 6e 73 66 6f  m.buf, p.transfo
13bb0 72 6d 2e 73 69 7a 65 29 3b 0a 09 63 6b 66 72 65  rm.size);..ckfre
13bc0 65 28 70 2e 74 72 61 6e 73 66 6f 72 6d 2e 62 75  e(p.transform.bu
13bd0 66 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  f);.    } else {
13be0 0a 23 65 6e 64 69 66 0a 09 69 66 20 28 49 6e 76  .#endif..if (Inv
13bf0 6f 6b 65 54 63 6c 4d 65 74 68 6f 64 28 72 74 50  okeTclMethod(rtP
13c00 74 72 2c 20 22 66 6c 75 73 68 22 2c 20 4e 55 4c  tr, "flush", NUL
13c10 4c 2c 20 4e 55 4c 4c 2c 20 26 72 65 73 4f 62 6a  L, NULL, &resObj
13c20 29 21 3d 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20  )!=TCL_OK) {..  
13c30 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c    Tcl_SetChannel
13c40 45 72 72 6f 72 28 72 74 50 74 72 2d 3e 63 68 61  Error(rtPtr->cha
13c50 6e 2c 20 72 65 73 4f 62 6a 29 3b 0a 09 20 20 20  n, resObj);..   
13c60 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
13c70 74 28 72 65 73 4f 62 6a 29 3b 09 2f 2a 20 52 65  t(resObj);./* Re
13c80 6d 6f 76 65 20 72 65 66 65 72 65 6e 63 65 20 68  move reference h
13c90 65 6c 64 20 66 72 6f 6d 20 69 6e 76 6f 6b 65 20  eld from invoke 
13ca0 2a 2f 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f  */..    *errorCo
13cb0 64 65 50 74 72 20 3d 20 45 49 4e 56 41 4c 3b 0a  dePtr = EINVAL;.
13cc0 09 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 09  .    return 0;..
13cd0 7d 0a 0a 09 62 79 74 65 76 20 3d 20 54 63 6c 5f  }...bytev = Tcl_
13ce0 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d  GetByteArrayFrom
13cf0 4f 62 6a 28 72 65 73 4f 62 6a 2c 20 26 62 79 74  Obj(resObj, &byt
13d00 65 63 29 3b 0a 09 72 65 73 20 20 20 3d 20 54 63  ec);..res   = Tc
13d10 6c 5f 57 72 69 74 65 52 61 77 20 28 72 74 50 74  l_WriteRaw (rtPt
13d20 72 2d 3e 70 61 72 65 6e 74 2c 20 20 28 63 68 61  r->parent,  (cha
13d30 72 2a 29 20 62 79 74 65 76 2c 20 62 79 74 65 63  r*) bytev, bytec
13d40 29 3b 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43  );..Tcl_DecrRefC
13d50 6f 75 6e 74 28 72 65 73 4f 62 6a 29 3b 09 2f 2a  ount(resObj);./*
13d60 20 52 65 6d 6f 76 65 20 72 65 66 65 72 65 6e 63   Remove referenc
13d70 65 20 68 65 6c 64 20 66 72 6f 6d 20 69 6e 76 6f  e held from invo
13d80 6b 65 20 2a 2f 0a 0a 23 69 66 64 65 66 20 54 43  ke */..#ifdef TC
13d90 4c 5f 54 48 52 45 41 44 53 0a 20 20 20 20 7d 0a  L_THREADS.    }.
13da0 23 65 6e 64 69 66 0a 20 20 20 20 69 66 20 28 72  #endif.    if (r
13db0 65 73 20 3c 20 30 29 20 7b 0a 09 2a 65 72 72 6f  es < 0) {..*erro
13dc0 72 43 6f 64 65 50 74 72 20 3d 20 45 49 4e 56 41  rCodePtr = EINVA
13dd0 4c 3b 0a 09 72 65 74 75 72 6e 20 30 3b 0a 20 20  L;..return 0;.  
13de0 20 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 20    }..    return 
13df0 31 3b 0a 7d 0a 0c 0a 73 74 61 74 69 63 20 76 6f  1;.}...static vo
13e00 69 64 0a 54 72 61 6e 73 66 6f 72 6d 43 6c 65 61  id.TransformClea
13e10 72 20 28 0a 09 52 65 66 6c 65 63 74 65 64 54 72  r (..ReflectedTr
13e20 61 6e 73 66 6f 72 6d 2a 20 72 74 50 74 72 29 0a  ansform* rtPtr).
13e30 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20  {.    /*.     * 
13e40 41 72 65 20 77 65 20 69 6e 20 74 68 65 20 63 6f  Are we in the co
13e50 72 72 65 63 74 20 74 68 72 65 61 64 3f 0a 20 20  rrect thread?.  
13e60 20 20 20 2a 2f 0a 0a 23 69 66 64 65 66 20 54 43     */..#ifdef TC
13e70 4c 5f 54 48 52 45 41 44 53 0a 20 20 20 20 69 66  L_THREADS.    if
13e80 20 28 72 74 50 74 72 2d 3e 74 68 72 65 61 64 20   (rtPtr->thread 
13e90 21 3d 20 54 63 6c 5f 47 65 74 43 75 72 72 65 6e  != Tcl_GetCurren
13ea0 74 54 68 72 65 61 64 28 29 29 20 7b 0a 09 46 6f  tThread()) {..Fo
13eb0 72 77 61 72 64 50 61 72 61 6d 20 70 3b 0a 0a 09  rwardParam p;...
13ec0 46 6f 72 77 61 72 64 4f 70 54 6f 4f 77 6e 65 72  ForwardOpToOwner
13ed0 54 68 72 65 61 64 28 72 74 50 74 72 2c 20 46 6f  Thread(rtPtr, Fo
13ee0 72 77 61 72 64 65 64 43 6c 65 61 72 2c 20 26 70  rwardedClear, &p
13ef0 29 3b 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20 20  );..return;.    
13f00 7d 20 65 6c 73 65 20 7b 0a 23 65 6e 64 69 66 0a  } else {.#endif.
13f10 09 2f 2a 20 41 53 53 45 52 54 3a 20 72 74 50 74  ./* ASSERT: rtPt
13f20 72 2d 3e 6d 65 74 68 6f 64 20 26 20 46 4c 41 47  r->method & FLAG
13f30 28 4d 45 54 48 5f 52 45 41 44 29 20 2a 2f 0a 09  (METH_READ) */..
13f40 2f 2a 20 41 53 53 45 52 54 3a 20 72 74 50 74 72  /* ASSERT: rtPtr
13f50 2d 3e 6d 6f 64 65 20 26 20 54 43 4c 5f 52 45 41  ->mode & TCL_REA
13f60 44 41 42 4c 45 20 2a 2f 0a 0a 09 28 76 6f 69 64  DABLE */...(void
13f70 29 20 49 6e 76 6f 6b 65 54 63 6c 4d 65 74 68 6f  ) InvokeTclMetho
13f80 64 28 72 74 50 74 72 2c 20 22 63 6c 65 61 72 22  d(rtPtr, "clear"
13f90 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55  , NULL, NULL, NU
13fa0 4c 4c 29 3b 0a 0a 23 69 66 64 65 66 20 54 43 4c  LL);..#ifdef TCL
13fb0 5f 54 48 52 45 41 44 53 0a 20 20 20 20 7d 0a 23  _THREADS.    }.#
13fc0 65 6e 64 69 66 0a 0a 20 20 20 20 72 74 50 74 72  endif..    rtPtr
13fd0 2d 3e 72 65 61 64 49 73 44 72 61 69 6e 65 64 20  ->readIsDrained 
13fe0 3d 20 30 3b 0a 20 20 20 20 52 65 73 75 6c 74 43  = 0;.    ResultC
13ff0 6c 65 61 72 20 28 26 72 74 50 74 72 2d 3e 72 65  lear (&rtPtr->re
14000 73 75 6c 74 29 3b 0a 7d 0a 0c 0a 73 74 61 74 69  sult);.}...stati
14010 63 20 69 6e 74 0a 54 72 61 6e 73 66 6f 72 6d 4c  c int.TransformL
14020 69 6d 69 74 20 28 0a 09 52 65 66 6c 65 63 74 65  imit (..Reflecte
14030 64 54 72 61 6e 73 66 6f 72 6d 2a 20 72 74 50 74  dTransform* rtPt
14040 72 2c 0a 09 69 6e 74 2a 20 65 72 72 6f 72 43 6f  r,..int* errorCo
14050 64 65 50 74 72 2c 0a 09 69 6e 74 2a 20 6d 61 78  dePtr,..int* max
14060 50 74 72 29 0a 7b 0a 20 20 20 20 54 63 6c 5f 4f  Ptr).{.    Tcl_O
14070 62 6a 2a 20 72 65 73 4f 62 6a 3b 0a 0a 20 20 20  bj* resObj;..   
14080 20 2f 2a 0a 20 20 20 20 20 2a 20 41 72 65 20 77   /*.     * Are w
14090 65 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74  e in the correct
140a0 20 74 68 72 65 61 64 3f 0a 20 20 20 20 20 2a 2f   thread?.     */
140b0 0a 0a 23 69 66 64 65 66 20 54 43 4c 5f 54 48 52  ..#ifdef TCL_THR
140c0 45 41 44 53 0a 20 20 20 20 69 66 20 28 72 74 50  EADS.    if (rtP
140d0 74 72 2d 3e 74 68 72 65 61 64 20 21 3d 20 54 63  tr->thread != Tc
140e0 6c 5f 47 65 74 43 75 72 72 65 6e 74 54 68 72 65  l_GetCurrentThre
140f0 61 64 28 29 29 20 7b 0a 09 46 6f 72 77 61 72 64  ad()) {..Forward
14100 50 61 72 61 6d 20 70 3b 0a 0a 09 46 6f 72 77 61  Param p;...Forwa
14110 72 64 4f 70 54 6f 4f 77 6e 65 72 54 68 72 65 61  rdOpToOwnerThrea
14120 64 28 72 74 50 74 72 2c 20 46 6f 72 77 61 72 64  d(rtPtr, Forward
14130 65 64 4c 69 6d 69 74 2c 20 26 70 29 3b 0a 0a 09  edLimit, &p);...
14140 69 66 20 28 70 2e 62 61 73 65 2e 63 6f 64 65 20  if (p.base.code 
14150 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20  != TCL_OK) {..  
14160 20 20 50 61 73 73 52 65 63 65 69 76 65 64 45 72    PassReceivedEr
14170 72 6f 72 28 72 74 50 74 72 2d 3e 63 68 61 6e 2c  ror(rtPtr->chan,
14180 20 26 70 29 3b 0a 09 20 20 20 20 2a 65 72 72 6f   &p);..    *erro
14190 72 43 6f 64 65 50 74 72 20 3d 20 45 49 4e 56 41  rCodePtr = EINVA
141a0 4c 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 30  L;..    return 0
141b0 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20  ;..} else {..   
141c0 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d   *errorCodePtr =
141d0 20 45 4f 4b 3b 0a 09 20 20 20 20 2a 6d 61 78 50   EOK;..    *maxP
141e0 74 72 20 3d 20 70 2e 6c 69 6d 69 74 2e 6d 61 78  tr = p.limit.max
141f0 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ;..    return 1;
14200 0a 09 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ..}.    }.#endif
14210 0a 0a 20 20 20 20 2f 2a 20 41 53 53 45 52 54 3a  ..    /* ASSERT:
14220 20 72 74 50 74 72 2d 3e 6d 65 74 68 6f 64 20 26   rtPtr->method &
14230 20 46 4c 41 47 28 4d 45 54 48 5f 57 52 49 54 45   FLAG(METH_WRITE
14240 29 20 2a 2f 0a 20 20 20 20 2f 2a 20 41 53 53 45  ) */.    /* ASSE
14250 52 54 3a 20 72 74 50 74 72 2d 3e 6d 6f 64 65 20  RT: rtPtr->mode 
14260 26 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 20 2a  & TCL_WRITABLE *
14270 2f 0a 0a 20 20 20 20 69 66 20 28 49 6e 76 6f 6b  /..    if (Invok
14280 65 54 63 6c 4d 65 74 68 6f 64 28 72 74 50 74 72  eTclMethod(rtPtr
14290 2c 20 22 6c 69 6d 69 74 3f 22 2c 20 4e 55 4c 4c  , "limit?", NULL
142a0 2c 20 4e 55 4c 4c 2c 20 26 72 65 73 4f 62 6a 29  , NULL, &resObj)
142b0 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 54   != TCL_OK) {..T
142c0 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 45 72 72  cl_SetChannelErr
142d0 6f 72 28 72 74 50 74 72 2d 3e 63 68 61 6e 2c 20  or(rtPtr->chan, 
142e0 72 65 73 4f 62 6a 29 3b 0a 09 54 63 6c 5f 44 65  resObj);..Tcl_De
142f0 63 72 52 65 66 43 6f 75 6e 74 28 72 65 73 4f 62  crRefCount(resOb
14300 6a 29 3b 09 2f 2a 20 52 65 6d 6f 76 65 20 72 65  j);./* Remove re
14310 66 65 72 65 6e 63 65 20 68 65 6c 64 20 66 72 6f  ference held fro
14320 6d 20 69 6e 76 6f 6b 65 20 2a 2f 0a 09 2a 65 72  m invoke */..*er
14330 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 49 4e  rorCodePtr = EIN
14340 56 41 4c 3b 0a 09 72 65 74 75 72 6e 20 30 3b 0a  VAL;..return 0;.
14350 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 54      }..    if (T
14360 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
14370 28 72 74 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20  (rtPtr->interp, 
14380 72 65 73 4f 62 6a 2c 20 6d 61 78 50 74 72 29 20  resObj, maxPtr) 
14390 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 54 63  != TCL_OK) {..Tc
143a0 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 72  l_DecrRefCount(r
143b0 65 73 4f 62 6a 29 3b 09 2f 2a 20 52 65 6d 6f 76  esObj);./* Remov
143c0 65 20 72 65 66 65 72 65 6e 63 65 20 68 65 6c 64  e reference held
143d0 20 66 72 6f 6d 20 69 6e 76 6f 6b 65 20 2a 2f 0a   from invoke */.
143e0 09 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 45  .Tcl_SetChannelE
143f0 72 72 6f 72 28 72 74 50 74 72 2d 3e 63 68 61 6e  rror(rtPtr->chan
14400 2c 20 4d 61 72 73 68 61 6c 6c 45 72 72 6f 72 28  , MarshallError(
14410 72 74 50 74 72 2d 3e 69 6e 74 65 72 70 29 29 3b  rtPtr->interp));
14420 0a 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20  ..*errorCodePtr 
14430 3d 20 45 49 4e 56 41 4c 3b 0a 09 72 65 74 75 72  = EINVAL;..retur
14440 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  n 0;.    }..    
14450 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
14460 28 72 65 73 4f 62 6a 29 3b 09 09 2f 2a 20 52 65  (resObj);../* Re
14470 6d 6f 76 65 20 72 65 66 65 72 65 6e 63 65 20 68  move reference h
14480 65 6c 64 20 66 72 6f 6d 20 69 6e 76 6f 6b 65 20  eld from invoke 
14490 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  */.    return 1;
144a0 0a 7d 0a 0c 0a 2f 2a 20 44 55 50 4c 49 43 41 54  .}.../* DUPLICAT
144b0 45 20 6f 66 20 48 61 76 65 56 65 72 73 69 6f 6e  E of HaveVersion
144c0 28 29 20 69 6e 20 74 63 6c 49 4f 2e 63 0a 20 2a  () in tclIO.c. *
144d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
144e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
144f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14500 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14510 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 48 61 76  ------. *. * Hav
14520 65 56 65 72 73 69 6f 6e 20 2d 2d 0a 20 2a 0a 20  eVersion --. *. 
14530 2a 09 52 65 74 75 72 6e 20 77 68 65 74 68 65 72  *.Return whether
14540 20 61 20 63 68 61 6e 6e 65 6c 20 74 79 70 65 20   a channel type 
14550 69 73 20 28 61 74 20 6c 65 61 73 74 29 20 6f 66  is (at least) of
14560 20 61 20 67 69 76 65 6e 20 76 65 72 73 69 6f 6e   a given version
14570 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
14580 0a 20 2a 09 54 72 75 65 20 69 66 20 74 68 65 20  . *.True if the 
14590 6d 69 6e 69 6d 75 6d 20 76 65 72 73 69 6f 6e 20  minimum version 
145a0 69 73 20 65 78 63 65 65 64 65 64 20 62 79 20 74  is exceeded by t
145b0 68 65 20 76 65 72 73 69 6f 6e 20 61 63 74 75 61  he version actua
145c0 6c 6c 79 0a 20 2a 09 70 72 65 73 65 6e 74 2e 0a  lly. *.present..
145d0 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
145e0 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a  ts:. *.None.. *.
145f0 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
14600 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14610 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14620 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14630 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74  --------. */..st
14640 61 74 69 63 20 69 6e 74 0a 48 61 76 65 56 65 72  atic int.HaveVer
14650 73 69 6f 6e 28 0a 20 20 20 20 63 6f 6e 73 74 20  sion(.    const 
14660 54 63 6c 5f 43 68 61 6e 6e 65 6c 54 79 70 65 20  Tcl_ChannelType 
14670 2a 63 68 61 6e 54 79 70 65 50 74 72 2c 0a 20 20  *chanTypePtr,.  
14680 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 54 79 70    Tcl_ChannelTyp
14690 65 56 65 72 73 69 6f 6e 20 6d 69 6e 69 6d 75 6d  eVersion minimum
146a0 56 65 72 73 69 6f 6e 29 0a 7b 0a 20 20 20 20 54  Version).{.    T
146b0 63 6c 5f 43 68 61 6e 6e 65 6c 54 79 70 65 56 65  cl_ChannelTypeVe
146c0 72 73 69 6f 6e 20 61 63 74 75 61 6c 56 65 72 73  rsion actualVers
146d0 69 6f 6e 20 3d 20 54 63 6c 5f 43 68 61 6e 6e 65  ion = Tcl_Channe
146e0 6c 56 65 72 73 69 6f 6e 28 63 68 61 6e 54 79 70  lVersion(chanTyp
146f0 65 50 74 72 29 3b 0a 0a 20 20 20 20 72 65 74 75  ePtr);..    retu
14700 72 6e 20 28 50 54 52 32 49 4e 54 28 61 63 74 75  rn (PTR2INT(actu
14710 61 6c 56 65 72 73 69 6f 6e 29 29 20 3e 3d 20 28  alVersion)) >= (
14720 50 54 52 32 49 4e 54 28 6d 69 6e 69 6d 75 6d 56  PTR2INT(minimumV
14730 65 72 73 69 6f 6e 29 29 3b 0a 7d 0a 0c 0a 2f 2a  ersion));.}.../*
14740 0a 20 2a 20 4c 6f 63 61 6c 20 56 61 72 69 61 62  . * Local Variab
14750 6c 65 73 3a 0a 20 2a 20 6d 6f 64 65 3a 20 63 0a  les:. * mode: c.
14760 20 2a 20 63 2d 62 61 73 69 63 2d 6f 66 66 73 65   * c-basic-offse
14770 74 3a 20 34 0a 20 2a 20 66 69 6c 6c 2d 63 6f 6c  t: 4. * fill-col
14780 75 6d 6e 3a 20 37 38 0a 20 2a 20 45 6e 64 3a 0a  umn: 78. * End:.
14790 20 2a 2f 0a                                       */.