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 , ¶mPtr->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, ¶mPtr->
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 */.