0000: 2f 2a 0a 20 2a 20 74 63 6c 49 4f 52 43 68 61 6e /*. * tclIORChan
0010: 2e 63 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 .c --. *. *.This
0020: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74 file contains t
0030: 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f he implementatio
0040: 6e 20 6f 66 20 54 63 6c 27 73 20 67 65 6e 65 72 n of Tcl's gener
0050: 69 63 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 72 65 ic channel. *.re
0060: 66 6c 65 63 74 69 6f 6e 20 63 6f 64 65 2c 20 77 flection code, w
0070: 68 69 63 68 20 61 6c 6c 6f 77 73 20 74 68 65 20 hich allows the
0080: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f implementation o
0090: 66 20 54 63 6c 20 63 68 61 6e 6e 65 6c 73 20 69 f Tcl channels i
00a0: 6e 0a 20 2a 09 54 63 6c 20 63 6f 64 65 2e 0a 20 n. *.Tcl code..
00b0: 2a 0a 20 2a 09 50 61 72 74 73 20 6f 66 20 74 68 *. *.Parts of th
00c0: 69 73 20 66 69 6c 65 20 61 72 65 20 62 61 73 65 is file are base
00d0: 64 20 6f 6e 20 63 6f 64 65 20 63 6f 6e 74 72 69 d on code contri
00e0: 62 75 74 65 64 20 62 79 20 4a 65 61 6e 2d 43 6c buted by Jean-Cl
00f0: 61 75 64 65 0a 20 2a 09 57 69 70 70 6c 65 72 2e aude. *.Wippler.
0100: 0a 20 2a 0a 20 2a 09 53 65 65 20 54 49 50 20 23 . *. *.See TIP #
0110: 32 31 39 20 66 6f 72 20 74 68 65 20 73 70 65 63 219 for the spec
0120: 69 66 69 63 61 74 69 6f 6e 20 6f 66 20 74 68 69 ification of thi
0130: 73 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79 2e s functionality.
0140: 0a 20 2a 0a 20 2a 20 43 6f 70 79 72 69 67 68 74 . *. * Copyright
0150: 20 28 63 29 20 32 30 30 34 2d 32 30 30 35 20 41 (c) 2004-2005 A
0160: 63 74 69 76 65 53 74 61 74 65 2c 20 61 20 64 69 ctiveState, a di
0170: 76 69 73 6f 6e 20 6f 66 20 53 6f 70 68 6f 73 0a vison of Sophos.
0180: 20 2a 0a 20 2a 20 53 65 65 20 74 68 65 20 66 69 *. * See the fi
0190: 6c 65 20 22 6c 69 63 65 6e 73 65 2e 74 65 72 6d le "license.term
01a0: 73 22 20 66 6f 72 20 69 6e 66 6f 72 6d 61 74 69 s" for informati
01b0: 6f 6e 20 6f 6e 20 75 73 61 67 65 20 61 6e 64 20 on on usage and
01c0: 72 65 64 69 73 74 72 69 62 75 74 69 6f 6e 20 6f redistribution o
01d0: 66 0a 20 2a 20 74 68 69 73 20 66 69 6c 65 2c 20 f. * this file,
01e0: 61 6e 64 20 66 6f 72 20 61 20 44 49 53 43 4c 41 and for a DISCLA
01f0: 49 4d 45 52 20 4f 46 20 41 4c 4c 20 57 41 52 52 IMER OF ALL WARR
0200: 41 4e 54 49 45 53 2e 0a 20 2a 0a 20 2a 20 52 43 ANTIES.. *. * RC
0210: 53 3a 20 40 28 23 29 20 24 49 64 3a 20 74 63 6c S: @(#) $Id: tcl
0220: 49 4f 52 43 68 61 6e 2e 63 2c 76 20 31 2e 33 34 IORChan.c,v 1.34
0230: 20 32 30 30 38 2f 30 37 2f 30 33 20 31 37 3a 33 2008/07/03 17:3
0240: 38 3a 33 38 20 61 6e 64 72 65 61 73 5f 6b 75 70 8:38 andreas_kup
0250: 72 69 65 73 20 45 78 70 20 24 0a 20 2a 2f 0a 0a ries Exp $. */..
0260: 23 69 6e 63 6c 75 64 65 20 3c 74 63 6c 49 6e 74 #include <tclInt
0270: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 74 63 .h>.#include <tc
0280: 6c 49 4f 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 lIO.h>.#include
0290: 3c 61 73 73 65 72 74 2e 68 3e 0a 0a 23 69 66 6e <assert.h>..#ifn
02a0: 64 65 66 20 45 49 4e 56 41 4c 0a 23 64 65 66 69 def EINVAL.#defi
02b0: 6e 65 20 45 49 4e 56 41 4c 09 39 0a 23 65 6e 64 ne EINVAL.9.#end
02c0: 69 66 0a 23 69 66 6e 64 65 66 20 45 4f 4b 0a 23 if.#ifndef EOK.#
02d0: 64 65 66 69 6e 65 20 45 4f 4b 09 30 0a 23 65 6e define EOK.0.#en
02e0: 64 69 66 0a 0a 2f 2a 0a 20 2a 20 53 69 67 6e 61 dif../*. * Signa
02f0: 74 75 72 65 73 20 6f 66 20 61 6c 6c 20 66 75 6e tures of all fun
0300: 63 74 69 6f 6e 73 20 75 73 65 64 20 69 6e 20 74 ctions used in t
0310: 68 65 20 43 20 6c 61 79 65 72 20 6f 66 20 74 68 he C layer of th
0320: 65 20 72 65 66 6c 65 63 74 69 6f 6e 2e 0a 20 2a e reflection.. *
0330: 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 09 09 52 /..static int..R
0340: 65 66 6c 65 63 74 43 6c 6f 73 65 28 43 6c 69 65 eflectClose(Clie
0350: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 ntData clientDat
0360: 61 2c 0a 09 09 09 20 20 20 20 54 63 6c 5f 49 6e a,.... Tcl_In
0370: 74 65 72 70 20 2a 69 6e 74 65 72 70 29 3b 0a 73 terp *interp);.s
0380: 74 61 74 69 63 20 69 6e 74 09 09 52 65 66 6c 65 tatic int..Refle
0390: 63 74 49 6e 70 75 74 28 43 6c 69 65 6e 74 44 61 ctInput(ClientDa
03a0: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 63 ta clientData, c
03b0: 68 61 72 20 2a 62 75 66 2c 0a 09 09 09 20 20 20 har *buf,....
03c0: 20 69 6e 74 20 74 6f 52 65 61 64 2c 20 69 6e 74 int toRead, int
03d0: 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 29 3b *errorCodePtr);
03e0: 0a 73 74 61 74 69 63 20 69 6e 74 09 09 52 65 66 .static int..Ref
03f0: 6c 65 63 74 4f 75 74 70 75 74 28 43 6c 69 65 6e lectOutput(Clien
0400: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 tData clientData
0410: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 62 75 , const char *bu
0420: 66 2c 0a 09 09 09 20 20 20 20 69 6e 74 20 74 6f f,.... int to
0430: 57 72 69 74 65 2c 20 69 6e 74 20 2a 65 72 72 6f Write, int *erro
0440: 72 43 6f 64 65 50 74 72 29 3b 0a 73 74 61 74 69 rCodePtr);.stati
0450: 63 20 76 6f 69 64 09 09 52 65 66 6c 65 63 74 57 c void..ReflectW
0460: 61 74 63 68 28 43 6c 69 65 6e 74 44 61 74 61 20 atch(ClientData
0470: 63 6c 69 65 6e 74 44 61 74 61 2c 20 69 6e 74 20 clientData, int
0480: 6d 61 73 6b 29 3b 0a 73 74 61 74 69 63 20 69 6e mask);.static in
0490: 74 09 09 52 65 66 6c 65 63 74 42 6c 6f 63 6b 28 t..ReflectBlock(
04a0: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e ClientData clien
04b0: 74 44 61 74 61 2c 20 69 6e 74 20 6d 6f 64 65 29 tData, int mode)
04c0: 3b 0a 73 74 61 74 69 63 20 54 63 6c 5f 57 69 64 ;.static Tcl_Wid
04d0: 65 49 6e 74 09 52 65 66 6c 65 63 74 53 65 65 6b eInt.ReflectSeek
04e0: 57 69 64 65 28 43 6c 69 65 6e 74 44 61 74 61 20 Wide(ClientData
04f0: 63 6c 69 65 6e 74 44 61 74 61 2c 0a 09 09 09 20 clientData,....
0500: 20 20 20 54 63 6c 5f 57 69 64 65 49 6e 74 20 6f Tcl_WideInt o
0510: 66 66 73 65 74 2c 20 69 6e 74 20 6d 6f 64 65 2c ffset, int mode,
0520: 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65 50 int *errorCodeP
0530: 74 72 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 09 tr);.static int.
0540: 09 52 65 66 6c 65 63 74 53 65 65 6b 28 43 6c 69 .ReflectSeek(Cli
0550: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 entData clientDa
0560: 74 61 2c 20 6c 6f 6e 67 20 6f 66 66 73 65 74 2c ta, long offset,
0570: 0a 09 09 09 20 20 20 20 69 6e 74 20 6d 6f 64 65 .... int mode
0580: 2c 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65 , int *errorCode
0590: 50 74 72 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 Ptr);.static int
05a0: 09 09 52 65 66 6c 65 63 74 47 65 74 4f 70 74 69 ..ReflectGetOpti
05b0: 6f 6e 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c on(ClientData cl
05c0: 69 65 6e 74 44 61 74 61 2c 0a 09 09 09 20 20 20 ientData,....
05d0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 Tcl_Interp *int
05e0: 65 72 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 erp, const char
05f0: 2a 6f 70 74 69 6f 6e 4e 61 6d 65 2c 0a 09 09 09 *optionName,....
0600: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 Tcl_DString
0610: 2a 64 73 50 74 72 29 3b 0a 73 74 61 74 69 63 20 *dsPtr);.static
0620: 69 6e 74 09 09 52 65 66 6c 65 63 74 53 65 74 4f int..ReflectSetO
0630: 70 74 69 6f 6e 28 43 6c 69 65 6e 74 44 61 74 61 ption(ClientData
0640: 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 09 09 09 clientData,....
0650: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a Tcl_Interp *
0660: 69 6e 74 65 72 70 2c 20 63 6f 6e 73 74 20 63 68 interp, const ch
0670: 61 72 20 2a 6f 70 74 69 6f 6e 4e 61 6d 65 2c 0a ar *optionName,.
0680: 09 09 09 20 20 20 20 63 6f 6e 73 74 20 63 68 61 ... const cha
0690: 72 20 2a 6e 65 77 56 61 6c 75 65 29 3b 0a 0a 2f r *newValue);../
06a0: 2a 0a 20 2a 20 54 68 65 20 43 20 6c 61 79 65 72 *. * The C layer
06b0: 20 63 68 61 6e 6e 65 6c 20 74 79 70 65 2f 64 72 channel type/dr
06c0: 69 76 65 72 20 64 65 66 69 6e 69 74 69 6f 6e 20 iver definition
06d0: 75 73 65 64 20 62 79 20 74 68 65 20 72 65 66 6c used by the refl
06e0: 65 63 74 69 6f 6e 2e 20 54 68 69 73 20 69 73 0a ection. This is.
06f0: 20 2a 20 61 20 76 65 72 73 69 6f 6e 20 33 20 73 * a version 3 s
0700: 74 72 75 63 74 75 72 65 2e 0a 20 2a 2f 0a 0a 73 tructure.. */..s
0710: 74 61 74 69 63 20 54 63 6c 5f 43 68 61 6e 6e 65 tatic Tcl_Channe
0720: 6c 54 79 70 65 20 74 63 6c 52 43 68 61 6e 6e 65 lType tclRChanne
0730: 6c 54 79 70 65 20 3d 20 7b 0a 20 20 20 20 22 74 lType = {. "t
0740: 63 6c 72 63 68 61 6e 6e 65 6c 22 2c 20 20 20 20 clrchannel",
0750: 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6e 61 6d /* Type nam
0760: 65 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 e.
0770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0780: 20 20 20 20 2a 2f 0a 20 20 20 20 54 43 4c 5f 43 */. TCL_C
0790: 48 41 4e 4e 45 4c 5f 56 45 52 53 49 4f 4e 5f 35 HANNEL_VERSION_5
07a0: 2c 20 2f 2a 20 76 35 20 63 68 61 6e 6e 65 6c 20 , /* v5 channel
07b0: 2a 2f 0a 20 20 20 20 52 65 66 6c 65 63 74 43 6c */. ReflectCl
07c0: 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a ose, /*
07d0: 20 43 6c 6f 73 65 20 63 68 61 6e 6e 65 6c 2c 20 Close channel,
07e0: 63 6c 65 61 6e 20 69 6e 73 74 61 6e 63 65 20 64 clean instance d
07f0: 61 74 61 20 20 20 20 20 20 20 20 20 20 2a 2f 0a ata */.
0800: 20 20 20 20 52 65 66 6c 65 63 74 49 6e 70 75 74 ReflectInput
0810: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 , /* Ha
0820: 6e 64 6c 65 20 72 65 61 64 20 72 65 71 75 65 73 ndle read reques
0830: 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 t
0840: 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 */.
0850: 20 52 65 66 6c 65 63 74 4f 75 74 70 75 74 2c 20 ReflectOutput,
0860: 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c /* Handl
0870: 65 20 77 72 69 74 65 20 72 65 71 75 65 73 74 20 e write request
0880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0890: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 52 65 */. Re
08a0: 66 6c 65 63 74 53 65 65 6b 2c 20 20 20 20 20 20 flectSeek,
08b0: 20 20 20 20 20 2f 2a 20 4d 6f 76 65 20 6c 6f 63 /* Move loc
08c0: 61 74 69 6f 6e 20 6f 66 20 61 63 63 65 73 73 20 ation of access
08d0: 70 6f 69 6e 74 2e 09 4e 55 4c 4c 27 61 62 6c 65 point..NULL'able
08e0: 20 2a 2f 0a 20 20 20 20 52 65 66 6c 65 63 74 53 */. ReflectS
08f0: 65 74 4f 70 74 69 6f 6e 2c 20 20 20 20 20 20 2f etOption, /
0900: 2a 20 53 65 74 20 6f 70 74 69 6f 6e 73 2e 09 09 * Set options...
0910: 09 4e 55 4c 4c 27 61 62 6c 65 20 2a 2f 0a 20 20 .NULL'able */.
0920: 20 20 52 65 66 6c 65 63 74 47 65 74 4f 70 74 69 ReflectGetOpti
0930: 6f 6e 2c 20 20 20 20 20 20 2f 2a 20 47 65 74 20 on, /* Get
0940: 6f 70 74 69 6f 6e 73 2e 09 09 09 4e 55 4c 4c 27 options....NULL'
0950: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 52 65 66 6c able */. Refl
0960: 65 63 74 57 61 74 63 68 2c 20 20 20 20 20 20 20 ectWatch,
0970: 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 /* Initialize
0980: 20 6e 6f 74 69 66 69 65 72 20 20 20 20 20 20 20 notifier
0990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
09a0: 20 20 2a 2f 0a 20 20 20 20 4e 55 4c 4c 2c 20 20 */. NULL,
09b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
09c0: 2f 2a 20 47 65 74 20 4f 53 20 68 61 6e 64 6c 65 /* Get OS handle
09d0: 20 66 72 6f 6d 20 74 68 65 20 63 68 61 6e 6e 65 from the channe
09e0: 6c 2e 09 4e 55 4c 4c 27 61 62 6c 65 20 2a 2f 0a l..NULL'able */.
09f0: 20 20 20 20 4e 55 4c 4c 2c 20 20 20 20 20 20 20 NULL,
0a00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f /* No
0a10: 20 63 6c 6f 73 65 32 20 73 75 70 70 6f 72 74 2e close2 support.
0a20: 09 09 4e 55 4c 4c 27 61 62 6c 65 20 2a 2f 0a 20 ..NULL'able */.
0a30: 20 20 20 52 65 66 6c 65 63 74 42 6c 6f 63 6b 2c ReflectBlock,
0a40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 /* Set
0a50: 20 62 6c 6f 63 6b 69 6e 67 2f 6e 6f 6e 62 6c 6f blocking/nonblo
0a60: 63 6b 69 6e 67 2e 09 09 4e 55 4c 4c 27 61 62 6c cking...NULL'abl
0a70: 65 20 2a 2f 0a 20 20 20 20 4e 55 4c 4c 2c 20 20 e */. NULL,
0a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0a90: 2f 2a 20 46 6c 75 73 68 20 63 68 61 6e 6e 65 6c /* Flush channel
0aa0: 2e 20 4e 6f 74 20 75 73 65 64 20 62 79 20 63 6f . Not used by co
0ab0: 72 65 2e 09 4e 55 4c 4c 27 61 62 6c 65 20 2a 2f re..NULL'able */
0ac0: 0a 20 20 20 20 4e 55 4c 4c 2c 20 20 20 20 20 20 . NULL,
0ad0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 /* H
0ae0: 61 6e 64 6c 65 20 65 76 65 6e 74 73 2e 09 09 09 andle events....
0af0: 4e 55 4c 4c 27 61 62 6c 65 20 2a 2f 0a 20 20 20 NULL'able */.
0b00: 20 52 65 66 6c 65 63 74 53 65 65 6b 57 69 64 65 ReflectSeekWide
0b10: 2c 20 20 20 20 20 20 20 2f 2a 20 4d 6f 76 65 20 , /* Move
0b20: 61 63 63 65 73 73 20 70 6f 69 6e 74 20 28 36 34 access point (64
0b30: 20 62 69 74 29 2e 09 4e 55 4c 4c 27 61 62 6c 65 bit)..NULL'able
0b40: 20 2a 2f 0a 20 20 20 20 4e 55 4c 4c 2c 20 20 20 */. NULL,
0b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
0b60: 2a 20 74 68 72 65 61 64 20 61 63 74 69 6f 6e 20 * thread action
0b70: 2a 2f 0a 20 20 20 20 4e 55 4c 4c 2c 20 20 20 20 */. NULL,
0b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
0b90: 20 74 72 75 6e 63 61 74 65 20 2a 2f 0a 7d 3b 0a truncate */.};.
0ba0: 0a 2f 2a 0a 20 2a 20 49 6e 73 74 61 6e 63 65 20 ./*. * Instance
0bb0: 64 61 74 61 20 66 6f 72 20 61 20 72 65 66 6c 65 data for a refle
0bc0: 63 74 65 64 20 63 68 61 6e 6e 65 6c 2e 20 3d 3d cted channel. ==
0bd0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
0be0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 20 2a 2f 0a 0a 74 =========. */..t
0bf0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 7b 0a ypedef struct {.
0c00: 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 Tcl_Channel
0c10: 63 68 61 6e 3b 09 09 2f 2a 20 42 61 63 6b 20 72 chan;../* Back r
0c20: 65 66 65 72 65 6e 63 65 20 74 6f 20 67 65 6e 65 eference to gene
0c30: 72 69 63 20 63 68 61 6e 6e 65 6c 0a 09 09 09 09 ric channel.....
0c40: 20 2a 20 73 74 72 75 63 74 75 72 65 2e 20 2a 2f * structure. */
0c50: 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 . Tcl_Interp
0c60: 2a 69 6e 74 65 72 70 3b 09 09 2f 2a 20 52 65 66 *interp;../* Ref
0c70: 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 69 6e erence to the in
0c80: 74 65 72 70 72 65 74 65 72 20 63 6f 6e 74 61 69 terpreter contai
0c90: 6e 69 6e 67 20 74 68 65 0a 09 09 09 09 20 2a 20 ning the..... *
0ca0: 54 63 6c 20 6c 65 76 65 6c 20 70 61 72 74 20 6f Tcl level part o
0cb0: 66 20 74 68 65 20 63 68 61 6e 6e 65 6c 2e 20 4e f the channel. N
0cc0: 55 4c 4c 20 68 65 72 65 0a 09 09 09 09 20 2a 20 ULL here..... *
0cd0: 73 69 67 6e 61 6c 73 20 74 68 65 20 63 68 61 6e signals the chan
0ce0: 6e 65 6c 20 69 73 20 64 65 61 64 20 62 65 63 61 nel is dead beca
0cf0: 75 73 65 20 74 68 65 0a 09 09 09 09 20 2a 20 69 use the..... * i
0d00: 6e 74 65 72 70 72 65 74 65 72 2f 74 68 72 65 61 nterpreter/threa
0d10: 64 20 63 6f 6e 74 61 69 6e 69 6e 67 20 69 74 73 d containing its
0d20: 20 54 63 6c 0a 09 09 09 09 20 2a 20 63 6f 6d 6d Tcl..... * comm
0d30: 61 6e 64 20 69 73 20 67 6f 6e 65 2e 0a 09 09 09 and is gone.....
0d40: 09 20 2a 2f 0a 23 69 66 64 65 66 20 54 43 4c 5f . */.#ifdef TCL_
0d50: 54 48 52 45 41 44 53 0a 20 20 20 20 54 63 6c 5f THREADS. Tcl_
0d60: 54 68 72 65 61 64 49 64 20 74 68 72 65 61 64 3b ThreadId thread;
0d70: 09 2f 2a 20 54 68 72 65 61 64 20 74 68 65 20 27 ./* Thread the '
0d80: 69 6e 74 65 72 70 27 20 62 65 6c 6f 6e 67 73 20 interp' belongs
0d90: 74 6f 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 to. */.#endif..
0da0: 20 20 20 2f 2a 20 53 65 65 20 5b 3d 3d 5d 20 61 /* See [==] a
0db0: 73 20 77 65 6c 6c 2e 0a 20 20 20 20 20 2a 20 53 s well.. * S
0dc0: 74 6f 72 61 67 65 20 66 6f 72 20 74 68 65 20 63 torage for the c
0dd0: 6f 6d 6d 61 6e 64 20 70 72 65 66 69 78 20 61 6e ommand prefix an
0de0: 64 20 74 68 65 20 61 64 64 69 74 69 6f 6e 61 6c d the additional
0df0: 20 77 6f 72 64 73 20 72 65 71 75 69 72 65 64 20 words required
0e00: 66 6f 72 0a 20 20 20 20 20 2a 20 74 68 65 20 69 for. * the i
0e10: 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 20 6d 65 74 nvocation of met
0e20: 68 6f 64 73 20 69 6e 20 74 68 65 20 63 6f 6d 6d hods in the comm
0e30: 61 6e 64 20 68 61 6e 64 6c 65 72 2e 0a 20 20 20 and handler..
0e40: 20 20 2a 0a 20 20 20 20 20 2a 20 61 72 67 76 20 *. * argv
0e50: 5b 30 5d 20 2e 2e 2e 20 5b 2e 5d 20 7c 20 5b 61 [0] ... [.] | [a
0e60: 72 67 63 2d 32 5d 20 5b 61 72 67 63 2d 31 5d 20 rgc-2] [argc-1]
0e70: 7c 20 5b 61 72 67 63 5d 20 20 5b 61 72 67 63 2b | [argc] [argc+
0e80: 32 5d 0a 20 20 20 20 20 2a 20 20 20 20 20 20 63 2]. * c
0e90: 6d 64 20 2e 2e 2e 20 70 66 78 20 7c 20 6d 65 74 md ... pfx | met
0ea0: 68 6f 64 20 20 20 63 68 61 6e 20 20 20 20 20 7c hod chan |
0eb0: 20 64 65 74 61 69 6c 31 20 64 65 74 61 69 6c 32 detail1 detail2
0ec0: 0a 20 20 20 20 20 2a 20 20 20 20 20 20 7e 7e 7e . * ~~~
0ed0: 7e 20 43 54 20 7e 7e 7e 20 20 20 20 20 20 20 20 ~ CT ~~~
0ee0: 20 20 20 20 7e 7e 20 43 54 20 7e 7e 0a 20 20 20 ~~ CT ~~.
0ef0: 20 20 2a 0a 20 20 20 20 20 2a 20 43 54 20 3d 20 *. * CT =
0f00: 42 65 6c 6f 6e 67 73 20 74 6f 20 74 68 65 20 27 Belongs to the '
0f10: 43 6f 6d 6d 61 6e 64 20 68 61 6e 64 6c 65 72 20 Command handler
0f20: 54 68 72 65 61 64 27 2e 0a 20 20 20 20 20 2a 2f Thread'.. */
0f30: 0a 0a 20 20 20 20 69 6e 74 20 61 72 67 63 3b 09 .. int argc;.
0f40: 09 09 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 ../* Number of p
0f50: 72 65 61 6c 6c 6f 63 61 74 65 64 20 77 6f 72 64 reallocated word
0f60: 73 20 2d 20 32 20 2a 2f 0a 20 20 20 20 54 63 6c s - 2 */. Tcl
0f70: 5f 4f 62 6a 20 2a 2a 61 72 67 76 3b 09 09 2f 2a _Obj **argv;../*
0f80: 20 50 72 65 61 6c 6c 6f 63 61 74 65 64 20 61 72 Preallocated ar
0f90: 72 61 79 20 66 6f 72 20 63 61 6c 6c 69 6e 67 20 ray for calling
0fa0: 74 68 65 20 68 61 6e 64 6c 65 72 2e 0a 09 09 09 the handler.....
0fb0: 09 20 2a 20 61 72 67 73 5b 30 5d 20 69 73 20 70 . * args[0] is p
0fc0: 6c 61 63 65 68 6f 6c 64 65 72 20 66 6f 72 20 63 laceholder for c
0fd0: 6d 64 20 77 6f 72 64 2e 0a 09 09 09 09 20 2a 20 md word...... *
0fe0: 46 6f 6c 6c 6f 77 65 64 20 62 79 20 74 68 65 20 Followed by the
0ff0: 61 72 67 75 6d 65 6e 74 73 20 69 6e 20 74 68 65 arguments in the
1000: 20 70 72 65 66 69 78 2c 0a 09 09 09 09 20 2a 20 prefix,..... *
1010: 70 6c 75 73 20 34 20 70 6c 61 63 65 68 6f 6c 64 plus 4 placehold
1020: 65 72 73 20 66 6f 72 20 6d 65 74 68 6f 64 2c 20 ers for method,
1030: 63 68 61 6e 6e 65 6c 2c 0a 09 09 09 09 20 2a 20 channel,..... *
1040: 61 6e 64 20 61 74 20 6d 6f 73 74 20 74 77 6f 20 and at most two
1050: 76 61 72 79 69 6e 67 20 28 6d 65 74 68 6f 64 20 varying (method
1060: 73 70 65 63 69 66 69 63 29 0a 09 09 09 09 20 2a specific)..... *
1070: 20 77 6f 72 64 73 2e 20 2a 2f 0a 20 20 20 20 69 words. */. i
1080: 6e 74 20 6d 65 74 68 6f 64 73 3b 09 09 2f 2a 20 nt methods;../*
1090: 42 69 74 6d 61 73 6b 20 6f 66 20 73 75 70 70 6f Bitmask of suppo
10a0: 72 74 65 64 20 6d 65 74 68 6f 64 73 20 2a 2f 0a rted methods */.
10b0: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 4e . /*. * N
10c0: 4f 54 45 20 28 39 29 3a 20 53 68 6f 75 6c 64 20 OTE (9): Should
10d0: 77 65 20 68 61 76 65 20 70 72 65 64 65 66 69 6e we have predefin
10e0: 65 64 20 73 68 61 72 65 64 20 6c 69 74 65 72 61 ed shared litera
10f0: 6c 73 20 66 6f 72 20 74 68 65 20 6d 65 74 68 6f ls for the metho
1100: 64 0a 20 20 20 20 20 2a 20 6e 61 6d 65 73 3f 0a d. * names?.
1110: 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69 6e 74 */.. int
1120: 20 6d 6f 64 65 3b 09 09 09 2f 2a 20 4d 61 73 6b mode;.../* Mask
1130: 20 6f 66 20 52 2f 57 20 6d 6f 64 65 20 2a 2f 0a of R/W mode */.
1140: 20 20 20 20 69 6e 74 20 69 6e 74 65 72 65 73 74 int interest
1150: 3b 09 09 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 76 ;../* Mask of ev
1160: 65 6e 74 73 20 74 68 65 20 63 68 61 6e 6e 65 6c ents the channel
1170: 20 69 73 20 69 6e 74 65 72 65 73 74 65 64 0a 09 is interested..
1180: 09 09 09 20 2a 20 69 6e 2e 20 2a 2f 0a 0a 20 20 ... * in. */..
1190: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 4e 6f 74 65 /*. * Note
11a0: 20 72 65 67 61 72 64 69 6e 67 20 74 68 65 20 75 regarding the u
11b0: 73 61 67 65 20 6f 66 20 74 69 6d 65 72 73 2e 0a sage of timers..
11c0: 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 4d 6f *. * Mo
11d0: 73 74 20 63 68 61 6e 6e 65 6c 20 69 6d 70 6c 65 st channel imple
11e0: 6d 65 6e 74 61 74 69 6f 6e 73 20 6e 65 65 64 20 mentations need
11f0: 61 20 74 69 6d 65 72 20 69 6e 20 74 68 65 20 43 a timer in the C
1200: 20 6c 65 76 65 6c 20 74 6f 20 65 6e 73 75 72 65 level to ensure
1210: 20 74 68 61 74 0a 20 20 20 20 20 2a 20 64 61 74 that. * dat
1220: 61 20 69 6e 20 62 75 66 66 65 72 73 20 69 73 20 a in buffers is
1230: 66 6c 75 73 68 65 64 20 6f 75 74 20 74 68 72 6f flushed out thro
1240: 75 67 68 20 74 68 65 20 67 65 6e 65 72 61 74 69 ugh the generati
1250: 6f 6e 20 6f 66 20 66 61 6b 65 20 66 69 6c 65 0a on of fake file.
1260: 20 20 20 20 20 2a 20 65 76 65 6e 74 73 2e 0a 20 * events..
1270: 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 53 65 65 *. * See
1280: 20 27 72 65 63 68 61 6e 27 2c 20 27 6d 65 6d 63 'rechan', 'memc
1290: 68 61 6e 27 2c 20 65 74 63 2e 0a 20 20 20 20 20 han', etc..
12a0: 2a 0a 20 20 20 20 20 2a 20 48 65 72 65 20 74 68 *. * Here th
12b0: 69 73 20 69 73 20 5f 6e 6f 74 5f 20 72 65 71 75 is is _not_ requ
12c0: 69 72 65 64 2e 20 49 6e 74 65 72 65 73 74 20 69 ired. Interest i
12d0: 6e 20 65 76 65 6e 74 73 20 69 73 20 70 6f 73 74 n events is post
12e0: 65 64 20 74 6f 20 74 68 65 20 54 63 6c 0a 20 20 ed to the Tcl.
12f0: 20 20 20 2a 20 6c 65 76 65 6c 20 76 69 61 20 27 * level via '
1300: 77 61 74 63 68 27 2e 20 41 6e 64 20 70 6f 73 74 watch'. And post
1310: 69 6e 67 20 6f 66 20 65 76 65 6e 74 73 20 69 73 ing of events is
1320: 20 70 6f 73 73 69 62 6c 65 20 66 72 6f 6d 20 74 possible from t
1330: 68 65 20 54 63 6c 20 6c 65 76 65 6c 0a 20 20 20 he Tcl level.
1340: 20 20 2a 20 61 73 20 77 65 6c 6c 2c 20 76 69 61 * as well, via
1350: 20 27 63 68 61 6e 20 70 6f 73 74 65 76 65 6e 74 'chan postevent
1360: 27 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 '. This means th
1370: 61 74 20 74 68 65 20 67 65 6e 65 72 61 74 69 6f at the generatio
1380: 6e 20 6f 66 20 61 6c 6c 0a 20 20 20 20 20 2a 20 n of all. *
1390: 65 76 65 6e 74 73 2c 20 66 61 6b 65 20 6f 72 20 events, fake or
13a0: 6e 6f 74 2c 20 74 69 6d 65 72 20 62 61 73 65 64 not, timer based
13b0: 20 6f 72 20 6e 6f 74 2c 20 69 73 20 63 6f 6d 70 or not, is comp
13c0: 6c 65 74 65 6c 79 20 69 6e 20 74 68 65 20 68 61 letely in the ha
13d0: 6e 64 73 20 6f 66 0a 20 20 20 20 20 2a 20 74 68 nds of. * th
13e0: 65 20 54 63 6c 20 6c 65 76 65 6c 2e 20 54 68 65 e Tcl level. The
13f0: 72 65 66 6f 72 65 20 6e 6f 20 74 69 6d 65 72 20 refore no timer
1400: 68 65 72 65 2e 0a 20 20 20 20 20 2a 2f 0a 7d 20 here.. */.}
1410: 52 65 66 6c 65 63 74 65 64 43 68 61 6e 6e 65 6c ReflectedChannel
1420: 3b 0a 0a 2f 2a 0a 20 2a 20 53 74 72 75 63 74 75 ;../*. * Structu
1430: 72 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 re of the table
1440: 6d 61 70 69 6e 67 20 66 72 6f 6d 20 63 68 61 6e maping from chan
1450: 6e 65 6c 20 68 61 6e 64 6c 65 73 20 74 6f 20 72 nel handles to r
1460: 65 66 6c 65 63 74 65 64 0a 20 2a 20 63 68 61 6e eflected. * chan
1470: 6e 65 6c 73 2e 20 45 61 63 68 20 69 6e 74 65 72 nels. Each inter
1480: 70 72 65 74 65 72 20 77 68 69 63 68 20 68 61 73 preter which has
1490: 20 74 68 65 20 68 61 6e 64 6c 65 72 20 63 6f 6d the handler com
14a0: 6d 61 6e 64 20 66 6f 72 20 6f 6e 65 20 6f 72 20 mand for one or
14b0: 6d 6f 72 65 0a 20 2a 20 72 65 66 6c 65 63 74 65 more. * reflecte
14c0: 64 20 63 68 61 6e 6e 65 6c 73 20 72 65 63 6f 72 d channels recor
14d0: 64 73 20 74 68 65 6d 20 69 6e 20 73 75 63 68 20 ds them in such
14e0: 61 20 74 61 62 6c 65 2c 20 73 6f 20 74 68 61 74 a table, so that
14f0: 20 27 63 68 61 6e 20 70 6f 73 74 65 76 65 6e 74 'chan postevent
1500: 27 0a 20 2a 20 69 73 20 61 62 6c 65 20 74 6f 20 '. * is able to
1510: 66 69 6e 64 20 74 68 65 6d 20 65 76 65 6e 20 69 find them even i
1520: 66 20 74 68 65 20 61 63 74 75 61 6c 20 63 68 61 f the actual cha
1530: 6e 6e 65 6c 20 77 61 73 20 6d 6f 76 65 64 20 74 nnel was moved t
1540: 6f 20 61 20 64 69 66 66 65 72 65 6e 74 0a 20 2a o a different. *
1550: 20 69 6e 74 65 72 70 72 65 74 65 72 20 61 6e 64 interpreter and
1560: 2f 6f 72 20 74 68 72 65 61 64 2e 0a 20 2a 0a 20 /or thread.. *.
1570: 2a 20 54 68 65 20 74 61 62 6c 65 20 69 73 20 72 * The table is r
1580: 65 61 63 68 61 62 6c 65 20 76 69 61 20 74 68 65 eachable via the
1590: 20 73 74 61 6e 64 61 72 64 20 69 6e 74 65 72 70 standard interp
15a0: 72 65 74 65 72 20 41 73 73 6f 63 44 61 74 61 2c reter AssocData,
15b0: 20 74 68 65 20 6b 65 79 20 69 73 0a 20 2a 20 64 the key is. * d
15c0: 65 66 69 6e 65 64 20 62 65 6c 6f 77 2e 0a 20 2a efined below.. *
15d0: 2f 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 /..typedef struc
15e0: 74 20 7b 0a 20 20 20 20 54 63 6c 5f 48 61 73 68 t {. Tcl_Hash
15f0: 54 61 62 6c 65 20 6d 61 70 3b 0a 7d 20 52 65 66 Table map;.} Ref
1600: 6c 65 63 74 65 64 43 68 61 6e 6e 65 6c 4d 61 70 lectedChannelMap
1610: 3b 0a 0a 23 64 65 66 69 6e 65 20 52 43 4d 4b 45 ;..#define RCMKE
1620: 59 20 22 52 65 66 6c 65 63 74 65 64 43 68 61 6e Y "ReflectedChan
1630: 6e 65 6c 4d 61 70 22 0a 0a 2f 2a 0a 20 2a 20 45 nelMap"../*. * E
1640: 76 65 6e 74 20 6c 69 74 65 72 61 6c 73 2e 20 3d vent literals. =
1650: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
1660: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
1670: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
1680: 3d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 63 6f =. */..static co
1690: 6e 73 74 20 63 68 61 72 20 2a 65 76 65 6e 74 4f nst char *eventO
16a0: 70 74 69 6f 6e 73 5b 5d 20 3d 20 7b 0a 20 20 20 ptions[] = {.
16b0: 20 22 72 65 61 64 22 2c 20 22 77 72 69 74 65 22 "read", "write"
16c0: 2c 20 4e 55 4c 4c 0a 7d 3b 0a 74 79 70 65 64 65 , NULL.};.typede
16d0: 66 20 65 6e 75 6d 20 7b 0a 20 20 20 20 45 56 45 f enum {. EVE
16e0: 4e 54 5f 52 45 41 44 2c 20 45 56 45 4e 54 5f 57 NT_READ, EVENT_W
16f0: 52 49 54 45 0a 7d 20 45 76 65 6e 74 4f 70 74 69 RITE.} EventOpti
1700: 6f 6e 3b 0a 0a 2f 2a 0a 20 2a 20 4d 65 74 68 6f on;../*. * Metho
1710: 64 20 6c 69 74 65 72 61 6c 73 2e 20 3d 3d 3d 3d d literals. ====
1720: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
1730: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
1740: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 20 ==============.
1750: 2a 2f 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 */..static const
1760: 20 63 68 61 72 20 2a 6d 65 74 68 6f 64 4e 61 6d char *methodNam
1770: 65 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 22 62 6c es[] = {. "bl
1780: 6f 63 6b 69 6e 67 22 2c 09 09 2f 2a 20 4f 50 54 ocking",../* OPT
1790: 20 2a 2f 0a 20 20 20 20 22 63 67 65 74 22 2c 09 */. "cget",.
17a0: 09 2f 2a 20 4f 50 54 20 5c 2f 20 54 6f 67 65 74 ./* OPT \/ Toget
17b0: 68 65 72 20 6f 72 20 6e 6f 6e 65 20 2a 2f 0a 20 her or none */.
17c0: 20 20 20 22 63 67 65 74 61 6c 6c 22 2c 09 09 2f "cgetall",../
17d0: 2a 20 4f 50 54 20 2f 5c 20 6f 66 20 74 68 65 73 * OPT /\ of thes
17e0: 65 20 74 77 6f 20 20 20 20 20 2a 2f 0a 20 20 20 e two */.
17f0: 20 22 63 6f 6e 66 69 67 75 72 65 22 2c 09 2f 2a "configure",./*
1800: 20 4f 50 54 20 2a 2f 0a 20 20 20 20 22 66 69 6e OPT */. "fin
1810: 61 6c 69 7a 65 22 2c 09 09 2f 2a 20 20 20 20 20 alize",../*
1820: 2a 2f 0a 20 20 20 20 22 69 6e 69 74 69 61 6c 69 */. "initiali
1830: 7a 65 22 2c 09 2f 2a 20 20 20 20 20 2a 2f 0a 20 ze",./* */.
1840: 20 20 20 22 72 65 61 64 22 2c 09 09 2f 2a 20 4f "read",../* O
1850: 50 54 20 2a 2f 0a 20 20 20 20 22 73 65 65 6b 22 PT */. "seek"
1860: 2c 09 09 2f 2a 20 4f 50 54 20 2a 2f 0a 20 20 20 ,../* OPT */.
1870: 20 22 77 61 74 63 68 22 2c 09 09 2f 2a 20 20 20 "watch",../*
1880: 20 20 2a 2f 0a 20 20 20 20 22 77 72 69 74 65 22 */. "write"
1890: 2c 09 09 2f 2a 20 4f 50 54 20 2a 2f 0a 20 20 20 ,../* OPT */.
18a0: 20 4e 55 4c 4c 0a 7d 3b 0a 74 79 70 65 64 65 66 NULL.};.typedef
18b0: 20 65 6e 75 6d 20 7b 0a 20 20 20 20 4d 45 54 48 enum {. METH
18c0: 5f 42 4c 4f 43 4b 49 4e 47 2c 0a 20 20 20 20 4d _BLOCKING,. M
18d0: 45 54 48 5f 43 47 45 54 2c 0a 20 20 20 20 4d 45 ETH_CGET,. ME
18e0: 54 48 5f 43 47 45 54 41 4c 4c 2c 0a 20 20 20 20 TH_CGETALL,.
18f0: 4d 45 54 48 5f 43 4f 4e 46 49 47 55 52 45 2c 0a METH_CONFIGURE,.
1900: 20 20 20 20 4d 45 54 48 5f 46 49 4e 41 4c 2c 0a METH_FINAL,.
1910: 20 20 20 20 4d 45 54 48 5f 49 4e 49 54 2c 0a 20 METH_INIT,.
1920: 20 20 20 4d 45 54 48 5f 52 45 41 44 2c 0a 20 20 METH_READ,.
1930: 20 20 4d 45 54 48 5f 53 45 45 4b 2c 0a 20 20 20 METH_SEEK,.
1940: 20 4d 45 54 48 5f 57 41 54 43 48 2c 0a 20 20 20 METH_WATCH,.
1950: 20 4d 45 54 48 5f 57 52 49 54 45 0a 7d 20 4d 65 METH_WRITE.} Me
1960: 74 68 6f 64 4e 61 6d 65 3b 0a 0a 23 64 65 66 69 thodName;..#defi
1970: 6e 65 20 46 4c 41 47 28 6d 29 20 28 31 20 3c 3c ne FLAG(m) (1 <<
1980: 20 28 6d 29 29 0a 23 64 65 66 69 6e 65 20 52 45 (m)).#define RE
1990: 51 55 49 52 45 44 5f 4d 45 54 48 4f 44 53 20 5c QUIRED_METHODS \
19a0: 0a 09 28 46 4c 41 47 28 4d 45 54 48 5f 49 4e 49 ..(FLAG(METH_INI
19b0: 54 29 20 7c 20 46 4c 41 47 28 4d 45 54 48 5f 46 T) | FLAG(METH_F
19c0: 49 4e 41 4c 29 20 7c 20 46 4c 41 47 28 4d 45 54 INAL) | FLAG(MET
19d0: 48 5f 57 41 54 43 48 29 29 0a 23 64 65 66 69 6e H_WATCH)).#defin
19e0: 65 20 4e 55 4c 4c 41 42 4c 45 5f 4d 45 54 48 4f e NULLABLE_METHO
19f0: 44 53 20 5c 0a 09 28 46 4c 41 47 28 4d 45 54 48 DS \..(FLAG(METH
1a00: 5f 42 4c 4f 43 4b 49 4e 47 29 20 7c 20 46 4c 41 _BLOCKING) | FLA
1a10: 47 28 4d 45 54 48 5f 53 45 45 4b 29 20 7c 20 5c G(METH_SEEK) | \
1a20: 0a 09 46 4c 41 47 28 4d 45 54 48 5f 43 4f 4e 46 ..FLAG(METH_CONF
1a30: 49 47 55 52 45 29 20 7c 20 46 4c 41 47 28 4d 45 IGURE) | FLAG(ME
1a40: 54 48 5f 43 47 45 54 29 20 7c 20 46 4c 41 47 28 TH_CGET) | FLAG(
1a50: 4d 45 54 48 5f 43 47 45 54 41 4c 4c 29 29 0a 0a METH_CGETALL))..
1a60: 23 64 65 66 69 6e 65 20 52 41 4e 44 57 20 5c 0a #define RANDW \.
1a70: 09 28 54 43 4c 5f 52 45 41 44 41 42 4c 45 20 7c .(TCL_READABLE |
1a80: 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 29 0a 0a TCL_WRITABLE)..
1a90: 23 64 65 66 69 6e 65 20 49 4d 50 4c 49 45 53 28 #define IMPLIES(
1aa0: 61 2c 62 29 09 28 28 21 28 61 29 29 20 7c 7c 20 a,b).((!(a)) ||
1ab0: 28 62 29 29 0a 23 64 65 66 69 6e 65 20 4e 45 47 (b)).#define NEG
1ac0: 49 4d 50 4c 28 61 2c 62 29 0a 23 64 65 66 69 6e IMPL(a,b).#defin
1ad0: 65 20 48 41 53 28 78 2c 66 29 09 28 78 20 26 20 e HAS(x,f).(x &
1ae0: 46 4c 41 47 28 66 29 29 0a 0c 0a 23 69 66 64 65 FLAG(f))...#ifde
1af0: 66 20 54 43 4c 5f 54 48 52 45 41 44 53 0a 2f 2a f TCL_THREADS./*
1b00: 0a 20 2a 20 54 68 72 65 61 64 20 73 70 65 63 69 . * Thread speci
1b10: 66 69 63 20 74 79 70 65 73 20 61 6e 64 20 73 74 fic types and st
1b20: 72 75 63 74 75 72 65 73 2e 0a 20 2a 0a 20 2a 20 ructures.. *. *
1b30: 57 65 20 61 72 65 20 68 65 72 65 20 65 73 73 65 We are here esse
1b40: 6e 74 69 61 6c 6c 79 20 63 72 65 61 74 69 6e 67 ntially creating
1b50: 20 61 20 76 65 72 79 20 73 70 65 63 69 66 69 63 a very specific
1b60: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 implementation
1b70: 6f 66 20 27 74 68 72 65 61 64 0a 20 2a 20 73 65 of 'thread. * se
1b80: 6e 64 27 2e 0a 20 2a 2f 0a 0a 2f 2a 0a 20 2a 20 nd'.. */../*. *
1b90: 45 6e 75 6d 65 72 61 74 69 6f 6e 20 6f 66 20 61 Enumeration of a
1ba0: 6c 6c 20 6f 70 65 72 61 74 69 6f 6e 73 20 77 68 ll operations wh
1bb0: 69 63 68 20 63 61 6e 20 62 65 20 66 6f 72 77 61 ich can be forwa
1bc0: 72 64 65 64 2e 0a 20 2a 2f 0a 0a 74 79 70 65 64 rded.. */..typed
1bd0: 65 66 20 65 6e 75 6d 20 7b 0a 20 20 20 20 46 6f ef enum {. Fo
1be0: 72 77 61 72 64 65 64 43 6c 6f 73 65 2c 0a 20 20 rwardedClose,.
1bf0: 20 20 46 6f 72 77 61 72 64 65 64 49 6e 70 75 74 ForwardedInput
1c00: 2c 0a 20 20 20 20 46 6f 72 77 61 72 64 65 64 4f ,. ForwardedO
1c10: 75 74 70 75 74 2c 0a 20 20 20 20 46 6f 72 77 61 utput,. Forwa
1c20: 72 64 65 64 53 65 65 6b 2c 0a 20 20 20 20 46 6f rdedSeek,. Fo
1c30: 72 77 61 72 64 65 64 57 61 74 63 68 2c 0a 20 20 rwardedWatch,.
1c40: 20 20 46 6f 72 77 61 72 64 65 64 42 6c 6f 63 6b ForwardedBlock
1c50: 2c 0a 20 20 20 20 46 6f 72 77 61 72 64 65 64 53 ,. ForwardedS
1c60: 65 74 4f 70 74 2c 0a 20 20 20 20 46 6f 72 77 61 etOpt,. Forwa
1c70: 72 64 65 64 47 65 74 4f 70 74 2c 0a 20 20 20 20 rdedGetOpt,.
1c80: 46 6f 72 77 61 72 64 65 64 47 65 74 4f 70 74 41 ForwardedGetOptA
1c90: 6c 6c 0a 7d 20 46 6f 72 77 61 72 64 65 64 4f 70 ll.} ForwardedOp
1ca0: 65 72 61 74 69 6f 6e 3b 0a 0a 2f 2a 0a 20 2a 20 eration;../*. *
1cb0: 45 76 65 6e 74 20 75 73 65 64 20 74 6f 20 66 6f Event used to fo
1cc0: 72 77 61 72 64 20 64 72 69 76 65 72 20 69 6e 76 rward driver inv
1cd0: 6f 63 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 ocations to the
1ce0: 74 68 72 65 61 64 20 61 63 74 75 61 6c 6c 79 20 thread actually
1cf0: 6d 61 6e 61 67 69 6e 67 0a 20 2a 20 74 68 65 20 managing. * the
1d00: 63 68 61 6e 6e 65 6c 2e 20 57 65 20 63 61 6e 6e channel. We cann
1d10: 6f 74 20 63 6f 6e 73 74 72 75 63 74 20 74 68 65 ot construct the
1d20: 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 78 65 63 command to exec
1d30: 75 74 65 20 61 6e 64 20 66 6f 72 77 61 72 64 20 ute and forward
1d40: 74 68 61 74 2e 0a 20 2a 20 42 65 63 61 75 73 65 that.. * Because
1d50: 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 20 63 6f then it will co
1d60: 6e 74 61 69 6e 20 61 20 6d 69 78 74 75 72 65 20 ntain a mixture
1d70: 6f 66 20 54 63 6c 5f 4f 62 6a 27 73 20 62 65 6c of Tcl_Obj's bel
1d80: 6f 6e 67 69 6e 67 20 74 6f 20 62 6f 74 68 20 74 onging to both t
1d90: 68 65 0a 20 2a 20 63 6f 6d 6d 61 6e 64 20 68 61 he. * command ha
1da0: 6e 64 6c 65 72 20 74 68 72 65 61 64 20 28 43 54 ndler thread (CT
1db0: 29 2c 20 61 6e 64 20 74 68 65 20 74 68 72 65 61 ), and the threa
1dc0: 64 20 6d 61 6e 61 67 69 6e 67 20 74 68 65 20 63 d managing the c
1dd0: 68 61 6e 6e 65 6c 20 28 4d 54 29 2c 0a 20 2a 20 hannel (MT),. *
1de0: 65 78 65 63 75 74 65 64 20 69 6e 20 43 54 2e 20 executed in CT.
1df0: 54 63 6c 5f 4f 62 6a 27 73 20 61 72 65 20 6e 6f Tcl_Obj's are no
1e00: 74 20 61 6c 6c 6f 77 65 64 20 74 6f 20 63 72 6f t allowed to cro
1e10: 73 73 20 74 68 72 65 61 64 20 62 6f 75 6e 64 61 ss thread bounda
1e20: 72 69 65 73 2e 20 53 6f 20 77 65 0a 20 2a 20 66 ries. So we. * f
1e30: 6f 72 77 61 72 64 20 61 6e 20 6f 70 65 72 61 74 orward an operat
1e40: 69 6f 6e 20 63 6f 64 65 2c 20 74 68 65 20 61 72 ion code, the ar
1e50: 67 75 6d 65 6e 74 20 64 65 74 61 69 6c 73 2c 20 gument details,
1e60: 61 6e 64 20 72 65 66 65 72 65 6e 63 65 20 74 6f and reference to
1e70: 20 72 65 73 75 6c 74 73 2e 0a 20 2a 20 54 68 65 results.. * The
1e80: 20 63 6f 6d 6d 61 6e 64 20 69 73 20 61 73 73 65 command is asse
1e90: 6d 62 6c 65 64 20 69 6e 20 74 68 65 20 43 54 20 mbled in the CT
1ea0: 61 6e 64 20 62 65 6c 6f 6e 67 73 20 66 75 6c 6c and belongs full
1eb0: 79 20 74 6f 20 74 68 61 74 20 74 68 72 65 61 64 y to that thread
1ec0: 2e 20 4e 6f 0a 20 2a 20 73 68 61 72 69 6e 67 20 . No. * sharing
1ed0: 70 72 6f 62 6c 65 6d 73 2e 0a 20 2a 2f 0a 0a 74 problems.. */..t
1ee0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46 6f ypedef struct Fo
1ef0: 72 77 61 72 64 50 61 72 61 6d 42 61 73 65 20 7b rwardParamBase {
1f00: 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 09 09 . int code;..
1f10: 09 2f 2a 20 4f 3a 20 4f 6b 2f 46 61 69 6c 20 6f ./* O: Ok/Fail o
1f20: 66 20 74 68 65 20 63 6d 64 20 68 61 6e 64 6c 65 f the cmd handle
1f30: 72 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 6d r */. char *m
1f40: 73 67 53 74 72 3b 09 09 2f 2a 20 4f 3a 20 45 72 sgStr;../* O: Er
1f50: 72 6f 72 20 6d 65 73 73 61 67 65 20 66 6f 72 20 ror message for
1f60: 68 61 6e 64 6c 65 72 20 66 61 69 6c 75 72 65 20 handler failure
1f70: 2a 2f 0a 20 20 20 20 69 6e 74 20 6d 75 73 74 46 */. int mustF
1f80: 72 65 65 3b 09 09 2f 2a 20 4f 3a 20 54 72 75 65 ree;../* O: True
1f90: 20 69 66 20 6d 73 67 53 74 72 20 69 73 20 61 6c if msgStr is al
1fa0: 6c 6f 63 61 74 65 64 2c 20 66 61 6c 73 65 20 69 located, false i
1fb0: 66 0a 09 09 09 09 20 2a 20 6f 74 68 65 72 77 69 f..... * otherwi
1fc0: 73 65 20 28 73 74 61 74 69 63 29 2e 20 2a 2f 0a se (static). */.
1fd0: 7d 20 46 6f 72 77 61 72 64 50 61 72 61 6d 42 61 } ForwardParamBa
1fe0: 73 65 3b 0a 0a 2f 2a 0a 20 2a 20 4f 70 65 72 61 se;../*. * Opera
1ff0: 74 69 6f 6e 20 73 70 65 63 69 66 69 63 20 70 61 tion specific pa
2000: 72 61 6d 65 74 65 72 2f 72 65 73 75 6c 74 20 73 rameter/result s
2010: 74 72 75 63 74 75 72 65 73 2e 20 28 54 68 65 73 tructures. (Thes
2020: 65 20 61 72 65 20 22 73 75 62 74 79 70 65 73 22 e are "subtypes"
2030: 20 6f 66 0a 20 2a 20 46 6f 72 77 61 72 64 50 61 of. * ForwardPa
2040: 72 61 6d 42 61 73 65 2e 20 57 68 65 72 65 20 61 ramBase. Where a
2050: 6e 20 6f 70 65 72 61 74 69 6f 6e 20 64 6f 65 73 n operation does
2060: 20 6e 6f 74 20 6e 65 65 64 20 61 6e 79 20 73 70 not need any sp
2070: 65 63 69 61 6c 20 74 79 70 65 73 2c 20 69 74 0a ecial types, it.
2080: 20 2a 20 68 61 73 20 6e 6f 20 22 73 75 62 74 79 * has no "subty
2090: 70 65 22 20 61 6e 64 20 6a 75 73 74 20 75 73 65 pe" and just use
20a0: 73 20 46 6f 72 77 61 72 64 50 61 72 61 6d 42 61 s ForwardParamBa
20b0: 73 65 2c 20 61 73 20 6c 69 73 74 65 64 20 61 62 se, as listed ab
20c0: 6f 76 65 2e 29 0a 20 2a 2f 0a 0a 73 74 72 75 63 ove.). */..struc
20d0: 74 20 46 6f 72 77 61 72 64 50 61 72 61 6d 49 6e t ForwardParamIn
20e0: 70 75 74 20 7b 0a 20 20 20 20 46 6f 72 77 61 72 put {. Forwar
20f0: 64 50 61 72 61 6d 42 61 73 65 20 62 61 73 65 3b dParamBase base;
2100: 09 2f 2a 20 22 53 75 70 65 72 74 79 70 65 22 2e ./* "Supertype".
2110: 20 4d 55 53 54 20 43 4f 4d 45 20 46 49 52 53 54 MUST COME FIRST
2120: 2e 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 62 . */. char *b
2130: 75 66 3b 09 09 09 2f 2a 20 4f 3a 20 57 68 65 72 uf;.../* O: Wher
2140: 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 72 e to store the r
2150: 65 61 64 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 ead bytes */.
2160: 20 69 6e 74 20 74 6f 52 65 61 64 3b 09 09 09 2f int toRead;.../
2170: 2a 20 49 3a 20 23 62 79 74 65 73 20 74 6f 20 72 * I: #bytes to r
2180: 65 61 64 2c 0a 09 09 09 09 20 2a 20 4f 3a 20 23 ead,..... * O: #
2190: 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72 bytes actually r
21a0: 65 61 64 20 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 ead */.};.struct
21b0: 20 46 6f 72 77 61 72 64 50 61 72 61 6d 4f 75 74 ForwardParamOut
21c0: 70 75 74 20 7b 0a 20 20 20 20 46 6f 72 77 61 72 put {. Forwar
21d0: 64 50 61 72 61 6d 42 61 73 65 20 62 61 73 65 3b dParamBase base;
21e0: 09 2f 2a 20 22 53 75 70 65 72 74 79 70 65 22 2e ./* "Supertype".
21f0: 20 4d 55 53 54 20 43 4f 4d 45 20 46 49 52 53 54 MUST COME FIRST
2200: 2e 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 . */. const c
2210: 68 61 72 20 2a 62 75 66 3b 09 09 2f 2a 20 49 3a har *buf;../* I:
2220: 20 57 68 65 72 65 20 74 68 65 20 62 79 74 65 73 Where the bytes
2230: 20 74 6f 20 77 72 69 74 65 20 63 6f 6d 65 20 66 to write come f
2240: 72 6f 6d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74 rom */. int t
2250: 6f 57 72 69 74 65 3b 09 09 2f 2a 20 49 3a 20 23 oWrite;../* I: #
2260: 62 79 74 65 73 20 74 6f 20 77 72 69 74 65 2c 0a bytes to write,.
2270: 09 09 09 09 20 2a 20 4f 3a 20 23 62 79 74 65 73 .... * O: #bytes
2280: 20 61 63 74 75 61 6c 6c 79 20 77 72 69 74 74 65 actually writte
2290: 6e 20 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 n */.};.struct F
22a0: 6f 72 77 61 72 64 50 61 72 61 6d 53 65 65 6b 20 orwardParamSeek
22b0: 7b 0a 20 20 20 20 46 6f 72 77 61 72 64 50 61 72 {. ForwardPar
22c0: 61 6d 42 61 73 65 20 62 61 73 65 3b 09 2f 2a 20 amBase base;./*
22d0: 22 53 75 70 65 72 74 79 70 65 22 2e 20 4d 55 53 "Supertype". MUS
22e0: 54 20 43 4f 4d 45 20 46 49 52 53 54 2e 20 2a 2f T COME FIRST. */
22f0: 0a 20 20 20 20 69 6e 74 20 73 65 65 6b 4d 6f 64 . int seekMod
2300: 65 3b 09 09 2f 2a 20 49 3a 20 48 6f 77 20 74 6f e;../* I: How to
2310: 20 73 65 65 6b 20 2a 2f 0a 20 20 20 20 54 63 6c seek */. Tcl
2320: 5f 57 69 64 65 49 6e 74 20 6f 66 66 73 65 74 3b _WideInt offset;
2330: 09 09 2f 2a 20 49 3a 20 57 68 65 72 65 20 74 6f ../* I: Where to
2340: 20 73 65 65 6b 2c 0a 09 09 09 09 20 2a 20 4f 3a seek,..... * O:
2350: 20 4e 65 77 20 6c 6f 63 61 74 69 6f 6e 20 2a 2f New location */
2360: 0a 7d 3b 0a 73 74 72 75 63 74 20 46 6f 72 77 61 .};.struct Forwa
2370: 72 64 50 61 72 61 6d 57 61 74 63 68 20 7b 0a 20 rdParamWatch {.
2380: 20 20 20 46 6f 72 77 61 72 64 50 61 72 61 6d 42 ForwardParamB
2390: 61 73 65 20 62 61 73 65 3b 09 2f 2a 20 22 53 75 ase base;./* "Su
23a0: 70 65 72 74 79 70 65 22 2e 20 4d 55 53 54 20 43 pertype". MUST C
23b0: 4f 4d 45 20 46 49 52 53 54 2e 20 2a 2f 0a 20 20 OME FIRST. */.
23c0: 20 20 69 6e 74 20 6d 61 73 6b 3b 09 09 09 2f 2a int mask;.../*
23d0: 20 49 3a 20 57 68 61 74 20 65 76 65 6e 74 73 20 I: What events
23e0: 74 6f 20 77 61 74 63 68 20 66 6f 72 20 2a 2f 0a to watch for */.
23f0: 7d 3b 0a 73 74 72 75 63 74 20 46 6f 72 77 61 72 };.struct Forwar
2400: 64 50 61 72 61 6d 42 6c 6f 63 6b 20 7b 0a 20 20 dParamBlock {.
2410: 20 20 46 6f 72 77 61 72 64 50 61 72 61 6d 42 61 ForwardParamBa
2420: 73 65 20 62 61 73 65 3b 09 2f 2a 20 22 53 75 70 se base;./* "Sup
2430: 65 72 74 79 70 65 22 2e 20 4d 55 53 54 20 43 4f ertype". MUST CO
2440: 4d 45 20 46 49 52 53 54 2e 20 2a 2f 0a 20 20 20 ME FIRST. */.
2450: 20 69 6e 74 20 6e 6f 6e 62 6c 6f 63 6b 69 6e 67 int nonblocking
2460: 3b 09 09 2f 2a 20 49 3a 20 57 68 61 74 20 6d 6f ;../* I: What mo
2470: 64 65 20 74 6f 20 61 63 74 69 76 61 74 65 20 2a de to activate *
2480: 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 6f 72 77 /.};.struct Forw
2490: 61 72 64 50 61 72 61 6d 53 65 74 4f 70 74 20 7b ardParamSetOpt {
24a0: 0a 20 20 20 20 46 6f 72 77 61 72 64 50 61 72 61 . ForwardPara
24b0: 6d 42 61 73 65 20 62 61 73 65 3b 09 2f 2a 20 22 mBase base;./* "
24c0: 53 75 70 65 72 74 79 70 65 22 2e 20 4d 55 53 54 Supertype". MUST
24d0: 20 43 4f 4d 45 20 46 49 52 53 54 2e 20 2a 2f 0a COME FIRST. */.
24e0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a const char *
24f0: 6e 61 6d 65 3b 09 09 2f 2a 20 4e 61 6d 65 20 6f name;../* Name o
2500: 66 20 6f 70 74 69 6f 6e 20 74 6f 20 73 65 74 20 f option to set
2510: 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 */. const cha
2520: 72 20 2a 76 61 6c 75 65 3b 09 09 2f 2a 20 56 61 r *value;../* Va
2530: 6c 75 65 20 74 6f 20 73 65 74 20 2a 2f 0a 7d 3b lue to set */.};
2540: 0a 73 74 72 75 63 74 20 46 6f 72 77 61 72 64 50 .struct ForwardP
2550: 61 72 61 6d 47 65 74 4f 70 74 20 7b 0a 20 20 20 aramGetOpt {.
2560: 20 46 6f 72 77 61 72 64 50 61 72 61 6d 42 61 73 ForwardParamBas
2570: 65 20 62 61 73 65 3b 09 2f 2a 20 22 53 75 70 65 e base;./* "Supe
2580: 72 74 79 70 65 22 2e 20 4d 55 53 54 20 43 4f 4d rtype". MUST COM
2590: 45 20 46 49 52 53 54 2e 20 2a 2f 0a 20 20 20 20 E FIRST. */.
25a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 6e 61 6d 65 const char *name
25b0: 3b 09 09 2f 2a 20 4e 61 6d 65 20 6f 66 20 6f 70 ;../* Name of op
25c0: 74 69 6f 6e 20 74 6f 20 67 65 74 2c 20 6d 61 79 tion to get, may
25d0: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 54 be NULL */. T
25e0: 63 6c 5f 44 53 74 72 69 6e 67 20 2a 76 61 6c 75 cl_DString *valu
25f0: 65 3b 09 09 2f 2a 20 52 65 73 75 6c 74 20 2a 2f e;../* Result */
2600: 0a 7d 3b 0a 0a 2f 2a 0a 20 2a 20 4e 6f 77 20 6a .};../*. * Now j
2610: 6f 69 6e 20 61 6c 6c 20 74 68 65 73 65 20 74 6f oin all these to
2620: 67 65 74 68 65 72 20 69 6e 20 61 20 73 69 6e 67 gether in a sing
2630: 6c 65 20 75 6e 69 6f 6e 20 66 6f 72 20 63 6f 6e le union for con
2640: 76 65 6e 69 65 6e 63 65 2e 0a 20 2a 2f 0a 0a 74 venience.. */..t
2650: 79 70 65 64 65 66 20 75 6e 69 6f 6e 20 46 6f 72 ypedef union For
2660: 77 61 72 64 50 61 72 61 6d 20 7b 0a 20 20 20 20 wardParam {.
2670: 46 6f 72 77 61 72 64 50 61 72 61 6d 42 61 73 65 ForwardParamBase
2680: 20 62 61 73 65 3b 0a 20 20 20 20 73 74 72 75 63 base;. struc
2690: 74 20 46 6f 72 77 61 72 64 50 61 72 61 6d 49 6e t ForwardParamIn
26a0: 70 75 74 20 69 6e 70 75 74 3b 0a 20 20 20 20 73 put input;. s
26b0: 74 72 75 63 74 20 46 6f 72 77 61 72 64 50 61 72 truct ForwardPar
26c0: 61 6d 4f 75 74 70 75 74 20 6f 75 74 70 75 74 3b amOutput output;
26d0: 0a 20 20 20 20 73 74 72 75 63 74 20 46 6f 72 77 . struct Forw
26e0: 61 72 64 50 61 72 61 6d 53 65 65 6b 20 73 65 65 ardParamSeek see
26f0: 6b 3b 0a 20 20 20 20 73 74 72 75 63 74 20 46 6f k;. struct Fo
2700: 72 77 61 72 64 50 61 72 61 6d 57 61 74 63 68 20 rwardParamWatch
2710: 77 61 74 63 68 3b 0a 20 20 20 20 73 74 72 75 63 watch;. struc
2720: 74 20 46 6f 72 77 61 72 64 50 61 72 61 6d 42 6c t ForwardParamBl
2730: 6f 63 6b 20 62 6c 6f 63 6b 3b 0a 20 20 20 20 73 ock block;. s
2740: 74 72 75 63 74 20 46 6f 72 77 61 72 64 50 61 72 truct ForwardPar
2750: 61 6d 53 65 74 4f 70 74 20 73 65 74 4f 70 74 3b amSetOpt setOpt;
2760: 0a 20 20 20 20 73 74 72 75 63 74 20 46 6f 72 77 . struct Forw
2770: 61 72 64 50 61 72 61 6d 47 65 74 4f 70 74 20 67 ardParamGetOpt g
2780: 65 74 4f 70 74 3b 0a 7d 20 46 6f 72 77 61 72 64 etOpt;.} Forward
2790: 50 61 72 61 6d 3b 0a 0a 2f 2a 0a 20 2a 20 46 6f Param;../*. * Fo
27a0: 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f rward declaratio
27b0: 6e 2e 0a 20 2a 2f 0a 0a 74 79 70 65 64 65 66 20 n.. */..typedef
27c0: 73 74 72 75 63 74 20 46 6f 72 77 61 72 64 69 6e struct Forwardin
27d0: 67 52 65 73 75 6c 74 20 46 6f 72 77 61 72 64 69 gResult Forwardi
27e0: 6e 67 52 65 73 75 6c 74 3b 0a 0a 2f 2a 0a 20 2a ngResult;../*. *
27f0: 20 47 65 6e 65 72 61 6c 20 65 76 65 6e 74 20 73 General event s
2800: 74 72 75 63 74 75 72 65 2c 20 77 69 74 68 20 72 tructure, with r
2810: 65 66 65 72 65 6e 63 65 20 74 6f 20 6f 70 65 72 eference to oper
2820: 61 74 69 6f 6e 20 73 70 65 63 69 66 69 63 20 64 ation specific d
2830: 61 74 61 2e 0a 20 2a 2f 0a 0a 74 79 70 65 64 65 ata.. */..typede
2840: 66 20 73 74 72 75 63 74 20 46 6f 72 77 61 72 64 f struct Forward
2850: 69 6e 67 45 76 65 6e 74 20 7b 0a 20 20 20 20 54 ingEvent {. T
2860: 63 6c 5f 45 76 65 6e 74 20 65 76 65 6e 74 3b 09 cl_Event event;.
2870: 09 2f 2a 20 42 61 73 69 63 20 65 76 65 6e 74 20 ./* Basic event
2880: 64 61 74 61 2c 20 68 61 73 20 74 6f 20 62 65 20 data, has to be
2890: 66 69 72 73 74 20 69 74 65 6d 20 2a 2f 0a 20 20 first item */.
28a0: 20 20 46 6f 72 77 61 72 64 69 6e 67 52 65 73 75 ForwardingResu
28b0: 6c 74 20 2a 72 65 73 75 6c 74 50 74 72 3b 0a 20 lt *resultPtr;.
28c0: 20 20 20 46 6f 72 77 61 72 64 65 64 4f 70 65 72 ForwardedOper
28d0: 61 74 69 6f 6e 20 6f 70 3b 09 2f 2a 20 46 6f 72 ation op;./* For
28e0: 77 61 72 64 65 64 20 64 72 69 76 65 72 20 6f 70 warded driver op
28f0: 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 52 eration */. R
2900: 65 66 6c 65 63 74 65 64 43 68 61 6e 6e 65 6c 20 eflectedChannel
2910: 2a 72 63 50 74 72 3b 09 2f 2a 20 43 68 61 6e 6e *rcPtr;./* Chann
2920: 65 6c 20 69 6e 73 74 61 6e 63 65 20 2a 2f 0a 20 el instance */.
2930: 20 20 20 46 6f 72 77 61 72 64 50 61 72 61 6d 20 ForwardParam
2940: 2a 70 61 72 61 6d 3b 09 2f 2a 20 50 61 63 6b 61 *param;./* Packa
2950: 67 65 64 20 61 72 67 75 6d 65 6e 74 73 20 61 6e ged arguments an
2960: 64 20 72 65 74 75 72 6e 20 76 61 6c 75 65 73 2c d return values,
2970: 20 61 0a 09 09 09 09 20 2a 20 46 6f 72 77 61 72 a..... * Forwar
2980: 64 50 61 72 61 6d 20 70 6f 69 6e 74 65 72 2e 20 dParam pointer.
2990: 2a 2f 0a 7d 20 46 6f 72 77 61 72 64 69 6e 67 45 */.} ForwardingE
29a0: 76 65 6e 74 3b 0a 0a 2f 2a 0a 20 2a 20 53 74 72 vent;../*. * Str
29b0: 75 63 74 75 72 65 20 74 6f 20 6d 61 6e 61 67 65 ucture to manage
29c0: 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 the result of t
29d0: 68 65 20 66 6f 72 77 61 72 64 69 6e 67 2e 20 54 he forwarding. T
29e0: 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20 72 his is not the r
29f0: 65 73 75 6c 74 20 6f 66 0a 20 2a 20 74 68 65 20 esult of. * the
2a00: 6f 70 65 72 61 74 69 6f 6e 20 69 74 73 65 6c 66 operation itself
2a10: 2c 20 62 75 74 20 61 62 6f 75 74 20 74 68 65 20 , but about the
2a20: 73 75 63 63 65 73 73 20 6f 66 20 74 68 65 20 66 success of the f
2a30: 6f 72 77 61 72 64 20 65 76 65 6e 74 20 69 74 73 orward event its
2a40: 65 6c 66 2e 0a 20 2a 20 54 68 65 20 65 76 65 6e elf.. * The even
2a50: 74 20 63 61 6e 20 62 65 20 73 75 63 63 65 73 73 t can be success
2a60: 66 75 6c 2c 20 65 76 65 6e 20 69 66 20 74 68 65 ful, even if the
2a70: 20 6f 70 65 72 61 74 69 6f 6e 20 77 68 69 63 68 operation which
2a80: 20 77 61 73 20 66 6f 72 77 61 72 64 65 64 0a 20 was forwarded.
2a90: 2a 20 66 61 69 6c 65 64 2e 20 49 74 20 69 73 20 * failed. It is
2aa0: 61 6c 73 6f 20 74 68 65 72 65 20 74 6f 20 6d 61 also there to ma
2ab0: 6e 61 67 65 20 74 68 65 20 73 79 6e 63 68 72 6f nage the synchro
2ac0: 6e 69 7a 61 74 69 6f 6e 20 62 65 74 77 65 65 6e nization between
2ad0: 20 74 68 65 20 69 6e 76 6f 6c 76 65 64 0a 20 2a the involved. *
2ae0: 20 74 68 72 65 61 64 73 2e 0a 20 2a 2f 0a 0a 73 threads.. */..s
2af0: 74 72 75 63 74 20 46 6f 72 77 61 72 64 69 6e 67 truct Forwarding
2b00: 52 65 73 75 6c 74 20 7b 0a 20 20 20 20 54 63 6c Result {. Tcl
2b10: 5f 54 68 72 65 61 64 49 64 20 73 72 63 3b 09 09 _ThreadId src;..
2b20: 2f 2a 20 4f 72 69 67 69 6e 61 74 69 6e 67 20 74 /* Originating t
2b30: 68 72 65 61 64 2e 20 2a 2f 0a 20 20 20 20 54 63 hread. */. Tc
2b40: 6c 5f 54 68 72 65 61 64 49 64 20 64 73 74 3b 09 l_ThreadId dst;.
2b50: 09 2f 2a 20 54 68 72 65 61 64 20 74 68 65 20 6f ./* Thread the o
2b60: 70 20 77 61 73 20 66 6f 72 77 61 72 64 65 64 20 p was forwarded
2b70: 74 6f 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 to. */. Tcl_I
2b80: 6e 74 65 72 70 20 2a 64 73 74 69 3b 09 09 2f 2a nterp *dsti;../*
2b90: 20 49 6e 74 65 72 70 72 65 74 65 72 20 69 6e 20 Interpreter in
2ba0: 74 68 65 20 74 68 72 65 61 64 20 74 68 65 20 6f the thread the o
2bb0: 70 20 77 61 73 0a 09 09 09 09 20 2a 20 66 6f 72 p was..... * for
2bc0: 77 61 72 64 65 64 20 74 6f 2e 20 2a 2f 0a 20 20 warded to. */.
2bd0: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 4e 6f 74 65 /*. * Note
2be0: 20 72 65 67 61 72 64 69 6e 67 20 27 64 73 74 69 regarding 'dsti
2bf0: 27 20 61 62 6f 76 65 3a 20 49 74 73 20 69 6e 66 ' above: Its inf
2c00: 6f 72 6d 61 74 69 6f 6e 20 69 73 20 61 6c 73 6f ormation is also
2c10: 20 61 76 61 69 6c 61 62 6c 65 20 76 69 61 20 74 available via t
2c20: 68 65 0a 20 20 20 20 20 2a 20 63 68 61 69 6e 20 he. * chain
2c30: 65 76 50 74 72 2d 3e 72 63 50 74 72 2d 3e 69 6e evPtr->rcPtr->in
2c40: 74 65 72 70 2c 20 68 6f 77 65 76 65 72 2c 20 61 terp, however, a
2c50: 73 20 63 61 6e 20 62 65 20 73 65 65 6e 2c 20 74 s can be seen, t
2c60: 77 6f 20 6d 6f 72 65 0a 20 20 20 20 20 2a 20 69 wo more. * i
2c70: 6e 64 69 72 65 63 74 69 6f 6e 73 20 61 72 65 20 ndirections are
2c80: 6e 65 65 64 65 64 20 74 6f 20 72 65 74 72 69 65 needed to retrie
2c90: 76 65 20 69 74 2e 20 41 6e 64 20 74 68 65 20 65 ve it. And the e
2ca0: 76 50 74 72 20 6d 61 79 20 62 65 20 67 6f 6e 65 vPtr may be gone
2cb0: 2c 0a 20 20 20 20 20 2a 20 62 72 65 61 6b 69 6e ,. * breakin
2cc0: 67 20 74 68 65 20 63 68 61 69 6e 2e 0a 20 20 20 g the chain..
2cd0: 20 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 43 6f 6e */. Tcl_Con
2ce0: 64 69 74 69 6f 6e 20 64 6f 6e 65 3b 09 09 2f 2a dition done;../*
2cf0: 20 43 6f 6e 64 69 74 69 6f 6e 20 76 61 72 69 61 Condition varia
2d00: 62 6c 65 20 74 68 65 20 66 6f 72 77 61 72 64 65 ble the forwarde
2d10: 72 20 62 6c 6f 63 6b 73 0a 09 09 09 09 20 2a 20 r blocks..... *
2d20: 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 on. */. int r
2d30: 65 73 75 6c 74 3b 09 09 09 2f 2a 20 54 43 4c 5f esult;.../* TCL_
2d40: 4f 4b 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52 20 OK or TCL_ERROR
2d50: 2a 2f 0a 20 20 20 20 46 6f 72 77 61 72 64 69 6e */. Forwardin
2d60: 67 45 76 65 6e 74 20 2a 65 76 50 74 72 3b 09 2f gEvent *evPtr;./
2d70: 2a 20 45 76 65 6e 74 20 74 68 65 20 72 65 73 75 * Event the resu
2d80: 6c 74 20 62 65 6c 6f 6e 67 73 20 74 6f 2e 20 2a lt belongs to. *
2d90: 2f 0a 20 20 20 20 46 6f 72 77 61 72 64 69 6e 67 /. Forwarding
2da0: 52 65 73 75 6c 74 20 2a 70 72 65 76 50 74 72 2c Result *prevPtr,
2db0: 20 2a 6e 65 78 74 50 74 72 3b 0a 09 09 09 09 2f *nextPtr;...../
2dc0: 2a 20 4c 69 6e 6b 73 20 69 6e 74 6f 20 74 68 65 * Links into the
2dd0: 20 6c 69 73 74 20 6f 66 20 70 65 6e 64 69 6e 67 list of pending
2de0: 20 66 6f 72 77 61 72 64 65 64 0a 09 09 09 09 20 forwarded.....
2df0: 2a 20 72 65 73 75 6c 74 73 2e 20 2a 2f 0a 7d 3b * results. */.};
2e00: 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 ..typedef struct
2e10: 20 54 68 72 65 61 64 53 70 65 63 69 66 69 63 44 ThreadSpecificD
2e20: 61 74 61 20 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 ata {. /*.
2e30: 20 20 2a 20 54 61 62 6c 65 20 6f 66 20 61 6c 6c * Table of all
2e40: 20 72 65 66 6c 65 63 74 65 64 20 63 68 61 6e 6e reflected chann
2e50: 65 6c 73 20 6f 77 6e 65 64 20 62 79 20 74 68 69 els owned by thi
2e60: 73 20 74 68 72 65 61 64 2e 20 54 68 69 73 20 69 s thread. This i
2e70: 73 20 74 68 65 0a 20 20 20 20 20 2a 20 70 65 72 s the. * per
2e80: 2d 74 68 72 65 61 64 20 76 65 72 73 69 6f 6e 20 -thread version
2e90: 6f 66 20 74 68 65 20 70 65 72 2d 69 6e 74 65 72 of the per-inter
2ea0: 70 72 65 74 65 72 20 6d 61 70 2e 0a 20 20 20 20 preter map..
2eb0: 20 2a 2f 0a 0a 20 20 20 20 52 65 66 6c 65 63 74 */.. Reflect
2ec0: 65 64 43 68 61 6e 6e 65 6c 4d 61 70 20 2a 72 63 edChannelMap *rc
2ed0: 6d 50 74 72 3b 0a 7d 20 54 68 72 65 61 64 53 70 mPtr;.} ThreadSp
2ee0: 65 63 69 66 69 63 44 61 74 61 3b 0a 0a 73 74 61 ecificData;..sta
2ef0: 74 69 63 20 54 63 6c 5f 54 68 72 65 61 64 44 61 tic Tcl_ThreadDa
2f00: 74 61 4b 65 79 20 64 61 74 61 4b 65 79 3b 0a 0a taKey dataKey;..
2f10: 2f 2a 0a 20 2a 20 4c 69 73 74 20 6f 66 20 66 6f /*. * List of fo
2f20: 72 77 61 72 64 65 64 20 6f 70 65 72 61 74 69 6f rwarded operatio
2f30: 6e 73 20 77 68 69 63 68 20 68 61 76 65 20 6e 6f ns which have no
2f40: 74 20 63 6f 6d 70 6c 65 74 65 64 20 79 65 74 2c t completed yet,
2f50: 20 70 6c 75 73 20 74 68 65 20 6d 75 74 65 78 0a plus the mutex.
2f60: 20 2a 20 74 6f 20 70 72 6f 74 65 63 74 20 74 68 * to protect th
2f70: 65 20 61 63 63 65 73 73 20 74 6f 20 74 68 69 73 e access to this
2f80: 20 70 72 6f 63 65 73 73 20 67 6c 6f 62 61 6c 20 process global
2f90: 6c 69 73 74 2e 0a 20 2a 2f 0a 0a 73 74 61 74 69 list.. */..stati
2fa0: 63 20 46 6f 72 77 61 72 64 69 6e 67 52 65 73 75 c ForwardingResu
2fb0: 6c 74 20 2a 66 6f 72 77 61 72 64 4c 69 73 74 20 lt *forwardList
2fc0: 3d 20 4e 55 4c 4c 3b 0a 54 43 4c 5f 44 45 43 4c = NULL;.TCL_DECL
2fd0: 41 52 45 5f 4d 55 54 45 58 28 72 63 46 6f 72 77 ARE_MUTEX(rcForw
2fe0: 61 72 64 4d 75 74 65 78 29 0a 0a 2f 2a 0a 20 2a ardMutex)../*. *
2ff0: 20 46 75 6e 63 74 69 6f 6e 20 63 6f 6e 74 61 69 Function contai
3000: 6e 69 6e 67 20 74 68 65 20 67 65 6e 65 72 69 63 ning the generic
3010: 20 63 6f 64 65 20 65 78 65 63 75 74 69 6e 67 20 code executing
3020: 61 20 66 6f 72 77 61 72 64 2c 20 61 6e 64 20 77 a forward, and w
3030: 72 61 70 70 65 72 0a 20 2a 20 6d 61 63 72 6f 73 rapper. * macros
3040: 20 66 6f 72 20 74 68 65 20 61 63 74 75 61 6c 20 for the actual
3050: 6f 70 65 72 61 74 69 6f 6e 73 20 77 65 20 77 69 operations we wi
3060: 73 68 20 74 6f 20 66 6f 72 77 61 72 64 2e 20 55 sh to forward. U
3070: 73 65 73 20 46 6f 72 77 61 72 64 50 72 6f 63 20 ses ForwardProc
3080: 61 73 0a 20 2a 20 74 68 65 20 65 76 65 6e 74 20 as. * the event
3090: 66 75 6e 63 74 69 6f 6e 20 65 78 65 63 75 74 65 function execute
30a0: 64 20 62 79 20 74 68 65 20 74 68 72 65 61 64 20 d by the thread
30b0: 72 65 63 65 69 76 69 6e 67 20 61 20 66 6f 72 77 receiving a forw
30c0: 61 72 64 69 6e 67 20 65 76 65 6e 74 0a 20 2a 20 arding event. *
30d0: 28 77 68 69 63 68 20 65 78 65 63 75 74 65 73 20 (which executes
30e0: 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 the appropriate
30f0: 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 63 6f 6c function and col
3100: 6c 65 63 74 73 20 74 68 65 20 72 65 73 75 6c 74 lects the result
3110: 2c 20 69 66 20 61 6e 79 29 2e 0a 20 2a 0a 20 2a , if any).. *. *
3120: 20 54 68 65 20 45 78 69 74 50 72 6f 63 20 65 6e The ExitProc en
3130: 73 75 72 65 73 20 74 68 61 74 20 74 68 69 6e 67 sures that thing
3140: 73 20 64 6f 20 6e 6f 74 20 64 65 61 64 6c 6f 63 s do not deadloc
3150: 6b 20 77 68 65 6e 20 74 68 65 20 73 65 6e 64 69 k when the sendi
3160: 6e 67 20 74 68 72 65 61 64 0a 20 2a 20 69 6e 76 ng thread. * inv
3170: 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 66 6f 72 olved in the for
3180: 77 61 72 64 69 6e 67 20 65 78 69 74 73 2e 20 49 warding exits. I
3190: 74 20 61 6c 73 6f 20 63 6c 65 61 6e 20 74 68 69 t also clean thi
31a0: 6e 67 73 20 75 70 20 73 6f 20 74 68 61 74 20 77 ngs up so that w
31b0: 65 20 64 6f 6e 27 74 0a 20 2a 20 6c 65 61 6b 20 e don't. * leak
31c0: 72 65 73 6f 75 72 63 65 73 20 77 68 65 6e 20 74 resources when t
31d0: 68 72 65 61 64 73 20 67 6f 20 61 77 61 79 2e 0a hreads go away..
31e0: 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 */..static void
31f0: 09 09 46 6f 72 77 61 72 64 4f 70 54 6f 4f 77 6e ..ForwardOpToOwn
3200: 65 72 54 68 72 65 61 64 28 52 65 66 6c 65 63 74 erThread(Reflect
3210: 65 64 43 68 61 6e 6e 65 6c 20 2a 72 63 50 74 72 edChannel *rcPtr
3220: 2c 0a 09 09 09 20 20 20 20 46 6f 72 77 61 72 64 ,.... Forward
3230: 65 64 4f 70 65 72 61 74 69 6f 6e 20 6f 70 2c 20 edOperation op,
3240: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 61 72 61 const void *para
3250: 6d 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 09 09 m);.static int..
3260: 46 6f 72 77 61 72 64 50 72 6f 63 28 54 63 6c 5f ForwardProc(Tcl_
3270: 45 76 65 6e 74 20 2a 65 76 50 74 72 2c 20 69 6e Event *evPtr, in
3280: 74 20 6d 61 73 6b 29 3b 0a 73 74 61 74 69 63 20 t mask);.static
3290: 76 6f 69 64 09 09 53 72 63 45 78 69 74 50 72 6f void..SrcExitPro
32a0: 63 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 c(ClientData cli
32b0: 65 6e 74 44 61 74 61 29 3b 0a 0a 23 64 65 66 69 entData);..#defi
32c0: 6e 65 20 46 72 65 65 52 65 63 65 69 76 65 64 45 ne FreeReceivedE
32d0: 72 72 6f 72 28 70 29 20 5c 0a 09 69 66 20 28 28 rror(p) \..if ((
32e0: 70 29 2d 3e 62 61 73 65 2e 6d 75 73 74 46 72 65 p)->base.mustFre
32f0: 65 29 20 7b 20 5c 0a 09 20 20 20 20 63 6b 66 72 e) { \.. ckfr
3300: 65 65 28 28 70 29 2d 3e 62 61 73 65 2e 6d 73 67 ee((p)->base.msg
3310: 53 74 72 29 3b 20 5c 0a 09 7d 0a 23 64 65 66 69 Str); \..}.#defi
3320: 6e 65 20 50 61 73 73 52 65 63 65 69 76 65 64 45 ne PassReceivedE
3330: 72 72 6f 72 49 6e 74 65 72 70 28 69 2c 70 29 20 rrorInterp(i,p)
3340: 5c 0a 09 69 66 20 28 28 69 29 20 21 3d 20 4e 55 \..if ((i) != NU
3350: 4c 4c 29 20 7b 20 5c 0a 09 20 20 20 20 54 63 6c LL) { \.. Tcl
3360: 5f 53 65 74 43 68 61 6e 6e 65 6c 45 72 72 6f 72 _SetChannelError
3370: 49 6e 74 65 72 70 28 28 69 29 2c 20 5c 0a 09 09 Interp((i), \...
3380: 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e Tcl_NewStrin
3390: 67 4f 62 6a 28 28 70 29 2d 3e 62 61 73 65 2e 6d gObj((p)->base.m
33a0: 73 67 53 74 72 2c 20 2d 31 29 29 3b 20 5c 0a 09 sgStr, -1)); \..
33b0: 7d 20 5c 0a 09 46 72 65 65 52 65 63 65 69 76 65 } \..FreeReceive
33c0: 64 45 72 72 6f 72 28 70 29 0a 23 64 65 66 69 6e dError(p).#defin
33d0: 65 20 50 61 73 73 52 65 63 65 69 76 65 64 45 72 e PassReceivedEr
33e0: 72 6f 72 28 63 2c 70 29 20 5c 0a 09 54 63 6c 5f ror(c,p) \..Tcl_
33f0: 53 65 74 43 68 61 6e 6e 65 6c 45 72 72 6f 72 28 SetChannelError(
3400: 28 63 29 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 (c), Tcl_NewStri
3410: 6e 67 4f 62 6a 28 28 70 29 2d 3e 62 61 73 65 2e ngObj((p)->base.
3420: 6d 73 67 53 74 72 2c 20 2d 31 29 29 3b 20 5c 0a msgStr, -1)); \.
3430: 09 46 72 65 65 52 65 63 65 69 76 65 64 45 72 72 .FreeReceivedErr
3440: 6f 72 28 70 29 0a 23 64 65 66 69 6e 65 20 46 6f or(p).#define Fo
3450: 72 77 61 72 64 53 65 74 53 74 61 74 69 63 45 72 rwardSetStaticEr
3460: 72 6f 72 28 70 2c 65 6d 73 67 29 20 5c 0a 09 28 ror(p,emsg) \..(
3470: 70 29 2d 3e 62 61 73 65 2e 63 6f 64 65 20 3d 20 p)->base.code =
3480: 54 43 4c 5f 45 52 52 4f 52 3b 20 5c 0a 09 28 70 TCL_ERROR; \..(p
3490: 29 2d 3e 62 61 73 65 2e 6d 75 73 74 46 72 65 65 )->base.mustFree
34a0: 20 3d 20 30 3b 20 5c 0a 09 28 70 29 2d 3e 62 61 = 0; \..(p)->ba
34b0: 73 65 2e 6d 73 67 53 74 72 20 3d 20 28 63 68 61 se.msgStr = (cha
34c0: 72 20 2a 29 20 28 65 6d 73 67 29 0a 23 64 65 66 r *) (emsg).#def
34d0: 69 6e 65 20 46 6f 72 77 61 72 64 53 65 74 44 79 ine ForwardSetDy
34e0: 6e 61 6d 69 63 45 72 72 6f 72 28 70 2c 65 6d 73 namicError(p,ems
34f0: 67 29 20 5c 0a 09 28 70 29 2d 3e 62 61 73 65 2e g) \..(p)->base.
3500: 63 6f 64 65 20 3d 20 54 43 4c 5f 45 52 52 4f 52 code = TCL_ERROR
3510: 3b 20 5c 0a 09 28 70 29 2d 3e 62 61 73 65 2e 6d ; \..(p)->base.m
3520: 75 73 74 46 72 65 65 20 3d 20 31 3b 20 5c 0a 09 ustFree = 1; \..
3530: 28 70 29 2d 3e 62 61 73 65 2e 6d 73 67 53 74 72 (p)->base.msgStr
3540: 20 3d 20 28 63 68 61 72 20 2a 29 20 28 65 6d 73 = (char *) (ems
3550: 67 29 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 09 g)..static void.
3560: 09 46 6f 72 77 61 72 64 53 65 74 4f 62 6a 45 72 .ForwardSetObjEr
3570: 72 6f 72 28 46 6f 72 77 61 72 64 50 61 72 61 6d ror(ForwardParam
3580: 20 2a 70 2c 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 *p, Tcl_Obj *ob
3590: 6a 50 74 72 29 3b 0a 0a 73 74 61 74 69 63 20 52 jPtr);..static R
35a0: 65 66 6c 65 63 74 65 64 43 68 61 6e 6e 65 6c 4d eflectedChannelM
35b0: 61 70 20 2a 09 47 65 74 54 68 72 65 61 64 52 65 ap *.GetThreadRe
35c0: 66 6c 65 63 74 65 64 43 68 61 6e 6e 65 6c 4d 61 flectedChannelMa
35d0: 70 28 76 6f 69 64 29 3b 0a 73 74 61 74 69 63 20 p(void);.static
35e0: 76 6f 69 64 09 09 44 65 6c 65 74 65 54 68 72 65 void..DeleteThre
35f0: 61 64 52 65 66 6c 65 63 74 65 64 43 68 61 6e 6e adReflectedChann
3600: 65 6c 4d 61 70 28 43 6c 69 65 6e 74 44 61 74 61 elMap(ClientData
3610: 20 63 6c 69 65 6e 74 44 61 74 61 29 3b 0a 0a 23 clientData);..#
3620: 65 6e 64 69 66 20 2f 2a 20 54 43 4c 5f 54 48 52 endif /* TCL_THR
3630: 45 41 44 53 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 EADS */..#define
3640: 20 53 65 74 43 68 61 6e 6e 65 6c 45 72 72 6f 72 SetChannelError
3650: 53 74 72 28 63 2c 6d 73 67 53 74 72 29 20 5c 0a Str(c,msgStr) \.
3660: 09 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 45 .Tcl_SetChannelE
3670: 72 72 6f 72 28 28 63 29 2c 20 54 63 6c 5f 4e 65 rror((c), Tcl_Ne
3680: 77 53 74 72 69 6e 67 4f 62 6a 28 28 6d 73 67 53 wStringObj((msgS
3690: 74 72 29 2c 20 2d 31 29 29 0a 0a 73 74 61 74 69 tr), -1))..stati
36a0: 63 20 54 63 6c 5f 4f 62 6a 20 2a 09 4d 61 72 73 c Tcl_Obj *.Mars
36b0: 68 61 6c 6c 45 72 72 6f 72 28 54 63 6c 5f 49 6e hallError(Tcl_In
36c0: 74 65 72 70 20 2a 69 6e 74 65 72 70 29 3b 0a 73 terp *interp);.s
36d0: 74 61 74 69 63 20 76 6f 69 64 09 09 55 6e 6d 61 tatic void..Unma
36e0: 72 73 68 61 6c 6c 45 72 72 6f 72 52 65 73 75 6c rshallErrorResul
36f0: 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e t(Tcl_Interp *in
3700: 74 65 72 70 2c 0a 09 09 09 20 20 20 20 54 63 6c terp,.... Tcl
3710: 5f 4f 62 6a 20 2a 6d 73 67 4f 62 6a 29 3b 0a 0a _Obj *msgObj);..
3720: 2f 2a 0a 20 2a 20 53 74 61 74 69 63 20 66 75 6e /*. * Static fun
3730: 63 74 69 6f 6e 73 20 66 6f 72 20 74 68 69 73 20 ctions for this
3740: 66 69 6c 65 3a 0a 20 2a 2f 0a 0a 73 74 61 74 69 file:. */..stati
3750: 63 20 69 6e 74 09 09 45 6e 63 6f 64 65 45 76 65 c int..EncodeEve
3760: 6e 74 4d 61 73 6b 28 54 63 6c 5f 49 6e 74 65 72 ntMask(Tcl_Inter
3770: 70 20 2a 69 6e 74 65 72 70 2c 0a 09 09 09 20 20 p *interp,....
3780: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6f 62 const char *ob
3790: 6a 4e 61 6d 65 2c 20 54 63 6c 5f 4f 62 6a 20 2a jName, Tcl_Obj *
37a0: 6f 62 6a 2c 20 69 6e 74 20 2a 6d 61 73 6b 29 3b obj, int *mask);
37b0: 0a 73 74 61 74 69 63 20 54 63 6c 5f 4f 62 6a 20 .static Tcl_Obj
37c0: 2a 09 44 65 63 6f 64 65 45 76 65 6e 74 4d 61 73 *.DecodeEventMas
37d0: 6b 28 69 6e 74 20 6d 61 73 6b 29 3b 0a 73 74 61 k(int mask);.sta
37e0: 74 69 63 20 52 65 66 6c 65 63 74 65 64 43 68 61 tic ReflectedCha
37f0: 6e 6e 65 6c 20 2a 20 4e 65 77 52 65 66 6c 65 63 nnel * NewReflec
3800: 74 65 64 43 68 61 6e 6e 65 6c 28 54 63 6c 5f 49 tedChannel(Tcl_I
3810: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 09 nterp *interp,..
3820: 09 09 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 .. Tcl_Obj *c
3830: 6d 64 70 66 78 4f 62 6a 2c 20 69 6e 74 20 6d 6f mdpfxObj, int mo
3840: 64 65 2c 20 54 63 6c 5f 4f 62 6a 20 2a 68 61 6e de, Tcl_Obj *han
3850: 64 6c 65 4f 62 6a 29 3b 0a 73 74 61 74 69 63 20 dleObj);.static
3860: 54 63 6c 5f 4f 62 6a 20 2a 09 4e 65 78 74 48 61 Tcl_Obj *.NextHa
3870: 6e 64 6c 65 28 76 6f 69 64 29 3b 0a 73 74 61 74 ndle(void);.stat
3880: 69 63 20 76 6f 69 64 09 09 46 72 65 65 52 65 66 ic void..FreeRef
3890: 6c 65 63 74 65 64 43 68 61 6e 6e 65 6c 28 52 65 lectedChannel(Re
38a0: 66 6c 65 63 74 65 64 43 68 61 6e 6e 65 6c 20 2a flectedChannel *
38b0: 72 63 50 74 72 29 3b 0a 73 74 61 74 69 63 20 69 rcPtr);.static i
38c0: 6e 74 09 09 49 6e 76 6f 6b 65 54 63 6c 4d 65 74 nt..InvokeTclMet
38d0: 68 6f 64 28 52 65 66 6c 65 63 74 65 64 43 68 61 hod(ReflectedCha
38e0: 6e 6e 65 6c 20 2a 72 63 50 74 72 2c 0a 09 09 09 nnel *rcPtr,....
38f0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a const char *
3900: 6d 65 74 68 6f 64 2c 20 54 63 6c 5f 4f 62 6a 20 method, Tcl_Obj
3910: 2a 61 72 67 4f 6e 65 4f 62 6a 2c 0a 09 09 09 20 *argOneObj,....
3920: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 61 72 67 54 Tcl_Obj *argT
3930: 77 6f 4f 62 6a 2c 20 54 63 6c 5f 4f 62 6a 20 2a woObj, Tcl_Obj *
3940: 2a 72 65 73 75 6c 74 4f 62 6a 50 74 72 29 3b 0a *resultObjPtr);.
3950: 0a 73 74 61 74 69 63 20 52 65 66 6c 65 63 74 65 .static Reflecte
3960: 64 43 68 61 6e 6e 65 6c 4d 61 70 20 2a 09 47 65 dChannelMap *.Ge
3970: 74 52 65 66 6c 65 63 74 65 64 43 68 61 6e 6e 65 tReflectedChanne
3980: 6c 4d 61 70 28 54 63 6c 5f 49 6e 74 65 72 70 20 lMap(Tcl_Interp
3990: 2a 69 6e 74 65 72 70 29 3b 0a 73 74 61 74 69 63 *interp);.static
39a0: 20 76 6f 69 64 09 09 44 65 6c 65 74 65 52 65 66 void..DeleteRef
39b0: 6c 65 63 74 65 64 43 68 61 6e 6e 65 6c 4d 61 70 lectedChannelMap
39c0: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 (ClientData clie
39d0: 6e 74 44 61 74 61 2c 0a 09 09 09 20 20 20 20 54 ntData,.... T
39e0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
39f0: 70 29 3b 0a 0a 2f 2a 0a 20 2a 20 47 6c 6f 62 61 p);../*. * Globa
3a00: 6c 20 63 6f 6e 73 74 61 6e 74 20 73 74 72 69 6e l constant strin
3a10: 67 73 20 28 6d 65 73 73 61 67 65 73 29 2e 20 3d gs (messages). =
3a20: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3a30: 3d 0a 20 2a 20 54 68 65 73 65 20 73 74 72 69 6e =. * These strin
3a40: 67 20 61 72 65 20 75 73 65 64 20 64 69 72 65 63 g are used direc
3a50: 74 6c 79 20 61 73 20 62 79 70 61 73 73 20 65 72 tly as bypass er
3a60: 72 6f 72 73 2c 20 74 68 75 73 20 74 68 65 79 20 rors, thus they
3a70: 68 61 76 65 20 74 6f 20 62 65 20 76 61 6c 69 64 have to be valid
3a80: 0a 20 2a 20 54 63 6c 20 6c 69 73 74 73 20 77 68 . * Tcl lists wh
3a90: 65 72 65 20 74 68 65 20 6c 61 73 74 20 65 6c 65 ere the last ele
3aa0: 6d 65 6e 74 20 69 73 20 74 68 65 20 6d 65 73 73 ment is the mess
3ab0: 61 67 65 20 69 74 73 65 6c 66 2e 20 48 65 6e 63 age itself. Henc
3ac0: 65 20 74 68 65 0a 20 2a 20 6c 69 73 74 2d 71 75 e the. * list-qu
3ad0: 6f 74 69 6e 67 20 74 6f 20 6b 65 65 70 20 74 68 oting to keep th
3ae0: 65 20 77 6f 72 64 73 20 6f 66 20 74 68 65 20 6d e words of the m
3af0: 65 73 73 61 67 65 20 74 6f 67 65 74 68 65 72 2e essage together.
3b00: 20 53 65 65 20 61 6c 73 6f 20 5b 78 5d 2e 0a 20 See also [x]..
3b10: 2a 2f 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 */..static const
3b20: 20 63 68 61 72 20 2a 6d 73 67 5f 72 65 61 64 5f char *msg_read_
3b30: 75 6e 73 75 70 20 3d 20 22 7b 72 65 61 64 20 6e unsup = "{read n
3b40: 6f 74 20 73 75 70 70 6f 72 74 65 64 20 62 79 20 ot supported by
3b50: 54 63 6c 20 64 72 69 76 65 72 7d 22 3b 0a 73 74 Tcl driver}";.st
3b60: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 atic const char
3b70: 2a 6d 73 67 5f 72 65 61 64 5f 74 6f 6f 6d 75 63 *msg_read_toomuc
3b80: 68 20 3d 20 22 7b 72 65 61 64 20 64 65 6c 69 76 h = "{read deliv
3b90: 65 72 65 64 20 6d 6f 72 65 20 74 68 61 6e 20 72 ered more than r
3ba0: 65 71 75 65 73 74 65 64 7d 22 3b 0a 73 74 61 74 equested}";.stat
3bb0: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6d ic const char *m
3bc0: 73 67 5f 77 72 69 74 65 5f 75 6e 73 75 70 20 3d sg_write_unsup =
3bd0: 20 22 7b 77 72 69 74 65 20 6e 6f 74 20 73 75 70 "{write not sup
3be0: 70 6f 72 74 65 64 20 62 79 20 54 63 6c 20 64 72 ported by Tcl dr
3bf0: 69 76 65 72 7d 22 3b 0a 73 74 61 74 69 63 20 63 iver}";.static c
3c00: 6f 6e 73 74 20 63 68 61 72 20 2a 6d 73 67 5f 77 onst char *msg_w
3c10: 72 69 74 65 5f 74 6f 6f 6d 75 63 68 20 3d 20 22 rite_toomuch = "
3c20: 7b 77 72 69 74 65 20 77 72 6f 74 65 20 6d 6f 72 {write wrote mor
3c30: 65 20 74 68 61 6e 20 72 65 71 75 65 73 74 65 64 e than requested
3c40: 7d 22 3b 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 }";.static const
3c50: 20 63 68 61 72 20 2a 6d 73 67 5f 77 72 69 74 65 char *msg_write
3c60: 5f 6e 6f 74 68 69 6e 67 20 3d 20 22 7b 77 72 69 _nothing = "{wri
3c70: 74 65 20 77 72 6f 74 65 20 6e 6f 74 68 69 6e 67 te wrote nothing
3c80: 7d 22 3b 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 }";.static const
3c90: 20 63 68 61 72 20 2a 6d 73 67 5f 73 65 65 6b 5f char *msg_seek_
3ca0: 62 65 66 6f 72 65 73 74 61 72 74 20 3d 20 22 7b beforestart = "{
3cb0: 54 72 69 65 64 20 74 6f 20 73 65 65 6b 20 62 65 Tried to seek be
3cc0: 66 6f 72 65 20 6f 72 69 67 69 6e 7d 22 3b 0a 23 fore origin}";.#
3cd0: 69 66 64 65 66 20 54 43 4c 5f 54 48 52 45 41 44 ifdef TCL_THREAD
3ce0: 53 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 S.static const c
3cf0: 68 61 72 20 2a 6d 73 67 5f 73 65 6e 64 5f 6f 72 har *msg_send_or
3d00: 69 67 69 6e 6c 6f 73 74 20 3d 20 22 7b 43 68 61 iginlost = "{Cha
3d10: 6e 6e 65 6c 20 74 68 72 65 61 64 20 6c 6f 73 74 nnel thread lost
3d20: 7d 22 3b 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 }";.static const
3d30: 20 63 68 61 72 20 2a 6d 73 67 5f 73 65 6e 64 5f char *msg_send_
3d40: 64 73 74 6c 6f 73 74 20 20 20 20 3d 20 22 7b 4f dstlost = "{O
3d50: 77 6e 65 72 20 6c 6f 73 74 7d 22 3b 0a 23 65 6e wner lost}";.#en
3d60: 64 69 66 20 2f 2a 20 54 43 4c 5f 54 48 52 45 41 dif /* TCL_THREA
3d70: 44 53 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e DS */.static con
3d80: 73 74 20 63 68 61 72 20 2a 6d 73 67 5f 64 73 74 st char *msg_dst
3d90: 6c 6f 73 74 20 20 20 20 3d 20 22 2d 63 6f 64 65 lost = "-code
3da0: 20 31 20 2d 6c 65 76 65 6c 20 30 20 2d 65 72 72 1 -level 0 -err
3db0: 6f 72 63 6f 64 65 20 4e 4f 4e 45 20 2d 65 72 72 orcode NONE -err
3dc0: 6f 72 69 6e 66 6f 20 7b 7d 20 2d 65 72 72 6f 72 orinfo {} -error
3dd0: 6c 69 6e 65 20 31 20 7b 4f 77 6e 65 72 20 6c 6f line 1 {Owner lo
3de0: 73 74 7d 22 3b 0a 0c 0a 2f 2a 0a 20 2a 20 4d 61 st}";.../*. * Ma
3df0: 69 6e 20 6d 65 74 68 6f 64 73 20 74 6f 20 70 6c in methods to pl
3e00: 75 67 20 69 6e 74 6f 20 74 68 65 20 27 63 68 61 ug into the 'cha
3e10: 6e 27 20 65 6e 73 65 6d 62 6c 65 27 2e 20 3d 3d n' ensemble'. ==
3e20: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3e30: 0a 20 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d . */../*. *-----
3e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3e80: 2d 0a 20 2a 0a 20 2a 20 54 63 6c 43 68 61 6e 43 -. *. * TclChanC
3e90: 72 65 61 74 65 4f 62 6a 43 6d 64 20 2d 2d 0a 20 reateObjCmd --.
3ea0: 2a 0a 20 2a 09 54 68 69 73 20 66 75 6e 63 74 69 *. *.This functi
3eb0: 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f on is invoked to
3ec0: 20 70 72 6f 63 65 73 73 20 74 68 65 20 22 63 68 process the "ch
3ed0: 61 6e 20 63 72 65 61 74 65 22 20 54 63 6c 20 63 an create" Tcl c
3ee0: 6f 6d 6d 61 6e 64 2e 0a 20 2a 09 53 65 65 20 74 ommand.. *.See t
3ef0: 68 65 20 75 73 65 72 20 64 6f 63 75 6d 65 6e 74 he user document
3f00: 61 74 69 6f 6e 20 66 6f 72 20 64 65 74 61 69 6c ation for detail
3f10: 73 20 6f 6e 20 77 68 61 74 20 69 74 20 64 6f 65 s on what it doe
3f20: 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 s.. *. * Results
3f30: 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 :. *.A standard
3f40: 54 63 6c 20 72 65 73 75 6c 74 2e 20 54 68 65 20 Tcl result. The
3f50: 68 61 6e 64 6c 65 20 6f 66 20 74 68 65 20 6e 65 handle of the ne
3f60: 77 20 63 68 61 6e 6e 65 6c 20 69 73 20 70 6c 61 w channel is pla
3f70: 63 65 64 20 69 6e 20 74 68 65 0a 20 2a 09 69 6e ced in the. *.in
3f80: 74 65 72 70 20 72 65 73 75 6c 74 2e 0a 20 2a 0a terp result.. *.
3f90: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
3fa0: 0a 20 2a 09 43 72 65 61 74 65 73 20 61 20 6e 65 . *.Creates a ne
3fb0: 77 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a w channel.. *. *
3fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4000: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a ------. */..int.
4010: 54 63 6c 43 68 61 6e 43 72 65 61 74 65 4f 62 6a TclChanCreateObj
4020: 43 6d 64 28 0a 20 20 20 20 43 6c 69 65 6e 74 44 Cmd(. ClientD
4030: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a ata clientData,.
4040: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a Tcl_Interp *
4050: 69 6e 74 65 72 70 2c 0a 20 20 20 20 69 6e 74 20 interp,. int
4060: 6f 62 6a 63 2c 0a 20 20 20 20 54 63 6c 5f 4f 62 objc,. Tcl_Ob
4070: 6a 20 2a 63 6f 6e 73 74 20 2a 6f 62 6a 76 29 0a j *const *objv).
4080: 7b 0a 20 20 20 20 52 65 66 6c 65 63 74 65 64 43 {. ReflectedC
4090: 68 61 6e 6e 65 6c 20 2a 72 63 50 74 72 3b 09 2f hannel *rcPtr;./
40a0: 2a 20 49 6e 73 74 61 6e 63 65 20 64 61 74 61 20 * Instance data
40b0: 6f 66 20 74 68 65 20 6e 65 77 20 63 68 61 6e 6e of the new chann
40c0: 65 6c 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 el */. Tcl_Ob
40d0: 6a 20 2a 72 63 49 64 3b 09 09 2f 2a 20 48 61 6e j *rcId;../* Han
40e0: 64 6c 65 20 6f 66 20 74 68 65 20 6e 65 77 20 63 dle of the new c
40f0: 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 69 6e hannel */. in
4100: 74 20 6d 6f 64 65 3b 09 09 09 2f 2a 20 52 2f 57 t mode;.../* R/W
4110: 20 6d 6f 64 65 20 6f 66 20 6e 65 77 20 63 68 61 mode of new cha
4120: 6e 6e 65 6c 2e 20 48 61 73 20 74 6f 20 6d 61 74 nnel. Has to mat
4130: 63 68 0a 09 09 09 09 20 2a 20 61 62 69 6c 69 74 ch..... * abilit
4140: 69 65 73 20 6f 66 20 68 61 6e 64 6c 65 72 20 63 ies of handler c
4150: 6f 6d 6d 61 6e 64 73 20 2a 2f 0a 20 20 20 20 54 ommands */. T
4160: 63 6c 5f 4f 62 6a 20 2a 63 6d 64 4f 62 6a 3b 09 cl_Obj *cmdObj;.
4170: 09 2f 2a 20 43 6f 6d 6d 61 6e 64 20 70 72 65 66 ./* Command pref
4180: 69 78 2c 20 6c 69 73 74 20 6f 66 20 77 6f 72 64 ix, list of word
4190: 73 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a s */. Tcl_Obj
41a0: 20 2a 63 6d 64 4e 61 6d 65 4f 62 6a 3b 09 2f 2a *cmdNameObj;./*
41b0: 20 43 6f 6d 6d 61 6e 64 20 6e 61 6d 65 20 2a 2f Command name */
41c0: 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c . Tcl_Channel
41d0: 20 63 68 61 6e 3b 09 09 2f 2a 20 54 6f 6b 65 6e chan;../* Token
41e0: 20 66 6f 72 20 74 68 65 20 6e 65 77 20 63 68 61 for the new cha
41f0: 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 54 63 6c 5f nnel */. Tcl_
4200: 4f 62 6a 20 2a 6d 6f 64 65 4f 62 6a 3b 09 09 2f Obj *modeObj;../
4210: 2a 20 6d 6f 64 65 20 69 6e 20 6f 62 6a 20 66 6f * mode in obj fo
4220: 72 6d 20 66 6f 72 20 6d 65 74 68 6f 64 20 63 61 rm for method ca
4230: 6c 6c 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 69 ll */. int li
4240: 73 74 63 3b 09 09 09 2f 2a 20 52 65 73 75 6c 74 stc;.../* Result
4250: 20 6f 66 20 27 69 6e 69 74 69 61 6c 69 7a 65 27 of 'initialize'
4260: 2c 20 61 6e 64 20 6f 66 20 2a 2f 0a 20 20 20 20 , and of */.
4270: 54 63 6c 5f 4f 62 6a 20 2a 2a 6c 69 73 74 76 3b Tcl_Obj **listv;
4280: 09 09 2f 2a 20 69 74 73 20 73 75 62 6c 69 73 74 ../* its sublist
4290: 20 69 6e 20 74 68 65 20 32 6e 64 20 65 6c 65 6d in the 2nd elem
42a0: 65 6e 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d ent */. int m
42b0: 65 74 68 49 6e 64 65 78 3b 09 09 2f 2a 20 45 6e ethIndex;../* En
42c0: 63 6f 64 65 64 20 6d 65 74 68 6f 64 20 6e 61 6d coded method nam
42d0: 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 73 e */. int res
42e0: 75 6c 74 3b 09 09 09 2f 2a 20 52 65 73 75 6c 74 ult;.../* Result
42f0: 20 63 6f 64 65 20 66 6f 72 20 27 69 6e 69 74 69 code for 'initi
4300: 61 6c 69 7a 65 27 20 2a 2f 0a 20 20 20 20 54 63 alize' */. Tc
4310: 6c 5f 4f 62 6a 20 2a 72 65 73 4f 62 6a 3b 09 09 l_Obj *resObj;..
4320: 2f 2a 20 52 65 73 75 6c 74 20 64 61 74 61 20 66 /* Result data f
4330: 6f 72 20 27 69 6e 69 74 69 61 6c 69 7a 65 27 20 or 'initialize'
4340: 2a 2f 0a 20 20 20 20 69 6e 74 20 6d 65 74 68 6f */. int metho
4350: 64 73 3b 09 09 2f 2a 20 42 69 74 6d 61 73 6b 20 ds;../* Bitmask
4360: 66 6f 72 20 73 75 70 70 6f 72 74 65 64 20 6d 65 for supported me
4370: 74 68 6f 64 73 2e 20 2a 2f 0a 20 20 20 20 43 68 thods. */. Ch
4380: 61 6e 6e 65 6c 20 2a 63 68 61 6e 50 74 72 3b 09 annel *chanPtr;.
4390: 09 2f 2a 20 27 63 68 61 6e 27 20 72 65 73 6f 6c ./* 'chan' resol
43a0: 76 65 64 20 74 6f 20 69 6e 74 65 72 6e 61 6c 20 ved to internal
43b0: 73 74 72 75 63 74 2e 20 2a 2f 0a 20 20 20 20 54 struct. */. T
43c0: 63 6c 5f 4f 62 6a 20 2a 65 72 72 3b 09 09 2f 2a cl_Obj *err;../*
43d0: 20 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20 2a Error message *
43e0: 2f 0a 20 20 20 20 52 65 66 6c 65 63 74 65 64 43 /. ReflectedC
43f0: 68 61 6e 6e 65 6c 4d 61 70 20 2a 72 63 6d 50 74 hannelMap *rcmPt
4400: 72 3b 0a 09 09 09 09 2f 2a 20 4d 61 70 20 6f 66 r;...../* Map of
4410: 20 72 65 66 6c 65 63 74 65 64 20 63 68 61 6e 6e reflected chann
4420: 65 6c 73 20 77 69 74 68 20 68 61 6e 64 6c 65 72 els with handler
4430: 73 20 69 6e 0a 09 09 09 09 20 2a 20 74 68 69 73 s in..... * this
4440: 20 69 6e 74 65 72 70 2e 20 2a 2f 0a 20 20 20 20 interp. */.
4450: 54 63 6c 5f 48 61 73 68 45 6e 74 72 79 20 2a 68 Tcl_HashEntry *h
4460: 50 74 72 3b 09 2f 2a 20 45 6e 74 72 79 20 69 6e Ptr;./* Entry in
4470: 20 74 68 65 20 61 62 6f 76 65 20 6d 61 70 20 2a the above map *
4480: 2f 0a 20 20 20 20 69 6e 74 20 69 73 4e 65 77 3b /. int isNew;
4490: 09 09 09 2f 2a 20 50 6c 61 63 65 68 6f 6c 64 65 .../* Placeholde
44a0: 72 2e 20 2a 2f 0a 0a 20 20 20 20 2f 2a 0a 20 20 r. */.. /*.
44b0: 20 20 20 2a 20 53 79 6e 74 61 78 3a 20 20 20 63 * Syntax: c
44c0: 68 61 6e 20 63 72 65 61 74 65 20 4d 4f 44 45 20 han create MODE
44d0: 43 4d 44 50 52 45 46 49 58 0a 20 20 20 20 20 2a CMDPREFIX. *
44e0: 20 20 20 20 20 20 20 20 20 20 20 5b 30 5d 20 20 [0]
44f0: 5b 31 5d 20 20 20 20 5b 32 5d 20 20 5b 33 5d 0a [1] [2] [3].
4500: 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 41 63 *. * Ac
4510: 74 75 61 6c 6c 79 3a 20 72 43 72 65 61 74 65 20 tually: rCreate
4520: 4d 4f 44 45 20 43 4d 44 50 52 45 46 49 58 0a 20 MODE CMDPREFIX.
4530: 20 20 20 20 2a 20 20 20 20 20 20 20 20 20 20 20 *
4540: 5b 30 5d 20 20 20 20 20 5b 31 5d 20 20 5b 32 5d [0] [1] [2]
4550: 0a 20 20 20 20 20 2a 2f 0a 0a 23 64 65 66 69 6e . */..#defin
4560: 65 20 4d 4f 44 45 09 28 31 29 0a 23 64 65 66 69 e MODE.(1).#defi
4570: 6e 65 20 43 4d 44 09 28 32 29 0a 0a 20 20 20 20 ne CMD.(2)..
4580: 2f 2a 0a 20 20 20 20 20 2a 20 4e 75 6d 62 65 72 /*. * Number
4590: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e 2e 2e of arguments...
45a0: 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66 . */.. if
45b0: 20 28 6f 62 6a 63 20 21 3d 20 33 29 20 7b 0a 09 (objc != 3) {..
45c0: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 Tcl_WrongNumArgs
45d0: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 (interp, 1, objv
45e0: 2c 20 22 6d 6f 64 65 20 63 6d 64 70 72 65 66 69 , "mode cmdprefi
45f0: 78 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c x");..return TCL
4600: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
4610: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 46 69 72 /*. * Fir
4620: 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 st argument is a
4630: 20 6c 69 73 74 20 6f 66 20 6d 6f 64 65 73 2e 20 list of modes.
4640: 41 6c 6c 6f 77 65 64 20 65 6e 74 72 69 65 73 20 Allowed entries
4650: 61 72 65 20 22 72 65 61 64 22 2c 20 22 77 72 69 are "read", "wri
4660: 74 65 22 2e 0a 20 20 20 20 20 2a 20 45 78 70 65 te".. * Expe
4670: 63 74 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 ct at least one
4680: 6c 69 73 74 20 65 6c 65 6d 65 6e 74 2e 20 41 62 list element. Ab
4690: 62 72 65 76 69 61 74 69 6f 6e 73 20 61 72 65 20 breviations are
46a0: 6f 6b 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 ok.. */..
46b0: 20 6d 6f 64 65 4f 62 6a 20 3d 20 6f 62 6a 76 5b modeObj = objv[
46c0: 4d 4f 44 45 5d 3b 0a 20 20 20 20 69 66 20 28 45 MODE];. if (E
46d0: 6e 63 6f 64 65 45 76 65 6e 74 4d 61 73 6b 28 69 ncodeEventMask(i
46e0: 6e 74 65 72 70 2c 20 22 6d 6f 64 65 22 2c 20 6f nterp, "mode", o
46f0: 62 6a 76 5b 4d 4f 44 45 5d 2c 20 26 6d 6f 64 65 bjv[MODE], &mode
4700: 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 ) != TCL_OK) {..
4710: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
4720: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a ;. }.. /*.
4730: 20 20 20 20 20 2a 20 53 65 63 6f 6e 64 20 61 72 * Second ar
4740: 67 75 6d 65 6e 74 20 69 73 20 63 6f 6d 6d 61 6e gument is comman
4750: 64 20 70 72 65 66 69 78 2c 20 69 2e 65 2e 20 6c d prefix, i.e. l
4760: 69 73 74 20 6f 66 20 77 6f 72 64 73 2c 20 66 69 ist of words, fi
4770: 72 73 74 20 77 6f 72 64 20 69 73 0a 20 20 20 20 rst word is.
4780: 20 2a 20 6e 61 6d 65 20 6f 66 20 68 61 6e 64 6c * name of handl
4790: 65 72 20 63 6f 6d 6d 61 6e 64 2c 20 6f 74 68 65 er command, othe
47a0: 72 20 77 6f 72 64 73 20 61 72 65 20 66 69 78 65 r words are fixe
47b0: 64 20 61 72 67 75 6d 65 6e 74 73 2e 20 52 75 6e d arguments. Run
47c0: 20 74 68 65 0a 20 20 20 20 20 2a 20 27 69 6e 69 the. * 'ini
47d0: 74 69 61 6c 69 7a 65 27 20 6d 65 74 68 6f 64 20 tialize' method
47e0: 74 6f 20 67 65 74 20 74 68 65 20 6c 69 73 74 20 to get the list
47f0: 6f 66 20 73 75 70 70 6f 72 74 65 64 20 6d 65 74 of supported met
4800: 68 6f 64 73 2e 20 56 61 6c 69 64 61 74 65 0a 20 hods. Validate.
4810: 20 20 20 20 2a 20 74 68 69 73 2e 0a 20 20 20 20 * this..
4820: 20 2a 2f 0a 0a 20 20 20 20 63 6d 64 4f 62 6a 20 */.. cmdObj
4830: 3d 20 6f 62 6a 76 5b 43 4d 44 5d 3b 0a 0a 20 20 = objv[CMD];..
4840: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 42 61 73 69 /*. * Basi
4850: 63 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 c check that the
4860: 20 63 6f 6d 6d 61 6e 64 20 70 72 65 66 69 78 20 command prefix
4870: 74 72 75 6c 79 20 69 73 20 61 20 6c 69 73 74 2e truly is a list.
4880: 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66 . */.. if
4890: 20 28 54 63 6c 5f 4c 69 73 74 4f 62 6a 49 6e 64 (Tcl_ListObjInd
48a0: 65 78 28 69 6e 74 65 72 70 2c 20 63 6d 64 4f 62 ex(interp, cmdOb
48b0: 6a 2c 20 30 2c 20 26 63 6d 64 4e 61 6d 65 4f 62 j, 0, &cmdNameOb
48c0: 6a 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a j) != TCL_OK) {.
48d0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
48e0: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a R;. }.. /*
48f0: 0a 20 20 20 20 20 2a 20 4e 6f 77 20 63 72 65 61 . * Now crea
4900: 74 65 20 74 68 65 20 63 68 61 6e 6e 65 6c 2e 0a te the channel..
4910: 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 72 63 49 */.. rcI
4920: 64 20 3d 20 4e 65 78 74 48 61 6e 64 6c 65 28 29 d = NextHandle()
4930: 3b 0a 20 20 20 20 72 63 50 74 72 20 3d 20 4e 65 ;. rcPtr = Ne
4940: 77 52 65 66 6c 65 63 74 65 64 43 68 61 6e 6e 65 wReflectedChanne
4950: 6c 28 69 6e 74 65 72 70 2c 20 63 6d 64 4f 62 6a l(interp, cmdObj
4960: 2c 20 6d 6f 64 65 2c 20 72 63 49 64 29 3b 0a 20 , mode, rcId);.
4970: 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 43 72 chan = Tcl_Cr
4980: 65 61 74 65 43 68 61 6e 6e 65 6c 28 26 74 63 6c eateChannel(&tcl
4990: 52 43 68 61 6e 6e 65 6c 54 79 70 65 2c 20 54 63 RChannelType, Tc
49a0: 6c 47 65 74 53 74 72 69 6e 67 28 72 63 49 64 29 lGetString(rcId)
49b0: 2c 20 72 63 50 74 72 2c 0a 09 20 20 20 20 6d 6f , rcPtr,.. mo
49c0: 64 65 29 3b 0a 20 20 20 20 72 63 50 74 72 2d 3e de);. rcPtr->
49d0: 63 68 61 6e 20 3d 20 63 68 61 6e 3b 0a 20 20 20 chan = chan;.
49e0: 20 63 68 61 6e 50 74 72 20 3d 20 28 43 68 61 6e chanPtr = (Chan
49f0: 6e 65 6c 20 2a 29 20 63 68 61 6e 3b 0a 0a 20 20 nel *) chan;..
4a00: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 49 6e 76 6f /*. * Invo
4a10: 6b 65 20 27 69 6e 69 74 69 61 6c 69 7a 65 27 20 ke 'initialize'
4a20: 61 6e 64 20 76 61 6c 69 64 61 74 65 20 74 68 61 and validate tha
4a30: 74 20 74 68 65 20 68 61 6e 64 6c 65 72 20 69 73 t the handler is
4a40: 20 70 72 65 73 65 6e 74 20 61 6e 64 20 6f 6b 2e present and ok.
4a50: 0a 20 20 20 20 20 2a 20 53 71 75 61 73 68 20 74 . * Squash t
4a60: 68 65 20 63 68 61 6e 6e 65 6c 20 69 66 20 6e 6f he channel if no
4a70: 74 2e 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 2a t.. *. *
4a80: 20 4e 6f 74 65 3a 20 54 68 65 20 63 6f 6e 76 65 Note: The conve
4a90: 72 73 69 6f 6e 20 6f 66 20 27 6d 6f 64 65 27 20 rsion of 'mode'
4aa0: 62 61 63 6b 20 69 6e 74 6f 20 61 20 54 63 6c 5f back into a Tcl_
4ab0: 4f 62 6a 20 65 6e 73 75 72 65 73 20 74 68 61 74 Obj ensures that
4ac0: 0a 20 20 20 20 20 2a 20 27 69 6e 69 74 69 61 6c . * 'initial
4ad0: 69 7a 65 27 20 69 73 20 69 6e 76 6f 6b 65 64 20 ize' is invoked
4ae0: 77 69 74 68 20 63 61 6e 6f 6e 69 63 61 6c 20 6d with canonical m
4af0: 6f 64 65 20 6e 61 6d 65 73 2c 20 61 6e 64 20 6e ode names, and n
4b00: 6f 0a 20 20 20 20 20 2a 20 61 62 62 72 65 76 69 o. * abbrevi
4b10: 61 74 69 6f 6e 73 2e 20 55 73 69 6e 67 20 6d 6f ations. Using mo
4b20: 64 65 4f 62 6a 20 64 69 72 65 63 74 6c 79 20 63 deObj directly c
4b30: 6f 75 6c 64 20 66 65 65 64 20 61 62 62 72 65 76 ould feed abbrev
4b40: 69 61 74 69 6f 6e 73 20 69 6e 74 6f 20 74 68 65 iations into the
4b50: 0a 20 20 20 20 20 2a 20 68 61 6e 64 6c 65 72 2c . * handler,
4b60: 20 61 6e 64 20 74 68 65 20 68 61 6e 64 6c 65 72 and the handler
4b70: 20 69 73 20 6e 6f 74 20 73 70 65 63 69 66 69 65 is not specifie
4b80: 64 20 74 6f 20 68 61 6e 64 6c 65 20 73 75 63 68 d to handle such
4b90: 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 6d .. */.. m
4ba0: 6f 64 65 4f 62 6a 20 3d 20 44 65 63 6f 64 65 45 odeObj = DecodeE
4bb0: 76 65 6e 74 4d 61 73 6b 28 6d 6f 64 65 29 3b 0a ventMask(mode);.
4bc0: 20 20 20 20 72 65 73 75 6c 74 20 3d 20 49 6e 76 result = Inv
4bd0: 6f 6b 65 54 63 6c 4d 65 74 68 6f 64 28 72 63 50 okeTclMethod(rcP
4be0: 74 72 2c 20 22 69 6e 69 74 69 61 6c 69 7a 65 22 tr, "initialize"
4bf0: 2c 20 6d 6f 64 65 4f 62 6a 2c 20 4e 55 4c 4c 2c , modeObj, NULL,
4c00: 20 26 72 65 73 4f 62 6a 29 3b 0a 20 20 20 20 54 &resObj);. T
4c10: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 cl_DecrRefCount(
4c20: 6d 6f 64 65 4f 62 6a 29 3b 0a 20 20 20 20 69 66 modeObj);. if
4c30: 20 28 72 65 73 75 6c 74 20 21 3d 20 54 43 4c 5f (result != TCL_
4c40: 4f 4b 29 20 7b 0a 09 55 6e 6d 61 72 73 68 61 6c OK) {..Unmarshal
4c50: 6c 45 72 72 6f 72 52 65 73 75 6c 74 28 69 6e 74 lErrorResult(int
4c60: 65 72 70 2c 20 72 65 73 4f 62 6a 29 3b 0a 09 54 erp, resObj);..T
4c70: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 cl_DecrRefCount(
4c80: 72 65 73 4f 62 6a 29 3b 09 2f 2a 20 52 65 6d 6f resObj);./* Remo
4c90: 76 65 20 72 65 66 65 72 65 6e 63 65 20 68 65 6c ve reference hel
4ca0: 64 20 66 72 6f 6d 20 69 6e 76 6f 6b 65 20 2a 2f d from invoke */
4cb0: 0a 09 67 6f 74 6f 20 65 72 72 6f 72 3b 0a 20 20 ..goto error;.
4cc0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 }.. /*.
4cd0: 20 2a 20 56 65 72 69 66 79 20 74 68 65 20 72 65 * Verify the re
4ce0: 73 75 6c 74 2e 0a 20 20 20 20 20 2a 20 2d 20 4c sult.. * - L
4cf0: 69 73 74 2c 20 6f 66 20 6d 65 74 68 6f 64 20 6e ist, of method n
4d00: 61 6d 65 73 2e 20 43 6f 6e 76 65 72 74 20 74 6f ames. Convert to
4d10: 20 6d 61 73 6b 2e 0a 20 20 20 20 20 2a 20 20 20 mask.. *
4d20: 43 68 65 63 6b 20 66 6f 72 20 6e 6f 6e 2d 6f 70 Check for non-op
4d30: 74 69 6f 6e 61 6c 73 20 74 68 72 6f 75 67 68 20 tionals through
4d40: 74 68 65 20 6d 61 73 6b 2e 0a 20 20 20 20 20 2a the mask.. *
4d50: 20 20 20 43 6f 6d 70 61 72 65 20 6f 70 65 6e 20 Compare open
4d60: 6d 6f 64 65 20 61 67 61 69 6e 73 74 20 6f 70 74 mode against opt
4d70: 69 6f 6e 61 6c 20 72 2f 77 2e 0a 20 20 20 20 20 ional r/w..
4d80: 2a 2f 0a 0a 20 20 20 20 69 66 20 28 54 63 6c 5f */.. if (Tcl_
4d90: 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e ListObjGetElemen
4da0: 74 73 28 4e 55 4c 4c 2c 20 72 65 73 4f 62 6a 2c ts(NULL, resObj,
4db0: 20 26 6c 69 73 74 63 2c 20 26 6c 69 73 74 76 29 &listc, &listv)
4dc0: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 54 != TCL_OK) {..T
4dd0: 63 6c 4e 65 77 4c 69 74 65 72 61 6c 53 74 72 69 clNewLiteralStri
4de0: 6e 67 4f 62 6a 28 65 72 72 2c 20 22 63 68 61 6e ngObj(err, "chan
4df0: 20 68 61 6e 64 6c 65 72 20 5c 22 22 29 3b 0a 09 handler \"");..
4e00: 54 63 6c 5f 41 70 70 65 6e 64 4f 62 6a 54 6f 4f Tcl_AppendObjToO
4e10: 62 6a 28 65 72 72 2c 20 63 6d 64 4f 62 6a 29 3b bj(err, cmdObj);
4e20: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 54 6f 4f 62 ..Tcl_AppendToOb
4e30: 6a 28 65 72 72 2c 20 22 20 69 6e 69 74 69 61 6c j(err, " initial
4e40: 69 7a 65 5c 22 20 72 65 74 75 72 6e 65 64 20 6e ize\" returned n
4e50: 6f 6e 2d 6c 69 73 74 3a 20 22 2c 20 2d 31 29 3b on-list: ", -1);
4e60: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 4f 62 6a 54 ..Tcl_AppendObjT
4e70: 6f 4f 62 6a 28 65 72 72 2c 20 72 65 73 4f 62 6a oObj(err, resObj
4e80: 29 3b 0a 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 );..Tcl_SetObjRe
4e90: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 65 72 72 sult(interp, err
4ea0: 29 3b 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43 );..Tcl_DecrRefC
4eb0: 6f 75 6e 74 28 72 65 73 4f 62 6a 29 3b 0a 09 67 ount(resObj);..g
4ec0: 6f 74 6f 20 65 72 72 6f 72 3b 0a 20 20 20 20 7d oto error;. }
4ed0: 0a 0a 20 20 20 20 6d 65 74 68 6f 64 73 20 3d 20 .. methods =
4ee0: 30 3b 0a 20 20 20 20 77 68 69 6c 65 20 28 6c 69 0;. while (li
4ef0: 73 74 63 20 3e 20 30 29 20 7b 0a 09 69 66 20 28 stc > 0) {..if (
4f00: 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d Tcl_GetIndexFrom
4f10: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 Obj(interp, list
4f20: 76 5b 6c 69 73 74 63 2d 31 5d 2c 20 6d 65 74 68 v[listc-1], meth
4f30: 6f 64 4e 61 6d 65 73 2c 0a 09 09 22 6d 65 74 68 odNames,..."meth
4f40: 6f 64 22 2c 20 54 43 4c 5f 45 58 41 43 54 2c 20 od", TCL_EXACT,
4f50: 26 6d 65 74 68 49 6e 64 65 78 29 20 21 3d 20 54 &methIndex) != T
4f60: 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 54 63 CL_OK) {.. Tc
4f70: 6c 4e 65 77 4c 69 74 65 72 61 6c 53 74 72 69 6e lNewLiteralStrin
4f80: 67 4f 62 6a 28 65 72 72 2c 20 22 63 68 61 6e 20 gObj(err, "chan
4f90: 68 61 6e 64 6c 65 72 20 5c 22 22 29 3b 0a 09 20 handler \"");..
4fa0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 4f 62 6a Tcl_AppendObj
4fb0: 54 6f 4f 62 6a 28 65 72 72 2c 20 63 6d 64 4f 62 ToObj(err, cmdOb
4fc0: 6a 29 3b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 j);.. Tcl_App
4fd0: 65 6e 64 54 6f 4f 62 6a 28 65 72 72 2c 20 22 20 endToObj(err, "
4fe0: 69 6e 69 74 69 61 6c 69 7a 65 5c 22 20 72 65 74 initialize\" ret
4ff0: 75 72 6e 65 64 20 22 2c 20 2d 31 29 3b 0a 09 20 urned ", -1);..
5000: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 4f 62 6a Tcl_AppendObj
5010: 54 6f 4f 62 6a 28 65 72 72 2c 20 54 63 6c 5f 47 ToObj(err, Tcl_G
5020: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 etObjResult(inte
5030: 72 70 29 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 rp));.. Tcl_S
5040: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 etObjResult(inte
5050: 72 70 2c 20 65 72 72 29 3b 0a 09 20 20 20 20 54 rp, err);.. T
5060: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 cl_DecrRefCount(
5070: 72 65 73 4f 62 6a 29 3b 0a 09 20 20 20 20 67 6f resObj);.. go
5080: 74 6f 20 65 72 72 6f 72 3b 0a 09 7d 0a 0a 09 6d to error;..}...m
5090: 65 74 68 6f 64 73 20 7c 3d 20 46 4c 41 47 28 6d ethods |= FLAG(m
50a0: 65 74 68 49 6e 64 65 78 29 3b 0a 09 6c 69 73 74 ethIndex);..list
50b0: 63 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 c--;. }. T
50c0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 cl_DecrRefCount(
50d0: 72 65 73 4f 62 6a 29 3b 0a 0a 20 20 20 20 69 66 resObj);.. if
50e0: 20 28 28 52 45 51 55 49 52 45 44 5f 4d 45 54 48 ((REQUIRED_METH
50f0: 4f 44 53 20 26 20 6d 65 74 68 6f 64 73 29 20 21 ODS & methods) !
5100: 3d 20 52 45 51 55 49 52 45 44 5f 4d 45 54 48 4f = REQUIRED_METHO
5110: 44 53 29 20 7b 0a 09 54 63 6c 4e 65 77 4c 69 74 DS) {..TclNewLit
5120: 65 72 61 6c 53 74 72 69 6e 67 4f 62 6a 28 65 72 eralStringObj(er
5130: 72 2c 20 22 63 68 61 6e 20 68 61 6e 64 6c 65 72 r, "chan handler
5140: 20 5c 22 22 29 3b 0a 09 54 63 6c 5f 41 70 70 65 \"");..Tcl_Appe
5150: 6e 64 4f 62 6a 54 6f 4f 62 6a 28 65 72 72 2c 20 ndObjToObj(err,
5160: 63 6d 64 4f 62 6a 29 3b 0a 09 54 63 6c 5f 41 70 cmdObj);..Tcl_Ap
5170: 70 65 6e 64 54 6f 4f 62 6a 28 65 72 72 2c 20 22 pendToObj(err, "
5180: 5c 22 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 \" does not supp
5190: 6f 72 74 20 61 6c 6c 20 72 65 71 75 69 72 65 64 ort all required
51a0: 20 6d 65 74 68 6f 64 73 22 2c 20 2d 31 29 3b 0a methods", -1);.
51b0: 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c .Tcl_SetObjResul
51c0: 74 28 69 6e 74 65 72 70 2c 20 65 72 72 29 3b 0a t(interp, err);.
51d0: 09 67 6f 74 6f 20 65 72 72 6f 72 3b 0a 20 20 20 .goto error;.
51e0: 20 7d 0a 0a 20 20 20 20 69 66 20 28 28 6d 6f 64 }.. if ((mod
51f0: 65 20 26 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 e & TCL_READABLE
5200: 29 20 26 26 20 21 48 41 53 28 6d 65 74 68 6f 64 ) && !HAS(method
5210: 73 2c 20 4d 45 54 48 5f 52 45 41 44 29 29 20 7b s, METH_READ)) {
5220: 0a 09 54 63 6c 4e 65 77 4c 69 74 65 72 61 6c 53 ..TclNewLiteralS
5230: 74 72 69 6e 67 4f 62 6a 28 65 72 72 2c 20 22 63 tringObj(err, "c
5240: 68 61 6e 20 68 61 6e 64 6c 65 72 20 5c 22 22 29 han handler \"")
5250: 3b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 4f 62 6a ;..Tcl_AppendObj
5260: 54 6f 4f 62 6a 28 65 72 72 2c 20 63 6d 64 4f 62 ToObj(err, cmdOb
5270: 6a 29 3b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 54 j);..Tcl_AppendT
5280: 6f 4f 62 6a 28 65 72 72 2c 20 22 5c 22 20 6c 61 oObj(err, "\" la
5290: 63 6b 73 20 61 20 5c 22 72 65 61 64 5c 22 20 6d cks a \"read\" m
52a0: 65 74 68 6f 64 22 2c 20 2d 31 29 3b 0a 09 54 63 ethod", -1);..Tc
52b0: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 l_SetObjResult(i
52c0: 6e 74 65 72 70 2c 20 65 72 72 29 3b 0a 09 67 6f nterp, err);..go
52d0: 74 6f 20 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a to error;. }.
52e0: 0a 20 20 20 20 69 66 20 28 28 6d 6f 64 65 20 26 . if ((mode &
52f0: 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 29 20 26 TCL_WRITABLE) &
5300: 26 20 21 48 41 53 28 6d 65 74 68 6f 64 73 2c 20 & !HAS(methods,
5310: 4d 45 54 48 5f 57 52 49 54 45 29 29 20 7b 0a 09 METH_WRITE)) {..
5320: 54 63 6c 4e 65 77 4c 69 74 65 72 61 6c 53 74 72 TclNewLiteralStr
5330: 69 6e 67 4f 62 6a 28 65 72 72 2c 20 22 63 68 61 ingObj(err, "cha
5340: 6e 20 68 61 6e 64 6c 65 72 20 5c 22 22 29 3b 0a n handler \"");.
5350: 09 54 63 6c 5f 41 70 70 65 6e 64 4f 62 6a 54 6f .Tcl_AppendObjTo
5360: 4f 62 6a 28 65 72 72 2c 20 63 6d 64 4f 62 6a 29 Obj(err, cmdObj)
5370: 3b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 54 6f 4f ;..Tcl_AppendToO
5380: 62 6a 28 65 72 72 2c 20 22 5c 22 20 6c 61 63 6b bj(err, "\" lack
5390: 73 20 61 20 5c 22 77 72 69 74 65 5c 22 20 6d 65 s a \"write\" me
53a0: 74 68 6f 64 22 2c 20 2d 31 29 3b 0a 09 54 63 6c thod", -1);..Tcl
53b0: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e _SetObjResult(in
53c0: 74 65 72 70 2c 20 65 72 72 29 3b 0a 09 67 6f 74 terp, err);..got
53d0: 6f 20 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 0a o error;. }..
53e0: 20 20 20 20 69 66 20 28 21 49 4d 50 4c 49 45 53 if (!IMPLIES
53f0: 28 48 41 53 28 6d 65 74 68 6f 64 73 2c 20 4d 45 (HAS(methods, ME
5400: 54 48 5f 43 47 45 54 29 2c 20 48 41 53 28 6d 65 TH_CGET), HAS(me
5410: 74 68 6f 64 73 2c 20 4d 45 54 48 5f 43 47 45 54 thods, METH_CGET
5420: 41 4c 4c 29 29 29 20 7b 0a 09 54 63 6c 4e 65 77 ALL))) {..TclNew
5430: 4c 69 74 65 72 61 6c 53 74 72 69 6e 67 4f 62 6a LiteralStringObj
5440: 28 65 72 72 2c 20 22 63 68 61 6e 20 68 61 6e 64 (err, "chan hand
5450: 6c 65 72 20 5c 22 22 29 3b 0a 09 54 63 6c 5f 41 ler \"");..Tcl_A
5460: 70 70 65 6e 64 4f 62 6a 54 6f 4f 62 6a 28 65 72 ppendObjToObj(er
5470: 72 2c 20 63 6d 64 4f 62 6a 29 3b 0a 09 54 63 6c r, cmdObj);..Tcl
5480: 5f 41 70 70 65 6e 64 54 6f 4f 62 6a 28 65 72 72 _AppendToObj(err
5490: 2c 20 22 5c 22 20 73 75 70 70 6f 72 74 73 20 5c , "\" supports \
54a0: 22 63 67 65 74 5c 22 20 62 75 74 20 6e 6f 74 20 "cget\" but not
54b0: 5c 22 63 67 65 74 61 6c 6c 5c 22 22 2c 20 2d 31 \"cgetall\"", -1
54c0: 29 3b 0a 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 );..Tcl_SetObjRe
54d0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 65 72 72 sult(interp, err
54e0: 29 3b 0a 09 67 6f 74 6f 20 65 72 72 6f 72 3b 0a );..goto error;.
54f0: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 21 }.. if (!
5500: 49 4d 50 4c 49 45 53 28 48 41 53 28 6d 65 74 68 IMPLIES(HAS(meth
5510: 6f 64 73 2c 20 4d 45 54 48 5f 43 47 45 54 41 4c ods, METH_CGETAL
5520: 4c 29 2c 20 48 41 53 28 6d 65 74 68 6f 64 73 2c L), HAS(methods,
5530: 20 4d 45 54 48 5f 43 47 45 54 29 29 29 20 7b 0a METH_CGET))) {.
5540: 09 54 63 6c 4e 65 77 4c 69 74 65 72 61 6c 53 74 .TclNewLiteralSt
5550: 72 69 6e 67 4f 62 6a 28 65 72 72 2c 20 22 63 68 ringObj(err, "ch
5560: 61 6e 20 68 61 6e 64 6c 65 72 20 5c 22 22 29 3b an handler \"");
5570: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 4f 62 6a 54 ..Tcl_AppendObjT
5580: 6f 4f 62 6a 28 65 72 72 2c 20 63 6d 64 4f 62 6a oObj(err, cmdObj
5590: 29 3b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 54 6f );..Tcl_AppendTo
55a0: 4f 62 6a 28 65 72 72 2c 20 22 5c 22 20 73 75 70 Obj(err, "\" sup
55b0: 70 6f 72 74 73 20 5c 22 63 67 65 74 61 6c 6c 5c ports \"cgetall\
55c0: 22 20 62 75 74 20 6e 6f 74 20 5c 22 63 67 65 74 " but not \"cget
55d0: 5c 22 22 2c 20 2d 31 29 3b 0a 09 54 63 6c 5f 53 \"", -1);..Tcl_S
55e0: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 etObjResult(inte
55f0: 72 70 2c 20 65 72 72 29 3b 0a 09 67 6f 74 6f 20 rp, err);..goto
5600: 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 error;. }..
5610: 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c Tcl_ResetResul
5620: 74 28 69 6e 74 65 72 70 29 3b 0a 0a 20 20 20 20 t(interp);..
5630: 2f 2a 0a 20 20 20 20 20 2a 20 45 76 65 72 79 74 /*. * Everyt
5640: 68 69 6e 67 20 69 73 20 66 69 6e 65 20 6e 6f 77 hing is fine now
5650: 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 72 .. */.. r
5660: 63 50 74 72 2d 3e 6d 65 74 68 6f 64 73 20 3d 20 cPtr->methods =
5670: 6d 65 74 68 6f 64 73 3b 0a 0a 20 20 20 20 69 66 methods;.. if
5680: 20 28 28 6d 65 74 68 6f 64 73 20 26 20 4e 55 4c ((methods & NUL
5690: 4c 41 42 4c 45 5f 4d 45 54 48 4f 44 53 29 20 21 LABLE_METHODS) !
56a0: 3d 20 4e 55 4c 4c 41 42 4c 45 5f 4d 45 54 48 4f = NULLABLE_METHO
56b0: 44 53 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 53 6f DS) {../*.. * So
56c0: 6d 65 20 6f 66 20 74 68 65 20 6e 75 6c 6c 61 62 me of the nullab
56d0: 6c 65 20 6d 65 74 68 6f 64 73 20 61 72 65 20 6e le methods are n
56e0: 6f 74 20 73 75 70 70 6f 72 74 65 64 2e 20 57 65 ot supported. We
56f0: 20 63 6c 6f 6e 65 20 74 68 65 0a 09 20 2a 20 63 clone the.. * c
5700: 68 61 6e 6e 65 6c 20 74 79 70 65 2c 20 6e 75 6c hannel type, nul
5710: 6c 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 l the associated
5720: 20 43 20 66 75 6e 63 74 69 6f 6e 73 2c 20 61 6e C functions, an
5730: 64 20 75 73 65 20 74 68 65 20 72 65 73 75 6c 74 d use the result
5740: 0a 09 20 2a 20 61 73 20 74 68 65 20 61 63 74 75 .. * as the actu
5750: 61 6c 20 63 68 61 6e 6e 65 6c 20 74 79 70 65 2e al channel type.
5760: 0a 09 20 2a 2f 0a 0a 09 54 63 6c 5f 43 68 61 6e .. */...Tcl_Chan
5770: 6e 65 6c 54 79 70 65 20 2a 63 6c 6f 6e 65 50 74 nelType *clonePt
5780: 72 20 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c r = (Tcl_Channel
5790: 54 79 70 65 20 2a 29 0a 09 09 63 6b 61 6c 6c 6f Type *)...ckallo
57a0: 63 28 73 69 7a 65 6f 66 28 54 63 6c 5f 43 68 61 c(sizeof(Tcl_Cha
57b0: 6e 6e 65 6c 54 79 70 65 29 29 3b 0a 0a 09 6d 65 nnelType));...me
57c0: 6d 63 70 79 28 63 6c 6f 6e 65 50 74 72 2c 20 26 mcpy(clonePtr, &
57d0: 74 63 6c 52 43 68 61 6e 6e 65 6c 54 79 70 65 2c tclRChannelType,
57e0: 20 73 69 7a 65 6f 66 28 54 63 6c 5f 43 68 61 6e sizeof(Tcl_Chan
57f0: 6e 65 6c 54 79 70 65 29 29 3b 0a 0a 09 69 66 20 nelType));...if
5800: 28 21 28 6d 65 74 68 6f 64 73 20 26 20 46 4c 41 (!(methods & FLA
5810: 47 28 4d 45 54 48 5f 43 4f 4e 46 49 47 55 52 45 G(METH_CONFIGURE
5820: 29 29 29 20 7b 0a 09 20 20 20 20 63 6c 6f 6e 65 ))) {.. clone
5830: 50 74 72 2d 3e 73 65 74 4f 70 74 69 6f 6e 50 72 Ptr->setOptionPr
5840: 6f 63 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 oc = NULL;..}...
5850: 69 66 20 28 21 28 6d 65 74 68 6f 64 73 20 26 20 if (!(methods &
5860: 46 4c 41 47 28 4d 45 54 48 5f 43 47 45 54 29 29 FLAG(METH_CGET))
5870: 20 26 26 20 21 28 6d 65 74 68 6f 64 73 20 26 20 && !(methods &
5880: 46 4c 41 47 28 4d 45 54 48 5f 43 47 45 54 41 4c FLAG(METH_CGETAL
5890: 4c 29 29 29 20 7b 0a 09 20 20 20 20 63 6c 6f 6e L))) {.. clon
58a0: 65 50 74 72 2d 3e 67 65 74 4f 70 74 69 6f 6e 50 ePtr->getOptionP
58b0: 72 6f 63 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 09 roc = NULL;..}..
58c0: 69 66 20 28 21 28 6d 65 74 68 6f 64 73 20 26 20 if (!(methods &
58d0: 46 4c 41 47 28 4d 45 54 48 5f 42 4c 4f 43 4b 49 FLAG(METH_BLOCKI
58e0: 4e 47 29 29 29 20 7b 0a 09 20 20 20 20 63 6c 6f NG))) {.. clo
58f0: 6e 65 50 74 72 2d 3e 62 6c 6f 63 6b 4d 6f 64 65 nePtr->blockMode
5900: 50 72 6f 63 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a Proc = NULL;..}.
5910: 09 69 66 20 28 21 28 6d 65 74 68 6f 64 73 20 26 .if (!(methods &
5920: 20 46 4c 41 47 28 4d 45 54 48 5f 53 45 45 4b 29 FLAG(METH_SEEK)
5930: 29 29 20 7b 0a 09 20 20 20 20 63 6c 6f 6e 65 50 )) {.. cloneP
5940: 74 72 2d 3e 73 65 65 6b 50 72 6f 63 20 3d 20 4e tr->seekProc = N
5950: 55 4c 4c 3b 0a 09 20 20 20 20 63 6c 6f 6e 65 50 ULL;.. cloneP
5960: 74 72 2d 3e 77 69 64 65 53 65 65 6b 50 72 6f 63 tr->wideSeekProc
5970: 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 63 68 = NULL;..}...ch
5980: 61 6e 50 74 72 2d 3e 74 79 70 65 50 74 72 20 3d anPtr->typePtr =
5990: 20 63 6c 6f 6e 65 50 74 72 3b 0a 20 20 20 20 7d clonePtr;. }
59a0: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 .. /*. *
59b0: 52 65 67 69 73 74 65 72 20 74 68 65 20 63 68 61 Register the cha
59c0: 6e 6e 65 6c 20 69 6e 20 74 68 65 20 49 2f 4f 20 nnel in the I/O
59d0: 73 79 73 74 65 6d 2c 20 61 6e 64 20 69 6e 20 6f system, and in o
59e0: 75 72 20 6f 75 72 20 6d 61 70 20 66 6f 72 20 27 ur our map for '
59f0: 63 68 61 6e 0a 20 20 20 20 20 2a 20 70 6f 73 74 chan. * post
5a00: 65 76 65 6e 74 27 2e 0a 20 20 20 20 20 2a 2f 0a event'.. */.
5a10: 0a 20 20 20 20 54 63 6c 5f 52 65 67 69 73 74 65 . Tcl_Registe
5a20: 72 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c rChannel(interp,
5a30: 20 63 68 61 6e 29 3b 0a 0a 20 20 20 20 72 63 6d chan);.. rcm
5a40: 50 74 72 20 3d 20 47 65 74 52 65 66 6c 65 63 74 Ptr = GetReflect
5a50: 65 64 43 68 61 6e 6e 65 6c 4d 61 70 20 28 69 6e edChannelMap (in
5a60: 74 65 72 70 29 3b 0a 20 20 20 20 68 50 74 72 20 terp);. hPtr
5a70: 3d 20 54 63 6c 5f 43 72 65 61 74 65 48 61 73 68 = Tcl_CreateHash
5a80: 45 6e 74 72 79 28 26 72 63 6d 50 74 72 2d 3e 6d Entry(&rcmPtr->m
5a90: 61 70 2c 20 63 68 61 6e 50 74 72 2d 3e 73 74 61 ap, chanPtr->sta
5aa0: 74 65 2d 3e 63 68 61 6e 6e 65 6c 4e 61 6d 65 2c te->channelName,
5ab0: 0a 09 20 20 20 20 26 69 73 4e 65 77 29 3b 0a 20 .. &isNew);.
5ac0: 20 20 20 69 66 20 28 21 69 73 4e 65 77 20 26 26 if (!isNew &&
5ad0: 20 63 68 61 6e 50 74 72 20 21 3d 20 54 63 6c 5f chanPtr != Tcl_
5ae0: 47 65 74 48 61 73 68 56 61 6c 75 65 28 68 50 74 GetHashValue(hPt
5af0: 72 29 29 20 7b 0a 09 54 63 6c 5f 50 61 6e 69 63 r)) {..Tcl_Panic
5b00: 28 22 54 63 6c 43 68 61 6e 43 72 65 61 74 65 4f ("TclChanCreateO
5b10: 62 6a 43 6d 64 3a 20 64 75 70 6c 69 63 61 74 65 bjCmd: duplicate
5b20: 20 63 68 61 6e 6e 65 6c 20 6e 61 6d 65 73 22 29 channel names")
5b30: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f ;. }. Tcl_
5b40: 53 65 74 48 61 73 68 56 61 6c 75 65 28 68 50 74 SetHashValue(hPt
5b50: 72 2c 20 63 68 61 6e 29 3b 0a 23 69 66 64 65 66 r, chan);.#ifdef
5b60: 20 54 43 4c 5f 54 48 52 45 41 44 53 0a 20 20 20 TCL_THREADS.
5b70: 20 72 63 6d 50 74 72 20 3d 20 47 65 74 54 68 72 rcmPtr = GetThr
5b80: 65 61 64 52 65 66 6c 65 63 74 65 64 43 68 61 6e eadReflectedChan
5b90: 6e 65 6c 4d 61 70 28 29 3b 0a 20 20 20 20 68 50 nelMap();. hP
5ba0: 74 72 20 3d 20 54 63 6c 5f 43 72 65 61 74 65 48 tr = Tcl_CreateH
5bb0: 61 73 68 45 6e 74 72 79 28 26 72 63 6d 50 74 72 ashEntry(&rcmPtr
5bc0: 2d 3e 6d 61 70 2c 20 63 68 61 6e 50 74 72 2d 3e ->map, chanPtr->
5bd0: 73 74 61 74 65 2d 3e 63 68 61 6e 6e 65 6c 4e 61 state->channelNa
5be0: 6d 65 2c 0a 09 20 20 20 20 26 69 73 4e 65 77 29 me,.. &isNew)
5bf0: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 48 61 73 ;. Tcl_SetHas
5c00: 68 56 61 6c 75 65 28 68 50 74 72 2c 20 63 68 61 hValue(hPtr, cha
5c10: 6e 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 n);.#endif..
5c20: 2f 2a 0a 20 20 20 20 20 2a 20 52 65 74 75 72 6e /*. * Return
5c30: 20 68 61 6e 64 6c 65 20 61 73 20 72 65 73 75 6c handle as resul
5c40: 74 20 6f 66 20 63 6f 6d 6d 61 6e 64 2e 0a 20 20 t of command..
5c50: 20 20 20 2a 2f 0a 0a 20 20 20 20 54 63 6c 5f 53 */.. Tcl_S
5c60: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 etObjResult(inte
5c70: 72 70 2c 20 72 63 49 64 29 3b 0a 20 20 20 20 72 rp, rcId);. r
5c80: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 0a 20 eturn TCL_OK;..
5c90: 20 65 72 72 6f 72 3a 0a 20 20 20 20 2f 2a 0a 20 error:. /*.
5ca0: 20 20 20 20 2a 20 53 69 67 6e 61 6c 20 74 6f 20 * Signal to
5cb0: 52 65 66 6c 65 63 74 43 6c 6f 73 65 20 74 6f 20 ReflectClose to
5cc0: 6e 6f 74 20 63 61 6c 6c 20 27 66 69 6e 61 6c 69 not call 'finali
5cd0: 7a 65 27 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 ze'.. */..
5ce0: 20 20 72 63 50 74 72 2d 3e 6d 65 74 68 6f 64 73 rcPtr->methods
5cf0: 20 3d 20 30 3b 0a 20 20 20 20 54 63 6c 5f 43 6c = 0;. Tcl_Cl
5d00: 6f 73 65 28 69 6e 74 65 72 70 2c 20 63 68 61 6e ose(interp, chan
5d10: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 );. return TC
5d20: 4c 5f 45 52 52 4f 52 3b 0a 0a 23 75 6e 64 65 66 L_ERROR;..#undef
5d30: 20 4d 4f 44 45 0a 23 75 6e 64 65 66 20 43 4d 44 MODE.#undef CMD
5d40: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
5d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5d90: 0a 20 2a 0a 20 2a 20 54 63 6c 43 68 61 6e 50 6f . *. * TclChanPo
5da0: 73 74 45 76 65 6e 74 4f 62 6a 43 6d 64 20 2d 2d stEventObjCmd --
5db0: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 66 75 6e 63 . *. *.This func
5dc0: 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20 tion is invoked
5dd0: 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20 22 to process the "
5de0: 63 68 61 6e 20 70 6f 73 74 65 76 65 6e 74 22 20 chan postevent"
5df0: 54 63 6c 20 63 6f 6d 6d 61 6e 64 2e 0a 20 2a 09 Tcl command.. *.
5e00: 53 65 65 20 74 68 65 20 75 73 65 72 20 64 6f 63 See the user doc
5e10: 75 6d 65 6e 74 61 74 69 6f 6e 20 66 6f 72 20 64 umentation for d
5e20: 65 74 61 69 6c 73 20 6f 6e 20 77 68 61 74 20 69 etails on what i
5e30: 74 20 64 6f 65 73 2e 0a 20 2a 0a 20 2a 20 52 65 t does.. *. * Re
5e40: 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e sults:. *.A stan
5e50: 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e dard Tcl result.
5e60: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
5e70: 63 74 73 3a 0a 20 2a 09 50 6f 73 74 73 20 65 76 cts:. *.Posts ev
5e80: 65 6e 74 73 20 74 6f 20 61 20 72 65 66 6c 65 63 ents to a reflec
5e90: 74 65 64 20 63 68 61 6e 6e 65 6c 2c 20 69 6e 76 ted channel, inv
5ea0: 6f 6b 65 73 20 65 76 65 6e 74 20 68 61 6e 64 6c okes event handl
5eb0: 65 72 73 2e 20 54 68 65 0a 20 2a 09 6c 61 74 74 ers. The. *.latt
5ec0: 65 72 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20 er implies that
5ed0: 61 72 62 69 74 72 61 72 79 20 73 69 64 65 20 65 arbitrary side e
5ee0: 66 66 65 63 74 73 20 61 72 65 20 70 6f 73 73 69 ffects are possi
5ef0: 62 6c 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d ble.. *. *------
5f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5f40: 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 63 6c 43 68 61 . */..int.TclCha
5f50: 6e 50 6f 73 74 45 76 65 6e 74 4f 62 6a 43 6d 64 nPostEventObjCmd
5f60: 28 0a 20 20 20 20 43 6c 69 65 6e 74 44 61 74 61 (. ClientData
5f70: 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 20 clientData,.
5f80: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 Tcl_Interp *int
5f90: 65 72 70 2c 0a 20 20 20 20 69 6e 74 20 6f 62 6a erp,. int obj
5fa0: 63 2c 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a c,. Tcl_Obj *
5fb0: 63 6f 6e 73 74 20 2a 6f 62 6a 76 29 0a 7b 0a 20 const *objv).{.
5fc0: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53 79 6e /*. * Syn
5fd0: 74 61 78 3a 20 20 20 63 68 61 6e 20 70 6f 73 74 tax: chan post
5fe0: 65 76 65 6e 74 20 43 48 41 4e 4e 45 4c 20 45 56 event CHANNEL EV
5ff0: 45 4e 54 53 50 45 43 0a 20 20 20 20 20 2a 20 20 ENTSPEC. *
6000: 20 20 20 20 20 20 20 20 20 5b 30 5d 20 20 5b 31 [0] [1
6010: 5d 20 20 20 20 20 20 20 5b 32 5d 20 20 20 20 20 ] [2]
6020: 5b 33 5d 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 [3]. *.
6030: 2a 20 41 63 74 75 61 6c 6c 79 3a 20 72 50 6f 73 * Actually: rPos
6040: 74 65 76 65 6e 74 20 43 48 41 4e 4e 45 4c 20 45 tevent CHANNEL E
6050: 56 45 4e 54 53 50 45 43 0a 20 20 20 20 20 2a 20 VENTSPEC. *
6060: 20 20 20 20 20 20 20 20 20 20 5b 30 5d 20 20 20 [0]
6070: 20 20 20 20 20 5b 31 5d 20 20 20 20 20 5b 32 5d [1] [2]
6080: 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 77 . *. * w
6090: 68 65 72 65 20 45 56 45 4e 54 53 50 45 43 20 3d here EVENTSPEC =
60a0: 20 7b 72 65 61 64 20 77 72 69 74 65 20 2e 2e 2e {read write ...
60b0: 7d 20 28 41 62 62 72 65 76 69 61 74 69 6f 6e 73 } (Abbreviations
60c0: 20 61 6c 6c 6f 77 65 64 20 61 73 20 77 65 6c 6c allowed as well
60d0: 29 2e 0a 20 20 20 20 20 2a 2f 0a 0a 23 64 65 66 ).. */..#def
60e0: 69 6e 65 20 43 48 41 4e 09 28 31 29 0a 23 64 65 ine CHAN.(1).#de
60f0: 66 69 6e 65 20 45 56 45 4e 54 09 28 32 29 0a 0a fine EVENT.(2)..
6100: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a const char *
6110: 63 68 61 6e 49 64 3b 09 09 2f 2a 20 54 63 6c 20 chanId;../* Tcl
6120: 6c 65 76 65 6c 20 63 68 61 6e 6e 65 6c 20 68 61 level channel ha
6130: 6e 64 6c 65 20 2a 2f 0a 20 20 20 20 54 63 6c 5f ndle */. Tcl_
6140: 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f Channel chan;../
6150: 2a 20 43 68 61 6e 6e 65 6c 20 61 73 73 6f 63 69 * Channel associ
6160: 61 74 65 64 20 74 6f 20 74 68 65 20 68 61 6e 64 ated to the hand
6170: 6c 65 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 le */. const
6180: 54 63 6c 5f 43 68 61 6e 6e 65 6c 54 79 70 65 20 Tcl_ChannelType
6190: 2a 63 68 61 6e 54 79 70 65 50 74 72 3b 0a 09 09 *chanTypePtr;...
61a0: 09 09 2f 2a 20 49 74 73 20 61 73 73 6f 63 69 61 ../* Its associa
61b0: 74 65 64 20 64 72 69 76 65 72 20 73 74 72 75 63 ted driver struc
61c0: 74 75 72 65 20 2a 2f 0a 20 20 20 20 52 65 66 6c ture */. Refl
61d0: 65 63 74 65 64 43 68 61 6e 6e 65 6c 20 2a 72 63 ectedChannel *rc
61e0: 50 74 72 3b 09 2f 2a 20 41 73 73 6f 63 69 61 74 Ptr;./* Associat
61f0: 65 64 20 69 6e 73 74 61 6e 63 65 20 64 61 74 61 ed instance data
6200: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65 76 65 6e */. int even
6210: 74 73 3b 09 09 09 2f 2a 20 4d 61 73 6b 20 6f 66 ts;.../* Mask of
6220: 20 65 76 65 6e 74 73 20 74 6f 20 70 6f 73 74 20 events to post
6230: 2a 2f 0a 20 20 20 20 52 65 66 6c 65 63 74 65 64 */. Reflected
6240: 43 68 61 6e 6e 65 6c 4d 61 70 20 2a 72 63 6d 50 ChannelMap *rcmP
6250: 74 72 3b 2f 2a 20 4d 61 70 20 6f 66 20 72 65 66 tr;/* Map of ref
6260: 6c 65 63 74 65 64 20 63 68 61 6e 6e 65 6c 73 20 lected channels
6270: 77 69 74 68 20 68 61 6e 64 6c 65 72 73 20 69 6e with handlers in
6280: 0a 09 09 09 09 20 2a 20 74 68 69 73 20 69 6e 74 ..... * this int
6290: 65 72 70 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f erp. */. Tcl_
62a0: 48 61 73 68 45 6e 74 72 79 20 2a 68 50 74 72 3b HashEntry *hPtr;
62b0: 09 2f 2a 20 45 6e 74 72 79 20 69 6e 20 74 68 65 ./* Entry in the
62c0: 20 61 62 6f 76 65 20 6d 61 70 20 2a 2f 0a 0a 20 above map */..
62d0: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 4e 75 6d /*. * Num
62e0: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 ber of arguments
62f0: 2e 2e 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 .... */..
6300: 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 33 29 20 if (objc != 3)
6310: 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 {..Tcl_WrongNumA
6320: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f rgs(interp, 1, o
6330: 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 20 65 76 bjv, "channel ev
6340: 65 6e 74 73 70 65 63 22 29 3b 0a 09 72 65 74 75 entspec");..retu
6350: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
6360: 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 }.. /*.
6370: 20 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e * First argumen
6380: 74 20 69 73 20 61 20 63 68 61 6e 6e 65 6c 2c 20 t is a channel,
6390: 61 20 72 65 66 6c 65 63 74 65 64 20 63 68 61 6e a reflected chan
63a0: 6e 65 6c 2c 20 61 6e 64 20 74 68 65 20 63 61 6c nel, and the cal
63b0: 6c 20 6f 66 20 74 68 69 73 0a 20 20 20 20 20 2a l of this. *
63c0: 20 63 6f 6d 6d 61 6e 64 20 69 73 20 64 6f 6e 65 command is done
63d0: 20 66 72 6f 6d 20 74 68 65 20 69 6e 74 65 72 70 from the interp
63e0: 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20 63 68 defining the ch
63f0: 61 6e 6e 65 6c 20 68 61 6e 64 6c 65 72 20 63 6d annel handler cm
6400: 64 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 d.. */..
6410: 63 68 61 6e 49 64 20 3d 20 54 63 6c 47 65 74 53 chanId = TclGetS
6420: 74 72 69 6e 67 28 6f 62 6a 76 5b 43 48 41 4e 5d tring(objv[CHAN]
6430: 29 3b 0a 0a 20 20 20 20 72 63 6d 50 74 72 20 3d );.. rcmPtr =
6440: 20 47 65 74 52 65 66 6c 65 63 74 65 64 43 68 61 GetReflectedCha
6450: 6e 6e 65 6c 4d 61 70 20 28 69 6e 74 65 72 70 29 nnelMap (interp)
6460: 3b 0a 20 20 20 20 68 50 74 72 20 3d 20 54 63 6c ;. hPtr = Tcl
6470: 5f 46 69 6e 64 48 61 73 68 45 6e 74 72 79 20 28 _FindHashEntry (
6480: 26 72 63 6d 50 74 72 2d 3e 6d 61 70 2c 20 63 68 &rcmPtr->map, ch
6490: 61 6e 49 64 29 3b 0a 0a 20 20 20 20 69 66 20 28 anId);.. if (
64a0: 68 50 74 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a hPtr == NULL) {.
64b0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
64c0: 74 28 69 6e 74 65 72 70 2c 20 22 63 61 6e 20 6e t(interp, "can n
64d0: 6f 74 20 66 69 6e 64 20 72 65 66 6c 65 63 74 65 ot find reflecte
64e0: 64 20 63 68 61 6e 6e 65 6c 20 6e 61 6d 65 64 20 d channel named
64f0: 5c 22 22 2c 20 63 68 61 6e 49 64 2c 0a 09 09 22 \"", chanId,..."
6500: 5c 22 22 2c 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c \"", NULL);..Tcl
6510: 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e _SetErrorCode(in
6520: 74 65 72 70 2c 20 22 54 43 4c 22 2c 20 22 4c 4f terp, "TCL", "LO
6530: 4f 4b 55 50 22 2c 20 22 43 48 41 4e 4e 45 4c 22 OKUP", "CHANNEL"
6540: 2c 20 63 68 61 6e 49 64 2c 20 4e 55 4c 4c 29 3b , chanId, NULL);
6550: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
6560: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f OR;. }.. /
6570: 2a 0a 20 20 20 20 20 2a 20 4e 6f 74 65 20 74 68 *. * Note th
6580: 61 74 20 74 68 65 20 73 65 61 72 63 68 20 61 62 at the search ab
6590: 6f 76 65 20 73 75 62 73 75 6d 65 73 20 73 65 76 ove subsumes sev
65a0: 65 72 61 6c 20 6f 66 20 74 68 65 20 6f 6c 64 65 eral of the olde
65b0: 72 20 63 68 65 63 6b 73 2c 20 6e 61 6d 65 6c 79 r checks, namely
65c0: 3a 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 :. *. *
65d0: 28 31 29 20 44 6f 65 73 20 74 68 65 20 63 68 61 (1) Does the cha
65e0: 6e 6e 65 6c 20 68 61 6e 64 6c 65 20 72 65 66 65 nnel handle refe
65f0: 72 20 74 6f 20 61 20 72 65 66 6c 65 63 74 65 64 r to a reflected
6600: 20 63 68 61 6e 6e 65 6c 20 3f 0a 20 20 20 20 20 channel ?.
6610: 2a 20 28 32 29 20 49 73 20 74 68 65 20 70 6f 73 * (2) Is the pos
6620: 74 20 65 76 65 6e 74 20 69 73 73 75 65 64 20 66 t event issued f
6630: 72 6f 6d 20 74 68 65 20 69 6e 74 65 72 70 72 65 rom the interpre
6640: 74 65 72 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 ter holding the
6650: 68 61 6e 64 6c 65 72 0a 20 20 20 20 20 2a 20 20 handler. *
6660: 20 20 20 6f 66 20 74 68 65 20 72 65 66 6c 65 63 of the reflec
6670: 74 65 64 20 63 68 61 6e 6e 65 6c 20 3f 0a 20 20 ted channel ?.
6680: 20 20 20 2a 0a 20 20 20 20 20 2a 20 41 20 73 75 *. * A su
6690: 63 63 65 73 73 66 75 6c 20 73 65 61 72 63 68 20 ccessful search
66a0: 61 6e 73 77 65 72 73 20 79 65 73 20 74 6f 20 62 answers yes to b
66b0: 6f 74 68 2e 20 42 65 63 61 75 73 65 20 74 68 65 oth. Because the
66c0: 20 6d 61 70 20 68 6f 6c 64 73 20 6f 6e 6c 79 0a map holds only.
66d0: 20 20 20 20 20 2a 20 68 61 6e 64 6c 65 73 20 6f * handles o
66e0: 66 20 72 65 66 6c 65 63 74 65 64 20 63 68 61 6e f reflected chan
66f0: 6e 65 6c 73 2c 20 61 6e 64 20 6f 6e 6c 79 20 6f nels, and only o
6700: 66 20 73 75 63 68 20 77 68 6f 73 65 20 68 61 6e f such whose han
6710: 64 6c 65 72 20 69 73 0a 20 20 20 20 20 2a 20 64 dler is. * d
6720: 65 66 69 6e 65 64 20 69 6e 20 74 68 69 73 20 69 efined in this i
6730: 6e 74 65 72 70 72 65 74 65 72 2e 0a 20 20 20 20 nterpreter..
6740: 20 2a 0a 20 20 20 20 20 2a 20 57 65 20 6b 65 65 *. * We kee
6750: 70 20 74 68 65 20 6f 6c 64 20 63 68 65 63 6b 73 p the old checks
6760: 20 66 6f 72 20 62 6f 74 68 2c 20 66 6f 72 20 70 for both, for p
6770: 61 72 61 6e 69 6f 61 2c 20 62 75 74 20 61 62 6f aranioa, but abo
6780: 72 74 20 6e 6f 77 20 69 6e 73 74 65 61 64 20 6f rt now instead o
6790: 66 0a 20 20 20 20 20 2a 20 74 68 72 6f 77 69 6e f. * throwin
67a0: 67 20 65 72 72 6f 72 73 2c 20 61 73 20 66 61 69 g errors, as fai
67b0: 6c 75 72 65 20 6e 6f 77 20 6d 65 61 6e 73 20 74 lure now means t
67c0: 68 61 74 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c hat our internal
67d0: 20 64 61 74 61 73 74 72 75 63 74 75 72 65 73 0a datastructures.
67e0: 20 20 20 20 20 2a 20 68 61 76 65 20 67 6f 6e 65 * have gone
67f0: 20 73 65 72 69 6f 75 73 6c 79 20 68 61 79 77 69 seriously haywi
6800: 72 65 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 re.. */..
6810: 20 63 68 61 6e 20 20 20 20 20 20 20 20 3d 20 54 chan = T
6820: 63 6c 5f 47 65 74 48 61 73 68 56 61 6c 75 65 28 cl_GetHashValue(
6830: 68 50 74 72 29 3b 0a 20 20 20 20 63 68 61 6e 54 hPtr);. chanT
6840: 79 70 65 50 74 72 20 3d 20 54 63 6c 5f 47 65 74 ypePtr = Tcl_Get
6850: 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e ChannelType(chan
6860: 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 );.. /*.
6870: 2a 20 57 65 20 75 73 65 20 61 20 66 75 6e 63 74 * We use a funct
6880: 69 6f 6e 20 72 65 66 65 72 65 6e 63 65 64 20 62 ion referenced b
6890: 79 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 74 79 y the channel ty
68a0: 70 65 20 61 73 20 6f 75 72 20 63 6f 6f 6b 69 65 pe as our cookie
68b0: 20 74 6f 0a 20 20 20 20 20 2a 20 64 65 74 65 63 to. * detec
68c0: 74 20 63 61 6c 6c 73 20 74 6f 20 6e 6f 6e 2d 72 t calls to non-r
68d0: 65 66 6c 65 63 74 69 6e 67 20 63 68 61 6e 6e 65 eflecting channe
68e0: 6c 73 2e 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 ls. The channel
68f0: 74 79 70 65 20 69 74 73 65 6c 66 20 69 73 20 6e type itself is n
6900: 6f 74 0a 20 20 20 20 20 2a 20 73 75 69 74 61 62 ot. * suitab
6910: 6c 65 2c 20 61 73 20 69 74 20 6d 69 67 68 74 20 le, as it might
6920: 6e 6f 74 20 62 65 20 74 68 65 20 73 74 61 74 69 not be the stati
6930: 63 20 64 65 66 69 6e 69 74 69 6f 6e 20 69 6e 20 c definition in
6940: 74 68 69 73 20 66 69 6c 65 2c 20 62 75 74 20 61 this file, but a
6950: 0a 20 20 20 20 20 2a 20 63 6c 6f 6e 65 20 74 68 . * clone th
6960: 65 72 65 6f 66 2e 20 41 6e 64 20 77 68 69 6c 65 ereof. And while
6970: 20 77 65 20 68 61 76 65 20 72 65 73 65 72 76 65 we have reserve
6980: 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 d the name of th
6990: 65 20 74 79 70 65 20 6e 6f 74 68 69 6e 67 0a 20 e type nothing.
69a0: 20 20 20 20 2a 20 69 6e 20 74 68 65 20 63 6f 72 * in the cor
69b0: 65 20 63 68 65 63 6b 73 20 61 67 61 69 6e 73 74 e checks against
69c0: 20 76 69 6f 6c 61 74 69 6f 6e 2c 20 73 6f 20 73 violation, so s
69d0: 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 69 67 68 omeone else migh
69e0: 74 20 68 61 76 65 0a 20 20 20 20 20 2a 20 63 72 t have. * cr
69f0: 65 61 74 65 64 20 61 20 63 68 61 6e 6e 65 6c 20 eated a channel
6a00: 74 79 70 65 20 75 73 69 6e 67 20 6f 75 72 20 6e type using our n
6a10: 61 6d 65 2c 20 63 6c 61 73 68 69 6e 67 20 77 69 ame, clashing wi
6a20: 74 68 20 6f 75 72 73 65 6c 76 65 73 2e 0a 20 20 th ourselves..
6a30: 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28 63 */.. if (c
6a40: 68 61 6e 54 79 70 65 50 74 72 2d 3e 77 61 74 63 hanTypePtr->watc
6a50: 68 50 72 6f 63 20 21 3d 20 26 52 65 66 6c 65 63 hProc != &Reflec
6a60: 74 57 61 74 63 68 29 20 7b 0a 09 54 63 6c 5f 50 tWatch) {..Tcl_P
6a70: 61 6e 69 63 20 28 22 54 63 6c 43 68 61 6e 50 6f anic ("TclChanPo
6a80: 73 74 45 76 65 6e 74 4f 62 6a 43 6d 64 3a 20 63 stEventObjCmd: c
6a90: 68 61 6e 6e 65 6c 20 69 73 20 6e 6f 74 20 61 20 hannel is not a
6aa0: 72 65 66 6c 65 63 74 65 64 20 63 68 61 6e 6e 65 reflected channe
6ab0: 6c 22 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 l");. }..
6ac0: 72 63 50 74 72 20 3d 20 28 52 65 66 6c 65 63 74 rcPtr = (Reflect
6ad0: 65 64 43 68 61 6e 6e 65 6c 20 2a 29 20 54 63 6c edChannel *) Tcl
6ae0: 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 _GetChannelInsta
6af0: 6e 63 65 44 61 74 61 28 63 68 61 6e 29 3b 0a 0a nceData(chan);..
6b00: 20 20 20 20 69 66 20 28 72 63 50 74 72 2d 3e 69 if (rcPtr->i
6b10: 6e 74 65 72 70 20 21 3d 20 69 6e 74 65 72 70 29 nterp != interp)
6b20: 20 7b 0a 09 54 63 6c 5f 50 61 6e 69 63 20 28 22 {..Tcl_Panic ("
6b30: 54 63 6c 43 68 61 6e 50 6f 73 74 45 76 65 6e 74 TclChanPostEvent
6b40: 4f 62 6a 43 6d 64 3a 20 70 6f 73 74 65 76 65 6e ObjCmd: posteven
6b50: 74 20 61 63 63 65 70 74 65 64 20 66 6f 72 20 63 t accepted for c
6b60: 61 6c 6c 20 66 72 6f 6d 20 6f 75 74 73 69 64 65 all from outside
6b70: 20 69 6e 74 65 72 70 72 65 74 65 72 22 29 3b 0a interpreter");.
6b80: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 }.. /*.
6b90: 20 20 20 2a 20 53 65 63 6f 6e 64 20 61 72 67 75 * Second argu
6ba0: 6d 65 6e 74 20 69 73 20 61 20 6c 69 73 74 20 6f ment is a list o
6bb0: 66 20 65 76 65 6e 74 73 2e 20 41 6c 6c 6f 77 65 f events. Allowe
6bc0: 64 20 65 6e 74 72 69 65 73 20 61 72 65 20 22 72 d entries are "r
6bd0: 65 61 64 22 2c 0a 20 20 20 20 20 2a 20 22 77 72 ead",. * "wr
6be0: 69 74 65 22 2e 20 45 78 70 65 63 74 20 61 74 20 ite". Expect at
6bf0: 6c 65 61 73 74 20 6f 6e 65 20 6c 69 73 74 20 65 least one list e
6c00: 6c 65 6d 65 6e 74 2e 20 41 62 62 72 65 76 69 61 lement. Abbrevia
6c10: 74 69 6f 6e 73 20 61 72 65 20 6f 6b 2e 0a 20 20 tions are ok..
6c20: 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28 45 */.. if (E
6c30: 6e 63 6f 64 65 45 76 65 6e 74 4d 61 73 6b 28 69 ncodeEventMask(i
6c40: 6e 74 65 72 70 2c 20 22 65 76 65 6e 74 22 2c 20 nterp, "event",
6c50: 6f 62 6a 76 5b 45 56 45 4e 54 5d 2c 20 26 65 76 objv[EVENT], &ev
6c60: 65 6e 74 73 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 ents) != TCL_OK)
6c70: 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 {..return TCL_E
6c80: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 RROR;. }..
6c90: 20 2f 2a 0a 20 20 20 20 20 2a 20 43 68 65 63 6b /*. * Check
6ca0: 20 74 68 61 74 20 74 68 65 20 63 68 61 6e 6e 65 that the channe
6cb0: 6c 20 69 73 20 61 63 74 75 61 6c 6c 79 20 69 6e l is actually in
6cc0: 74 65 72 65 73 74 65 64 20 69 6e 20 74 68 65 20 terested in the
6cd0: 70 72 6f 76 69 64 65 64 20 65 76 65 6e 74 73 2e provided events.
6ce0: 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66 . */.. if
6cf0: 20 28 65 76 65 6e 74 73 20 26 20 7e 72 63 50 74 (events & ~rcPt
6d00: 72 2d 3e 69 6e 74 65 72 65 73 74 29 20 7b 0a 09 r->interest) {..
6d10: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
6d20: 28 69 6e 74 65 72 70 2c 20 22 74 72 69 65 64 20 (interp, "tried
6d30: 74 6f 20 70 6f 73 74 20 65 76 65 6e 74 73 20 63 to post events c
6d40: 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 63 68 61 6e hannel \"", chan
6d50: 49 64 2c 0a 09 09 22 5c 22 20 69 73 20 6e 6f 74 Id,..."\" is not
6d60: 20 69 6e 74 65 72 65 73 74 65 64 20 69 6e 22 2c interested in",
6d70: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 NULL);..return
6d80: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
6d90: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 .. /*. *
6da0: 57 65 20 68 61 76 65 20 74 68 65 20 63 68 61 6e We have the chan
6db0: 6e 65 6c 20 61 6e 64 20 74 68 65 20 65 76 65 6e nel and the even
6dc0: 74 73 20 74 6f 20 70 6f 73 74 2e 0a 20 20 20 20 ts to post..
6dd0: 20 2a 2f 0a 0a 20 20 20 20 54 63 6c 5f 4e 6f 74 */.. Tcl_Not
6de0: 69 66 79 43 68 61 6e 6e 65 6c 28 63 68 61 6e 2c ifyChannel(chan,
6df0: 20 65 76 65 6e 74 73 29 3b 0a 0a 20 20 20 20 2f events);.. /
6e00: 2a 0a 20 20 20 20 20 2a 20 53 71 75 61 73 68 20 *. * Squash
6e10: 69 6e 74 65 72 70 20 72 65 73 75 6c 74 73 20 6c interp results l
6e20: 65 66 74 20 62 79 20 74 68 65 20 65 76 65 6e 74 eft by the event
6e30: 20 73 63 72 69 70 74 2e 0a 20 20 20 20 20 2a 2f script.. */
6e40: 0a 0a 20 20 20 20 54 63 6c 5f 52 65 73 65 74 52 .. Tcl_ResetR
6e50: 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 esult(interp);.
6e60: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b return TCL_OK
6e70: 3b 0a 0a 23 75 6e 64 65 66 20 43 48 41 4e 0a 23 ;..#undef CHAN.#
6e80: 75 6e 64 65 66 20 45 56 45 4e 54 0a 7d 0a 0c 0a undef EVENT.}...
6e90: 2f 2a 0a 20 2a 20 43 68 61 6e 6e 65 6c 20 65 72 /*. * Channel er
6ea0: 72 6f 72 20 6d 65 73 73 61 67 65 20 6d 61 72 73 ror message mars
6eb0: 68 61 6c 6c 69 6e 67 20 75 74 69 6c 69 74 69 65 halling utilitie
6ec0: 73 2e 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 54 s.. */..static T
6ed0: 63 6c 5f 4f 62 6a 20 2a 0a 4d 61 72 73 68 61 6c cl_Obj *.Marshal
6ee0: 6c 45 72 72 6f 72 28 0a 20 20 20 20 54 63 6c 5f lError(. Tcl_
6ef0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 0a Interp *interp).
6f00: 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 {. /*. *
6f10: 43 61 70 74 75 72 65 20 74 68 65 20 72 65 73 75 Capture the resu
6f20: 6c 74 20 73 74 61 74 75 73 20 6f 66 20 74 68 65 lt status of the
6f30: 20 69 6e 74 65 72 70 72 65 74 65 72 20 69 6e 74 interpreter int
6f40: 6f 20 61 20 73 74 72 69 6e 67 2e 20 3d 3e 20 4c o a string. => L
6f50: 69 73 74 20 6f 66 0a 20 20 20 20 20 2a 20 6f 70 ist of. * op
6f60: 74 69 6f 6e 73 20 61 6e 64 20 76 61 6c 75 65 73 tions and values
6f70: 2c 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 74 68 , followed by th
6f80: 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e e error message.
6f90: 20 54 68 65 20 72 65 73 75 6c 74 20 68 61 73 0a The result has.
6fa0: 20 20 20 20 20 2a 20 72 65 66 43 6f 75 6e 74 20 * refCount
6fb0: 30 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 0.. */..
6fc0: 54 63 6c 5f 4f 62 6a 20 2a 72 65 74 75 72 6e 4f Tcl_Obj *returnO
6fd0: 70 74 20 3d 20 54 63 6c 5f 47 65 74 52 65 74 75 pt = Tcl_GetRetu
6fe0: 72 6e 4f 70 74 69 6f 6e 73 28 69 6e 74 65 72 70 rnOptions(interp
6ff0: 2c 20 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 0a 20 , TCL_ERROR);..
7000: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 3d 3e 20 /*. * =>
7010: 72 65 74 75 72 6e 4f 70 74 2e 72 65 66 43 6f 75 returnOpt.refCou
7020: 6e 74 20 3d 3d 20 30 2e 20 57 65 20 63 61 6e 20 nt == 0. We can
7030: 61 70 70 65 6e 64 20 64 69 72 65 63 74 6c 79 2e append directly.
7040: 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 54 63 . */.. Tc
7050: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 l_ListObjAppendE
7060: 6c 65 6d 65 6e 74 28 4e 55 4c 4c 2c 20 72 65 74 lement(NULL, ret
7070: 75 72 6e 4f 70 74 2c 20 54 63 6c 5f 47 65 74 4f urnOpt, Tcl_GetO
7080: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 bjResult(interp)
7090: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 );. return re
70a0: 74 75 72 6e 4f 70 74 3b 0a 7d 0a 0a 73 74 61 74 turnOpt;.}..stat
70b0: 69 63 20 76 6f 69 64 0a 55 6e 6d 61 72 73 68 61 ic void.Unmarsha
70c0: 6c 6c 45 72 72 6f 72 52 65 73 75 6c 74 28 0a 20 llErrorResult(.
70d0: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 Tcl_Interp *i
70e0: 6e 74 65 72 70 2c 0a 20 20 20 20 54 63 6c 5f 4f nterp,. Tcl_O
70f0: 62 6a 20 2a 6d 73 67 4f 62 6a 29 0a 7b 0a 20 20 bj *msgObj).{.
7100: 20 20 69 6e 74 20 6c 63 3b 0a 20 20 20 20 54 63 int lc;. Tc
7110: 6c 5f 4f 62 6a 20 2a 2a 6c 76 3b 0a 20 20 20 20 l_Obj **lv;.
7120: 69 6e 74 20 65 78 70 6c 69 63 69 74 52 65 73 75 int explicitResu
7130: 6c 74 3b 0a 20 20 20 20 69 6e 74 20 6e 75 6d 4f lt;. int numO
7140: 70 74 69 6f 6e 73 3b 0a 0a 20 20 20 20 2f 2a 0a ptions;.. /*.
7150: 20 20 20 20 20 2a 20 50 72 6f 63 65 73 73 20 74 * Process t
7160: 68 65 20 63 61 75 67 68 74 20 6d 65 73 73 61 67 he caught messag
7170: 65 2e 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 2a e.. *. *
7180: 20 53 79 6e 74 61 78 20 3d 20 28 6f 70 74 69 6f Syntax = (optio
7190: 6e 20 76 61 6c 75 65 29 2e 2e 2e 20 3f 6d 65 73 n value)... ?mes
71a0: 73 61 67 65 3f 0a 20 20 20 20 20 2a 0a 20 20 20 sage?. *.
71b0: 20 20 2a 20 42 61 64 20 73 79 6e 74 61 78 20 63 * Bad syntax c
71c0: 61 75 73 65 73 20 61 20 70 61 6e 69 63 2e 20 54 auses a panic. T
71d0: 68 69 73 20 69 73 20 4f 4b 20 62 65 63 61 75 73 his is OK becaus
71e0: 65 20 74 68 65 20 6f 74 68 65 72 20 73 69 64 65 e the other side
71f0: 20 75 73 65 73 0a 20 20 20 20 20 2a 20 54 63 6c uses. * Tcl
7200: 5f 47 65 74 52 65 74 75 72 6e 4f 70 74 69 6f 6e _GetReturnOption
7210: 73 20 61 6e 64 20 6c 69 73 74 20 63 6f 6e 73 74 s and list const
7220: 72 75 63 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e ruction function
7230: 73 20 74 6f 20 6d 61 72 73 68 61 6c 6c 20 74 68 s to marshall th
7240: 65 0a 20 20 20 20 20 2a 20 69 6e 66 6f 72 6d 61 e. * informa
7250: 74 69 6f 6e 3b 20 69 66 20 77 65 20 70 61 6e 69 tion; if we pani
7260: 63 20 68 65 72 65 2c 20 73 6f 6d 65 74 68 69 6e c here, somethin
7270: 67 20 68 61 73 20 67 6f 6e 65 20 62 61 64 6c 79 g has gone badly
7280: 20 77 72 6f 6e 67 20 61 6c 72 65 61 64 79 2e 0a wrong already..
7290: 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66 20 */.. if
72a0: 28 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45 (Tcl_ListObjGetE
72b0: 6c 65 6d 65 6e 74 73 28 69 6e 74 65 72 70 2c 20 lements(interp,
72c0: 6d 73 67 4f 62 6a 2c 20 26 6c 63 2c 20 26 6c 76 msgObj, &lc, &lv
72d0: 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 ) != TCL_OK) {..
72e0: 54 63 6c 5f 50 61 6e 69 63 28 22 54 63 6c 43 68 Tcl_Panic("TclCh
72f0: 61 6e 43 61 75 67 68 74 45 72 72 6f 72 42 79 70 anCaughtErrorByp
7300: 61 73 73 3a 20 42 61 64 20 73 79 6e 74 61 78 20 ass: Bad syntax
7310: 6f 66 20 63 61 75 67 68 74 20 72 65 73 75 6c 74 of caught result
7320: 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 ");. }. if
7330: 20 28 69 6e 74 65 72 70 20 3d 3d 20 4e 55 4c 4c (interp == NULL
7340: 29 20 7b 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20 ) {..return;.
7350: 20 7d 0a 0a 20 20 20 20 65 78 70 6c 69 63 69 74 }.. explicit
7360: 52 65 73 75 6c 74 20 3d 20 6c 63 20 26 20 31 3b Result = lc & 1;
7370: 09 09 2f 2a 20 4f 64 64 20 6e 75 6d 62 65 72 20 ../* Odd number
7380: 6f 66 20 76 61 6c 75 65 73 3f 20 2a 2f 0a 20 20 of values? */.
7390: 20 20 6e 75 6d 4f 70 74 69 6f 6e 73 20 3d 20 6c numOptions = l
73a0: 63 20 2d 20 65 78 70 6c 69 63 69 74 52 65 73 75 c - explicitResu
73b0: 6c 74 3b 0a 0a 20 20 20 20 69 66 20 28 65 78 70 lt;.. if (exp
73c0: 6c 69 63 69 74 52 65 73 75 6c 74 29 20 7b 0a 09 licitResult) {..
73d0: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 Tcl_SetObjResult
73e0: 28 69 6e 74 65 72 70 2c 20 6c 76 5b 6c 63 2d 31 (interp, lv[lc-1
73f0: 5d 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 28 ]);. }.. (
7400: 76 6f 69 64 29 20 54 63 6c 5f 53 65 74 52 65 74 void) Tcl_SetRet
7410: 75 72 6e 4f 70 74 69 6f 6e 73 28 69 6e 74 65 72 urnOptions(inter
7420: 70 2c 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 p, Tcl_NewListOb
7430: 6a 28 6e 75 6d 4f 70 74 69 6f 6e 73 2c 20 6c 76 j(numOptions, lv
7440: 29 29 3b 0a 20 20 20 20 28 28 49 6e 74 65 72 70 ));. ((Interp
7450: 20 2a 29 69 6e 74 65 72 70 29 2d 3e 66 6c 61 67 *)interp)->flag
7460: 73 20 26 3d 20 7e 45 52 52 5f 41 4c 52 45 41 44 s &= ~ERR_ALREAD
7470: 59 5f 4c 4f 47 47 45 44 3b 0a 7d 0a 0a 69 6e 74 Y_LOGGED;.}..int
7480: 0a 54 63 6c 43 68 61 6e 43 61 75 67 68 74 45 72 .TclChanCaughtEr
7490: 72 6f 72 42 79 70 61 73 73 28 0a 20 20 20 20 54 rorBypass(. T
74a0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
74b0: 70 2c 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e p,. Tcl_Chann
74c0: 65 6c 20 63 68 61 6e 29 0a 7b 0a 20 20 20 20 54 el chan).{. T
74d0: 63 6c 5f 4f 62 6a 20 2a 63 68 61 6e 4d 73 67 4f cl_Obj *chanMsgO
74e0: 62 6a 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 bj = NULL;. T
74f0: 63 6c 5f 4f 62 6a 20 2a 69 6e 74 65 72 70 4d 73 cl_Obj *interpMs
7500: 67 4f 62 6a 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 gObj = NULL;.
7510: 20 54 63 6c 5f 4f 62 6a 20 2a 6d 73 67 4f 62 6a Tcl_Obj *msgObj
7520: 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 2f 2a = NULL;.. /*
7530: 0a 20 20 20 20 20 2a 20 47 65 74 20 61 20 62 79 . * Get a by
7540: 70 61 73 73 65 64 20 65 72 72 6f 72 20 6d 65 73 passed error mes
7550: 73 61 67 65 20 66 72 6f 6d 20 63 68 61 6e 6e 65 sage from channe
7560: 6c 20 61 6e 64 2f 6f 72 20 69 6e 74 65 72 70 72 l and/or interpr
7570: 65 74 65 72 2c 20 73 61 76 65 20 74 68 65 0a 20 eter, save the.
7580: 20 20 20 20 2a 20 72 65 66 65 72 65 6e 63 65 2c * reference,
7590: 20 74 68 65 6e 20 6b 69 6c 6c 20 74 68 65 20 72 then kill the r
75a0: 65 74 75 72 6e 65 64 20 6f 62 6a 65 63 74 73 2c eturned objects,
75b0: 20 69 66 20 74 68 65 72 65 20 77 65 72 65 20 61 if there were a
75c0: 6e 79 2e 20 49 66 20 74 68 65 72 65 0a 20 20 20 ny. If there.
75d0: 20 20 2a 20 61 72 65 20 6d 65 73 73 61 67 65 73 * are messages
75e0: 20 69 6e 20 62 6f 74 68 20 74 68 65 20 63 68 61 in both the cha
75f0: 6e 6e 65 6c 20 68 61 73 20 70 72 65 66 65 72 65 nnel has prefere
7600: 6e 63 65 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 nce.. */..
7610: 20 20 69 66 20 28 28 63 68 61 6e 20 3d 3d 20 4e if ((chan == N
7620: 55 4c 4c 29 20 26 26 20 28 69 6e 74 65 72 70 20 ULL) && (interp
7630: 3d 3d 20 4e 55 4c 4c 29 29 20 7b 0a 09 72 65 74 == NULL)) {..ret
7640: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 urn 0;. }..
7650: 20 20 69 66 20 28 63 68 61 6e 20 21 3d 20 4e 55 if (chan != NU
7660: 4c 4c 29 20 7b 0a 09 54 63 6c 5f 47 65 74 43 68 LL) {..Tcl_GetCh
7670: 61 6e 6e 65 6c 45 72 72 6f 72 28 63 68 61 6e 2c annelError(chan,
7680: 20 26 63 68 61 6e 4d 73 67 4f 62 6a 29 3b 0a 20 &chanMsgObj);.
7690: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 69 6e 74 }. if (int
76a0: 65 72 70 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 erp != NULL) {..
76b0: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 45 72 Tcl_GetChannelEr
76c0: 72 6f 72 49 6e 74 65 72 70 28 69 6e 74 65 72 70 rorInterp(interp
76d0: 2c 20 26 69 6e 74 65 72 70 4d 73 67 4f 62 6a 29 , &interpMsgObj)
76e0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 ;. }.. if
76f0: 28 63 68 61 6e 4d 73 67 4f 62 6a 20 21 3d 20 4e (chanMsgObj != N
7700: 55 4c 4c 29 20 7b 0a 09 6d 73 67 4f 62 6a 20 3d ULL) {..msgObj =
7710: 20 63 68 61 6e 4d 73 67 4f 62 6a 3b 0a 20 20 20 chanMsgObj;.
7720: 20 7d 20 65 6c 73 65 20 69 66 20 28 69 6e 74 65 } else if (inte
7730: 72 70 4d 73 67 4f 62 6a 20 21 3d 20 4e 55 4c 4c rpMsgObj != NULL
7740: 29 20 7b 0a 09 6d 73 67 4f 62 6a 20 3d 20 69 6e ) {..msgObj = in
7750: 74 65 72 70 4d 73 67 4f 62 6a 3b 0a 20 20 20 20 terpMsgObj;.
7760: 7d 0a 20 20 20 20 69 66 20 28 6d 73 67 4f 62 6a }. if (msgObj
7770: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c != NULL) {..Tcl
7780: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 6d 73 _IncrRefCount(ms
7790: 67 4f 62 6a 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 gObj);. }..
77a0: 20 20 69 66 20 28 63 68 61 6e 4d 73 67 4f 62 6a if (chanMsgObj
77b0: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c != NULL) {..Tcl
77c0: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 68 _DecrRefCount(ch
77d0: 61 6e 4d 73 67 4f 62 6a 29 3b 0a 20 20 20 20 7d anMsgObj);. }
77e0: 0a 20 20 20 20 69 66 20 28 69 6e 74 65 72 70 4d . if (interpM
77f0: 73 67 4f 62 6a 20 21 3d 20 4e 55 4c 4c 29 20 7b sgObj != NULL) {
7800: 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 ..Tcl_DecrRefCou
7810: 6e 74 28 69 6e 74 65 72 70 4d 73 67 4f 62 6a 29 nt(interpMsgObj)
7820: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a ;. }.. /*.
7830: 20 20 20 20 20 2a 20 4e 6f 20 6d 65 73 73 61 67 * No messag
7840: 65 20 72 65 74 75 72 6e 65 64 2c 20 6e 6f 74 68 e returned, noth
7850: 69 6e 67 20 63 61 75 67 68 74 2e 0a 20 20 20 20 ing caught..
7860: 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28 6d 73 67 */.. if (msg
7870: 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 Obj == NULL) {..
7880: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a return 0;. }.
7890: 0a 20 20 20 20 55 6e 6d 61 72 73 68 61 6c 6c 45 . UnmarshallE
78a0: 72 72 6f 72 52 65 73 75 6c 74 28 69 6e 74 65 72 rrorResult(inter
78b0: 70 2c 20 6d 73 67 4f 62 6a 29 3b 0a 0a 20 20 20 p, msgObj);..
78c0: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e Tcl_DecrRefCoun
78d0: 74 28 6d 73 67 4f 62 6a 29 3b 0a 20 20 20 20 72 t(msgObj);. r
78e0: 65 74 75 72 6e 20 31 3b 0a 7d 0a 0c 0a 2f 2a 0a eturn 1;.}.../*.
78f0: 20 2a 20 44 72 69 76 65 72 20 66 75 6e 63 74 69 * Driver functi
7900: 6f 6e 73 2e 20 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ons. ===========
7910: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
7920: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
7930: 3d 3d 3d 3d 3d 0a 20 2a 2f 0a 0a 2f 2a 0a 20 2a =====. */../*. *
7940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7980: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 52 65 66 ------. *. * Ref
7990: 6c 65 63 74 43 6c 6f 73 65 20 2d 2d 0a 20 2a 0a lectClose --. *.
79a0: 20 2a 09 54 68 69 73 20 66 75 6e 63 74 69 6f 6e *.This function
79b0: 20 69 73 20 69 6e 76 6f 6b 65 64 20 77 68 65 6e is invoked when
79c0: 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 69 73 20 the channel is
79d0: 63 6c 6f 73 65 64 2c 20 74 6f 20 64 65 6c 65 74 closed, to delet
79e0: 65 20 74 68 65 0a 20 2a 09 64 72 69 76 65 72 20 e the. *.driver
79f0: 73 70 65 63 69 66 69 63 20 69 6e 73 74 61 6e 63 specific instanc
7a00: 65 20 64 61 74 61 2e 0a 20 2a 0a 20 2a 20 52 65 e data.. *. * Re
7a10: 73 75 6c 74 73 3a 0a 20 2a 09 41 20 70 6f 73 69 sults:. *.A posi
7a20: 78 20 65 72 72 6f 72 2e 0a 20 2a 0a 20 2a 20 53 x error.. *. * S
7a30: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
7a40: 52 65 6c 65 61 73 65 73 20 6d 65 6d 6f 72 79 2e Releases memory.
7a50: 20 41 72 62 69 74 72 61 72 79 2c 20 61 73 20 69 Arbitrary, as i
7a60: 74 20 63 61 6c 6c 73 20 75 70 6f 6e 20 61 20 73 t calls upon a s
7a70: 63 72 69 70 74 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d cript.. *. *----
7a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7ac0: 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 --. */..static i
7ad0: 6e 74 0a 52 65 66 6c 65 63 74 43 6c 6f 73 65 28 nt.ReflectClose(
7ae0: 0a 20 20 20 20 43 6c 69 65 6e 74 44 61 74 61 20 . ClientData
7af0: 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 20 20 clientData,.
7b00: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
7b10: 72 70 29 0a 7b 0a 20 20 20 20 52 65 66 6c 65 63 rp).{. Reflec
7b20: 74 65 64 43 68 61 6e 6e 65 6c 20 2a 72 63 50 74 tedChannel *rcPt
7b30: 72 20 3d 20 28 52 65 66 6c 65 63 74 65 64 43 68 r = (ReflectedCh
7b40: 61 6e 6e 65 6c 20 2a 29 20 63 6c 69 65 6e 74 44 annel *) clientD
7b50: 61 74 61 3b 0a 20 20 20 20 69 6e 74 20 72 65 73 ata;. int res
7b60: 75 6c 74 3b 09 09 09 2f 2a 20 52 65 73 75 6c 74 ult;.../* Result
7b70: 20 63 6f 64 65 20 66 6f 72 20 27 63 6c 6f 73 65 code for 'close
7b80: 27 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a ' */. Tcl_Obj
7b90: 20 2a 72 65 73 4f 62 6a 3b 09 09 2f 2a 20 52 65 *resObj;../* Re
7ba0: 73 75 6c 74 20 64 61 74 61 20 66 6f 72 20 27 63 sult data for 'c
7bb0: 6c 6f 73 65 27 20 2a 2f 0a 20 20 20 20 52 65 66 lose' */. Ref
7bc0: 6c 65 63 74 65 64 43 68 61 6e 6e 65 6c 4d 61 70 lectedChannelMap
7bd0: 20 2a 72 63 6d 50 74 72 3b 2f 2a 20 4d 61 70 20 *rcmPtr;/* Map
7be0: 6f 66 20 72 65 66 6c 65 63 74 65 64 20 63 68 61 of reflected cha
7bf0: 6e 6e 65 6c 73 20 77 69 74 68 20 68 61 6e 64 6c nnels with handl
7c00: 65 72 73 20 69 6e 0a 09 09 09 09 20 2a 20 74 68 ers in..... * th
7c10: 69 73 20 69 6e 74 65 72 70 20 2a 2f 0a 20 20 20 is interp */.
7c20: 20 54 63 6c 5f 48 61 73 68 45 6e 74 72 79 20 2a Tcl_HashEntry *
7c30: 68 50 74 72 3b 09 2f 2a 20 45 6e 74 72 79 20 69 hPtr;./* Entry i
7c40: 6e 20 74 68 65 20 61 62 6f 76 65 20 6d 61 70 20 n the above map
7c50: 2a 2f 0a 0a 20 20 20 20 69 66 20 28 69 6e 74 65 */.. if (inte
7c60: 72 70 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 2f rp == NULL) {../
7c70: 2a 0a 09 20 2a 20 54 68 69 73 20 63 61 6c 6c 20 *.. * This call
7c80: 63 6f 6d 65 73 20 66 72 6f 6d 20 54 63 6c 46 69 comes from TclFi
7c90: 6e 61 6c 69 7a 65 49 4f 53 79 73 74 65 6d 2e 20 nalizeIOSystem.
7ca0: 54 68 65 72 65 20 61 72 65 20 6e 6f 0a 09 20 2a There are no.. *
7cb0: 20 69 6e 74 65 72 70 72 65 74 65 72 73 2c 20 61 interpreters, a
7cc0: 6e 64 20 74 68 65 72 65 66 6f 72 65 20 77 65 20 nd therefore we
7cd0: 63 61 6e 6e 6f 74 20 63 61 6c 6c 20 75 70 6f 6e cannot call upon
7ce0: 20 74 68 65 20 68 61 6e 64 6c 65 72 20 63 6f 6d the handler com
7cf0: 6d 61 6e 64 0a 09 20 2a 20 61 6e 79 6d 6f 72 65 mand.. * anymore
7d00: 2e 20 54 68 72 65 61 64 69 6e 67 20 69 73 20 69 . Threading is i
7d10: 72 72 65 6c 65 76 61 6e 74 20 61 73 20 77 65 6c rrelevant as wel
7d20: 6c 2e 20 57 65 20 73 69 6d 70 6c 79 20 63 6c 65 l. We simply cle
7d30: 61 6e 20 75 70 20 61 6c 6c 0a 09 20 2a 20 6f 75 an up all.. * ou
7d40: 72 20 43 20 6c 65 76 65 6c 20 64 61 74 61 20 73 r C level data s
7d50: 74 72 75 63 74 75 72 65 73 20 61 6e 64 20 6c 65 tructures and le
7d60: 61 76 65 20 74 68 65 20 54 63 6c 20 6c 65 76 65 ave the Tcl leve
7d70: 6c 20 74 6f 20 74 68 65 20 6f 74 68 65 72 0a 09 l to the other..
7d80: 20 2a 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 * finalization
7d90: 66 75 6e 63 74 69 6f 6e 73 2e 0a 09 20 2a 2f 0a functions... */.
7da0: 0a 09 2f 2a 0a 09 20 2a 20 54 48 52 45 41 44 45 ../*.. * THREADE
7db0: 44 20 3d 3e 20 46 6f 72 77 61 72 64 20 74 68 69 D => Forward thi
7dc0: 73 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 20 s to the origin
7dd0: 74 68 72 65 61 64 0a 09 20 2a 0a 09 20 2a 20 4e thread.. *.. * N
7de0: 6f 74 65 3a 20 44 65 6c 65 74 65 54 68 72 65 61 ote: DeleteThrea
7df0: 64 52 65 66 6c 65 63 74 65 64 43 68 61 6e 6e 65 dReflectedChanne
7e00: 6c 4d 61 70 28 29 20 69 73 20 74 68 65 20 74 68 lMap() is the th
7e10: 72 65 61 64 20 65 78 69 74 20 68 61 6e 64 6c 65 read exit handle
7e20: 72 20 66 6f 72 20 74 68 65 20 6f 72 69 67 69 6e r for the origin
7e30: 0a 09 20 2a 20 74 68 72 65 61 64 2e 20 55 73 65 .. * thread. Use
7e40: 20 74 68 69 73 20 74 6f 20 63 6c 65 61 6e 20 75 this to clean u
7e50: 70 20 74 68 65 20 73 74 72 75 63 74 75 72 65 3f p the structure?
7e60: 20 45 78 63 65 70 74 20 69 66 20 6c 6f 73 74 3f Except if lost?
7e70: 0a 09 20 2a 2f 0a 0a 23 69 66 64 65 66 20 54 43 .. */..#ifdef TC
7e80: 4c 5f 54 48 52 45 41 44 53 0a 09 69 66 20 28 72 L_THREADS..if (r
7e90: 63 50 74 72 2d 3e 74 68 72 65 61 64 20 21 3d 20 cPtr->thread !=
7ea0: 54 63 6c 5f 47 65 74 43 75 72 72 65 6e 74 54 68 Tcl_GetCurrentTh
7eb0: 72 65 61 64 28 29 29 20 7b 0a 09 20 20 20 20 46 read()) {.. F
7ec0: 6f 72 77 61 72 64 50 61 72 61 6d 20 70 3b 0a 0a orwardParam p;..
7ed0: 09 20 20 20 20 46 6f 72 77 61 72 64 4f 70 54 6f . ForwardOpTo
7ee0: 4f 77 6e 65 72 54 68 72 65 61 64 28 72 63 50 74 OwnerThread(rcPt
7ef0: 72 2c 20 46 6f 72 77 61 72 64 65 64 43 6c 6f 73 r, ForwardedClos
7f00: 65 2c 20 26 70 29 3b 0a 09 20 20 20 20 72 65 73 e, &p);.. res
7f10: 75 6c 74 20 3d 20 70 2e 62 61 73 65 2e 63 6f 64 ult = p.base.cod
7f20: 65 3b 0a 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 e;... /*..
7f30: 20 20 2a 20 46 72 65 65 52 65 66 6c 65 63 74 65 * FreeReflecte
7f40: 64 43 68 61 6e 6e 65 6c 20 69 73 20 64 6f 6e 65 dChannel is done
7f50: 20 69 6e 20 74 68 65 20 66 6f 72 77 61 72 64 65 in the forwarde
7f60: 64 20 6f 70 65 72 61 74 69 6f 6e 21 2c 20 69 6e d operation!, in
7f70: 0a 09 20 20 20 20 20 2a 20 74 68 65 20 6f 74 68 .. * the oth
7f80: 65 72 20 74 68 72 65 61 64 2e 20 72 63 50 74 72 er thread. rcPtr
7f90: 20 68 65 72 65 20 69 73 20 67 6f 6e 65 21 0a 09 here is gone!..
7fa0: 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20 69 66 */... if
7fb0: 20 28 72 65 73 75 6c 74 20 21 3d 20 54 43 4c 5f (result != TCL_
7fc0: 4f 4b 29 20 7b 0a 09 09 46 72 65 65 52 65 63 65 OK) {...FreeRece
7fd0: 69 76 65 64 45 72 72 6f 72 28 26 70 29 3b 0a 09 ivedError(&p);..
7fe0: 20 20 20 20 7d 0a 09 20 20 20 20 72 65 74 75 72 }.. retur
7ff0: 6e 20 45 4f 4b 3b 0a 09 7d 0a 23 65 6e 64 69 66 n EOK;..}.#endif
8000: 0a 0a 09 46 72 65 65 52 65 66 6c 65 63 74 65 64 ...FreeReflected
8010: 43 68 61 6e 6e 65 6c 28 72 63 50 74 72 29 3b 0a Channel(rcPtr);.
8020: 09 72 65 74 75 72 6e 20 45 4f 4b 3b 0a 20 20 20 .return EOK;.
8030: 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 }.. /*.
8040: 2a 20 2d 2d 20 4e 6f 20 2d 2d 20 41 53 53 45 52 * -- No -- ASSER
8050: 54 20 72 63 50 74 72 2d 3e 6d 65 74 68 6f 64 73 T rcPtr->methods
8060: 20 26 20 46 4c 41 47 28 4d 45 54 48 5f 46 49 4e & FLAG(METH_FIN
8070: 41 4c 29 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 AL). *.
8080: 2a 20 41 20 63 6c 65 61 6e 65 64 20 6d 65 74 68 * A cleaned meth
8090: 6f 64 20 6d 61 73 6b 20 68 65 72 65 20 69 6d 70 od mask here imp
80a0: 6c 69 65 73 20 74 68 61 74 20 74 68 65 20 63 68 lies that the ch
80b0: 61 6e 6e 65 6c 20 63 72 65 61 74 69 6f 6e 20 77 annel creation w
80c0: 61 73 0a 20 20 20 20 20 2a 20 61 62 6f 72 74 65 as. * aborte
80d0: 64 2c 20 61 6e 64 20 22 66 69 6e 61 6c 69 7a 65 d, and "finalize
80e0: 22 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 63 61 " must not be ca
80f0: 6c 6c 65 64 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 lled.. */..
8100: 20 20 20 69 66 20 28 72 63 50 74 72 2d 3e 6d 65 if (rcPtr->me
8110: 74 68 6f 64 73 20 3d 3d 20 30 29 20 7b 0a 09 46 thods == 0) {..F
8120: 72 65 65 52 65 66 6c 65 63 74 65 64 43 68 61 6e reeReflectedChan
8130: 6e 65 6c 28 72 63 50 74 72 29 3b 0a 09 72 65 74 nel(rcPtr);..ret
8140: 75 72 6e 20 45 4f 4b 3b 0a 20 20 20 20 7d 0a 0a urn EOK;. }..
8150: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 41 72 /*. * Ar
8160: 65 20 77 65 20 69 6e 20 74 68 65 20 63 6f 72 72 e we in the corr
8170: 65 63 74 20 74 68 72 65 61 64 3f 0a 20 20 20 20 ect thread?.
8180: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 54 43 4c 5f */..#ifdef TCL_
8190: 54 48 52 45 41 44 53 0a 20 20 20 20 69 66 20 28 THREADS. if (
81a0: 72 63 50 74 72 2d 3e 74 68 72 65 61 64 20 21 3d rcPtr->thread !=
81b0: 20 54 63 6c 5f 47 65 74 43 75 72 72 65 6e 74 54 Tcl_GetCurrentT
81c0: 68 72 65 61 64 28 29 29 20 7b 0a 09 46 6f 72 77 hread()) {..Forw
81d0: 61 72 64 50 61 72 61 6d 20 70 3b 0a 0a 09 46 6f ardParam p;...Fo
81e0: 72 77 61 72 64 4f 70 54 6f 4f 77 6e 65 72 54 68 rwardOpToOwnerTh
81f0: 72 65 61 64 28 72 63 50 74 72 2c 20 46 6f 72 77 read(rcPtr, Forw
8200: 61 72 64 65 64 43 6c 6f 73 65 2c 20 26 70 29 3b ardedClose, &p);
8210: 0a 09 72 65 73 75 6c 74 20 3d 20 70 2e 62 61 73 ..result = p.bas
8220: 65 2e 63 6f 64 65 3b 0a 0a 09 2f 2a 0a 09 20 2a e.code;.../*.. *
8230: 20 46 72 65 65 52 65 66 6c 65 63 74 65 64 43 68 FreeReflectedCh
8240: 61 6e 6e 65 6c 20 69 73 20 64 6f 6e 65 20 69 6e annel is done in
8250: 20 74 68 65 20 66 6f 72 77 61 72 64 65 64 20 6f the forwarded o
8260: 70 65 72 61 74 69 6f 6e 21 2c 20 69 6e 20 74 68 peration!, in th
8270: 65 0a 09 20 2a 20 6f 74 68 65 72 20 74 68 72 65 e.. * other thre
8280: 61 64 2e 20 72 63 50 74 72 20 68 65 72 65 20 69 ad. rcPtr here i
8290: 73 20 67 6f 6e 65 21 0a 09 20 2a 2f 0a 0a 09 69 s gone!.. */...i
82a0: 66 20 28 72 65 73 75 6c 74 20 21 3d 20 54 43 4c f (result != TCL
82b0: 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 50 61 73 73 _OK) {.. Pass
82c0: 52 65 63 65 69 76 65 64 45 72 72 6f 72 49 6e 74 ReceivedErrorInt
82d0: 65 72 70 28 69 6e 74 65 72 70 2c 20 26 70 29 3b erp(interp, &p);
82e0: 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b ..}. } else {
82f0: 0a 23 65 6e 64 69 66 0a 09 72 65 73 75 6c 74 20 .#endif..result
8300: 3d 20 49 6e 76 6f 6b 65 54 63 6c 4d 65 74 68 6f = InvokeTclMetho
8310: 64 28 72 63 50 74 72 2c 20 22 66 69 6e 61 6c 69 d(rcPtr, "finali
8320: 7a 65 22 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c ze", NULL, NULL,
8330: 20 26 72 65 73 4f 62 6a 29 3b 0a 09 69 66 20 28 &resObj);..if (
8340: 28 72 65 73 75 6c 74 20 21 3d 20 54 43 4c 5f 4f (result != TCL_O
8350: 4b 29 20 26 26 20 28 69 6e 74 65 72 70 20 21 3d K) && (interp !=
8360: 20 4e 55 4c 4c 29 29 20 7b 0a 09 20 20 20 20 54 NULL)) {.. T
8370: 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 45 72 72 cl_SetChannelErr
8380: 6f 72 49 6e 74 65 72 70 28 69 6e 74 65 72 70 2c orInterp(interp,
8390: 20 72 65 73 4f 62 6a 29 3b 0a 09 7d 0a 0a 09 54 resObj);..}...T
83a0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 cl_DecrRefCount(
83b0: 72 65 73 4f 62 6a 29 3b 09 2f 2a 20 52 65 6d 6f resObj);./* Remo
83c0: 76 65 20 72 65 66 65 72 65 6e 63 65 20 77 65 20 ve reference we
83d0: 68 65 6c 64 20 66 72 6f 6d 20 74 68 65 0a 09 09 held from the...
83e0: 09 09 09 20 2a 20 69 6e 76 6f 6b 65 20 2a 2f 0a ... * invoke */.
83f0: 0a 09 2f 2a 0a 09 20 2a 20 52 65 6d 6f 76 65 20 ../*.. * Remove
8400: 74 68 65 20 63 68 61 6e 6e 65 6c 20 66 72 6f 6d the channel from
8410: 20 74 68 65 20 6d 61 70 20 62 65 66 6f 72 65 20 the map before
8420: 72 65 6c 65 61 73 69 6e 67 20 74 68 65 20 6d 65 releasing the me
8430: 6d 6f 72 79 2c 20 74 6f 0a 09 20 2a 20 70 72 65 mory, to.. * pre
8440: 76 65 6e 74 20 66 75 74 75 72 65 20 61 63 63 65 vent future acce
8450: 73 73 65 73 20 28 6c 69 6b 65 20 62 79 20 27 70 sses (like by 'p
8460: 6f 73 74 65 76 65 6e 74 27 29 20 66 72 6f 6d 20 ostevent') from
8470: 66 69 6e 64 69 6e 67 20 61 6e 64 0a 09 20 2a 20 finding and.. *
8480: 64 65 72 65 66 65 72 65 6e 63 69 6e 67 20 61 20 dereferencing a
8490: 64 61 6e 67 6c 69 6e 67 20 70 6f 69 6e 74 65 72 dangling pointer
84a0: 2e 0a 09 20 2a 0a 09 20 2a 20 4e 4f 54 45 3a 20 ... *.. * NOTE:
84b0: 54 68 65 20 63 68 61 6e 6e 65 6c 20 6d 61 79 20 The channel may
84c0: 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20 6d 61 not be in the ma
84d0: 70 2e 20 54 68 69 73 20 69 73 20 6f 6b 2c 20 74 p. This is ok, t
84e0: 68 61 74 20 68 61 70 70 65 6e 73 0a 09 20 2a 20 hat happens.. *
84f0: 77 68 65 6e 20 74 68 65 20 63 68 61 6e 6e 65 6c when the channel
8500: 20 77 61 73 20 63 72 65 61 74 65 64 20 69 6e 20 was created in
8510: 61 20 64 69 66 66 65 72 65 6e 74 20 69 6e 74 65 a different inte
8520: 72 70 72 65 74 65 72 20 61 6e 64 2f 6f 72 0a 09 rpreter and/or..
8530: 20 2a 20 74 68 72 65 61 64 20 61 6e 64 20 74 68 * thread and th
8540: 65 6e 20 77 61 73 20 6d 6f 76 65 64 20 68 65 72 en was moved her
8550: 65 2e 0a 09 20 2a 2f 0a 0a 09 72 63 6d 50 74 72 e... */...rcmPtr
8560: 20 3d 20 47 65 74 52 65 66 6c 65 63 74 65 64 43 = GetReflectedC
8570: 68 61 6e 6e 65 6c 4d 61 70 28 69 6e 74 65 72 70 hannelMap(interp
8580: 29 3b 0a 09 68 50 74 72 20 3d 20 54 63 6c 5f 46 );..hPtr = Tcl_F
8590: 69 6e 64 48 61 73 68 45 6e 74 72 79 28 26 72 63 indHashEntry(&rc
85a0: 6d 50 74 72 2d 3e 6d 61 70 2c 0a 09 09 54 63 6c mPtr->map,...Tcl
85b0: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 _GetChannelName(
85c0: 72 63 50 74 72 2d 3e 63 68 61 6e 29 29 3b 0a 09 rcPtr->chan));..
85d0: 69 66 20 28 68 50 74 72 29 20 7b 0a 09 20 20 20 if (hPtr) {..
85e0: 20 54 63 6c 5f 44 65 6c 65 74 65 48 61 73 68 45 Tcl_DeleteHashE
85f0: 6e 74 72 79 28 68 50 74 72 29 3b 0a 09 7d 0a 23 ntry(hPtr);..}.#
8600: 69 66 64 65 66 20 54 43 4c 5f 54 48 52 45 41 44 ifdef TCL_THREAD
8610: 53 0a 20 20 20 20 20 20 20 20 72 63 6d 50 74 72 S. rcmPtr
8620: 20 3d 20 47 65 74 54 68 72 65 61 64 52 65 66 6c = GetThreadRefl
8630: 65 63 74 65 64 43 68 61 6e 6e 65 6c 4d 61 70 28 ectedChannelMap(
8640: 29 3b 0a 09 68 50 74 72 20 3d 20 54 63 6c 5f 46 );..hPtr = Tcl_F
8650: 69 6e 64 48 61 73 68 45 6e 74 72 79 28 26 72 63 indHashEntry(&rc
8660: 6d 50 74 72 2d 3e 6d 61 70 2c 0a 09 09 54 63 6c mPtr->map,...Tcl
8670: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 _GetChannelName(
8680: 72 63 50 74 72 2d 3e 63 68 61 6e 29 29 3b 0a 09 rcPtr->chan));..
8690: 69 66 20 28 68 50 74 72 29 20 7b 0a 09 20 20 20 if (hPtr) {..
86a0: 20 54 63 6c 5f 44 65 6c 65 74 65 48 61 73 68 45 Tcl_DeleteHashE
86b0: 6e 74 72 79 28 68 50 74 72 29 3b 0a 09 7d 0a 23 ntry(hPtr);..}.#
86c0: 65 6e 64 69 66 0a 0a 09 46 72 65 65 52 65 66 6c endif...FreeRefl
86d0: 65 63 74 65 64 43 68 61 6e 6e 65 6c 28 72 63 50 ectedChannel(rcP
86e0: 74 72 29 3b 0a 23 69 66 64 65 66 20 54 43 4c 5f tr);.#ifdef TCL_
86f0: 54 48 52 45 41 44 53 0a 20 20 20 20 7d 0a 23 65 THREADS. }.#e
8700: 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 ndif. return
8710: 28 72 65 73 75 6c 74 20 3d 3d 20 54 43 4c 5f 4f (result == TCL_O
8720: 4b 29 20 3f 20 45 4f 4b 20 3a 20 45 49 4e 56 41 K) ? EOK : EINVA
8730: 4c 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d L;.}.../*. *----
8740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8780: 2d 2d 0a 20 2a 0a 20 2a 20 52 65 66 6c 65 63 74 --. *. * Reflect
8790: 49 6e 70 75 74 20 2d 2d 0a 20 2a 0a 20 2a 09 54 Input --. *. *.T
87a0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 his function is
87b0: 69 6e 76 6f 6b 65 64 20 77 68 65 6e 20 6d 6f 72 invoked when mor
87c0: 65 20 64 61 74 61 20 69 73 20 72 65 71 75 65 73 e data is reques
87d0: 74 65 64 20 66 72 6f 6d 20 74 68 65 20 63 68 61 ted from the cha
87e0: 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 nnel.. *. * Resu
87f0: 6c 74 73 3a 0a 20 2a 09 54 68 65 20 6e 75 6d 62 lts:. *.The numb
8800: 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 61 64 er of bytes read
8810: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 .. *. * Side eff
8820: 65 63 74 73 3a 0a 20 2a 09 41 6c 6c 6f 63 61 74 ects:. *.Allocat
8830: 65 73 20 6d 65 6d 6f 72 79 2e 20 41 72 62 69 74 es memory. Arbit
8840: 72 61 72 79 2c 20 61 73 20 69 74 20 63 61 6c 6c rary, as it call
8850: 73 20 75 70 6f 6e 20 61 20 73 63 72 69 70 74 2e s upon a script.
8860: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
8870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
88a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
88b0: 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 52 65 66 ..static int.Ref
88c0: 6c 65 63 74 49 6e 70 75 74 28 0a 20 20 20 20 43 lectInput(. C
88d0: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 lientData client
88e0: 44 61 74 61 2c 0a 20 20 20 20 63 68 61 72 20 2a Data,. char *
88f0: 62 75 66 2c 0a 20 20 20 20 69 6e 74 20 74 6f 52 buf,. int toR
8900: 65 61 64 2c 0a 20 20 20 20 69 6e 74 20 2a 65 72 ead,. int *er
8910: 72 6f 72 43 6f 64 65 50 74 72 29 0a 7b 0a 20 20 rorCodePtr).{.
8920: 20 20 52 65 66 6c 65 63 74 65 64 43 68 61 6e 6e ReflectedChann
8930: 65 6c 20 2a 72 63 50 74 72 20 3d 20 28 52 65 66 el *rcPtr = (Ref
8940: 6c 65 63 74 65 64 43 68 61 6e 6e 65 6c 20 2a 29 lectedChannel *)
8950: 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 20 clientData;.
8960: 20 54 63 6c 5f 4f 62 6a 20 2a 74 6f 52 65 61 64 Tcl_Obj *toRead
8970: 4f 62 6a 3b 0a 20 20 20 20 69 6e 74 20 62 79 74 Obj;. int byt
8980: 65 63 3b 09 09 09 2f 2a 20 4e 75 6d 62 65 72 20 ec;.../* Number
8990: 6f 66 20 72 65 74 75 72 6e 65 64 20 62 79 74 65 of returned byte
89a0: 73 20 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65 s */. unsigne
89b0: 64 20 63 68 61 72 20 2a 62 79 74 65 76 3b 09 2f d char *bytev;./
89c0: 2a 20 41 72 72 61 79 20 6f 66 20 72 65 74 75 72 * Array of retur
89d0: 6e 65 64 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 ned bytes */.
89e0: 20 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 4f 62 6a Tcl_Obj *resObj
89f0: 3b 09 09 2f 2a 20 52 65 73 75 6c 74 20 64 61 74 ;../* Result dat
8a00: 61 20 66 6f 72 20 27 72 65 61 64 27 20 2a 2f 0a a for 'read' */.
8a10: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 54 . /*. * T
8a20: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 65 he following che
8a30: 63 6b 20 63 61 6e 20 62 65 20 64 6f 6e 65 20 62 ck can be done b
8a40: 65 66 6f 72 65 20 74 68 72 65 61 64 20 72 65 64 efore thread red
8a50: 69 72 65 63 74 69 6f 6e 2c 20 62 65 63 61 75 73 irection, becaus
8a60: 65 20 77 65 0a 20 20 20 20 20 2a 20 61 72 65 20 e we. * are
8a70: 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 61 6e 20 reading from an
8a80: 69 74 65 6d 20 77 68 69 63 68 20 69 73 20 72 65 item which is re
8a90: 61 64 6f 6e 6c 79 2c 20 69 2e 65 2e 20 77 69 6c adonly, i.e. wil
8aa0: 6c 20 6e 65 76 65 72 20 63 68 61 6e 67 65 0a 20 l never change.
8ab0: 20 20 20 20 2a 20 64 75 72 69 6e 67 20 74 68 65 * during the
8ac0: 20 6c 69 66 65 74 69 6d 65 20 6f 66 20 74 68 65 lifetime of the
8ad0: 20 63 68 61 6e 6e 65 6c 2e 0a 20 20 20 20 20 2a channel.. *
8ae0: 2f 0a 0a 20 20 20 20 69 66 20 28 21 28 72 63 50 /.. if (!(rcP
8af0: 74 72 2d 3e 6d 65 74 68 6f 64 73 20 26 20 46 4c tr->methods & FL
8b00: 41 47 28 4d 45 54 48 5f 52 45 41 44 29 29 29 20 AG(METH_READ)))
8b10: 7b 0a 09 53 65 74 43 68 61 6e 6e 65 6c 45 72 72 {..SetChannelErr
8b20: 6f 72 53 74 72 28 72 63 50 74 72 2d 3e 63 68 61 orStr(rcPtr->cha
8b30: 6e 2c 20 6d 73 67 5f 72 65 61 64 5f 75 6e 73 75 n, msg_read_unsu
8b40: 70 29 3b 0a 09 2a 65 72 72 6f 72 43 6f 64 65 50 p);..*errorCodeP
8b50: 74 72 20 3d 20 45 49 4e 56 41 4c 3b 0a 09 72 65 tr = EINVAL;..re
8b60: 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a turn -1;. }..
8b70: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 41 72 /*. * Ar
8b80: 65 20 77 65 20 69 6e 20 74 68 65 20 63 6f 72 72 e we in the corr
8b90: 65 63 74 20 74 68 72 65 61 64 3f 0a 20 20 20 20 ect thread?.
8ba0: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 54 43 4c 5f */..#ifdef TCL_
8bb0: 54 48 52 45 41 44 53 0a 20 20 20 20 69 66 20 28 THREADS. if (
8bc0: 72 63 50 74 72 2d 3e 74 68 72 65 61 64 20 21 3d rcPtr->thread !=
8bd0: 20 54 63 6c 5f 47 65 74 43 75 72 72 65 6e 74 54 Tcl_GetCurrentT
8be0: 68 72 65 61 64 28 29 29 20 7b 0a 09 46 6f 72 77 hread()) {..Forw
8bf0: 61 72 64 50 61 72 61 6d 20 70 3b 0a 0a 09 70 2e ardParam p;...p.
8c00: 69 6e 70 75 74 2e 62 75 66 20 3d 20 62 75 66 3b input.buf = buf;
8c10: 0a 09 70 2e 69 6e 70 75 74 2e 74 6f 52 65 61 64 ..p.input.toRead
8c20: 20 3d 20 74 6f 52 65 61 64 3b 0a 0a 09 46 6f 72 = toRead;...For
8c30: 77 61 72 64 4f 70 54 6f 4f 77 6e 65 72 54 68 72 wardOpToOwnerThr
8c40: 65 61 64 28 72 63 50 74 72 2c 20 46 6f 72 77 61 ead(rcPtr, Forwa
8c50: 72 64 65 64 49 6e 70 75 74 2c 20 26 70 29 3b 0a rdedInput, &p);.
8c60: 0a 09 69 66 20 28 70 2e 62 61 73 65 2e 63 6f 64 ..if (p.base.cod
8c70: 65 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 e != TCL_OK) {..
8c80: 20 20 20 20 50 61 73 73 52 65 63 65 69 76 65 64 PassReceived
8c90: 45 72 72 6f 72 28 72 63 50 74 72 2d 3e 63 68 61 Error(rcPtr->cha
8ca0: 6e 2c 20 26 70 29 3b 0a 09 20 20 20 20 2a 65 72 n, &p);.. *er
8cb0: 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 49 4e rorCodePtr = EIN
8cc0: 56 41 4c 3b 0a 09 20 20 20 20 70 2e 69 6e 70 75 VAL;.. p.inpu
8cd0: 74 2e 74 6f 52 65 61 64 20 3d 20 2d 31 3b 0a 09 t.toRead = -1;..
8ce0: 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 2a 65 } else {.. *e
8cf0: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 4f rrorCodePtr = EO
8d00: 4b 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 20 70 K;..}...return p
8d10: 2e 69 6e 70 75 74 2e 74 6f 52 65 61 64 3b 0a 20 .input.toRead;.
8d20: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 }.#endif..
8d30: 20 2f 2a 20 41 53 53 45 52 54 3a 20 72 63 50 74 /* ASSERT: rcPt
8d40: 72 2d 3e 6d 65 74 68 6f 64 20 26 20 46 4c 41 47 r->method & FLAG
8d50: 28 4d 45 54 48 5f 52 45 41 44 29 20 2a 2f 0a 20 (METH_READ) */.
8d60: 20 20 20 2f 2a 20 41 53 53 45 52 54 3a 20 72 63 /* ASSERT: rc
8d70: 50 74 72 2d 3e 6d 6f 64 65 20 26 20 54 43 4c 5f Ptr->mode & TCL_
8d80: 52 45 41 44 41 42 4c 45 20 2a 2f 0a 0a 20 20 20 READABLE */..
8d90: 20 74 6f 52 65 61 64 4f 62 6a 20 3d 20 54 63 6c toReadObj = Tcl
8da0: 5f 4e 65 77 49 6e 74 4f 62 6a 28 74 6f 52 65 61 _NewIntObj(toRea
8db0: 64 29 3b 0a 20 20 20 20 69 66 20 28 49 6e 76 6f d);. if (Invo
8dc0: 6b 65 54 63 6c 4d 65 74 68 6f 64 28 72 63 50 74 keTclMethod(rcPt
8dd0: 72 2c 20 22 72 65 61 64 22 2c 20 74 6f 52 65 61 r, "read", toRea
8de0: 64 4f 62 6a 2c 20 4e 55 4c 4c 2c 20 26 72 65 73 dObj, NULL, &res
8df0: 4f 62 6a 29 21 3d 54 43 4c 5f 4f 4b 29 20 7b 0a Obj)!=TCL_OK) {.
8e00: 09 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 45 .Tcl_SetChannelE
8e10: 72 72 6f 72 28 72 63 50 74 72 2d 3e 63 68 61 6e rror(rcPtr->chan
8e20: 2c 20 72 65 73 4f 62 6a 29 3b 0a 09 54 63 6c 5f , resObj);..Tcl_
8e30: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 72 65 73 DecrRefCount(res
8e40: 4f 62 6a 29 3b 09 2f 2a 20 52 65 6d 6f 76 65 20 Obj);./* Remove
8e50: 72 65 66 65 72 65 6e 63 65 20 68 65 6c 64 20 66 reference held f
8e60: 72 6f 6d 20 69 6e 76 6f 6b 65 20 2a 2f 0a 09 2a rom invoke */..*
8e70: 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 errorCodePtr = E
8e80: 49 4e 56 41 4c 3b 0a 09 72 65 74 75 72 6e 20 2d INVAL;..return -
8e90: 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 62 79 1;. }.. by
8ea0: 74 65 76 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 tev = Tcl_GetByt
8eb0: 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 72 65 eArrayFromObj(re
8ec0: 73 4f 62 6a 2c 20 26 62 79 74 65 63 29 3b 0a 0a sObj, &bytec);..
8ed0: 20 20 20 20 69 66 20 28 74 6f 52 65 61 64 20 3c if (toRead <
8ee0: 20 62 79 74 65 63 29 20 7b 0a 09 54 63 6c 5f 44 bytec) {..Tcl_D
8ef0: 65 63 72 52 65 66 43 6f 75 6e 74 28 72 65 73 4f ecrRefCount(resO
8f00: 62 6a 29 3b 09 2f 2a 20 52 65 6d 6f 76 65 20 72 bj);./* Remove r
8f10: 65 66 65 72 65 6e 63 65 20 68 65 6c 64 20 66 72 eference held fr
8f20: 6f 6d 20 69 6e 76 6f 6b 65 20 2a 2f 0a 09 53 65 om invoke */..Se
8f30: 74 43 68 61 6e 6e 65 6c 45 72 72 6f 72 53 74 72 tChannelErrorStr
8f40: 28 72 63 50 74 72 2d 3e 63 68 61 6e 2c 20 6d 73 (rcPtr->chan, ms
8f50: 67 5f 72 65 61 64 5f 74 6f 6f 6d 75 63 68 29 3b g_read_toomuch);
8f60: 0a 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 ..*errorCodePtr
8f70: 3d 20 45 49 4e 56 41 4c 3b 0a 09 72 65 74 75 72 = EINVAL;..retur
8f80: 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 n -1;. }..
8f90: 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d *errorCodePtr =
8fa0: 20 45 4f 4b 3b 0a 0a 20 20 20 20 69 66 20 28 62 EOK;.. if (b
8fb0: 79 74 65 63 20 3e 20 30 29 20 7b 0a 09 6d 65 6d ytec > 0) {..mem
8fc0: 63 70 79 28 62 75 66 2c 20 62 79 74 65 76 2c 20 cpy(buf, bytev,
8fd0: 28 73 69 7a 65 5f 74 29 62 79 74 65 63 29 3b 0a (size_t)bytec);.
8fe0: 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 44 }.. Tcl_D
8ff0: 65 63 72 52 65 66 43 6f 75 6e 74 28 72 65 73 4f ecrRefCount(resO
9000: 62 6a 29 3b 09 09 2f 2a 20 52 65 6d 6f 76 65 20 bj);../* Remove
9010: 72 65 66 65 72 65 6e 63 65 20 68 65 6c 64 20 66 reference held f
9020: 72 6f 6d 20 69 6e 76 6f 6b 65 20 2a 2f 0a 20 20 rom invoke */.
9030: 20 20 72 65 74 75 72 6e 20 62 79 74 65 63 3b 0a return bytec;.
9040: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d }.../*. *-------
9050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
9090: 20 2a 0a 20 2a 20 52 65 66 6c 65 63 74 4f 75 74 *. * ReflectOut
90a0: 70 75 74 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 put --. *. *.Thi
90b0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e s function is in
90c0: 76 6f 6b 65 64 20 77 68 65 6e 20 64 61 74 61 20 voked when data
90d0: 69 73 20 77 72 69 74 65 6e 20 74 6f 20 74 68 65 is writen to the
90e0: 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 20 channel.. *. *
90f0: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 54 68 65 20 Results:. *.The
9100: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 number of bytes
9110: 61 63 74 75 61 6c 6c 79 20 77 72 69 74 74 65 6e actually written
9120: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 .. *. * Side eff
9130: 65 63 74 73 3a 0a 20 2a 09 41 6c 6c 6f 63 61 74 ects:. *.Allocat
9140: 65 73 20 6d 65 6d 6f 72 79 2e 20 41 72 62 69 74 es memory. Arbit
9150: 72 61 72 79 2c 20 61 73 20 69 74 20 63 61 6c 6c rary, as it call
9160: 73 20 75 70 6f 6e 20 61 20 73 63 72 69 70 74 2e s upon a script.
9170: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
9180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
91a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
91b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
91c0: 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 52 65 66 ..static int.Ref
91d0: 6c 65 63 74 4f 75 74 70 75 74 28 0a 20 20 20 20 lectOutput(.
91e0: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e ClientData clien
91f0: 74 44 61 74 61 2c 0a 20 20 20 20 63 6f 6e 73 74 tData,. const
9200: 20 63 68 61 72 20 2a 62 75 66 2c 0a 20 20 20 20 char *buf,.
9210: 69 6e 74 20 74 6f 57 72 69 74 65 2c 0a 20 20 20 int toWrite,.
9220: 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65 50 int *errorCodeP
9230: 74 72 29 0a 7b 0a 20 20 20 20 52 65 66 6c 65 63 tr).{. Reflec
9240: 74 65 64 43 68 61 6e 6e 65 6c 20 2a 72 63 50 74 tedChannel *rcPt
9250: 72 20 3d 20 28 52 65 66 6c 65 63 74 65 64 43 68 r = (ReflectedCh
9260: 61 6e 6e 65 6c 20 2a 29 20 63 6c 69 65 6e 74 44 annel *) clientD
9270: 61 74 61 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a ata;. Tcl_Obj
9280: 20 2a 62 75 66 4f 62 6a 3b 0a 20 20 20 20 54 63 *bufObj;. Tc
9290: 6c 5f 4f 62 6a 20 2a 72 65 73 4f 62 6a 3b 09 09 l_Obj *resObj;..
92a0: 2f 2a 20 52 65 73 75 6c 74 20 64 61 74 61 20 66 /* Result data f
92b0: 6f 72 20 27 77 72 69 74 65 27 20 2a 2f 0a 20 20 or 'write' */.
92c0: 20 20 69 6e 74 20 77 72 69 74 74 65 6e 3b 0a 0a int written;..
92d0: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 54 68 /*. * Th
92e0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 65 63 e following chec
92f0: 6b 20 63 61 6e 20 62 65 20 64 6f 6e 65 20 62 65 k can be done be
9300: 66 6f 72 65 20 74 68 72 65 61 64 20 72 65 64 69 fore thread redi
9310: 72 65 63 74 69 6f 6e 2c 20 62 65 63 61 75 73 65 rection, because
9320: 20 77 65 0a 20 20 20 20 20 2a 20 61 72 65 20 72 we. * are r
9330: 65 61 64 69 6e 67 20 66 72 6f 6d 20 61 6e 20 69 eading from an i
9340: 74 65 6d 20 77 68 69 63 68 20 69 73 20 72 65 61 tem which is rea
9350: 64 6f 6e 6c 79 2c 20 69 2e 65 2e 20 77 69 6c 6c donly, i.e. will
9360: 20 6e 65 76 65 72 20 63 68 61 6e 67 65 0a 20 20 never change.
9370: 20 20 20 2a 20 64 75 72 69 6e 67 20 74 68 65 20 * during the
9380: 6c 69 66 65 74 69 6d 65 20 6f 66 20 74 68 65 20 lifetime of the
9390: 63 68 61 6e 6e 65 6c 2e 0a 20 20 20 20 20 2a 2f channel.. */
93a0: 0a 0a 20 20 20 20 69 66 20 28 21 28 72 63 50 74 .. if (!(rcPt
93b0: 72 2d 3e 6d 65 74 68 6f 64 73 20 26 20 46 4c 41 r->methods & FLA
93c0: 47 28 4d 45 54 48 5f 57 52 49 54 45 29 29 29 20 G(METH_WRITE)))
93d0: 7b 0a 09 53 65 74 43 68 61 6e 6e 65 6c 45 72 72 {..SetChannelErr
93e0: 6f 72 53 74 72 28 72 63 50 74 72 2d 3e 63 68 61 orStr(rcPtr->cha
93f0: 6e 2c 20 6d 73 67 5f 77 72 69 74 65 5f 75 6e 73 n, msg_write_uns
9400: 75 70 29 3b 0a 09 2a 65 72 72 6f 72 43 6f 64 65 up);..*errorCode
9410: 50 74 72 20 3d 20 45 49 4e 56 41 4c 3b 0a 09 72 Ptr = EINVAL;..r
9420: 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a eturn -1;. }.
9430: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 41 . /*. * A
9440: 72 65 20 77 65 20 69 6e 20 74 68 65 20 63 6f 72 re we in the cor
9450: 72 65 63 74 20 74 68 72 65 61 64 3f 0a 20 20 20 rect thread?.
9460: 20 20 2a 2f 0a 0a 23 69 66 64 65 66 20 54 43 4c */..#ifdef TCL
9470: 5f 54 48 52 45 41 44 53 0a 20 20 20 20 69 66 20 _THREADS. if
9480: 28 72 63 50 74 72 2d 3e 74 68 72 65 61 64 20 21 (rcPtr->thread !
9490: 3d 20 54 63 6c 5f 47 65 74 43 75 72 72 65 6e 74 = Tcl_GetCurrent
94a0: 54 68 72 65 61 64 28 29 29 20 7b 0a 09 46 6f 72 Thread()) {..For
94b0: 77 61 72 64 50 61 72 61 6d 20 70 3b 0a 0a 09 70 wardParam p;...p
94c0: 2e 6f 75 74 70 75 74 2e 62 75 66 20 3d 20 62 75 .output.buf = bu
94d0: 66 3b 0a 09 70 2e 6f 75 74 70 75 74 2e 74 6f 57 f;..p.output.toW
94e0: 72 69 74 65 20 3d 20 74 6f 57 72 69 74 65 3b 0a rite = toWrite;.
94f0: 0a 09 46 6f 72 77 61 72 64 4f 70 54 6f 4f 77 6e ..ForwardOpToOwn
9500: 65 72 54 68 72 65 61 64 28 72 63 50 74 72 2c 20 erThread(rcPtr,
9510: 46 6f 72 77 61 72 64 65 64 4f 75 74 70 75 74 2c ForwardedOutput,
9520: 20 26 70 29 3b 0a 0a 09 69 66 20 28 70 2e 62 61 &p);...if (p.ba
9530: 73 65 2e 63 6f 64 65 20 21 3d 20 54 43 4c 5f 4f se.code != TCL_O
9540: 4b 29 20 7b 0a 09 20 20 20 20 50 61 73 73 52 65 K) {.. PassRe
9550: 63 65 69 76 65 64 45 72 72 6f 72 28 72 63 50 74 ceivedError(rcPt
9560: 72 2d 3e 63 68 61 6e 2c 20 26 70 29 3b 0a 09 20 r->chan, &p);..
9570: 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 *errorCodePtr
9580: 20 3d 20 45 49 4e 56 41 4c 3b 0a 09 20 20 20 20 = EINVAL;..
9590: 70 2e 6f 75 74 70 75 74 2e 74 6f 57 72 69 74 65 p.output.toWrite
95a0: 20 3d 20 2d 31 3b 0a 09 7d 20 65 6c 73 65 20 7b = -1;..} else {
95b0: 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 .. *errorCode
95c0: 50 74 72 20 3d 20 45 4f 4b 3b 0a 09 7d 0a 0a 09 Ptr = EOK;..}...
95d0: 72 65 74 75 72 6e 20 70 2e 6f 75 74 70 75 74 2e return p.output.
95e0: 74 6f 57 72 69 74 65 3b 0a 20 20 20 20 7d 0a 23 toWrite;. }.#
95f0: 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 41 53 endif.. /* AS
9600: 53 45 52 54 3a 20 72 63 50 74 72 2d 3e 6d 65 74 SERT: rcPtr->met
9610: 68 6f 64 20 26 20 46 4c 41 47 28 4d 45 54 48 5f hod & FLAG(METH_
9620: 57 52 49 54 45 29 20 2a 2f 0a 20 20 20 20 2f 2a WRITE) */. /*
9630: 20 41 53 53 45 52 54 3a 20 72 63 50 74 72 2d 3e ASSERT: rcPtr->
9640: 6d 6f 64 65 20 26 20 54 43 4c 5f 57 52 49 54 41 mode & TCL_WRITA
9650: 42 4c 45 20 2a 2f 0a 0a 20 20 20 20 62 75 66 4f BLE */.. bufO
9660: 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 42 79 74 65 bj = Tcl_NewByte
9670: 41 72 72 61 79 4f 62 6a 28 28 75 6e 73 69 67 6e ArrayObj((unsign
9680: 65 64 20 63 68 61 72 20 2a 29 20 62 75 66 2c 20 ed char *) buf,
9690: 74 6f 57 72 69 74 65 29 3b 0a 20 20 20 20 69 66 toWrite);. if
96a0: 20 28 49 6e 76 6f 6b 65 54 63 6c 4d 65 74 68 6f (InvokeTclMetho
96b0: 64 28 72 63 50 74 72 2c 20 22 77 72 69 74 65 22 d(rcPtr, "write"
96c0: 2c 20 62 75 66 4f 62 6a 2c 20 4e 55 4c 4c 2c 20 , bufObj, NULL,
96d0: 26 72 65 73 4f 62 6a 29 20 21 3d 20 54 43 4c 5f &resObj) != TCL_
96e0: 4f 4b 29 20 7b 0a 09 54 63 6c 5f 53 65 74 43 68 OK) {..Tcl_SetCh
96f0: 61 6e 6e 65 6c 45 72 72 6f 72 28 72 63 50 74 72 annelError(rcPtr
9700: 2d 3e 63 68 61 6e 2c 20 72 65 73 4f 62 6a 29 3b ->chan, resObj);
9710: 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 ..Tcl_DecrRefCou
9720: 6e 74 28 72 65 73 4f 62 6a 29 3b 09 2f 2a 20 52 nt(resObj);./* R
9730: 65 6d 6f 76 65 20 72 65 66 65 72 65 6e 63 65 20 emove reference
9740: 68 65 6c 64 20 66 72 6f 6d 20 69 6e 76 6f 6b 65 held from invoke
9750: 20 2a 2f 0a 09 2a 65 72 72 6f 72 43 6f 64 65 50 */..*errorCodeP
9760: 74 72 20 3d 20 45 49 4e 56 41 4c 3b 0a 09 72 65 tr = EINVAL;..re
9770: 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a turn -1;. }..
9780: 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 49 if (Tcl_GetI
9790: 6e 74 46 72 6f 6d 4f 62 6a 28 72 63 50 74 72 2d ntFromObj(rcPtr-
97a0: 3e 69 6e 74 65 72 70 2c 20 72 65 73 4f 62 6a 2c >interp, resObj,
97b0: 20 26 77 72 69 74 74 65 6e 29 20 21 3d 20 54 43 &written) != TC
97c0: 4c 5f 4f 4b 29 20 7b 0a 09 54 63 6c 5f 44 65 63 L_OK) {..Tcl_Dec
97d0: 72 52 65 66 43 6f 75 6e 74 28 72 65 73 4f 62 6a rRefCount(resObj
97e0: 29 3b 09 2f 2a 20 52 65 6d 6f 76 65 20 72 65 66 );./* Remove ref
97f0: 65 72 65 6e 63 65 20 68 65 6c 64 20 66 72 6f 6d erence held from
9800: 20 69 6e 76 6f 6b 65 20 2a 2f 0a 09 54 63 6c 5f invoke */..Tcl_
9810: 53 65 74 43 68 61 6e 6e 65 6c 45 72 72 6f 72 28 SetChannelError(
9820: 72 63 50 74 72 2d 3e 63 68 61 6e 2c 20 4d 61 72 rcPtr->chan, Mar
9830: 73 68 61 6c 6c 45 72 72 6f 72 28 72 63 50 74 72 shallError(rcPtr
9840: 2d 3e 69 6e 74 65 72 70 29 29 3b 0a 09 2a 65 72 ->interp));..*er
9850: 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 49 4e rorCodePtr = EIN
9860: 56 41 4c 3b 0a 09 72 65 74 75 72 6e 20 2d 31 3b VAL;..return -1;
9870: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f . }.. Tcl_
9880: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 72 65 73 DecrRefCount(res
9890: 4f 62 6a 29 3b 09 09 2f 2a 20 52 65 6d 6f 76 65 Obj);../* Remove
98a0: 20 72 65 66 65 72 65 6e 63 65 20 68 65 6c 64 20 reference held
98b0: 66 72 6f 6d 20 69 6e 76 6f 6b 65 20 2a 2f 0a 0a from invoke */..
98c0: 20 20 20 20 69 66 20 28 28 77 72 69 74 74 65 6e if ((written
98d0: 20 3d 3d 20 30 29 20 26 26 20 28 74 6f 57 72 69 == 0) && (toWri
98e0: 74 65 20 3e 20 30 29 29 20 7b 0a 09 2f 2a 0a 09 te > 0)) {../*..
98f0: 20 2a 20 54 68 65 20 68 61 6e 64 6c 65 72 20 63 * The handler c
9900: 6c 61 69 6d 73 20 74 6f 20 68 61 76 65 20 77 72 laims to have wr
9910: 69 74 74 65 6e 20 6e 6f 74 68 69 6e 67 20 6f 66 itten nothing of
9920: 20 77 68 61 74 20 69 74 20 77 61 73 0a 09 20 2a what it was.. *
9930: 20 67 69 76 65 6e 2e 20 54 68 61 74 20 69 73 20 given. That is
9940: 62 61 64 2e 0a 09 20 2a 2f 0a 0a 09 53 65 74 43 bad... */...SetC
9950: 68 61 6e 6e 65 6c 45 72 72 6f 72 53 74 72 28 72 hannelErrorStr(r
9960: 63 50 74 72 2d 3e 63 68 61 6e 2c 20 6d 73 67 5f cPtr->chan, msg_
9970: 77 72 69 74 65 5f 6e 6f 74 68 69 6e 67 29 3b 0a write_nothing);.
9980: 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d .*errorCodePtr =
9990: 20 45 49 4e 56 41 4c 3b 0a 09 72 65 74 75 72 6e EINVAL;..return
99a0: 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 -1;. }. i
99b0: 66 20 28 74 6f 57 72 69 74 65 20 3c 20 77 72 69 f (toWrite < wri
99c0: 74 74 65 6e 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 tten) {../*.. *
99d0: 54 68 65 20 68 61 6e 64 6c 65 72 20 63 6c 61 69 The handler clai
99e0: 6d 73 20 74 6f 20 68 61 76 65 20 77 72 69 74 74 ms to have writt
99f0: 65 6e 20 6d 6f 72 65 20 74 68 61 6e 20 69 74 20 en more than it
9a00: 77 61 73 20 67 69 76 65 6e 2e 20 54 68 61 74 20 was given. That
9a10: 69 73 0a 09 20 2a 20 62 61 64 2e 20 4e 6f 74 65 is.. * bad. Note
9a20: 20 74 68 61 74 20 74 68 65 20 49 2f 4f 20 63 6f that the I/O co
9a30: 72 65 20 77 6f 75 6c 64 20 63 72 61 73 68 20 69 re would crash i
9a40: 66 20 77 65 20 77 65 72 65 20 74 6f 20 72 65 74 f we were to ret
9a50: 75 72 6e 20 74 68 69 73 0a 09 20 2a 20 69 6e 66 urn this.. * inf
9a60: 6f 72 6d 61 74 69 6f 6e 2c 20 74 72 79 69 6e 67 ormation, trying
9a70: 20 74 6f 20 77 72 69 74 65 20 2d 6e 6e 6e 20 62 to write -nnn b
9a80: 79 74 65 73 20 69 6e 20 74 68 65 20 6e 65 78 74 ytes in the next
9a90: 20 69 74 65 72 61 74 69 6f 6e 2e 0a 09 20 2a 2f iteration... */
9aa0: 0a 0a 09 53 65 74 43 68 61 6e 6e 65 6c 45 72 72 ...SetChannelErr
9ab0: 6f 72 53 74 72 28 72 63 50 74 72 2d 3e 63 68 61 orStr(rcPtr->cha
9ac0: 6e 2c 20 6d 73 67 5f 77 72 69 74 65 5f 74 6f 6f n, msg_write_too
9ad0: 6d 75 63 68 29 3b 0a 09 2a 65 72 72 6f 72 43 6f much);..*errorCo
9ae0: 64 65 50 74 72 20 3d 20 45 49 4e 56 41 4c 3b 0a dePtr = EINVAL;.
9af0: 09 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 .return -1;.
9b00: 7d 0a 0a 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 }.. *errorCod
9b10: 65 50 74 72 20 3d 20 45 4f 4b 3b 0a 20 20 20 20 ePtr = EOK;.
9b20: 72 65 74 75 72 6e 20 77 72 69 74 74 65 6e 3b 0a return written;.
9b30: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d }.../*. *-------
9b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
9b80: 20 2a 0a 20 2a 20 52 65 66 6c 65 63 74 53 65 65 *. * ReflectSee
9b90: 6b 57 69 64 65 20 2f 20 52 65 66 6c 65 63 74 53 kWide / ReflectS
9ba0: 65 65 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 eek --. *. *.Thi
9bb0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e s function is in
9bc0: 76 6f 6b 65 64 20 77 68 65 6e 20 74 68 65 20 75 voked when the u
9bd0: 73 65 72 20 77 69 73 68 65 73 20 74 6f 20 73 65 ser wishes to se
9be0: 65 6b 20 6f 6e 20 74 68 65 20 63 68 61 6e 6e 65 ek on the channe
9bf0: 6c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 l.. *. * Results
9c00: 3a 0a 20 2a 09 54 68 65 20 6e 65 77 20 6c 6f 63 :. *.The new loc
9c10: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 61 63 63 ation of the acc
9c20: 65 73 73 20 70 6f 69 6e 74 2e 0a 20 2a 0a 20 2a ess point.. *. *
9c30: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
9c40: 2a 09 41 6c 6c 6f 63 61 74 65 73 20 6d 65 6d 6f *.Allocates memo
9c50: 72 79 2e 20 41 72 62 69 74 72 61 72 79 2c 20 61 ry. Arbitrary, a
9c60: 73 20 69 74 20 63 61 6c 6c 73 20 75 70 6f 6e 20 s it calls upon
9c70: 61 20 73 63 72 69 70 74 2e 0a 20 2a 0a 20 2a 2d a script.. *. *-
9c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9cc0: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 -----. */..stati
9cd0: 63 20 54 63 6c 5f 57 69 64 65 49 6e 74 0a 52 65 c Tcl_WideInt.Re
9ce0: 66 6c 65 63 74 53 65 65 6b 57 69 64 65 28 0a 20 flectSeekWide(.
9cf0: 20 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c ClientData cl
9d00: 69 65 6e 74 44 61 74 61 2c 0a 20 20 20 20 54 63 ientData,. Tc
9d10: 6c 5f 57 69 64 65 49 6e 74 20 6f 66 66 73 65 74 l_WideInt offset
9d20: 2c 0a 20 20 20 20 69 6e 74 20 73 65 65 6b 4d 6f ,. int seekMo
9d30: 64 65 2c 0a 20 20 20 20 69 6e 74 20 2a 65 72 72 de,. int *err
9d40: 6f 72 43 6f 64 65 50 74 72 29 0a 7b 0a 20 20 20 orCodePtr).{.
9d50: 20 52 65 66 6c 65 63 74 65 64 43 68 61 6e 6e 65 ReflectedChanne
9d60: 6c 20 2a 72 63 50 74 72 20 3d 20 28 52 65 66 6c l *rcPtr = (Refl
9d70: 65 63 74 65 64 43 68 61 6e 6e 65 6c 20 2a 29 20 ectedChannel *)
9d80: 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 20 20 clientData;.
9d90: 54 63 6c 5f 4f 62 6a 20 2a 6f 66 66 4f 62 6a 2c Tcl_Obj *offObj,
9da0: 20 2a 62 61 73 65 4f 62 6a 3b 0a 20 20 20 20 54 *baseObj;. T
9db0: 63 6c 5f 4f 62 6a 20 2a 72 65 73 4f 62 6a 3b 09 cl_Obj *resObj;.
9dc0: 09 2f 2a 20 52 65 73 75 6c 74 20 66 6f 72 20 27 ./* Result for '
9dd0: 73 65 65 6b 27 20 2a 2f 0a 20 20 20 20 54 63 6c seek' */. Tcl
9de0: 5f 57 69 64 65 49 6e 74 20 6e 65 77 4c 6f 63 3b _WideInt newLoc;
9df0: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 .. /*. *
9e00: 41 72 65 20 77 65 20 69 6e 20 74 68 65 20 63 6f Are we in the co
9e10: 72 72 65 63 74 20 74 68 72 65 61 64 3f 0a 20 20 rrect thread?.
9e20: 20 20 20 2a 2f 0a 0a 23 69 66 64 65 66 20 54 43 */..#ifdef TC
9e30: 4c 5f 54 48 52 45 41 44 53 0a 20 20 20 20 69 66 L_THREADS. if
9e40: 20 28 72 63 50 74 72 2d 3e 74 68 72 65 61 64 20 (rcPtr->thread
9e50: 21 3d 20 54 63 6c 5f 47 65 74 43 75 72 72 65 6e != Tcl_GetCurren
9e60: 74 54 68 72 65 61 64 28 29 29 20 7b 0a 09 46 6f tThread()) {..Fo
9e70: 72 77 61 72 64 50 61 72 61 6d 20 70 3b 0a 0a 09 rwardParam p;...
9e80: 70 2e 73 65 65 6b 2e 73 65 65 6b 4d 6f 64 65 20 p.seek.seekMode
9e90: 3d 20 73 65 65 6b 4d 6f 64 65 3b 0a 09 70 2e 73 = seekMode;..p.s
9ea0: 65 65 6b 2e 6f 66 66 73 65 74 20 3d 20 6f 66 66 eek.offset = off
9eb0: 73 65 74 3b 0a 0a 09 46 6f 72 77 61 72 64 4f 70 set;...ForwardOp
9ec0: 54 6f 4f 77 6e 65 72 54 68 72 65 61 64 28 72 63 ToOwnerThread(rc
9ed0: 50 74 72 2c 20 46 6f 72 77 61 72 64 65 64 53 65 Ptr, ForwardedSe
9ee0: 65 6b 2c 20 26 70 29 3b 0a 0a 09 69 66 20 28 70 ek, &p);...if (p
9ef0: 2e 62 61 73 65 2e 63 6f 64 65 20 21 3d 20 54 43 .base.code != TC
9f00: 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 50 61 73 L_OK) {.. Pas
9f10: 73 52 65 63 65 69 76 65 64 45 72 72 6f 72 28 72 sReceivedError(r
9f20: 63 50 74 72 2d 3e 63 68 61 6e 2c 20 26 70 29 3b cPtr->chan, &p);
9f30: 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 .. *errorCode
9f40: 50 74 72 20 3d 20 45 49 4e 56 41 4c 3b 0a 09 20 Ptr = EINVAL;..
9f50: 20 20 20 70 2e 73 65 65 6b 2e 6f 66 66 73 65 74 p.seek.offset
9f60: 20 3d 20 2d 31 3b 0a 09 7d 20 65 6c 73 65 20 7b = -1;..} else {
9f70: 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 .. *errorCode
9f80: 50 74 72 20 3d 20 45 4f 4b 3b 0a 09 7d 0a 0a 09 Ptr = EOK;..}...
9f90: 72 65 74 75 72 6e 20 70 2e 73 65 65 6b 2e 6f 66 return p.seek.of
9fa0: 66 73 65 74 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 fset;. }.#end
9fb0: 69 66 0a 0a 20 20 20 20 2f 2a 20 41 53 53 45 52 if.. /* ASSER
9fc0: 54 3a 20 72 63 50 74 72 2d 3e 6d 65 74 68 6f 64 T: rcPtr->method
9fd0: 20 26 20 46 4c 41 47 28 4d 45 54 48 5f 53 45 45 & FLAG(METH_SEE
9fe0: 4b 29 20 2a 2f 0a 0a 20 20 20 20 6f 66 66 4f 62 K) */.. offOb
9ff0: 6a 20 3d 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 j = Tcl_NewWideI
a000: 6e 74 4f 62 6a 28 6f 66 66 73 65 74 29 3b 0a 20 ntObj(offset);.
a010: 20 20 20 62 61 73 65 4f 62 6a 20 3d 20 54 63 6c baseObj = Tcl
a020: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 73 _NewStringObj((s
a030: 65 65 6b 4d 6f 64 65 20 3d 3d 20 53 45 45 4b 5f eekMode == SEEK_
a040: 53 45 54 29 20 3f 20 22 73 74 61 72 74 22 20 3a SET) ? "start" :
a050: 0a 09 20 20 20 20 28 28 73 65 65 6b 4d 6f 64 65 .. ((seekMode
a060: 20 3d 3d 20 53 45 45 4b 5f 43 55 52 29 20 3f 20 == SEEK_CUR) ?
a070: 22 63 75 72 72 65 6e 74 22 20 3a 20 22 65 6e 64 "current" : "end
a080: 22 29 2c 20 2d 31 29 3b 0a 20 20 20 20 69 66 20 "), -1);. if
a090: 28 49 6e 76 6f 6b 65 54 63 6c 4d 65 74 68 6f 64 (InvokeTclMethod
a0a0: 28 72 63 50 74 72 2c 20 22 73 65 65 6b 22 2c 20 (rcPtr, "seek",
a0b0: 6f 66 66 4f 62 6a 2c 20 62 61 73 65 4f 62 6a 2c offObj, baseObj,
a0c0: 20 26 72 65 73 4f 62 6a 29 21 3d 54 43 4c 5f 4f &resObj)!=TCL_O
a0d0: 4b 29 20 7b 0a 09 54 63 6c 5f 53 65 74 43 68 61 K) {..Tcl_SetCha
a0e0: 6e 6e 65 6c 45 72 72 6f 72 28 72 63 50 74 72 2d nnelError(rcPtr-
a0f0: 3e 63 68 61 6e 2c 20 72 65 73 4f 62 6a 29 3b 0a >chan, resObj);.
a100: 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e .Tcl_DecrRefCoun
a110: 74 28 72 65 73 4f 62 6a 29 3b 09 2f 2a 20 52 65 t(resObj);./* Re
a120: 6d 6f 76 65 20 72 65 66 65 72 65 6e 63 65 20 68 move reference h
a130: 65 6c 64 20 66 72 6f 6d 20 69 6e 76 6f 6b 65 20 eld from invoke
a140: 2a 2f 0a 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 */..*errorCodePt
a150: 72 20 3d 20 45 49 4e 56 41 4c 3b 0a 09 72 65 74 r = EINVAL;..ret
a160: 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 urn -1;. }..
a170: 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 57 69 if (Tcl_GetWi
a180: 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 72 63 50 deIntFromObj(rcP
a190: 74 72 2d 3e 69 6e 74 65 72 70 2c 20 72 65 73 4f tr->interp, resO
a1a0: 62 6a 2c 20 26 6e 65 77 4c 6f 63 29 20 21 3d 20 bj, &newLoc) !=
a1b0: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 54 63 6c 5f 44 TCL_OK) {..Tcl_D
a1c0: 65 63 72 52 65 66 43 6f 75 6e 74 28 72 65 73 4f ecrRefCount(resO
a1d0: 62 6a 29 3b 09 2f 2a 20 52 65 6d 6f 76 65 20 72 bj);./* Remove r
a1e0: 65 66 65 72 65 6e 63 65 20 68 65 6c 64 20 66 72 eference held fr
a1f0: 6f 6d 20 69 6e 76 6f 6b 65 20 2a 2f 0a 09 54 63 om invoke */..Tc
a200: 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 45 72 72 6f l_SetChannelErro
a210: 72 28 72 63 50 74 72 2d 3e 63 68 61 6e 2c 20 4d r(rcPtr->chan, M
a220: 61 72 73 68 61 6c 6c 45 72 72 6f 72 28 72 63 50 arshallError(rcP
a230: 74 72 2d 3e 69 6e 74 65 72 70 29 29 3b 0a 09 2a tr->interp));..*
a240: 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 errorCodePtr = E
a250: 49 4e 56 41 4c 3b 0a 09 72 65 74 75 72 6e 20 2d INVAL;..return -
a260: 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 1;. }.. Tc
a270: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 72 l_DecrRefCount(r
a280: 65 73 4f 62 6a 29 3b 09 09 2f 2a 20 52 65 6d 6f esObj);../* Remo
a290: 76 65 20 72 65 66 65 72 65 6e 63 65 20 68 65 6c ve reference hel
a2a0: 64 20 66 72 6f 6d 20 69 6e 76 6f 6b 65 20 2a 2f d from invoke */
a2b0: 0a 0a 20 20 20 20 69 66 20 28 6e 65 77 4c 6f 63 .. if (newLoc
a2c0: 20 3c 20 54 63 6c 5f 4c 6f 6e 67 41 73 57 69 64 < Tcl_LongAsWid
a2d0: 65 28 30 29 29 20 7b 0a 09 53 65 74 43 68 61 6e e(0)) {..SetChan
a2e0: 6e 65 6c 45 72 72 6f 72 53 74 72 28 72 63 50 74 nelErrorStr(rcPt
a2f0: 72 2d 3e 63 68 61 6e 2c 20 6d 73 67 5f 73 65 65 r->chan, msg_see
a300: 6b 5f 62 65 66 6f 72 65 73 74 61 72 74 29 3b 0a k_beforestart);.
a310: 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d .*errorCodePtr =
a320: 20 45 49 4e 56 41 4c 3b 0a 09 72 65 74 75 72 6e EINVAL;..return
a330: 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 -1;. }..
a340: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 *errorCodePtr =
a350: 45 4f 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 EOK;. return
a360: 6e 65 77 4c 6f 63 3b 0a 7d 0a 0a 73 74 61 74 69 newLoc;.}..stati
a370: 63 20 69 6e 74 0a 52 65 66 6c 65 63 74 53 65 65 c int.ReflectSee
a380: 6b 28 0a 20 20 20 20 43 6c 69 65 6e 74 44 61 74 k(. ClientDat
a390: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 a clientData,.
a3a0: 20 20 6c 6f 6e 67 20 6f 66 66 73 65 74 2c 0a 20 long offset,.
a3b0: 20 20 20 69 6e 74 20 73 65 65 6b 4d 6f 64 65 2c int seekMode,
a3c0: 0a 20 20 20 20 69 6e 74 20 2a 65 72 72 6f 72 43 . int *errorC
a3d0: 6f 64 65 50 74 72 29 0a 7b 0a 20 20 20 20 2f 2a odePtr).{. /*
a3e0: 0a 20 20 20 20 20 2a 20 54 68 69 73 20 66 75 6e . * This fun
a3f0: 63 74 69 6f 6e 20 63 61 6e 20 62 65 20 69 6e 76 ction can be inv
a400: 6f 6b 65 64 20 66 72 6f 6d 20 61 20 74 72 61 6e oked from a tran
a410: 73 66 6f 72 6d 61 74 69 6f 6e 20 77 68 69 63 68 sformation which
a420: 20 69 73 20 62 61 73 65 64 20 6f 6e 0a 20 20 20 is based on.
a430: 20 20 2a 20 73 74 61 6e 64 61 72 64 20 73 65 65 * standard see
a440: 6b 69 6e 67 2c 20 69 2e 65 2e 20 6e 6f 6e 2d 77 king, i.e. non-w
a450: 69 64 65 2e 20 42 65 63 61 75 73 65 20 6f 66 20 ide. Because of
a460: 74 68 69 73 20 77 65 20 68 61 76 65 20 74 6f 20 this we have to
a470: 69 6d 70 6c 65 6d 65 6e 74 0a 20 20 20 20 20 2a implement. *
a480: 20 69 74 2c 20 61 20 64 75 6d 6d 79 20 69 73 20 it, a dummy is
a490: 6e 6f 74 20 65 6e 6f 75 67 68 2e 20 57 65 20 73 not enough. We s
a4a0: 69 6d 70 6c 79 20 64 65 6c 65 67 61 74 65 20 74 imply delegate t
a4b0: 68 65 20 63 61 6c 6c 20 74 6f 20 74 68 65 20 77 he call to the w
a4c0: 69 64 65 0a 20 20 20 20 20 2a 20 72 6f 75 74 69 ide. * routi
a4d0: 6e 65 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 ne.. */..
a4e0: 20 72 65 74 75 72 6e 20 28 69 6e 74 29 20 52 65 return (int) Re
a4f0: 66 6c 65 63 74 53 65 65 6b 57 69 64 65 28 63 6c flectSeekWide(cl
a500: 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 4c 6f ientData, Tcl_Lo
a510: 6e 67 41 73 57 69 64 65 28 6f 66 66 73 65 74 29 ngAsWide(offset)
a520: 2c 20 73 65 65 6b 4d 6f 64 65 2c 0a 09 20 20 20 , seekMode,..
a530: 20 65 72 72 6f 72 43 6f 64 65 50 74 72 29 3b 0a errorCodePtr);.
a540: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d }.../*. *-------
a550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
a590: 20 2a 0a 20 2a 20 52 65 66 6c 65 63 74 57 61 74 *. * ReflectWat
a5a0: 63 68 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 ch --. *. *.This
a5b0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 function is inv
a5c0: 6f 6b 65 64 20 74 6f 20 74 65 6c 6c 20 74 68 65 oked to tell the
a5d0: 20 63 68 61 6e 6e 65 6c 20 77 68 61 74 20 65 76 channel what ev
a5e0: 65 6e 74 73 20 74 68 65 20 49 2f 4f 0a 20 2a 09 ents the I/O. *.
a5f0: 73 79 73 74 65 6d 20 69 73 20 69 6e 74 65 72 65 system is intere
a600: 73 74 65 64 20 69 6e 2e 0a 20 2a 0a 20 2a 20 52 sted in.. *. * R
a610: 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e esults:. *.None.
a620: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
a630: 63 74 73 3a 0a 20 2a 09 41 6c 6c 6f 63 61 74 65 cts:. *.Allocate
a640: 73 20 6d 65 6d 6f 72 79 2e 20 41 72 62 69 74 72 s memory. Arbitr
a650: 61 72 79 2c 20 61 73 20 69 74 20 63 61 6c 6c 73 ary, as it calls
a660: 20 75 70 6f 6e 20 61 20 73 63 72 69 70 74 2e 0a upon a script..
a670: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
a680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a6a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a6b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
a6c0: 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 52 65 66 .static void.Ref
a6d0: 6c 65 63 74 57 61 74 63 68 28 0a 20 20 20 20 43 lectWatch(. C
a6e0: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 lientData client
a6f0: 44 61 74 61 2c 0a 20 20 20 20 69 6e 74 20 6d 61 Data,. int ma
a700: 73 6b 29 0a 7b 0a 20 20 20 20 52 65 66 6c 65 63 sk).{. Reflec
a710: 74 65 64 43 68 61 6e 6e 65 6c 20 2a 72 63 50 74 tedChannel *rcPt
a720: 72 20 3d 20 28 52 65 66 6c 65 63 74 65 64 43 68 r = (ReflectedCh
a730: 61 6e 6e 65 6c 20 2a 29 20 63 6c 69 65 6e 74 44 annel *) clientD
a740: 61 74 61 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a ata;. Tcl_Obj
a750: 20 2a 6d 61 73 6b 4f 62 6a 3b 0a 0a 20 20 20 20 *maskObj;..
a760: 2f 2a 20 41 53 53 45 52 54 20 72 63 50 74 72 2d /* ASSERT rcPtr-
a770: 3e 6d 65 74 68 6f 64 73 20 26 20 46 4c 41 47 28 >methods & FLAG(
a780: 4d 45 54 48 5f 57 41 54 43 48 29 20 2a 2f 0a 0a METH_WATCH) */..
a790: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 57 65 /*. * We
a7a0: 20 72 65 73 74 72 69 63 74 20 74 68 65 20 69 6e restrict the in
a7b0: 74 65 72 65 73 74 20 74 6f 20 77 68 61 74 20 74 terest to what t
a7c0: 68 65 20 63 68 61 6e 6e 65 6c 20 63 61 6e 20 73 he channel can s
a7d0: 75 70 70 6f 72 74 2e 20 49 4f 57 20 74 68 65 72 upport. IOW ther
a7e0: 65 0a 20 20 20 20 20 2a 20 77 69 6c 6c 20 6e 65 e. * will ne
a7f0: 76 65 72 20 62 65 20 77 72 69 74 65 20 65 76 65 ver be write eve
a800: 6e 74 73 20 66 6f 72 20 61 20 63 68 61 6e 6e 65 nts for a channe
a810: 6c 20 77 68 69 63 68 20 69 73 20 6e 6f 74 20 77 l which is not w
a820: 72 69 74 61 62 6c 65 2e 0a 20 20 20 20 20 2a 20 ritable.. *
a830: 41 6e 61 6c 6f 67 75 6f 75 73 6c 79 20 66 6f 72 Analoguously for
a840: 20 72 65 61 64 20 65 76 65 6e 74 73 20 61 6e 64 read events and
a850: 20 6e 6f 6e 2d 72 65 61 64 61 62 6c 65 20 63 68 non-readable ch
a860: 61 6e 6e 65 6c 73 2e 0a 20 20 20 20 20 2a 2f 0a annels.. */.
a870: 0a 20 20 20 20 6d 61 73 6b 20 26 3d 20 72 63 50 . mask &= rcP
a880: 74 72 2d 3e 6d 6f 64 65 3b 0a 0a 20 20 20 20 69 tr->mode;.. i
a890: 66 20 28 6d 61 73 6b 20 3d 3d 20 72 63 50 74 72 f (mask == rcPtr
a8a0: 2d 3e 69 6e 74 65 72 65 73 74 29 20 7b 0a 09 2f ->interest) {../
a8b0: 2a 0a 09 20 2a 20 53 61 6d 65 20 6f 6c 64 2c 20 *.. * Same old,
a8c0: 73 61 6d 65 20 6f 6c 64 2c 20 77 68 79 20 73 68 same old, why sh
a8d0: 6f 75 6c 64 20 77 65 20 64 6f 20 73 6f 6d 65 74 ould we do somet
a8e0: 68 69 6e 67 3f 0a 09 20 2a 2f 0a 0a 09 72 65 74 hing?.. */...ret
a8f0: 75 72 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 urn;. }..
a900: 72 63 50 74 72 2d 3e 69 6e 74 65 72 65 73 74 20 rcPtr->interest
a910: 3d 20 6d 61 73 6b 3b 0a 0a 20 20 20 20 2f 2a 0a = mask;.. /*.
a920: 20 20 20 20 20 2a 20 41 72 65 20 77 65 20 69 6e * Are we in
a930: 20 74 68 65 20 63 6f 72 72 65 63 74 20 74 68 72 the correct thr
a940: 65 61 64 3f 0a 20 20 20 20 20 2a 2f 0a 0a 23 69 ead?. */..#i
a950: 66 64 65 66 20 54 43 4c 5f 54 48 52 45 41 44 53 fdef TCL_THREADS
a960: 0a 20 20 20 20 69 66 20 28 72 63 50 74 72 2d 3e . if (rcPtr->
a970: 74 68 72 65 61 64 20 21 3d 20 54 63 6c 5f 47 65 thread != Tcl_Ge
a980: 74 43 75 72 72 65 6e 74 54 68 72 65 61 64 28 29 tCurrentThread()
a990: 29 20 7b 0a 09 46 6f 72 77 61 72 64 50 61 72 61 ) {..ForwardPara
a9a0: 6d 20 70 3b 0a 0a 09 70 2e 77 61 74 63 68 2e 6d m p;...p.watch.m
a9b0: 61 73 6b 20 3d 20 6d 61 73 6b 3b 0a 09 46 6f 72 ask = mask;..For
a9c0: 77 61 72 64 4f 70 54 6f 4f 77 6e 65 72 54 68 72 wardOpToOwnerThr
a9d0: 65 61 64 28 72 63 50 74 72 2c 20 46 6f 72 77 61 ead(rcPtr, Forwa
a9e0: 72 64 65 64 57 61 74 63 68 2c 20 26 70 29 3b 0a rdedWatch, &p);.
a9f0: 0a 09 2f 2a 0a 09 20 2a 20 41 6e 79 20 66 61 69 ../*.. * Any fai
aa00: 6c 75 72 65 20 66 72 6f 6d 20 74 68 65 20 66 6f lure from the fo
aa10: 72 77 61 72 64 20 69 73 20 69 67 6e 6f 72 65 64 rward is ignored
aa20: 2e 20 57 65 20 68 61 76 65 20 6e 6f 20 70 6c 61 . We have no pla
aa30: 63 65 20 74 6f 20 70 75 74 0a 09 20 2a 20 74 68 ce to put.. * th
aa40: 69 73 2e 0a 09 20 2a 2f 0a 0a 09 72 65 74 75 72 is... */...retur
aa50: 6e 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a n;. }.#endif.
aa60: 0a 20 20 20 20 6d 61 73 6b 4f 62 6a 20 3d 20 44 . maskObj = D
aa70: 65 63 6f 64 65 45 76 65 6e 74 4d 61 73 6b 28 6d ecodeEventMask(m
aa80: 61 73 6b 29 3b 0a 20 20 20 20 28 76 6f 69 64 29 ask);. (void)
aa90: 20 49 6e 76 6f 6b 65 54 63 6c 4d 65 74 68 6f 64 InvokeTclMethod
aaa0: 28 72 63 50 74 72 2c 20 22 77 61 74 63 68 22 2c (rcPtr, "watch",
aab0: 20 6d 61 73 6b 4f 62 6a 2c 20 4e 55 4c 4c 2c 20 maskObj, NULL,
aac0: 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 44 NULL);. Tcl_D
aad0: 65 63 72 52 65 66 43 6f 75 6e 74 28 6d 61 73 6b ecrRefCount(mask
aae0: 4f 62 6a 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d Obj);.}.../*. *-
aaf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ab00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ab10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ab20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ab30: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 52 65 66 6c -----. *. * Refl
ab40: 65 63 74 42 6c 6f 63 6b 20 2d 2d 0a 20 2a 0a 20 ectBlock --. *.
ab50: 2a 09 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 *.This function
ab60: 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 74 65 is invoked to te
ab70: 6c 6c 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 77 ll the channel w
ab80: 68 69 63 68 20 62 6c 6f 63 6b 69 6e 67 20 62 65 hich blocking be
ab90: 68 61 76 69 6f 75 72 0a 20 2a 09 69 73 20 72 65 haviour. *.is re
aba0: 71 75 69 72 65 64 20 6f 66 20 69 74 2e 0a 20 2a quired of it.. *
abb0: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
abc0: 41 20 70 6f 73 69 78 20 65 72 72 6f 72 20 6e 75 A posix error nu
abd0: 6d 62 65 72 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 mber.. *. * Side
abe0: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 41 6c 6c effects:. *.All
abf0: 6f 63 61 74 65 73 20 6d 65 6d 6f 72 79 2e 20 41 ocates memory. A
ac00: 72 62 69 74 72 61 72 79 2c 20 61 73 20 69 74 20 rbitrary, as it
ac10: 63 61 6c 6c 73 20 75 70 6f 6e 20 61 20 73 63 72 calls upon a scr
ac20: 69 70 74 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d ipt.. *. *------
ac30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ac40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ac50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ac60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ac70: 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 . */..static int
ac80: 0a 52 65 66 6c 65 63 74 42 6c 6f 63 6b 28 0a 20 .ReflectBlock(.
ac90: 20 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c ClientData cl
aca0: 69 65 6e 74 44 61 74 61 2c 0a 20 20 20 20 69 6e ientData,. in
acb0: 74 20 6e 6f 6e 62 6c 6f 63 6b 69 6e 67 29 0a 7b t nonblocking).{
acc0: 0a 20 20 20 20 52 65 66 6c 65 63 74 65 64 43 68 . ReflectedCh
acd0: 61 6e 6e 65 6c 20 2a 72 63 50 74 72 20 3d 20 28 annel *rcPtr = (
ace0: 52 65 66 6c 65 63 74 65 64 43 68 61 6e 6e 65 6c ReflectedChannel
acf0: 20 2a 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a *) clientData;.
ad00: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 62 6c 6f Tcl_Obj *blo
ad10: 63 6b 4f 62 6a 3b 0a 20 20 20 20 69 6e 74 20 65 ckObj;. int e
ad20: 72 72 6f 72 4e 75 6d 3b 09 09 2f 2a 20 45 49 4e rrorNum;../* EIN
ad30: 56 41 4c 20 6f 72 20 45 4f 4b 20 28 73 75 63 63 VAL or EOK (succ
ad40: 65 73 73 29 2e 20 2a 2f 0a 20 20 20 20 54 63 6c ess). */. Tcl
ad50: 5f 4f 62 6a 20 2a 72 65 73 4f 62 6a 3b 09 09 2f _Obj *resObj;../
ad60: 2a 20 52 65 73 75 6c 74 20 64 61 74 61 20 66 6f * Result data fo
ad70: 72 20 27 62 6c 6f 63 6b 69 6e 67 27 20 2a 2f 0a r 'blocking' */.
ad80: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 41 . /*. * A
ad90: 72 65 20 77 65 20 69 6e 20 74 68 65 20 63 6f 72 re we in the cor
ada0: 72 65 63 74 20 74 68 72 65 61 64 3f 0a 20 20 20 rect thread?.
adb0: 20 20 2a 2f 0a 0a 23 69 66 64 65 66 20 54 43 4c */..#ifdef TCL
adc0: 5f 54 48 52 45 41 44 53 0a 20 20 20 20 69 66 20 _THREADS. if
add0: 28 72 63 50 74 72 2d 3e 74 68 72 65 61 64 20 21 (rcPtr->thread !
ade0: 3d 20 54 63 6c 5f 47 65 74 43 75 72 72 65 6e 74 = Tcl_GetCurrent
adf0: 54 68 72 65 61 64 28 29 29 20 7b 0a 09 46 6f 72 Thread()) {..For
ae00: 77 61 72 64 50 61 72 61 6d 20 70 3b 0a 0a 09 70 wardParam p;...p
ae10: 2e 62 6c 6f 63 6b 2e 6e 6f 6e 62 6c 6f 63 6b 69 .block.nonblocki
ae20: 6e 67 20 3d 20 6e 6f 6e 62 6c 6f 63 6b 69 6e 67 ng = nonblocking
ae30: 3b 0a 0a 09 46 6f 72 77 61 72 64 4f 70 54 6f 4f ;...ForwardOpToO
ae40: 77 6e 65 72 54 68 72 65 61 64 28 72 63 50 74 72 wnerThread(rcPtr
ae50: 2c 20 46 6f 72 77 61 72 64 65 64 42 6c 6f 63 6b , ForwardedBlock
ae60: 2c 20 26 70 29 3b 0a 0a 09 69 66 20 28 70 2e 62 , &p);...if (p.b
ae70: 61 73 65 2e 63 6f 64 65 20 21 3d 20 54 43 4c 5f ase.code != TCL_
ae80: 4f 4b 29 20 7b 0a 09 20 20 20 20 50 61 73 73 52 OK) {.. PassR
ae90: 65 63 65 69 76 65 64 45 72 72 6f 72 28 72 63 50 eceivedError(rcP
aea0: 74 72 2d 3e 63 68 61 6e 2c 20 26 70 29 3b 0a 09 tr->chan, &p);..
aeb0: 20 20 20 20 72 65 74 75 72 6e 20 45 49 4e 56 41 return EINVA
aec0: 4c 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 20 45 L;..}...return E
aed0: 4f 4b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 OK;. }.#endif
aee0: 0a 0a 20 20 20 20 62 6c 6f 63 6b 4f 62 6a 20 3d .. blockObj =
aef0: 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f Tcl_NewBooleanO
af00: 62 6a 28 21 6e 6f 6e 62 6c 6f 63 6b 69 6e 67 29 bj(!nonblocking)
af10: 3b 0a 0a 20 20 20 20 69 66 20 28 49 6e 76 6f 6b ;.. if (Invok
af20: 65 54 63 6c 4d 65 74 68 6f 64 28 72 63 50 74 72 eTclMethod(rcPtr
af30: 2c 20 22 62 6c 6f 63 6b 69 6e 67 22 2c 20 62 6c , "blocking", bl
af40: 6f 63 6b 4f 62 6a 2c 20 4e 55 4c 4c 2c 20 26 72 ockObj, NULL, &r
af50: 65 73 4f 62 6a 29 20 21 3d 20 54 43 4c 5f 4f 4b esObj) != TCL_OK
af60: 29 20 7b 0a 09 54 63 6c 5f 53 65 74 43 68 61 6e ) {..Tcl_SetChan
af70: 6e 65 6c 45 72 72 6f 72 28 72 63 50 74 72 2d 3e nelError(rcPtr->
af80: 63 68 61 6e 2c 20 72 65 73 4f 62 6a 29 3b 0a 09 chan, resObj);..
af90: 65 72 72 6f 72 4e 75 6d 20 3d 20 45 49 4e 56 41 errorNum = EINVA
afa0: 4c 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a L;. } else {.
afb0: 09 65 72 72 6f 72 4e 75 6d 20 3d 20 45 4f 4b 3b .errorNum = EOK;
afc0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f . }.. Tcl_
afd0: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 72 65 73 DecrRefCount(res
afe0: 4f 62 6a 29 3b 09 09 2f 2a 20 52 65 6d 6f 76 65 Obj);../* Remove
aff0: 20 72 65 66 65 72 65 6e 63 65 20 68 65 6c 64 20 reference held
b000: 66 72 6f 6d 20 69 6e 76 6f 6b 65 20 2a 2f 0a 20 from invoke */.
b010: 20 20 20 72 65 74 75 72 6e 20 65 72 72 6f 72 4e return errorN
b020: 75 6d 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d um;.}.../*. *---
b030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b070: 2d 2d 2d 0a 20 2a 0a 20 2a 20 52 65 66 6c 65 63 ---. *. * Reflec
b080: 74 53 65 74 4f 70 74 69 6f 6e 20 2d 2d 0a 20 2a tSetOption --. *
b090: 0a 20 2a 09 54 68 69 73 20 66 75 6e 63 74 69 6f . *.This functio
b0a0: 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 n is invoked to
b0b0: 63 6f 6e 66 69 67 75 72 65 20 61 20 63 68 61 6e configure a chan
b0c0: 6e 65 6c 20 6f 70 74 69 6f 6e 2e 0a 20 2a 0a 20 nel option.. *.
b0d0: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 * Results:. *.A
b0e0: 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 standard Tcl res
b0f0: 75 6c 74 20 63 6f 64 65 2e 0a 20 2a 0a 20 2a 20 ult code.. *. *
b100: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
b110: 09 41 72 62 69 74 72 61 72 79 2c 20 61 73 20 69 .Arbitrary, as i
b120: 74 20 63 61 6c 6c 73 20 75 70 6f 6e 20 61 20 54 t calls upon a T
b130: 63 6c 20 73 63 72 69 70 74 2e 0a 20 2a 0a 20 2a cl script.. *. *
b140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b180: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 ------. */..stat
b190: 69 63 20 69 6e 74 0a 52 65 66 6c 65 63 74 53 65 ic int.ReflectSe
b1a0: 74 4f 70 74 69 6f 6e 28 0a 20 20 20 20 43 6c 69 tOption(. Cli
b1b0: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 entData clientDa
b1c0: 74 61 2c 09 2f 2a 20 43 68 61 6e 6e 65 6c 20 74 ta,./* Channel t
b1d0: 6f 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 54 o query */. T
b1e0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
b1f0: 70 2c 09 09 2f 2a 20 49 6e 74 65 72 70 72 65 74 p,../* Interpret
b200: 65 72 20 74 6f 20 6c 65 61 76 65 20 65 72 72 6f er to leave erro
b210: 72 20 6d 65 73 73 61 67 65 73 20 69 6e 20 2a 2f r messages in */
b220: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 . const char
b230: 2a 6f 70 74 69 6f 6e 4e 61 6d 65 2c 09 2f 2a 20 *optionName,./*
b240: 4e 61 6d 65 20 6f 66 20 72 65 71 75 65 73 74 65 Name of requeste
b250: 64 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 d option */.
b260: 63 6f 6e 73 74 20 63 68 61 72 20 2a 6e 65 77 56 const char *newV
b270: 61 6c 75 65 29 09 2f 2a 20 54 68 65 20 6e 65 77 alue)./* The new
b280: 20 76 61 6c 75 65 20 2a 2f 0a 7b 0a 20 20 20 20 value */.{.
b290: 52 65 66 6c 65 63 74 65 64 43 68 61 6e 6e 65 6c ReflectedChannel
b2a0: 20 2a 72 63 50 74 72 20 3d 20 28 52 65 66 6c 65 *rcPtr = (Refle
b2b0: 63 74 65 64 43 68 61 6e 6e 65 6c 20 2a 29 20 63 ctedChannel *) c
b2c0: 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 20 20 54 lientData;. T
b2d0: 63 6c 5f 4f 62 6a 20 2a 6f 70 74 69 6f 6e 4f 62 cl_Obj *optionOb
b2e0: 6a 2c 20 2a 76 61 6c 75 65 4f 62 6a 3b 0a 20 20 j, *valueObj;.
b2f0: 20 20 69 6e 74 20 72 65 73 75 6c 74 3b 09 09 09 int result;...
b300: 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66 /* Result code f
b310: 6f 72 20 27 63 6f 6e 66 69 67 75 72 65 27 20 2a or 'configure' *
b320: 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 72 /. Tcl_Obj *r
b330: 65 73 4f 62 6a 3b 09 09 2f 2a 20 52 65 73 75 6c esObj;../* Resul
b340: 74 20 64 61 74 61 20 66 6f 72 20 27 63 6f 6e 66 t data for 'conf
b350: 69 67 75 72 65 27 20 2a 2f 0a 0a 20 20 20 20 2f igure' */.. /
b360: 2a 0a 20 20 20 20 20 2a 20 41 72 65 20 77 65 20 *. * Are we
b370: 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74 20 74 in the correct t
b380: 68 72 65 61 64 3f 0a 20 20 20 20 20 2a 2f 0a 0a hread?. */..
b390: 23 69 66 64 65 66 20 54 43 4c 5f 54 48 52 45 41 #ifdef TCL_THREA
b3a0: 44 53 0a 20 20 20 20 69 66 20 28 72 63 50 74 72 DS. if (rcPtr
b3b0: 2d 3e 74 68 72 65 61 64 20 21 3d 20 54 63 6c 5f ->thread != Tcl_
b3c0: 47 65 74 43 75 72 72 65 6e 74 54 68 72 65 61 64 GetCurrentThread
b3d0: 28 29 29 20 7b 0a 09 46 6f 72 77 61 72 64 50 61 ()) {..ForwardPa
b3e0: 72 61 6d 20 70 3b 0a 0a 09 70 2e 73 65 74 4f 70 ram p;...p.setOp
b3f0: 74 2e 6e 61 6d 65 20 3d 20 6f 70 74 69 6f 6e 4e t.name = optionN
b400: 61 6d 65 3b 0a 09 70 2e 73 65 74 4f 70 74 2e 76 ame;..p.setOpt.v
b410: 61 6c 75 65 20 3d 20 6e 65 77 56 61 6c 75 65 3b alue = newValue;
b420: 0a 0a 09 46 6f 72 77 61 72 64 4f 70 54 6f 4f 77 ...ForwardOpToOw
b430: 6e 65 72 54 68 72 65 61 64 28 72 63 50 74 72 2c nerThread(rcPtr,
b440: 20 46 6f 72 77 61 72 64 65 64 53 65 74 4f 70 74 ForwardedSetOpt
b450: 2c 20 26 70 29 3b 0a 0a 09 69 66 20 28 70 2e 62 , &p);...if (p.b
b460: 61 73 65 2e 63 6f 64 65 20 21 3d 20 54 43 4c 5f ase.code != TCL_
b470: 4f 4b 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4f OK) {.. Tcl_O
b480: 62 6a 20 2a 65 72 72 20 3d 20 54 63 6c 5f 4e 65 bj *err = Tcl_Ne
b490: 77 53 74 72 69 6e 67 4f 62 6a 28 70 2e 62 61 73 wStringObj(p.bas
b4a0: 65 2e 6d 73 67 53 74 72 2c 20 2d 31 29 3b 0a 0a e.msgStr, -1);..
b4b0: 09 20 20 20 20 55 6e 6d 61 72 73 68 61 6c 6c 45 . UnmarshallE
b4c0: 72 72 6f 72 52 65 73 75 6c 74 28 69 6e 74 65 72 rrorResult(inter
b4d0: 70 2c 20 65 72 72 29 3b 0a 09 20 20 20 20 54 63 p, err);.. Tc
b4e0: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 65 l_DecrRefCount(e
b4f0: 72 72 29 3b 0a 09 20 20 20 20 46 72 65 65 52 65 rr);.. FreeRe
b500: 63 65 69 76 65 64 45 72 72 6f 72 28 26 70 29 3b ceivedError(&p);
b510: 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 20 70 2e 62 ..}...return p.b
b520: 61 73 65 2e 63 6f 64 65 3b 0a 20 20 20 20 7d 0a ase.code;. }.
b530: 23 65 6e 64 69 66 0a 0a 20 20 20 20 6f 70 74 69 #endif.. opti
b540: 6f 6e 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 53 onObj = Tcl_NewS
b550: 74 72 69 6e 67 4f 62 6a 28 6f 70 74 69 6f 6e 4e tringObj(optionN
b560: 61 6d 65 2c 20 2d 31 29 3b 0a 20 20 20 20 76 61 ame, -1);. va
b570: 6c 75 65 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 lueObj = Tcl_New
b580: 53 74 72 69 6e 67 4f 62 6a 28 6e 65 77 56 61 6c StringObj(newVal
b590: 75 65 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65 73 ue, -1);. res
b5a0: 75 6c 74 20 3d 20 49 6e 76 6f 6b 65 54 63 6c 4d ult = InvokeTclM
b5b0: 65 74 68 6f 64 28 72 63 50 74 72 2c 20 22 63 6f ethod(rcPtr, "co
b5c0: 6e 66 69 67 75 72 65 22 2c 6f 70 74 69 6f 6e 4f nfigure",optionO
b5d0: 62 6a 2c 76 61 6c 75 65 4f 62 6a 2c 20 26 72 65 bj,valueObj, &re
b5e0: 73 4f 62 6a 29 3b 0a 20 20 20 20 69 66 20 28 72 sObj);. if (r
b5f0: 65 73 75 6c 74 20 21 3d 20 54 43 4c 5f 4f 4b 29 esult != TCL_OK)
b600: 20 7b 0a 09 55 6e 6d 61 72 73 68 61 6c 6c 45 72 {..UnmarshallEr
b610: 72 6f 72 52 65 73 75 6c 74 28 69 6e 74 65 72 70 rorResult(interp
b620: 2c 20 72 65 73 4f 62 6a 29 3b 0a 20 20 20 20 7d , resObj);. }
b630: 0a 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 .. Tcl_DecrRe
b640: 66 43 6f 75 6e 74 28 72 65 73 4f 62 6a 29 3b 09 fCount(resObj);.
b650: 09 2f 2a 20 52 65 6d 6f 76 65 20 72 65 66 65 72 ./* Remove refer
b660: 65 6e 63 65 20 68 65 6c 64 20 66 72 6f 6d 20 69 ence held from i
b670: 6e 76 6f 6b 65 20 2a 2f 0a 20 20 20 20 72 65 74 nvoke */. ret
b680: 75 72 6e 20 72 65 73 75 6c 74 3b 0a 7d 0a 0c 0a urn result;.}...
b690: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
b6a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b6b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b6c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b6d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
b6e0: 2a 20 52 65 66 6c 65 63 74 47 65 74 4f 70 74 69 * ReflectGetOpti
b6f0: 6f 6e 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 on --. *. *.This
b700: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 function is inv
b710: 6f 6b 65 64 20 74 6f 20 72 65 74 72 69 65 76 65 oked to retrieve
b720: 20 61 6c 6c 20 6f 72 20 61 20 63 68 61 6e 6e 65 all or a channe
b730: 6c 20 6f 70 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 l option.. *. *
b740: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 Results:. *.A st
b750: 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c andard Tcl resul
b760: 74 20 63 6f 64 65 2e 0a 20 2a 0a 20 2a 20 53 69 t code.. *. * Si
b770: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 41 de effects:. *.A
b780: 72 62 69 74 72 61 72 79 2c 20 61 73 20 69 74 20 rbitrary, as it
b790: 63 61 6c 6c 73 20 75 70 6f 6e 20 61 20 54 63 6c calls upon a Tcl
b7a0: 20 73 63 72 69 70 74 2e 0a 20 2a 0a 20 2a 2d 2d script.. *. *--
b7b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b7c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b7d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b7e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b7f0: 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 ----. */..static
b800: 20 69 6e 74 0a 52 65 66 6c 65 63 74 47 65 74 4f int.ReflectGetO
b810: 70 74 69 6f 6e 28 0a 20 20 20 20 43 6c 69 65 6e ption(. Clien
b820: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 tData clientData
b830: 2c 09 2f 2a 20 43 68 61 6e 6e 65 6c 20 74 6f 20 ,./* Channel to
b840: 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 54 63 6c query */. Tcl
b850: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c _Interp *interp,
b860: 09 09 2f 2a 20 49 6e 74 65 72 70 72 65 74 65 72 ../* Interpreter
b870: 20 74 6f 20 6c 65 61 76 65 20 65 72 72 6f 72 20 to leave error
b880: 6d 65 73 73 61 67 65 73 20 69 6e 20 2a 2f 0a 20 messages in */.
b890: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6f const char *o
b8a0: 70 74 69 6f 6e 4e 61 6d 65 2c 09 2f 2a 20 4e 61 ptionName,./* Na
b8b0: 6d 65 20 6f 66 20 72 65 75 71 65 73 74 65 64 20 me of reuqested
b8c0: 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 54 63 option */. Tc
b8d0: 6c 5f 44 53 74 72 69 6e 67 20 2a 64 73 50 74 72 l_DString *dsPtr
b8e0: 29 09 09 2f 2a 20 53 74 72 69 6e 67 20 74 6f 20 )../* String to
b8f0: 70 6c 61 63 65 20 74 68 65 20 72 65 73 75 6c 74 place the result
b900: 20 69 6e 74 6f 20 2a 2f 0a 7b 0a 20 20 20 20 2f into */.{. /
b910: 2a 0a 20 20 20 20 20 2a 20 54 68 69 73 20 63 6f *. * This co
b920: 64 65 20 69 73 20 73 70 65 63 69 61 6c 2e 20 49 de is special. I
b930: 74 20 68 61 73 20 72 65 67 75 6c 61 72 20 70 61 t has regular pa
b940: 73 73 69 6e 67 20 6f 66 20 54 63 6c 20 72 65 73 ssing of Tcl res
b950: 75 6c 74 2c 20 61 6e 64 20 65 72 72 6f 72 73 2e ult, and errors.
b960: 0a 20 20 20 20 20 2a 20 54 68 65 20 62 79 70 61 . * The bypa
b970: 73 73 20 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 ss functions are
b980: 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 0a 20 not required..
b990: 20 20 20 20 2a 2f 0a 0a 20 20 20 20 52 65 66 6c */.. Refl
b9a0: 65 63 74 65 64 43 68 61 6e 6e 65 6c 20 2a 72 63 ectedChannel *rc
b9b0: 50 74 72 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 Ptr = clientData
b9c0: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f ;. Tcl_Obj *o
b9d0: 70 74 69 6f 6e 4f 62 6a 3b 0a 20 20 20 20 54 63 ptionObj;. Tc
b9e0: 6c 5f 4f 62 6a 20 2a 72 65 73 4f 62 6a 3b 09 09 l_Obj *resObj;..
b9f0: 2f 2a 20 52 65 73 75 6c 74 20 64 61 74 61 20 66 /* Result data f
ba00: 6f 72 20 27 63 6f 6e 66 69 67 75 72 65 27 20 2a or 'configure' *
ba10: 2f 0a 20 20 20 20 69 6e 74 20 6c 69 73 74 63 3b /. int listc;
ba20: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 6c . Tcl_Obj **l
ba30: 69 73 74 76 3b 0a 20 20 20 20 63 6f 6e 73 74 20 istv;. const
ba40: 63 68 61 72 20 2a 6d 65 74 68 6f 64 3b 0a 0a 20 char *method;..
ba50: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 41 72 65 /*. * Are
ba60: 20 77 65 20 69 6e 20 74 68 65 20 63 6f 72 72 65 we in the corre
ba70: 63 74 20 74 68 72 65 61 64 3f 0a 20 20 20 20 20 ct thread?.
ba80: 2a 2f 0a 0a 23 69 66 64 65 66 20 54 43 4c 5f 54 */..#ifdef TCL_T
ba90: 48 52 45 41 44 53 0a 20 20 20 20 69 66 20 28 72 HREADS. if (r
baa0: 63 50 74 72 2d 3e 74 68 72 65 61 64 20 21 3d 20 cPtr->thread !=
bab0: 54 63 6c 5f 47 65 74 43 75 72 72 65 6e 74 54 68 Tcl_GetCurrentTh
bac0: 72 65 61 64 28 29 29 20 7b 0a 09 69 6e 74 20 6f read()) {..int o
bad0: 70 63 6f 64 65 3b 0a 09 46 6f 72 77 61 72 64 50 pcode;..ForwardP
bae0: 61 72 61 6d 20 70 3b 0a 0a 09 70 2e 67 65 74 4f aram p;...p.getO
baf0: 70 74 2e 6e 61 6d 65 20 3d 20 6f 70 74 69 6f 6e pt.name = option
bb00: 4e 61 6d 65 3b 0a 09 70 2e 67 65 74 4f 70 74 2e Name;..p.getOpt.
bb10: 76 61 6c 75 65 20 3d 20 64 73 50 74 72 3b 0a 0a value = dsPtr;..
bb20: 09 69 66 20 28 6f 70 74 69 6f 6e 4e 61 6d 65 20 .if (optionName
bb30: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 == NULL) {..
bb40: 6f 70 63 6f 64 65 20 3d 20 46 6f 72 77 61 72 64 opcode = Forward
bb50: 65 64 47 65 74 4f 70 74 41 6c 6c 3b 0a 09 7d 20 edGetOptAll;..}
bb60: 65 6c 73 65 20 7b 0a 09 20 20 20 20 6f 70 63 6f else {.. opco
bb70: 64 65 20 3d 20 46 6f 72 77 61 72 64 65 64 47 65 de = ForwardedGe
bb80: 74 4f 70 74 3b 0a 09 7d 0a 0a 09 46 6f 72 77 61 tOpt;..}...Forwa
bb90: 72 64 4f 70 54 6f 4f 77 6e 65 72 54 68 72 65 61 rdOpToOwnerThrea
bba0: 64 28 72 63 50 74 72 2c 20 6f 70 63 6f 64 65 2c d(rcPtr, opcode,
bbb0: 20 26 70 29 3b 0a 0a 09 69 66 20 28 70 2e 62 61 &p);...if (p.ba
bbc0: 73 65 2e 63 6f 64 65 20 21 3d 20 54 43 4c 5f 4f se.code != TCL_O
bbd0: 4b 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4f 62 K) {.. Tcl_Ob
bbe0: 6a 20 2a 65 72 72 20 3d 20 54 63 6c 5f 4e 65 77 j *err = Tcl_New
bbf0: 53 74 72 69 6e 67 4f 62 6a 28 70 2e 62 61 73 65 StringObj(p.base
bc00: 2e 6d 73 67 53 74 72 2c 20 2d 31 29 3b 0a 0a 09 .msgStr, -1);...
bc10: 20 20 20 20 55 6e 6d 61 72 73 68 61 6c 6c 45 72 UnmarshallEr
bc20: 72 6f 72 52 65 73 75 6c 74 28 69 6e 74 65 72 70 rorResult(interp
bc30: 2c 20 65 72 72 29 3b 0a 09 20 20 20 20 54 63 6c , err);.. Tcl
bc40: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 65 72 _DecrRefCount(er
bc50: 72 29 3b 0a 09 20 20 20 20 46 72 65 65 52 65 63 r);.. FreeRec
bc60: 65 69 76 65 64 45 72 72 6f 72 28 26 70 29 3b 0a eivedError(&p);.
bc70: 09 7d 0a 0a 09 72 65 74 75 72 6e 20 70 2e 62 61 .}...return p.ba
bc80: 73 65 2e 63 6f 64 65 3b 0a 20 20 20 20 7d 0a 23 se.code;. }.#
bc90: 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 20 28 6f endif.. if (o
bca0: 70 74 69 6f 6e 4e 61 6d 65 20 3d 3d 20 4e 55 4c ptionName == NUL
bcb0: 4c 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 52 65 74 L) {../*.. * Ret
bcc0: 72 69 65 76 65 20 61 6c 6c 20 6f 70 74 69 6f 6e rieve all option
bcd0: 73 2e 0a 09 20 2a 2f 0a 0a 09 6d 65 74 68 6f 64 s... */...method
bce0: 20 3d 20 22 63 67 65 74 61 6c 6c 22 3b 0a 09 6f = "cgetall";..o
bcf0: 70 74 69 6f 6e 4f 62 6a 20 3d 20 4e 55 4c 4c 3b ptionObj = NULL;
bd00: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f . } else {../
bd10: 2a 0a 09 20 2a 20 52 65 74 72 69 65 76 65 20 74 *.. * Retrieve t
bd20: 68 65 20 76 61 6c 75 65 20 6f 66 20 6f 6e 65 20 he value of one
bd30: 6f 70 74 69 6f 6e 2e 0a 09 20 2a 2f 0a 0a 09 6d option... */...m
bd40: 65 74 68 6f 64 20 3d 20 22 63 67 65 74 22 3b 0a ethod = "cget";.
bd50: 09 6f 70 74 69 6f 6e 4f 62 6a 20 3d 20 54 63 6c .optionObj = Tcl
bd60: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 6f 70 _NewStringObj(op
bd70: 74 69 6f 6e 4e 61 6d 65 2c 20 2d 31 29 3b 0a 20 tionName, -1);.
bd80: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 49 6e }.. if (In
bd90: 76 6f 6b 65 54 63 6c 4d 65 74 68 6f 64 28 72 63 vokeTclMethod(rc
bda0: 50 74 72 2c 20 6d 65 74 68 6f 64 2c 20 6f 70 74 Ptr, method, opt
bdb0: 69 6f 6e 4f 62 6a 2c 20 4e 55 4c 4c 2c 20 26 72 ionObj, NULL, &r
bdc0: 65 73 4f 62 6a 29 21 3d 54 43 4c 5f 4f 4b 29 20 esObj)!=TCL_OK)
bdd0: 7b 0a 09 55 6e 6d 61 72 73 68 61 6c 6c 45 72 72 {..UnmarshallErr
bde0: 6f 72 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c orResult(interp,
bdf0: 20 72 65 73 4f 62 6a 29 3b 0a 09 54 63 6c 5f 44 resObj);..Tcl_D
be00: 65 63 72 52 65 66 43 6f 75 6e 74 28 72 65 73 4f ecrRefCount(resO
be10: 62 6a 29 3b 09 2f 2a 20 52 65 6d 6f 76 65 20 72 bj);./* Remove r
be20: 65 66 65 72 65 6e 63 65 20 68 65 6c 64 20 66 72 eference held fr
be30: 6f 6d 20 69 6e 76 6f 6b 65 20 2a 2f 0a 09 72 65 om invoke */..re
be40: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
be50: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 }.. /*.
be60: 20 20 20 2a 20 54 68 65 20 72 65 73 75 6c 74 20 * The result
be70: 68 61 73 20 74 6f 20 67 6f 20 69 6e 74 6f 20 74 has to go into t
be80: 68 65 20 27 64 73 50 74 72 27 20 66 6f 72 20 70 he 'dsPtr' for p
be90: 72 6f 70 61 67 61 74 69 6f 6e 20 74 6f 20 74 68 ropagation to th
bea0: 65 20 63 61 6c 6c 65 72 20 6f 66 0a 20 20 20 20 e caller of.
beb0: 20 2a 20 74 68 65 20 64 72 69 76 65 72 2e 0a 20 * the driver..
bec0: 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28 */.. if (
bed0: 6f 70 74 69 6f 6e 4f 62 6a 20 21 3d 20 4e 55 4c optionObj != NUL
bee0: 4c 29 20 7b 0a 09 54 63 6c 5f 44 53 74 72 69 6e L) {..Tcl_DStrin
bef0: 67 41 70 70 65 6e 64 28 64 73 50 74 72 2c 20 54 gAppend(dsPtr, T
bf00: 63 6c 47 65 74 53 74 72 69 6e 67 28 72 65 73 4f clGetString(resO
bf10: 62 6a 29 2c 20 2d 31 29 3b 0a 09 54 63 6c 5f 44 bj), -1);..Tcl_D
bf20: 65 63 72 52 65 66 43 6f 75 6e 74 28 72 65 73 4f ecrRefCount(resO
bf30: 62 6a 29 3b 09 2f 2a 20 52 65 6d 6f 76 65 20 72 bj);./* Remove r
bf40: 65 66 65 72 65 6e 63 65 20 68 65 6c 64 20 66 72 eference held fr
bf50: 6f 6d 20 69 6e 76 6f 6b 65 20 2a 2f 0a 09 72 65 om invoke */..re
bf60: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 turn TCL_OK;.
bf70: 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 }.. /*.
bf80: 2a 20 45 78 74 72 61 63 74 20 74 68 65 20 6c 69 * Extract the li
bf90: 73 74 20 61 6e 64 20 61 70 70 65 6e 64 20 65 61 st and append ea
bfa0: 63 68 20 69 74 65 6d 20 61 73 20 65 6c 65 6d 65 ch item as eleme
bfb0: 6e 74 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 nt.. */..
bfc0: 20 2f 2a 0a 20 20 20 20 20 2a 20 4e 4f 54 45 20 /*. * NOTE
bfd0: 28 34 29 3a 20 49 66 20 77 65 20 65 78 74 72 61 (4): If we extra
bfe0: 63 74 20 74 68 65 20 73 74 72 69 6e 67 20 72 65 ct the string re
bff0: 70 20 77 65 20 63 61 6e 20 61 73 73 75 6d 65 20 p we can assume
c000: 61 20 70 72 6f 70 65 72 6c 79 20 71 75 6f 74 65 a properly quote
c010: 64 0a 20 20 20 20 20 2a 20 73 74 72 69 6e 67 2e d. * string.
c020: 20 54 6f 67 65 74 68 65 72 20 77 69 74 68 20 61 Together with a
c030: 20 73 65 70 61 72 61 74 69 6e 67 20 73 70 61 63 separating spac
c040: 65 20 74 68 69 73 20 77 61 79 20 6f 66 20 73 69 e this way of si
c050: 6d 70 6c 79 20 61 70 70 65 6e 64 69 6e 67 0a 20 mply appending.
c060: 20 20 20 20 2a 20 74 68 65 20 77 68 6f 6c 65 20 * the whole
c070: 73 74 72 69 6e 67 20 72 65 70 20 6d 69 67 68 74 string rep might
c080: 20 62 65 20 66 61 73 74 65 72 2e 20 49 74 20 61 be faster. It a
c090: 6c 73 6f 20 64 6f 65 73 6e 27 74 20 63 68 65 63 lso doesn't chec
c0a0: 6b 20 69 66 20 74 68 65 0a 20 20 20 20 20 2a 20 k if the. *
c0b0: 72 65 73 75 6c 74 20 69 73 20 61 20 76 61 6c 69 result is a vali
c0c0: 64 20 6c 69 73 74 2e 20 4e 6f 72 20 74 68 61 74 d list. Nor that
c0d0: 20 74 68 65 20 6c 69 73 74 20 68 61 73 20 61 6e the list has an
c0e0: 20 65 76 65 6e 20 6e 75 6d 62 65 72 20 65 6c 65 even number ele
c0f0: 6d 65 6e 74 73 2e 0a 20 20 20 20 20 2a 2f 0a 0a ments.. */..
c100: 20 20 20 20 69 66 20 28 54 63 6c 5f 4c 69 73 74 if (Tcl_List
c110: 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28 69 ObjGetElements(i
c120: 6e 74 65 72 70 2c 20 72 65 73 4f 62 6a 2c 20 26 nterp, resObj, &
c130: 6c 69 73 74 63 2c 20 26 6c 69 73 74 76 29 20 21 listc, &listv) !
c140: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 54 63 6c = TCL_OK) {..Tcl
c150: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 72 65 _DecrRefCount(re
c160: 73 4f 62 6a 29 3b 09 2f 2a 20 52 65 6d 6f 76 65 sObj);./* Remove
c170: 20 72 65 66 65 72 65 6e 63 65 20 68 65 6c 64 20 reference held
c180: 66 72 6f 6d 20 69 6e 76 6f 6b 65 20 2a 2f 0a 09 from invoke */..
c190: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
c1a0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 ;. }.. if
c1b0: 28 28 6c 69 73 74 63 20 25 20 32 29 20 3d 3d 20 ((listc % 2) ==
c1c0: 31 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 4f 64 64 1) {../*.. * Odd
c1d0: 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 number of eleme
c1e0: 6e 74 73 20 69 73 20 77 72 6f 6e 67 2e 0a 09 20 nts is wrong...
c1f0: 2a 2f 0a 0a 09 54 63 6c 5f 52 65 73 65 74 52 65 */...Tcl_ResetRe
c200: 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09 54 sult(interp);..T
c210: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 cl_SetObjResult(
c220: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 50 interp, Tcl_ObjP
c230: 72 69 6e 74 66 28 0a 09 09 22 45 78 70 65 63 74 rintf(..."Expect
c240: 65 64 20 6c 69 73 74 20 77 69 74 68 20 65 76 65 ed list with eve
c250: 6e 20 6e 75 6d 62 65 72 20 6f 66 20 22 0a 09 09 n number of "...
c260: 22 65 6c 65 6d 65 6e 74 73 2c 20 67 6f 74 20 25 "elements, got %
c270: 64 20 65 6c 65 6d 65 6e 74 25 73 20 69 6e 73 74 d element%s inst
c280: 65 61 64 22 2c 20 6c 69 73 74 63 2c 0a 09 09 28 ead", listc,...(
c290: 6c 69 73 74 63 20 3d 3d 20 31 20 3f 20 22 22 20 listc == 1 ? ""
c2a0: 3a 20 22 73 22 29 29 29 3b 0a 09 54 63 6c 5f 44 : "s")));..Tcl_D
c2b0: 65 63 72 52 65 66 43 6f 75 6e 74 28 72 65 73 4f ecrRefCount(resO
c2c0: 62 6a 29 3b 09 2f 2a 20 52 65 6d 6f 76 65 20 72 bj);./* Remove r
c2d0: 65 66 65 72 65 6e 63 65 20 68 65 6c 64 20 66 72 eference held fr
c2e0: 6f 6d 20 69 6e 76 6f 6b 65 20 2a 2f 0a 09 72 65 om invoke */..re
c2f0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
c300: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 6e } else {..in
c310: 74 20 6c 65 6e 3b 0a 09 63 68 61 72 20 2a 73 74 t len;..char *st
c320: 72 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e r = Tcl_GetStrin
c330: 67 46 72 6f 6d 4f 62 6a 28 72 65 73 4f 62 6a 2c gFromObj(resObj,
c340: 20 26 6c 65 6e 29 3b 0a 0a 09 69 66 20 28 6c 65 &len);...if (le
c350: 6e 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 44 53 n) {.. Tcl_DS
c360: 74 72 69 6e 67 41 70 70 65 6e 64 28 64 73 50 74 tringAppend(dsPt
c370: 72 2c 20 22 20 22 2c 20 31 29 3b 0a 09 20 20 20 r, " ", 1);..
c380: 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 Tcl_DStringAppe
c390: 6e 64 28 64 73 50 74 72 2c 20 73 74 72 2c 20 6c nd(dsPtr, str, l
c3a0: 65 6e 29 3b 0a 09 7d 0a 09 54 63 6c 5f 44 65 63 en);..}..Tcl_Dec
c3b0: 72 52 65 66 43 6f 75 6e 74 28 72 65 73 4f 62 6a rRefCount(resObj
c3c0: 29 3b 09 2f 2a 20 52 65 6d 6f 76 65 20 72 65 66 );./* Remove ref
c3d0: 65 72 65 6e 63 65 20 68 65 6c 64 20 66 72 6f 6d erence held from
c3e0: 20 69 6e 76 6f 6b 65 20 2a 2f 0a 09 72 65 74 75 invoke */..retu
c3f0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d rn TCL_OK;. }
c400: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 20 48 65 6c 70 65 .}.../*. * Helpe
c410: 72 73 2e 20 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d rs. ============
c420: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
c430: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
c440: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 20 2a =============. *
c450: 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d /../*. *--------
c460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
c4a0: 2a 0a 20 2a 20 45 6e 63 6f 64 65 45 76 65 6e 74 *. * EncodeEvent
c4b0: 4d 61 73 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 Mask --. *. *.Th
c4c0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 61 6b 65 is function take
c4d0: 73 20 61 20 6c 69 73 74 20 6f 66 20 65 76 65 6e s a list of even
c4e0: 74 20 69 74 65 6d 73 20 61 6e 64 20 63 6f 6e 73 t items and cons
c4f0: 74 72 75 63 74 73 20 74 68 65 0a 20 2a 09 65 71 tructs the. *.eq
c500: 75 69 76 61 6c 65 6e 74 20 69 6e 74 65 72 6e 61 uivalent interna
c510: 6c 20 62 69 74 6d 61 73 6b 2e 20 54 68 65 20 6c l bitmask. The l
c520: 69 73 74 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e ist must contain
c530: 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 0a 20 2a at least one. *
c540: 09 65 6c 65 6d 65 6e 74 2e 20 45 6c 65 6d 65 6e .element. Elemen
c550: 74 73 20 61 72 65 20 22 72 65 61 64 22 2c 20 22 ts are "read", "
c560: 77 72 69 74 65 22 2c 20 6f 72 20 61 6e 79 20 75 write", or any u
c570: 6e 69 71 75 65 20 61 62 62 72 65 76 69 61 74 69 nique abbreviati
c580: 6f 6e 20 6f 66 0a 20 2a 09 74 68 65 6d 2e 20 4e on of. *.them. N
c590: 6f 74 65 20 74 68 61 74 20 74 68 65 20 62 69 74 ote that the bit
c5a0: 6d 61 73 6b 20 69 73 20 6e 6f 74 20 63 68 61 6e mask is not chan
c5b0: 67 65 64 20 69 66 20 70 72 6f 62 6c 65 6d 73 20 ged if problems
c5c0: 61 72 65 0a 20 2a 09 65 6e 63 6f 75 6e 74 65 72 are. *.encounter
c5d0: 65 64 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 ed.. *. * Result
c5e0: 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 s:. *.A standard
c5f0: 20 54 63 6c 20 65 72 72 6f 72 20 63 6f 64 65 2e Tcl error code.
c600: 20 41 20 62 69 74 6d 61 73 6b 20 77 68 65 72 65 A bitmask where
c610: 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 20 61 6e TCL_READABLE an
c620: 64 2f 6f 72 0a 20 2a 09 54 43 4c 5f 57 52 49 54 d/or. *.TCL_WRIT
c630: 41 42 4c 45 20 63 61 6e 20 62 65 20 73 65 74 2e ABLE can be set.
c640: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
c650: 63 74 73 3a 0a 20 2a 09 4d 61 79 20 73 68 69 6d cts:. *.May shim
c660: 6d 65 72 20 27 6f 62 6a 27 20 74 6f 20 61 20 6c mer 'obj' to a l
c670: 69 73 74 20 72 65 70 72 65 73 65 6e 74 61 74 69 ist representati
c680: 6f 6e 2e 20 4d 61 79 20 70 6c 61 63 65 20 61 6e on. May place an
c690: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 error message.
c6a0: 2a 09 69 6e 74 6f 20 74 68 65 20 69 6e 74 65 72 *.into the inter
c6b0: 70 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 2d p result.. *. *-
c6c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c6d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c6e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c6f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c700: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 -----. */..stati
c710: 63 20 69 6e 74 0a 45 6e 63 6f 64 65 45 76 65 6e c int.EncodeEven
c720: 74 4d 61 73 6b 28 0a 20 20 20 20 54 63 6c 5f 49 tMask(. Tcl_I
c730: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 nterp *interp,.
c740: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6f const char *o
c750: 62 6a 4e 61 6d 65 2c 0a 20 20 20 20 54 63 6c 5f bjName,. Tcl_
c760: 4f 62 6a 20 2a 6f 62 6a 2c 0a 20 20 20 20 69 6e Obj *obj,. in
c770: 74 20 2a 6d 61 73 6b 29 0a 7b 0a 20 20 20 20 69 t *mask).{. i
c780: 6e 74 20 65 76 65 6e 74 73 3b 09 09 09 2f 2a 20 nt events;.../*
c790: 4d 61 73 6b 20 6f 66 20 65 76 65 6e 74 73 20 74 Mask of events t
c7a0: 6f 20 70 6f 73 74 20 2a 2f 0a 20 20 20 20 69 6e o post */. in
c7b0: 74 20 6c 69 73 74 63 3b 09 09 09 2f 2a 20 23 65 t listc;.../* #e
c7c0: 6c 65 6d 65 6e 74 73 20 69 6e 20 65 76 65 6e 74 lements in event
c7d0: 73 70 65 63 20 6c 69 73 74 20 2a 2f 0a 20 20 20 spec list */.
c7e0: 20 54 63 6c 5f 4f 62 6a 20 2a 2a 6c 69 73 74 76 Tcl_Obj **listv
c7f0: 3b 09 09 2f 2a 20 45 6c 65 6d 65 6e 74 73 20 6f ;../* Elements o
c800: 66 20 65 76 65 6e 74 73 70 65 63 20 6c 69 73 74 f eventspec list
c810: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65 76 49 6e */. int evIn
c820: 64 65 78 3b 09 09 2f 2a 20 49 64 20 6f 66 20 65 dex;../* Id of e
c830: 76 65 6e 74 20 66 6f 72 20 61 6e 20 65 6c 65 6d vent for an elem
c840: 65 6e 74 20 6f 66 20 74 68 65 20 65 76 65 6e 74 ent of the event
c850: 73 70 65 63 0a 09 09 09 09 20 2a 20 6c 69 73 74 spec..... * list
c860: 2e 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28 54 63 . */.. if (Tc
c870: 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d l_ListObjGetElem
c880: 65 6e 74 73 28 69 6e 74 65 72 70 2c 20 6f 62 6a ents(interp, obj
c890: 2c 20 26 6c 69 73 74 63 2c 20 26 6c 69 73 74 76 , &listc, &listv
c8a0: 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 ) != TCL_OK) {..
c8b0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
c8c0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 ;. }.. if
c8d0: 28 6c 69 73 74 63 20 3c 20 31 29 20 7b 0a 09 54 (listc < 1) {..T
c8e0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
c8f0: 69 6e 74 65 72 70 2c 20 22 62 61 64 20 22 2c 20 interp, "bad ",
c900: 6f 62 6a 4e 61 6d 65 2c 20 22 20 6c 69 73 74 3a objName, " list:
c910: 20 69 73 20 65 6d 70 74 79 22 2c 20 4e 55 4c 4c is empty", NULL
c920: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 );..return TCL_E
c930: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 RROR;. }..
c940: 20 65 76 65 6e 74 73 20 3d 20 30 3b 0a 20 20 20 events = 0;.
c950: 20 77 68 69 6c 65 20 28 6c 69 73 74 63 20 3e 20 while (listc >
c960: 30 29 20 7b 0a 09 69 66 20 28 54 63 6c 5f 47 65 0) {..if (Tcl_Ge
c970: 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e tIndexFromObj(in
c980: 74 65 72 70 2c 20 6c 69 73 74 76 5b 6c 69 73 74 terp, listv[list
c990: 63 2d 31 5d 2c 20 65 76 65 6e 74 4f 70 74 69 6f c-1], eventOptio
c9a0: 6e 73 2c 0a 09 09 6f 62 6a 4e 61 6d 65 2c 20 30 ns,...objName, 0
c9b0: 2c 20 26 65 76 49 6e 64 65 78 29 20 21 3d 20 54 , &evIndex) != T
c9c0: 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 72 65 CL_OK) {.. re
c9d0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
c9e0: 09 7d 0a 09 73 77 69 74 63 68 20 28 65 76 49 6e .}..switch (evIn
c9f0: 64 65 78 29 20 7b 0a 09 63 61 73 65 20 45 56 45 dex) {..case EVE
ca00: 4e 54 5f 52 45 41 44 3a 0a 09 20 20 20 20 65 76 NT_READ:.. ev
ca10: 65 6e 74 73 20 7c 3d 20 54 43 4c 5f 52 45 41 44 ents |= TCL_READ
ca20: 41 42 4c 45 3b 0a 09 20 20 20 20 62 72 65 61 6b ABLE;.. break
ca30: 3b 0a 09 63 61 73 65 20 45 56 45 4e 54 5f 57 52 ;..case EVENT_WR
ca40: 49 54 45 3a 0a 09 20 20 20 20 65 76 65 6e 74 73 ITE:.. events
ca50: 20 7c 3d 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 |= TCL_WRITABLE
ca60: 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 7d ;.. break;..}
ca70: 0a 09 6c 69 73 74 63 20 2d 2d 3b 0a 20 20 20 20 ..listc --;.
ca80: 7d 0a 0a 20 20 20 20 2a 6d 61 73 6b 20 3d 20 65 }.. *mask = e
ca90: 76 65 6e 74 73 3b 0a 20 20 20 20 72 65 74 75 72 vents;. retur
caa0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a n TCL_OK;.}.../*
cab0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
cac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
caf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
cb00: 44 65 63 6f 64 65 45 76 65 6e 74 4d 61 73 6b 20 DecodeEventMask
cb10: 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 66 75 --. *. *.This fu
cb20: 6e 63 74 69 6f 6e 20 74 61 6b 65 73 20 61 6e 20 nction takes an
cb30: 69 6e 74 65 72 6e 61 6c 20 62 69 74 6d 61 73 6b internal bitmask
cb40: 20 6f 66 20 65 76 65 6e 74 73 20 61 6e 64 20 63 of events and c
cb50: 6f 6e 73 74 72 75 63 74 73 20 74 68 65 0a 20 2a onstructs the. *
cb60: 09 65 71 75 69 76 61 6c 65 6e 74 20 6c 69 73 74 .equivalent list
cb70: 20 6f 66 20 65 76 65 6e 74 20 69 74 65 6d 73 2e of event items.
cb80: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
cb90: 20 2a 09 41 20 54 63 6c 5f 4f 62 6a 20 72 65 66 *.A Tcl_Obj ref
cba0: 65 72 65 6e 63 65 2e 20 54 68 65 20 6f 62 6a 65 erence. The obje
cbb0: 63 74 20 77 69 6c 6c 20 68 61 76 65 20 61 20 72 ct will have a r
cbc0: 65 66 43 6f 75 6e 74 20 6f 66 20 6f 6e 65 2e 20 efCount of one.
cbd0: 54 68 65 20 75 73 65 72 0a 20 2a 09 68 61 73 20 The user. *.has
cbe0: 74 6f 20 64 65 63 72 65 6d 65 6e 74 20 69 74 20 to decrement it
cbf0: 74 6f 20 72 65 6c 65 61 73 65 20 74 68 65 20 6f to release the o
cc00: 62 6a 65 63 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 bject.. *. * Sid
cc10: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f e effects:. *.No
cc20: 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d ne.. *. *-------
cc30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cc40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cc50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cc60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
cc70: 20 2a 2f 0a 0a 73 74 61 74 69 63 20 54 63 6c 5f */..static Tcl_
cc80: 4f 62 6a 20 2a 0a 44 65 63 6f 64 65 45 76 65 6e Obj *.DecodeEven
cc90: 74 4d 61 73 6b 28 0a 20 20 20 20 69 6e 74 20 6d tMask(. int m
cca0: 61 73 6b 29 0a 7b 0a 20 20 20 20 72 65 67 69 73 ask).{. regis
ccb0: 74 65 72 20 63 6f 6e 73 74 20 63 68 61 72 20 2a ter const char *
ccc0: 65 76 65 6e 74 53 74 72 3b 0a 20 20 20 20 54 63 eventStr;. Tc
ccd0: 6c 5f 4f 62 6a 20 2a 65 76 4f 62 6a 3b 0a 0a 20 l_Obj *evObj;..
cce0: 20 20 20 73 77 69 74 63 68 20 28 6d 61 73 6b 20 switch (mask
ccf0: 26 20 52 41 4e 44 57 29 20 7b 0a 20 20 20 20 63 & RANDW) {. c
cd00: 61 73 65 20 52 41 4e 44 57 3a 0a 09 65 76 65 6e ase RANDW:..even
cd10: 74 53 74 72 20 3d 20 22 72 65 61 64 20 77 72 69 tStr = "read wri
cd20: 74 65 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 te";..break;.
cd30: 20 63 61 73 65 20 54 43 4c 5f 52 45 41 44 41 42 case TCL_READAB
cd40: 4c 45 3a 0a 09 65 76 65 6e 74 53 74 72 20 3d 20 LE:..eventStr =
cd50: 22 72 65 61 64 22 3b 0a 09 62 72 65 61 6b 3b 0a "read";..break;.
cd60: 20 20 20 20 63 61 73 65 20 54 43 4c 5f 57 52 49 case TCL_WRI
cd70: 54 41 42 4c 45 3a 0a 09 65 76 65 6e 74 53 74 72 TABLE:..eventStr
cd80: 20 3d 20 22 77 72 69 74 65 22 3b 0a 09 62 72 65 = "write";..bre
cd90: 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a ak;. default:
cda0: 0a 09 65 76 65 6e 74 53 74 72 20 3d 20 22 22 3b ..eventStr = "";
cdb0: 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a ..break;. }..
cdc0: 20 20 20 20 65 76 4f 62 6a 20 3d 20 54 63 6c 5f evObj = Tcl_
cdd0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 65 76 65 NewStringObj(eve
cde0: 6e 74 53 74 72 2c 20 2d 31 29 3b 0a 20 20 20 20 ntStr, -1);.
cdf0: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 Tcl_IncrRefCount
ce00: 28 65 76 4f 62 6a 29 3b 0a 20 20 20 20 72 65 74 (evObj);. ret
ce10: 75 72 6e 20 65 76 4f 62 6a 3b 0a 7d 0a 0c 0a 2f urn evObj;.}.../
ce20: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
ce30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ce40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ce50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ce60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
ce70: 20 4e 65 77 52 65 66 6c 65 63 74 65 64 43 68 61 NewReflectedCha
ce80: 6e 6e 65 6c 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 nnel --. *. *.Th
ce90: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 is function is i
cea0: 6e 76 6f 6b 65 64 20 74 6f 20 61 6c 6c 6f 63 61 nvoked to alloca
ceb0: 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a te and initializ
cec0: 65 20 74 68 65 20 69 6e 73 74 61 6e 63 65 20 64 e the instance d
ced0: 61 74 61 0a 20 2a 09 6f 66 20 61 20 6e 65 77 20 ata. *.of a new
cee0: 72 65 66 6c 65 63 74 65 64 20 63 68 61 6e 6e 65 reflected channe
cef0: 6c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 l.. *. * Results
cf00: 3a 0a 20 2a 09 41 20 68 65 61 70 2d 61 6c 6c 6f :. *.A heap-allo
cf10: 63 61 74 65 64 20 63 68 61 6e 6e 65 6c 20 69 6e cated channel in
cf20: 73 74 61 6e 63 65 2e 0a 20 2a 0a 20 2a 20 53 69 stance.. *. * Si
cf30: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 41 de effects:. *.A
cf40: 6c 6c 6f 63 61 74 65 73 20 6d 65 6d 6f 72 79 2e llocates memory.
cf50: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
cf60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cf70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cf80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
cf90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
cfa0: 0a 0a 73 74 61 74 69 63 20 52 65 66 6c 65 63 74 ..static Reflect
cfb0: 65 64 43 68 61 6e 6e 65 6c 20 2a 0a 4e 65 77 52 edChannel *.NewR
cfc0: 65 66 6c 65 63 74 65 64 43 68 61 6e 6e 65 6c 28 eflectedChannel(
cfd0: 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 . Tcl_Interp
cfe0: 2a 69 6e 74 65 72 70 2c 0a 20 20 20 20 54 63 6c *interp,. Tcl
cff0: 5f 4f 62 6a 20 2a 63 6d 64 70 66 78 4f 62 6a 2c _Obj *cmdpfxObj,
d000: 0a 20 20 20 20 69 6e 74 20 6d 6f 64 65 2c 0a 20 . int mode,.
d010: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 68 61 6e 64 Tcl_Obj *hand
d020: 6c 65 4f 62 6a 29 0a 7b 0a 20 20 20 20 52 65 66 leObj).{. Ref
d030: 6c 65 63 74 65 64 43 68 61 6e 6e 65 6c 20 2a 72 lectedChannel *r
d040: 63 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 69 2c cPtr;. int i,
d050: 20 6c 69 73 74 63 3b 0a 20 20 20 20 54 63 6c 5f listc;. Tcl_
d060: 4f 62 6a 20 2a 2a 6c 69 73 74 76 3b 0a 0a 20 20 Obj **listv;..
d070: 20 20 72 63 50 74 72 20 3d 20 28 52 65 66 6c 65 rcPtr = (Refle
d080: 63 74 65 64 43 68 61 6e 6e 65 6c 20 2a 29 20 63 ctedChannel *) c
d090: 6b 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 52 65 kalloc(sizeof(Re
d0a0: 66 6c 65 63 74 65 64 43 68 61 6e 6e 65 6c 29 29 flectedChannel))
d0b0: 3b 0a 0a 20 20 20 20 2f 2a 20 72 63 50 74 72 2d ;.. /* rcPtr-
d0c0: 3e 63 68 61 6e 3a 20 41 73 73 69 67 6e 65 64 20 >chan: Assigned
d0d0: 62 79 20 63 61 6c 6c 65 72 2e 20 44 75 6d 6d 79 by caller. Dummy
d0e0: 20 64 61 74 61 20 68 65 72 65 2e 20 2a 2f 0a 20 data here. */.
d0f0: 20 20 20 2f 2a 20 72 63 50 74 72 2d 3e 6d 65 74 /* rcPtr->met
d100: 68 6f 64 73 3a 20 41 73 73 69 67 6e 65 64 20 62 hods: Assigned b
d110: 79 20 63 61 6c 6c 65 72 2e 20 44 75 6d 6d 79 20 y caller. Dummy
d120: 64 61 74 61 20 68 65 72 65 2e 20 2a 2f 0a 0a 20 data here. */..
d130: 20 20 20 72 63 50 74 72 2d 3e 63 68 61 6e 20 3d rcPtr->chan =
d140: 20 4e 55 4c 4c 3b 0a 20 20 20 20 72 63 50 74 72 NULL;. rcPtr
d150: 2d 3e 6d 65 74 68 6f 64 73 20 3d 20 30 3b 0a 20 ->methods = 0;.
d160: 20 20 20 72 63 50 74 72 2d 3e 69 6e 74 65 72 70 rcPtr->interp
d170: 20 3d 20 69 6e 74 65 72 70 3b 0a 23 69 66 64 65 = interp;.#ifde
d180: 66 20 54 43 4c 5f 54 48 52 45 41 44 53 0a 20 20 f TCL_THREADS.
d190: 20 20 72 63 50 74 72 2d 3e 74 68 72 65 61 64 20 rcPtr->thread
d1a0: 3d 20 54 63 6c 5f 47 65 74 43 75 72 72 65 6e 74 = Tcl_GetCurrent
d1b0: 54 68 72 65 61 64 28 29 3b 0a 23 65 6e 64 69 66 Thread();.#endif
d1c0: 0a 20 20 20 20 72 63 50 74 72 2d 3e 6d 6f 64 65 . rcPtr->mode
d1d0: 20 3d 20 6d 6f 64 65 3b 0a 20 20 20 20 72 63 50 = mode;. rcP
d1e0: 74 72 2d 3e 69 6e 74 65 72 65 73 74 20 3d 20 30 tr->interest = 0
d1f0: 3b 09 09 2f 2a 20 49 6e 69 74 69 61 6c 6c 79 20 ;../* Initially
d200: 6e 6f 20 69 6e 74 65 72 65 73 74 20 72 65 67 69 no interest regi
d210: 73 74 65 72 65 64 20 2a 2f 0a 0a 20 20 20 20 2f stered */.. /
d220: 2a 0a 20 20 20 20 20 2a 20 4d 65 74 68 6f 64 20 *. * Method
d230: 70 6c 61 63 65 68 6f 6c 64 65 72 2e 0a 20 20 20 placeholder..
d240: 20 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 41 53 53 */.. /* ASS
d250: 45 52 54 3a 20 63 6d 64 70 66 78 4f 62 6a 20 69 ERT: cmdpfxObj i
d260: 73 20 61 20 54 63 6c 20 4c 69 73 74 20 2a 2f 0a s a Tcl List */.
d270: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a . Tcl_ListObj
d280: 47 65 74 45 6c 65 6d 65 6e 74 73 28 69 6e 74 65 GetElements(inte
d290: 72 70 2c 20 63 6d 64 70 66 78 4f 62 6a 2c 20 26 rp, cmdpfxObj, &
d2a0: 6c 69 73 74 63 2c 20 26 6c 69 73 74 76 29 3b 0a listc, &listv);.
d2b0: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53 . /*. * S
d2c0: 65 65 20 5b 3d 3d 5d 20 61 73 20 77 65 6c 6c 2e ee [==] as well.
d2d0: 0a 20 20 20 20 20 2a 20 53 74 6f 72 61 67 65 20 . * Storage
d2e0: 66 6f 72 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 for the command
d2f0: 70 72 65 66 69 78 20 61 6e 64 20 74 68 65 20 61 prefix and the a
d300: 64 64 69 74 69 6f 6e 61 6c 20 77 6f 72 64 73 20 dditional words
d310: 72 65 71 75 69 72 65 64 20 66 6f 72 0a 20 20 20 required for.
d320: 20 20 2a 20 74 68 65 20 69 6e 76 6f 63 61 74 69 * the invocati
d330: 6f 6e 20 6f 66 20 6d 65 74 68 6f 64 73 20 69 6e on of methods in
d340: 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 68 61 6e the command han
d350: 64 6c 65 72 2e 0a 20 20 20 20 20 2a 0a 20 20 20 dler.. *.
d360: 20 20 2a 20 6c 69 73 74 76 20 5b 30 5d 20 5b 6c * listv [0] [l
d370: 69 73 74 63 2d 31 5d 20 7c 20 5b 6c 69 73 74 63 istc-1] | [listc
d380: 5d 20 20 5b 6c 69 73 74 63 2b 31 5d 20 7c 0a 20 ] [listc+1] |.
d390: 20 20 20 20 2a 20 61 72 67 76 20 20 5b 30 5d 20 * argv [0]
d3a0: 20 20 2e 2e 2e 20 5b 2e 5d 20 7c 20 5b 61 72 67 ... [.] | [arg
d3b0: 63 2d 32 5d 20 5b 61 72 67 63 2d 31 5d 20 20 7c c-2] [argc-1] |
d3c0: 20 5b 61 72 67 63 5d 20 20 5b 61 72 67 63 2b 32 [argc] [argc+2
d3d0: 5d 0a 20 20 20 20 20 2a 20 20 20 20 20 20 20 63 ]. * c
d3e0: 6d 64 20 20 20 2e 2e 2e 20 70 66 78 20 7c 20 6d md ... pfx | m
d3f0: 65 74 68 6f 64 20 20 20 63 68 61 6e 20 20 20 20 ethod chan
d400: 20 20 7c 20 64 65 74 61 69 6c 31 20 64 65 74 61 | detail1 deta
d410: 69 6c 32 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 il2. */..
d420: 20 72 63 50 74 72 2d 3e 61 72 67 63 20 3d 20 6c rcPtr->argc = l
d430: 69 73 74 63 20 2b 20 32 3b 0a 20 20 20 20 72 63 istc + 2;. rc
d440: 50 74 72 2d 3e 61 72 67 76 20 3d 20 28 54 63 6c Ptr->argv = (Tcl
d450: 5f 4f 62 6a 20 2a 2a 29 20 63 6b 61 6c 6c 6f 63 _Obj **) ckalloc
d460: 28 73 69 7a 65 6f 66 28 54 63 6c 5f 4f 62 6a 20 (sizeof(Tcl_Obj
d470: 2a 29 20 2a 20 28 6c 69 73 74 63 2b 34 29 29 3b *) * (listc+4));
d480: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 .. /*. *
d490: 44 75 70 6c 69 63 61 74 65 20 6f 62 6a 65 63 74 Duplicate object
d4a0: 20 72 65 66 65 72 65 6e 63 65 73 2e 0a 20 20 20 references..
d4b0: 20 20 2a 2f 0a 0a 20 20 20 20 66 6f 72 20 28 69 */.. for (i
d4c0: 3d 30 3b 20 69 3c 6c 69 73 74 63 20 3b 20 69 2b =0; i<listc ; i+
d4d0: 2b 29 20 7b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 77 +) {..Tcl_Obj *w
d4e0: 6f 72 64 20 3d 20 72 63 50 74 72 2d 3e 61 72 67 ord = rcPtr->arg
d4f0: 76 5b 69 5d 20 3d 20 6c 69 73 74 76 5b 69 5d 3b v[i] = listv[i];
d500: 0a 0a 09 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f ...Tcl_IncrRefCo
d510: 75 6e 74 28 77 6f 72 64 29 3b 0a 20 20 20 20 7d unt(word);. }
d520: 0a 0a 20 20 20 20 69 2b 2b 3b 09 09 09 09 2f 2a .. i++;..../*
d530: 20 53 6b 69 70 20 70 6c 61 63 65 68 6f 6c 64 65 Skip placeholde
d540: 72 20 66 6f 72 20 6d 65 74 68 6f 64 20 2a 2f 0a r for method */.
d550: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 5b . /*. * [
d560: 42 75 67 20 31 36 36 37 39 39 30 5d 3a 20 53 65 Bug 1667990]: Se
d570: 65 20 5b 78 5d 20 69 6e 20 46 72 65 65 52 65 66 e [x] in FreeRef
d580: 6c 65 63 74 65 64 43 68 61 6e 6e 65 6c 20 66 6f lectedChannel fo
d590: 72 20 72 65 6c 65 61 73 65 0a 20 20 20 20 20 2a r release. *
d5a0: 2f 0a 0a 20 20 20 20 72 63 50 74 72 2d 3e 61 72 /.. rcPtr->ar
d5b0: 67 76 5b 69 5d 20 3d 20 68 61 6e 64 6c 65 4f 62 gv[i] = handleOb
d5c0: 6a 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 j;. Tcl_IncrR
d5d0: 65 66 43 6f 75 6e 74 28 68 61 6e 64 6c 65 4f 62 efCount(handleOb
d5e0: 6a 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 j);.. /*.
d5f0: 20 2a 20 54 68 65 20 6e 65 78 74 20 74 77 6f 20 * The next two
d600: 6f 62 6a 65 63 74 73 20 61 72 65 20 6b 65 70 74 objects are kept
d610: 20 65 6d 70 74 79 2c 20 76 61 72 79 69 6e 67 20 empty, varying
d620: 61 72 67 75 6d 65 6e 74 73 2e 0a 20 20 20 20 20 arguments..
d630: 2a 2f 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 */.. /*.
d640: 2a 20 49 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e * Initialization
d650: 20 63 6f 6d 70 6c 65 74 65 2e 0a 20 20 20 20 20 complete..
d660: 2a 2f 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 72 */.. return r
d670: 63 50 74 72 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d cPtr;.}.../*. *-
d680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d6a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d6b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d6c0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4e 65 78 74 -----. *. * Next
d6d0: 48 61 6e 64 6c 65 20 2d 2d 0a 20 2a 0a 20 2a 09 Handle --. *. *.
d6e0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 This function is
d6f0: 20 69 6e 76 6f 6b 65 64 20 74 6f 20 67 65 6e 65 invoked to gene
d700: 72 61 74 65 20 61 20 63 68 61 6e 6e 65 6c 20 68 rate a channel h
d710: 61 6e 64 6c 65 20 66 6f 72 20 61 20 6e 65 77 0a andle for a new.
d720: 20 2a 09 72 65 66 6c 65 63 74 65 64 20 63 68 61 *.reflected cha
d730: 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 nnel.. *. * Resu
d740: 6c 74 73 3a 0a 20 2a 09 41 20 54 63 6c 5f 4f 62 lts:. *.A Tcl_Ob
d750: 6a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 j containing the
d760: 20 73 74 72 69 6e 67 20 6f 66 20 74 68 65 20 6e string of the n
d770: 65 77 20 63 68 61 6e 6e 65 6c 20 68 61 6e 64 6c ew channel handl
d780: 65 2e 20 54 68 65 0a 20 2a 09 72 65 66 63 6f 75 e. The. *.refcou
d790: 6e 74 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e nt of the return
d7a0: 65 64 20 6f 62 6a 65 63 74 20 69 73 20 2d 2d 20 ed object is --
d7b0: 7a 65 72 6f 20 2d 2d 2e 0a 20 2a 0a 20 2a 20 53 zero --.. *. * S
d7c0: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
d7d0: 4d 61 79 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d May allocate mem
d7e0: 6f 72 79 2e 20 4d 75 74 65 78 20 70 72 6f 74 65 ory. Mutex prote
d7f0: 63 74 65 64 20 63 72 69 74 69 63 61 6c 20 73 65 cted critical se
d800: 63 74 69 6f 6e 20 6c 6f 63 6b 73 20 6f 75 74 20 ction locks out
d810: 6f 74 68 65 72 0a 20 2a 09 74 68 72 65 61 64 73 other. *.threads
d820: 20 66 6f 72 20 61 20 73 68 6f 72 74 20 74 69 6d for a short tim
d830: 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d e.. *. *--------
d840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
d880: 2a 2f 0a 0a 73 74 61 74 69 63 20 54 63 6c 5f 4f */..static Tcl_O
d890: 62 6a 20 2a 0a 4e 65 78 74 48 61 6e 64 6c 65 28 bj *.NextHandle(
d8a0: 76 6f 69 64 29 0a 7b 0a 20 20 20 20 2f 2a 0a 20 void).{. /*.
d8b0: 20 20 20 20 2a 20 43 6f 75 6e 74 20 6e 75 6d 62 * Count numb
d8c0: 65 72 20 6f 66 20 67 65 6e 65 72 61 74 65 64 20 er of generated
d8d0: 72 65 66 6c 65 63 74 65 64 20 63 68 61 6e 6e 65 reflected channe
d8e0: 6c 73 2e 20 55 73 65 64 20 66 6f 72 20 69 64 20 ls. Used for id
d8f0: 67 65 6e 65 72 61 74 69 6f 6e 2e 0a 20 20 20 20 generation..
d900: 20 2a 20 49 64 73 20 61 72 65 20 6e 65 76 65 72 * Ids are never
d910: 20 72 65 63 6c 61 69 6d 65 64 20 61 6e 64 20 74 reclaimed and t
d920: 68 65 72 65 20 69 73 20 6e 6f 20 64 65 61 6c 69 here is no deali
d930: 6e 67 20 77 69 74 68 20 77 72 61 70 20 61 72 6f ng with wrap aro
d940: 75 6e 64 2e 20 4f 6e 0a 20 20 20 20 20 2a 20 74 und. On. * t
d950: 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 22 he other hand, "
d960: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 22 20 73 unsigned long" s
d970: 68 6f 75 6c 64 20 62 65 20 62 69 67 20 65 6e 6f hould be big eno
d980: 75 67 68 20 65 78 63 65 70 74 20 66 6f 72 0a 20 ugh except for.
d990: 20 20 20 20 2a 20 61 62 73 6f 6c 75 74 65 20 6c * absolute l
d9a0: 6f 6e 67 72 75 6e 6e 65 72 73 20 28 67 65 6e 65 ongrunners (gene
d9b0: 72 61 74 65 20 61 20 31 30 30 20 69 64 73 20 70 rate a 100 ids p
d9c0: 65 72 20 73 65 63 6f 6e 64 20 3d 3e 20 6f 76 65 er second => ove
d9d0: 72 66 6c 6f 77 20 77 69 6c 6c 0a 20 20 20 20 20 rflow will.
d9e0: 2a 20 6f 63 63 75 72 20 69 6e 20 31 20 31 2f 33 * occur in 1 1/3
d9f0: 20 79 65 61 72 73 29 2e 0a 20 20 20 20 20 2a 2f years).. */
da00: 0a 0a 20 20 20 20 54 43 4c 5f 44 45 43 4c 41 52 .. TCL_DECLAR
da10: 45 5f 4d 55 54 45 58 28 72 63 43 6f 75 6e 74 65 E_MUTEX(rcCounte
da20: 72 4d 75 74 65 78 29 0a 20 20 20 20 73 74 61 74 rMutex). stat
da30: 69 63 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 ic unsigned long
da40: 20 72 63 43 6f 75 6e 74 65 72 20 3d 20 30 3b 0a rcCounter = 0;.
da50: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 Tcl_Obj *res
da60: 4f 62 6a 3b 0a 0a 20 20 20 20 54 63 6c 5f 4d 75 Obj;.. Tcl_Mu
da70: 74 65 78 4c 6f 63 6b 28 26 72 63 43 6f 75 6e 74 texLock(&rcCount
da80: 65 72 4d 75 74 65 78 29 3b 0a 20 20 20 20 72 65 erMutex);. re
da90: 73 4f 62 6a 20 3d 20 54 63 6c 5f 4f 62 6a 50 72 sObj = Tcl_ObjPr
daa0: 69 6e 74 66 28 22 72 63 25 6c 75 22 2c 20 72 63 intf("rc%lu", rc
dab0: 43 6f 75 6e 74 65 72 29 3b 0a 20 20 20 20 72 63 Counter);. rc
dac0: 43 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20 20 54 Counter++;. T
dad0: 63 6c 5f 4d 75 74 65 78 55 6e 6c 6f 63 6b 28 26 cl_MutexUnlock(&
dae0: 72 63 43 6f 75 6e 74 65 72 4d 75 74 65 78 29 3b rcCounterMutex);
daf0: 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 .. return res
db00: 4f 62 6a 3b 0a 7d 0a 0c 0a 73 74 61 74 69 63 20 Obj;.}...static
db10: 76 6f 69 64 0a 46 72 65 65 52 65 66 6c 65 63 74 void.FreeReflect
db20: 65 64 43 68 61 6e 6e 65 6c 28 0a 20 20 20 20 52 edChannel(. R
db30: 65 66 6c 65 63 74 65 64 43 68 61 6e 6e 65 6c 20 eflectedChannel
db40: 2a 72 63 50 74 72 29 0a 7b 0a 20 20 20 20 43 68 *rcPtr).{. Ch
db50: 61 6e 6e 65 6c 20 2a 63 68 61 6e 50 74 72 20 3d annel *chanPtr =
db60: 20 28 43 68 61 6e 6e 65 6c 20 2a 29 20 72 63 50 (Channel *) rcP
db70: 74 72 2d 3e 63 68 61 6e 3b 0a 20 20 20 20 69 6e tr->chan;. in
db80: 74 20 69 2c 20 6e 3b 0a 0a 20 20 20 20 69 66 20 t i, n;.. if
db90: 28 63 68 61 6e 50 74 72 2d 3e 74 79 70 65 50 74 (chanPtr->typePt
dba0: 72 20 21 3d 20 26 74 63 6c 52 43 68 61 6e 6e 65 r != &tclRChanne
dbb0: 6c 54 79 70 65 29 20 7b 0a 09 2f 2a 0a 09 20 2a lType) {../*.. *
dbc0: 20 44 65 6c 65 74 65 20 61 20 63 6c 6f 6e 65 64 Delete a cloned
dbd0: 20 43 68 61 6e 6e 65 6c 54 79 70 65 20 73 74 72 ChannelType str
dbe0: 75 63 74 75 72 65 2e 0a 09 20 2a 2f 0a 0a 09 63 ucture... */...c
dbf0: 6b 66 72 65 65 28 28 63 68 61 72 20 2a 29 20 63 kfree((char *) c
dc00: 68 61 6e 50 74 72 2d 3e 74 79 70 65 50 74 72 29 hanPtr->typePtr)
dc10: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 20 3d ;. }.. n =
dc20: 20 72 63 50 74 72 2d 3e 61 72 67 63 20 2d 20 32 rcPtr->argc - 2
dc30: 3b 0a 20 20 20 20 66 6f 72 20 28 69 3d 30 3b 20 ;. for (i=0;
dc40: 69 3c 6e 3b 20 69 2b 2b 29 20 7b 0a 09 54 63 6c i<n; i++) {..Tcl
dc50: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 72 63 _DecrRefCount(rc
dc60: 50 74 72 2d 3e 61 72 67 76 5b 69 5d 29 3b 0a 20 Ptr->argv[i]);.
dc70: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 }.. /*.
dc80: 20 20 2a 20 5b 42 75 67 20 31 36 36 37 39 39 30 * [Bug 1667990
dc90: 5d 3a 20 53 65 65 20 5b 78 5d 20 69 6e 20 4e 65 ]: See [x] in Ne
dca0: 77 52 65 66 6c 65 63 74 65 64 43 68 61 6e 6e 65 wReflectedChanne
dcb0: 6c 20 66 6f 72 20 6c 6f 63 6b 2e 20 6e 2b 31 20 l for lock. n+1
dcc0: 3d 20 61 72 67 63 2d 31 2e 0a 20 20 20 20 20 2a = argc-1.. *
dcd0: 2f 0a 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 /.. Tcl_DecrR
dce0: 65 66 43 6f 75 6e 74 28 72 63 50 74 72 2d 3e 61 efCount(rcPtr->a
dcf0: 72 67 76 5b 6e 2b 31 5d 29 3b 0a 0a 20 20 20 20 rgv[n+1]);..
dd00: 63 6b 66 72 65 65 28 28 63 68 61 72 20 2a 29 20 ckfree((char *)
dd10: 72 63 50 74 72 2d 3e 61 72 67 76 29 3b 0a 20 20 rcPtr->argv);.
dd20: 20 20 63 6b 66 72 65 65 28 28 63 68 61 72 20 2a ckfree((char *
dd30: 29 20 72 63 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a ) rcPtr);.}.../*
dd40: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
dd50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
dd60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
dd70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
dd80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
dd90: 49 6e 76 6f 6b 65 54 63 6c 4d 65 74 68 6f 64 20 InvokeTclMethod
dda0: 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 66 75 --. *. *.This fu
ddb0: 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 nction is used t
ddc0: 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 54 63 6c o invoke the Tcl
ddd0: 20 6c 65 76 65 6c 20 6f 66 20 61 20 72 65 66 6c level of a refl
dde0: 65 63 74 65 64 20 63 68 61 6e 6e 65 6c 2e 0a 20 ected channel..
ddf0: 2a 09 49 74 20 68 61 6e 64 6c 65 73 20 61 6c 6c *.It handles all
de00: 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 61 73 73 the command ass
de10: 65 6d 62 6c 79 2c 20 69 6e 76 6f 6b 61 74 69 6f embly, invokatio
de20: 6e 2c 20 61 6e 64 20 67 65 6e 65 72 69 63 20 73 n, and generic s
de30: 74 61 74 65 20 61 6e 64 0a 20 2a 09 72 65 73 75 tate and. *.resu
de40: 6c 74 20 6d 67 6d 74 2e 20 49 74 20 64 6f 65 73 lt mgmt. It does
de50: 20 2a 6e 6f 74 2a 20 68 61 6e 64 6c 65 20 74 68 *not* handle th
de60: 72 65 61 64 20 72 65 64 69 72 65 63 74 69 6f 6e read redirection
de70: 3b 20 74 68 61 74 20 69 73 20 74 68 65 0a 20 2a ; that is the. *
de80: 09 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 .responsibility
de90: 6f 66 20 63 6c 69 65 6e 74 73 20 6f 66 20 74 68 of clients of th
dea0: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 2a 0a is function.. *.
deb0: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 52 * Results:. *.R
dec0: 65 73 75 6c 74 20 63 6f 64 65 20 61 6e 64 20 64 esult code and d
ded0: 61 74 61 20 61 73 20 72 65 74 75 72 6e 65 64 20 ata as returned
dee0: 62 79 20 74 68 65 20 6d 65 74 68 6f 64 2e 0a 20 by the method..
def0: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
df00: 73 3a 0a 20 2a 09 41 72 62 69 74 72 61 72 79 2c s:. *.Arbitrary,
df10: 20 61 73 20 69 74 20 63 61 6c 6c 73 20 75 70 6f as it calls upo
df20: 6e 20 61 20 54 63 6c 20 73 63 72 69 70 74 2e 0a n a Tcl script..
df30: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
df40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
df50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
df60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
df70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
df80: 0a 73 74 61 74 69 63 20 69 6e 74 0a 49 6e 76 6f .static int.Invo
df90: 6b 65 54 63 6c 4d 65 74 68 6f 64 28 0a 20 20 20 keTclMethod(.
dfa0: 20 52 65 66 6c 65 63 74 65 64 43 68 61 6e 6e 65 ReflectedChanne
dfb0: 6c 20 2a 72 63 50 74 72 2c 0a 20 20 20 20 63 6f l *rcPtr,. co
dfc0: 6e 73 74 20 63 68 61 72 20 2a 6d 65 74 68 6f 64 nst char *method
dfd0: 2c 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 61 ,. Tcl_Obj *a
dfe0: 72 67 4f 6e 65 4f 62 6a 2c 09 09 2f 2a 20 4e 55 rgOneObj,../* NU
dff0: 4c 4c 27 61 62 6c 65 20 2a 2f 0a 20 20 20 20 54 LL'able */. T
e000: 63 6c 5f 4f 62 6a 20 2a 61 72 67 54 77 6f 4f 62 cl_Obj *argTwoOb
e010: 6a 2c 09 09 2f 2a 20 4e 55 4c 4c 27 61 62 6c 65 j,../* NULL'able
e020: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 */. Tcl_Obj
e030: 2a 2a 72 65 73 75 6c 74 4f 62 6a 50 74 72 29 09 **resultObjPtr).
e040: 2f 2a 20 4e 55 4c 4c 27 61 62 6c 65 20 2a 2f 0a /* NULL'able */.
e050: 7b 0a 20 20 20 20 69 6e 74 20 63 6d 64 63 3b 09 {. int cmdc;.
e060: 09 09 2f 2a 20 23 77 6f 72 64 73 20 69 6e 20 63 ../* #words in c
e070: 6f 6e 73 74 72 75 63 74 65 64 20 63 6f 6d 6d 61 onstructed comma
e080: 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 nd */. Tcl_Ob
e090: 6a 20 2a 6d 65 74 68 4f 62 6a 20 3d 20 4e 55 4c j *methObj = NUL
e0a0: 4c 3b 09 2f 2a 20 4d 65 74 68 6f 64 20 6e 61 6d L;./* Method nam
e0b0: 65 20 69 6e 20 6f 62 6a 65 63 74 20 66 6f 72 6d e in object form
e0c0: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 */. Tcl_Inte
e0d0: 72 70 53 74 61 74 65 20 73 72 3b 09 09 2f 2a 20 rpState sr;../*
e0e0: 53 74 61 74 65 20 6f 66 20 68 61 6e 64 6c 65 72 State of handler
e0f0: 20 69 6e 74 65 72 70 20 2a 2f 0a 20 20 20 20 69 interp */. i
e100: 6e 74 20 72 65 73 75 6c 74 3b 09 09 09 2f 2a 20 nt result;.../*
e110: 52 65 73 75 6c 74 20 63 6f 64 65 20 6f 66 20 6d Result code of m
e120: 65 74 68 6f 64 20 69 6e 76 6f 6b 61 74 69 6f 6e ethod invokation
e130: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 */. Tcl_Obj
e140: 2a 72 65 73 4f 62 6a 20 3d 20 4e 55 4c 4c 3b 09 *resObj = NULL;.
e150: 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 6d 65 74 /* Result of met
e160: 68 6f 64 20 69 6e 76 6f 6b 61 74 69 6f 6e 2e 20 hod invokation.
e170: 2a 2f 0a 0a 20 20 20 20 69 66 20 28 21 72 63 50 */.. if (!rcP
e180: 74 72 2d 3e 69 6e 74 65 72 70 29 20 7b 0a 09 2f tr->interp) {../
e190: 2a 0a 09 20 2a 20 54 68 65 20 63 68 61 6e 6e 65 *.. * The channe
e1a0: 6c 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 64 l is marked as d
e1b0: 65 61 64 2e 20 42 61 69 6c 20 6f 75 74 20 69 6d ead. Bail out im
e1c0: 6d 65 64 69 61 74 65 6c 79 2c 20 77 69 74 68 20 mediately, with
e1d0: 61 6e 0a 09 20 2a 20 61 70 70 72 6f 70 72 69 61 an.. * appropria
e1e0: 74 65 20 65 72 72 6f 72 2e 0a 09 20 2a 2f 0a 0a te error... */..
e1f0: 09 69 66 20 28 72 65 73 75 6c 74 4f 62 6a 50 74 .if (resultObjPt
e200: 72 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 r != NULL) {..
e210: 20 20 72 65 73 4f 62 6a 20 3d 20 54 63 6c 5f 4e resObj = Tcl_N
e220: 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d 73 67 5f ewStringObj(msg_
e230: 64 73 74 6c 6f 73 74 2c 2d 31 29 3b 0a 09 20 20 dstlost,-1);..
e240: 20 20 2a 72 65 73 75 6c 74 4f 62 6a 50 74 72 20 *resultObjPtr
e250: 3d 20 72 65 73 4f 62 6a 3b 0a 09 20 20 20 20 54 = resObj;.. T
e260: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 cl_IncrRefCount(
e270: 72 65 73 4f 62 6a 29 3b 0a 09 7d 0a 0a 09 2f 2a resObj);..}.../*
e280: 0a 09 20 2a 20 43 6c 65 61 6e 75 70 20 6f 66 20 .. * Cleanup of
e290: 74 68 65 20 64 79 6e 61 6d 69 63 20 70 61 72 74 the dynamic part
e2a0: 73 20 6f 66 20 74 68 65 20 63 6f 6d 6d 61 6e 64 s of the command
e2b0: 2e 0a 09 20 2a 2f 0a 0a 09 69 66 20 28 61 72 67 ... */...if (arg
e2c0: 4f 6e 65 4f 62 6a 29 20 7b 0a 09 20 20 20 20 54 OneObj) {.. T
e2d0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 cl_DecrRefCount(
e2e0: 61 72 67 4f 6e 65 4f 62 6a 29 3b 0a 09 20 20 20 argOneObj);..
e2f0: 20 69 66 20 28 61 72 67 54 77 6f 4f 62 6a 29 20 if (argTwoObj)
e300: 7b 0a 09 09 54 63 6c 5f 44 65 63 72 52 65 66 43 {...Tcl_DecrRefC
e310: 6f 75 6e 74 28 61 72 67 54 77 6f 4f 62 6a 29 3b ount(argTwoObj);
e320: 0a 09 20 20 20 20 7d 0a 09 7d 0a 0a 09 72 65 74 .. }..}...ret
e330: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
e340: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 }.. /*.
e350: 20 20 2a 20 4e 4f 54 45 20 28 35 29 3a 20 44 65 * NOTE (5): De
e360: 63 69 64 65 20 69 6d 70 6c 2e 20 69 73 73 75 65 cide impl. issue
e370: 3a 20 43 61 63 68 65 20 6f 62 6a 65 63 74 73 20 : Cache objects
e380: 77 69 74 68 20 6d 65 74 68 6f 64 20 6e 61 6d 65 with method name
e390: 73 3f 20 4e 65 65 64 73 0a 20 20 20 20 20 2a 20 s? Needs. *
e3a0: 54 53 44 20 64 61 74 61 20 61 73 20 72 65 66 6c TSD data as refl
e3b0: 65 63 74 69 6f 6e 73 20 63 61 6e 20 62 65 20 63 ections can be c
e3c0: 72 65 61 74 65 64 20 69 6e 20 6d 61 6e 79 20 64 reated in many d
e3d0: 69 66 66 65 72 65 6e 74 20 74 68 72 65 61 64 73 ifferent threads
e3e0: 2e 0a 20 20 20 20 20 2a 20 4e 4f 3a 20 43 61 63 .. * NO: Cac
e3f0: 68 69 6e 67 20 6f 66 20 63 6f 6d 6d 61 6e 64 20 hing of command
e400: 72 65 73 6f 6c 75 74 69 6f 6e 73 20 6d 65 61 6e resolutions mean
e410: 73 20 73 74 6f 72 61 67 65 20 70 65 72 20 63 68 s storage per ch
e420: 61 6e 6e 65 6c 2e 0a 20 20 20 20 20 2a 2f 0a 0a annel.. */..
e430: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 49 6e /*. * In
e440: 73 65 72 74 20 6d 65 74 68 6f 64 20 69 6e 74 6f sert method into
e450: 20 74 68 65 20 70 72 65 2d 61 6c 6c 6f 63 61 74 the pre-allocat
e460: 65 64 20 61 72 65 61 2c 20 61 66 74 65 72 20 74 ed area, after t
e470: 68 65 20 63 6f 6d 6d 61 6e 64 20 70 72 65 66 69 he command prefi
e480: 78 2c 0a 20 20 20 20 20 2a 20 62 65 66 6f 72 65 x,. * before
e490: 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 69 64 2e the channel id.
e4a0: 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 6d 65 . */.. me
e4b0: 74 68 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 53 thObj = Tcl_NewS
e4c0: 74 72 69 6e 67 4f 62 6a 28 6d 65 74 68 6f 64 2c tringObj(method,
e4d0: 20 2d 31 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e -1);. Tcl_In
e4e0: 63 72 52 65 66 43 6f 75 6e 74 28 6d 65 74 68 4f crRefCount(methO
e4f0: 62 6a 29 3b 0a 20 20 20 20 72 63 50 74 72 2d 3e bj);. rcPtr->
e500: 61 72 67 76 5b 72 63 50 74 72 2d 3e 61 72 67 63 argv[rcPtr->argc
e510: 20 2d 20 32 5d 20 3d 20 6d 65 74 68 4f 62 6a 3b - 2] = methObj;
e520: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 .. /*. *
e530: 41 70 70 65 6e 64 20 74 68 65 20 61 64 64 69 74 Append the addit
e540: 69 6f 6e 61 6c 20 61 72 67 75 6d 65 6e 74 20 63 ional argument c
e550: 6f 6e 74 61 69 6e 69 6e 67 20 6d 65 74 68 6f 64 ontaining method
e560: 20 73 70 65 63 69 66 69 63 20 64 65 74 61 69 6c specific detail
e570: 73 0a 20 20 20 20 20 2a 20 62 65 68 69 6e 64 20 s. * behind
e580: 74 68 65 20 63 68 61 6e 6e 65 6c 20 69 64 2e 20 the channel id.
e590: 49 66 20 73 70 65 63 69 66 69 65 64 2e 0a 20 20 If specified..
e5a0: 20 20 20 2a 2f 0a 0a 20 20 20 20 63 6d 64 63 20 */.. cmdc
e5b0: 3d 20 72 63 50 74 72 2d 3e 61 72 67 63 3b 0a 20 = rcPtr->argc;.
e5c0: 20 20 20 69 66 20 28 61 72 67 4f 6e 65 4f 62 6a if (argOneObj
e5d0: 29 20 7b 0a 09 54 63 6c 5f 49 6e 63 72 52 65 66 ) {..Tcl_IncrRef
e5e0: 43 6f 75 6e 74 28 61 72 67 4f 6e 65 4f 62 6a 29 Count(argOneObj)
e5f0: 3b 0a 09 72 63 50 74 72 2d 3e 61 72 67 76 5b 63 ;..rcPtr->argv[c
e600: 6d 64 63 5d 20 3d 20 61 72 67 4f 6e 65 4f 62 6a mdc] = argOneObj
e610: 3b 0a 09 63 6d 64 63 2b 2b 3b 0a 09 69 66 20 28 ;..cmdc++;..if (
e620: 61 72 67 54 77 6f 4f 62 6a 29 20 7b 0a 09 20 20 argTwoObj) {..
e630: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 Tcl_IncrRefCou
e640: 6e 74 28 61 72 67 54 77 6f 4f 62 6a 29 3b 0a 09 nt(argTwoObj);..
e650: 20 20 20 20 72 63 50 74 72 2d 3e 61 72 67 76 5b rcPtr->argv[
e660: 63 6d 64 63 5d 20 3d 20 61 72 67 54 77 6f 4f 62 cmdc] = argTwoOb
e670: 6a 3b 0a 09 20 20 20 20 63 6d 64 63 2b 2b 3b 0a j;.. cmdc++;.
e680: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a .}. }.. /*
e690: 0a 20 20 20 20 20 2a 20 41 6e 64 20 72 75 6e 20 . * And run
e6a0: 74 68 65 20 68 61 6e 64 6c 65 72 2e 2e 2e 20 54 the handler... T
e6b0: 68 69 73 20 69 73 20 64 6f 6e 65 20 69 6e 20 61 his is done in a
e6c0: 75 63 68 20 61 20 6d 61 6e 6e 65 72 20 77 68 69 uch a manner whi
e6d0: 63 68 20 6c 65 61 76 65 73 20 61 6e 79 0a 20 20 ch leaves any.
e6e0: 20 20 20 2a 20 65 78 69 73 74 69 6e 67 20 73 74 * existing st
e6f0: 61 74 65 20 69 6e 74 61 63 74 2e 0a 20 20 20 20 ate intact..
e700: 20 2a 2f 0a 0a 20 20 20 20 73 72 20 3d 20 54 63 */.. sr = Tc
e710: 6c 5f 53 61 76 65 49 6e 74 65 72 70 53 74 61 74 l_SaveInterpStat
e720: 65 28 72 63 50 74 72 2d 3e 69 6e 74 65 72 70 2c e(rcPtr->interp,
e730: 20 30 20 2f 2a 20 44 75 6d 6d 79 20 2a 2f 29 3b 0 /* Dummy */);
e740: 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 . Tcl_Preserv
e750: 65 28 72 63 50 74 72 2d 3e 69 6e 74 65 72 70 29 e(rcPtr->interp)
e760: 3b 0a 20 20 20 20 72 65 73 75 6c 74 20 3d 20 54 ;. result = T
e770: 63 6c 5f 45 76 61 6c 4f 62 6a 76 28 72 63 50 74 cl_EvalObjv(rcPt
e780: 72 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64 63 2c r->interp, cmdc,
e790: 20 72 63 50 74 72 2d 3e 61 72 67 76 2c 20 54 43 rcPtr->argv, TC
e7a0: 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a L_EVAL_GLOBAL);.
e7b0: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 57 . /*. * W
e7c0: 65 20 64 6f 20 6e 6f 74 20 74 72 79 20 74 6f 20 e do not try to
e7d0: 65 78 74 72 61 63 74 20 74 68 65 20 72 65 73 75 extract the resu
e7e0: 6c 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 lt information i
e7f0: 66 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 f the caller has
e800: 20 6e 6f 0a 20 20 20 20 20 2a 20 69 6e 74 65 72 no. * inter
e810: 65 73 74 20 69 6e 20 69 74 2e 20 49 2e 65 2e 20 est in it. I.e.
e820: 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 there is no need
e830: 20 74 6f 20 70 75 74 20 65 66 66 6f 72 74 20 69 to put effort i
e840: 6e 74 6f 20 63 72 65 61 74 69 6e 67 0a 20 20 20 nto creating.
e850: 20 20 2a 20 73 6f 6d 65 74 68 69 6e 67 20 77 68 * something wh
e860: 69 63 68 20 69 73 20 64 69 73 63 61 72 64 65 64 ich is discarded
e870: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 immediately aft
e880: 65 72 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 er.. */..
e890: 20 69 66 20 28 72 65 73 75 6c 74 4f 62 6a 50 74 if (resultObjPt
e8a0: 72 29 20 7b 0a 09 69 66 20 28 72 65 73 75 6c 74 r) {..if (result
e8b0: 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 == TCL_OK) {..
e8c0: 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20 4f 6b /*.. * Ok
e8d0: 20 72 65 73 75 6c 74 20 74 61 6b 65 6e 20 61 73 result taken as
e8e0: 20 69 73 2c 20 61 6c 73 6f 20 69 66 20 74 68 65 is, also if the
e8f0: 20 63 61 6c 6c 65 72 20 72 65 71 75 65 73 74 73 caller requests
e900: 20 74 68 61 74 20 74 68 65 72 65 0a 09 20 20 20 that there..
e910: 20 20 2a 20 69 73 20 6e 6f 20 63 61 70 74 75 72 * is no captur
e920: 65 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20 e... */...
e930: 20 20 72 65 73 4f 62 6a 20 3d 20 54 63 6c 5f 47 resObj = Tcl_G
e940: 65 74 4f 62 6a 52 65 73 75 6c 74 28 72 63 50 74 etObjResult(rcPt
e950: 72 2d 3e 69 6e 74 65 72 70 29 3b 0a 09 7d 20 65 r->interp);..} e
e960: 6c 73 65 20 7b 0a 09 20 20 20 20 2f 2a 0a 09 20 lse {.. /*..
e970: 20 20 20 20 2a 20 4e 6f 6e 2d 6f 6b 20 72 65 73 * Non-ok res
e980: 75 6c 74 20 69 73 20 61 6c 77 61 79 73 20 74 72 ult is always tr
e990: 65 61 74 65 64 20 61 73 20 61 6e 20 65 72 72 6f eated as an erro
e9a0: 72 2e 20 57 65 20 68 61 76 65 20 74 6f 20 63 61 r. We have to ca
e9b0: 70 74 75 72 65 0a 09 20 20 20 20 20 2a 20 74 68 pture.. * th
e9c0: 65 20 66 75 6c 6c 20 73 74 61 74 65 20 6f 66 20 e full state of
e9d0: 74 68 65 20 72 65 73 75 6c 74 2c 20 69 6e 63 6c the result, incl
e9e0: 75 64 69 6e 67 20 61 64 64 69 74 69 6f 6e 61 6c uding additional
e9f0: 20 6f 70 74 69 6f 6e 73 2e 0a 09 20 20 20 20 20 options...
ea00: 2a 0a 09 20 20 20 20 20 2a 20 54 68 69 73 20 69 *.. * This i
ea10: 73 20 63 6f 6d 70 6c 65 78 20 61 6e 64 20 75 67 s complex and ug
ea20: 6c 79 2c 20 61 6e 64 20 77 6f 75 6c 64 20 62 65 ly, and would be
ea30: 20 63 6f 6d 70 6c 65 74 65 6c 79 20 75 6e 6e 65 completely unne
ea40: 63 65 73 73 61 72 79 0a 09 20 20 20 20 20 2a 20 cessary.. *
ea50: 69 66 20 77 65 20 6f 6e 6c 79 20 61 64 64 65 64 if we only added
ea60: 20 73 75 70 70 6f 72 74 20 66 6f 72 20 61 20 54 support for a T
ea70: 43 4c 5f 46 4f 52 42 49 44 5f 45 58 43 45 50 54 CL_FORBID_EXCEPT
ea80: 49 4f 4e 53 20 66 6c 61 67 2e 0a 09 20 20 20 20 IONS flag...
ea90: 20 2a 2f 0a 0a 09 20 20 20 20 69 66 20 28 72 65 */... if (re
eaa0: 73 75 6c 74 20 21 3d 20 54 43 4c 5f 45 52 52 4f sult != TCL_ERRO
eab0: 52 29 20 7b 0a 09 09 54 63 6c 5f 4f 62 6a 20 2a R) {...Tcl_Obj *
eac0: 63 6d 64 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 cmd = Tcl_NewLis
ead0: 74 4f 62 6a 28 63 6d 64 63 2c 20 72 63 50 74 72 tObj(cmdc, rcPtr
eae0: 2d 3e 61 72 67 76 29 3b 0a 09 09 69 6e 74 20 63 ->argv);...int c
eaf0: 6d 64 4c 65 6e 3b 0a 09 09 63 6f 6e 73 74 20 63 mdLen;...const c
eb00: 68 61 72 20 2a 63 6d 64 53 74 72 69 6e 67 20 3d har *cmdString =
eb10: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 Tcl_GetStringFr
eb20: 6f 6d 4f 62 6a 28 63 6d 64 2c 20 26 63 6d 64 4c omObj(cmd, &cmdL
eb30: 65 6e 29 3b 0a 0a 09 09 54 63 6c 5f 49 6e 63 72 en);....Tcl_Incr
eb40: 52 65 66 43 6f 75 6e 74 28 63 6d 64 29 3b 0a 09 RefCount(cmd);..
eb50: 09 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 .Tcl_ResetResult
eb60: 28 72 63 50 74 72 2d 3e 69 6e 74 65 72 70 29 3b (rcPtr->interp);
eb70: 0a 09 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 ...Tcl_SetObjRes
eb80: 75 6c 74 28 72 63 50 74 72 2d 3e 69 6e 74 65 72 ult(rcPtr->inter
eb90: 70 2c 20 54 63 6c 5f 4f 62 6a 50 72 69 6e 74 66 p, Tcl_ObjPrintf
eba0: 28 0a 09 09 09 22 63 68 61 6e 20 68 61 6e 64 6c (...."chan handl
ebb0: 65 72 20 72 65 74 75 72 6e 65 64 20 62 61 64 20 er returned bad
ebc0: 63 6f 64 65 3a 20 25 64 22 2c 20 72 65 73 75 6c code: %d", resul
ebd0: 74 29 29 3b 0a 09 09 54 63 6c 5f 4c 6f 67 43 6f t));...Tcl_LogCo
ebe0: 6d 6d 61 6e 64 49 6e 66 6f 28 72 63 50 74 72 2d mmandInfo(rcPtr-
ebf0: 3e 69 6e 74 65 72 70 2c 20 63 6d 64 53 74 72 69 >interp, cmdStri
ec00: 6e 67 2c 20 63 6d 64 53 74 72 69 6e 67 2c 0a 09 ng, cmdString,..
ec10: 09 09 63 6d 64 4c 65 6e 29 3b 0a 09 09 54 63 6c ..cmdLen);...Tcl
ec20: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d _DecrRefCount(cm
ec30: 64 29 3b 0a 09 09 72 65 73 75 6c 74 20 3d 20 54 d);...result = T
ec40: 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d CL_ERROR;.. }
ec50: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 .. Tcl_Append
ec60: 4f 62 6a 54 6f 45 72 72 6f 72 49 6e 66 6f 28 72 ObjToErrorInfo(r
ec70: 63 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20 54 63 cPtr->interp, Tc
ec80: 6c 5f 4f 62 6a 50 72 69 6e 74 66 28 0a 09 09 20 l_ObjPrintf(...
ec90: 20 20 20 22 5c 6e 20 20 20 20 28 63 68 61 6e 20 "\n (chan
eca0: 68 61 6e 64 6c 65 72 20 73 75 62 63 6f 6d 6d 61 handler subcomma
ecb0: 6e 64 20 5c 22 25 73 5c 22 29 22 2c 20 6d 65 74 nd \"%s\")", met
ecc0: 68 6f 64 29 29 3b 0a 09 20 20 20 20 72 65 73 4f hod));.. resO
ecd0: 62 6a 20 3d 20 4d 61 72 73 68 61 6c 6c 45 72 72 bj = MarshallErr
ece0: 6f 72 28 72 63 50 74 72 2d 3e 69 6e 74 65 72 70 or(rcPtr->interp
ecf0: 29 3b 0a 09 7d 0a 09 54 63 6c 5f 49 6e 63 72 52 );..}..Tcl_IncrR
ed00: 65 66 43 6f 75 6e 74 28 72 65 73 4f 62 6a 29 3b efCount(resObj);
ed10: 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 52 . }. Tcl_R
ed20: 65 73 74 6f 72 65 49 6e 74 65 72 70 53 74 61 74 estoreInterpStat
ed30: 65 28 72 63 50 74 72 2d 3e 69 6e 74 65 72 70 2c e(rcPtr->interp,
ed40: 20 73 72 29 3b 0a 20 20 20 20 54 63 6c 5f 52 65 sr);. Tcl_Re
ed50: 6c 65 61 73 65 28 72 63 50 74 72 2d 3e 69 6e 74 lease(rcPtr->int
ed60: 65 72 70 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 erp);.. /*.
ed70: 20 20 20 2a 20 43 6c 65 61 6e 75 70 20 6f 66 20 * Cleanup of
ed80: 74 68 65 20 64 79 6e 61 6d 69 63 20 70 61 72 74 the dynamic part
ed90: 73 20 6f 66 20 74 68 65 20 63 6f 6d 6d 61 6e 64 s of the command
eda0: 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 54 .. */.. T
edb0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 cl_DecrRefCount(
edc0: 6d 65 74 68 4f 62 6a 29 3b 0a 20 20 20 20 69 66 methObj);. if
edd0: 20 28 61 72 67 4f 6e 65 4f 62 6a 29 20 7b 0a 09 (argOneObj) {..
ede0: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 Tcl_DecrRefCount
edf0: 28 61 72 67 4f 6e 65 4f 62 6a 29 3b 0a 09 69 66 (argOneObj);..if
ee00: 20 28 61 72 67 54 77 6f 4f 62 6a 29 20 7b 0a 09 (argTwoObj) {..
ee10: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 Tcl_DecrRefC
ee20: 6f 75 6e 74 28 61 72 67 54 77 6f 4f 62 6a 29 3b ount(argTwoObj);
ee30: 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f ..}. }.. /
ee40: 2a 0a 20 20 20 20 20 2a 20 54 68 65 20 72 65 73 *. * The res
ee50: 4f 62 6a 20 68 61 73 20 61 20 72 65 66 20 63 6f Obj has a ref co
ee60: 75 6e 74 20 6f 66 20 31 20 61 74 20 74 68 69 73 unt of 1 at this
ee70: 20 6c 6f 63 61 74 69 6f 6e 2e 20 54 68 69 73 20 location. This
ee80: 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 0a 20 means that the.
ee90: 20 20 20 20 2a 20 63 61 6c 6c 65 72 20 6f 66 20 * caller of
eea0: 49 6e 76 6f 6b 65 54 63 6c 4d 65 74 68 6f 64 20 InvokeTclMethod
eeb0: 68 61 73 20 74 6f 20 64 69 73 70 6f 73 65 20 6f has to dispose o
eec0: 66 20 69 74 20 28 62 75 74 20 6f 6e 6c 79 20 69 f it (but only i
eed0: 66 20 69 74 20 77 61 73 0a 20 20 20 20 20 2a 20 f it was. *
eee0: 72 65 74 75 72 6e 65 64 20 74 6f 20 69 74 29 2e returned to it).
eef0: 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66 . */.. if
ef00: 20 28 72 65 73 75 6c 74 4f 62 6a 50 74 72 20 21 (resultObjPtr !
ef10: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 2a 72 65 73 75 = NULL) {..*resu
ef20: 6c 74 4f 62 6a 50 74 72 20 3d 20 72 65 73 4f 62 ltObjPtr = resOb
ef30: 6a 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a j;. }.. /*
ef40: 0a 20 20 20 20 20 2a 20 54 68 65 72 65 20 6e 6f . * There no
ef50: 20 6e 65 65 64 20 74 6f 20 68 61 6e 64 6c 65 20 need to handle
ef60: 74 68 65 20 63 61 73 65 20 77 68 65 72 65 20 6e the case where n
ef70: 6f 74 68 69 6e 67 20 69 73 20 72 65 74 75 72 6e othing is return
ef80: 65 64 2c 20 62 65 63 61 75 73 65 20 66 6f 72 0a ed, because for.
ef90: 20 20 20 20 20 2a 20 74 68 61 74 20 63 61 73 65 * that case
efa0: 20 72 65 73 4f 62 6a 20 77 61 73 20 6e 6f 74 20 resObj was not
efb0: 73 65 74 20 61 6e 79 77 61 79 2e 0a 20 20 20 20 set anyway..
efc0: 20 2a 2f 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 */.. return
efd0: 72 65 73 75 6c 74 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 result;.}.../*.
efe0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
eff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f020: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 47 65 -------. *. * Ge
f030: 74 52 65 66 6c 65 63 74 65 64 43 68 61 6e 6e 65 tReflectedChanne
f040: 6c 4d 61 70 20 2d 2d 0a 20 2a 0a 20 2a 09 47 65 lMap --. *. *.Ge
f050: 74 73 20 61 6e 64 20 70 6f 74 65 6e 74 69 61 6c ts and potential
f060: 6c 79 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 74 ly initializes t
f070: 68 65 20 72 65 66 6c 65 63 74 65 64 20 63 68 61 he reflected cha
f080: 6e 6e 65 6c 20 6d 61 70 20 66 6f 72 20 61 6e 0a nnel map for an.
f090: 20 2a 09 69 6e 74 65 72 70 72 65 74 65 72 2e 0a *.interpreter..
f0a0: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
f0b0: 2a 09 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 *.A pointer to t
f0c0: 68 65 20 6d 61 70 20 63 72 65 61 74 65 64 2c 20 he map created,
f0d0: 66 6f 72 20 75 73 65 20 62 79 20 74 68 65 20 63 for use by the c
f0e0: 61 6c 6c 65 72 2e 0a 20 2a 0a 20 2a 20 53 69 64 aller.. *. * Sid
f0f0: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 49 6e e effects:. *.In
f100: 69 74 69 61 6c 69 7a 65 73 20 74 68 65 20 72 65 itializes the re
f110: 66 6c 65 63 74 65 64 20 63 68 61 6e 6e 65 6c 20 flected channel
f120: 6d 61 70 20 66 6f 72 20 61 6e 20 69 6e 74 65 72 map for an inter
f130: 70 72 65 74 65 72 2e 0a 20 2a 0a 20 2a 2d 2d 2d preter.. *. *---
f140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f180: 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 ---. */..static
f190: 52 65 66 6c 65 63 74 65 64 43 68 61 6e 6e 65 6c ReflectedChannel
f1a0: 4d 61 70 20 2a 0a 47 65 74 52 65 66 6c 65 63 74 Map *.GetReflect
f1b0: 65 64 43 68 61 6e 6e 65 6c 4d 61 70 28 0a 20 20 edChannelMap(.
f1c0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e Tcl_Interp *in
f1d0: 74 65 72 70 29 0a 7b 0a 20 20 20 20 52 65 66 6c terp).{. Refl
f1e0: 65 63 74 65 64 43 68 61 6e 6e 65 6c 4d 61 70 20 ectedChannelMap
f1f0: 2a 72 63 6d 50 74 72 20 3d 20 54 63 6c 5f 47 65 *rcmPtr = Tcl_Ge
f200: 74 41 73 73 6f 63 44 61 74 61 28 69 6e 74 65 72 tAssocData(inter
f210: 70 2c 20 52 43 4d 4b 45 59 2c 20 4e 55 4c 4c 29 p, RCMKEY, NULL)
f220: 3b 0a 0a 20 20 20 20 69 66 20 28 72 63 6d 50 74 ;.. if (rcmPt
f230: 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 63 r == NULL) {..rc
f240: 6d 50 74 72 20 3d 20 28 52 65 66 6c 65 63 74 65 mPtr = (Reflecte
f250: 64 43 68 61 6e 6e 65 6c 4d 61 70 20 2a 29 20 63 dChannelMap *) c
f260: 6b 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 52 65 kalloc(sizeof(Re
f270: 66 6c 65 63 74 65 64 43 68 61 6e 6e 65 6c 4d 61 flectedChannelMa
f280: 70 29 29 3b 0a 09 54 63 6c 5f 49 6e 69 74 48 61 p));..Tcl_InitHa
f290: 73 68 54 61 62 6c 65 28 26 72 63 6d 50 74 72 2d shTable(&rcmPtr-
f2a0: 3e 6d 61 70 2c 20 54 43 4c 5f 53 54 52 49 4e 47 >map, TCL_STRING
f2b0: 5f 4b 45 59 53 29 3b 0a 09 54 63 6c 5f 53 65 74 _KEYS);..Tcl_Set
f2c0: 41 73 73 6f 63 44 61 74 61 28 69 6e 74 65 72 70 AssocData(interp
f2d0: 2c 20 52 43 4d 4b 45 59 2c 0a 09 09 28 54 63 6c , RCMKEY,...(Tcl
f2e0: 5f 49 6e 74 65 72 70 44 65 6c 65 74 65 50 72 6f _InterpDeletePro
f2f0: 63 20 2a 29 20 44 65 6c 65 74 65 52 65 66 6c 65 c *) DeleteRefle
f300: 63 74 65 64 43 68 61 6e 6e 65 6c 4d 61 70 2c 20 ctedChannelMap,
f310: 72 63 6d 50 74 72 29 3b 0a 20 20 20 20 7d 0a 20 rcmPtr);. }.
f320: 20 20 20 72 65 74 75 72 6e 20 72 63 6d 50 74 72 return rcmPtr
f330: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d ;.}.../*. *-----
f340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f380: 2d 0a 20 2a 0a 20 2a 20 44 65 6c 65 74 65 52 65 -. *. * DeleteRe
f390: 66 6c 65 63 74 65 64 43 68 61 6e 6e 65 6c 4d 61 flectedChannelMa
f3a0: 70 20 2d 2d 0a 20 2a 0a 20 2a 09 44 65 6c 65 74 p --. *. *.Delet
f3b0: 65 73 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 74 es the channel t
f3c0: 61 62 6c 65 20 66 6f 72 20 61 6e 20 69 6e 74 65 able for an inte
f3d0: 72 70 72 65 74 65 72 2c 20 63 6c 6f 73 69 6e 67 rpreter, closing
f3e0: 20 61 6e 79 20 6f 70 65 6e 0a 20 2a 09 63 68 61 any open. *.cha
f3f0: 6e 6e 65 6c 73 20 77 68 6f 73 65 20 72 65 66 63 nnels whose refc
f400: 6f 75 6e 74 20 72 65 61 63 68 65 73 20 7a 65 72 ount reaches zer
f410: 6f 2e 20 54 68 69 73 20 70 72 6f 63 65 64 75 72 o. This procedur
f420: 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 77 68 65 e is invoked whe
f430: 6e 0a 20 2a 09 61 6e 20 69 6e 74 65 72 70 72 65 n. *.an interpre
f440: 74 65 72 20 69 73 20 64 65 6c 65 74 65 64 2c 20 ter is deleted,
f450: 76 69 61 20 74 68 65 20 41 73 73 6f 63 44 61 74 via the AssocDat
f460: 61 20 63 6c 65 61 6e 75 70 20 6d 65 63 68 61 6e a cleanup mechan
f470: 69 73 6d 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c ism.. *. * Resul
f480: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a ts:. *.None.. *.
f490: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
f4a0: 0a 20 2a 09 44 65 6c 65 74 65 73 20 74 68 65 20 . *.Deletes the
f4b0: 68 61 73 68 20 74 61 62 6c 65 20 6f 66 20 63 68 hash table of ch
f4c0: 61 6e 6e 65 6c 73 2e 20 4d 61 79 20 63 6c 6f 73 annels. May clos
f4d0: 65 20 63 68 61 6e 6e 65 6c 73 2e 20 4d 61 79 20 e channels. May
f4e0: 66 6c 75 73 68 0a 20 2a 09 6f 75 74 70 75 74 20 flush. *.output
f4f0: 6f 6e 20 63 6c 6f 73 65 64 20 63 68 61 6e 6e 65 on closed channe
f500: 6c 73 2e 20 52 65 6d 6f 76 65 73 20 61 6e 79 20 ls. Removes any
f510: 63 68 61 6e 6e 65 45 76 65 6e 74 20 68 61 6e 64 channeEvent hand
f520: 6c 65 72 73 20 74 68 61 74 20 77 65 72 65 0a 20 lers that were.
f530: 2a 09 72 65 67 69 73 74 65 72 65 64 20 69 6e 20 *.registered in
f540: 74 68 69 73 20 69 6e 74 65 72 70 72 65 74 65 72 this interpreter
f550: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d .. *. *---------
f560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
f5a0: 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 44 /..static void.D
f5b0: 65 6c 65 74 65 52 65 66 6c 65 63 74 65 64 43 68 eleteReflectedCh
f5c0: 61 6e 6e 65 6c 4d 61 70 28 0a 20 20 20 20 43 6c annelMap(. Cl
f5d0: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 ientData clientD
f5e0: 61 74 61 2c 09 2f 2a 20 54 68 65 20 70 65 72 2d ata,./* The per-
f5f0: 69 6e 74 65 72 70 72 65 74 65 72 20 64 61 74 61 interpreter data
f600: 20 73 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 structure. */.
f610: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 Tcl_Interp *i
f620: 6e 74 65 72 70 29 09 09 2f 2a 20 54 68 65 20 69 nterp)../* The i
f630: 6e 74 65 72 70 72 65 74 65 72 20 62 65 69 6e 67 nterpreter being
f640: 20 64 65 6c 65 74 65 64 2e 20 2a 2f 0a 7b 0a 20 deleted. */.{.
f650: 20 20 20 52 65 66 6c 65 63 74 65 64 43 68 61 6e ReflectedChan
f660: 6e 65 6c 4d 61 70 20 2a 72 63 6d 50 74 72 3b 20 nelMap *rcmPtr;
f670: 2f 2a 20 54 68 65 20 6d 61 70 20 2a 2f 0a 20 20 /* The map */.
f680: 20 20 54 63 6c 5f 48 61 73 68 53 65 61 72 63 68 Tcl_HashSearch
f690: 20 68 53 65 61 72 63 68 3b 09 20 2f 2a 20 53 65 hSearch;. /* Se
f6a0: 61 72 63 68 20 76 61 72 69 61 62 6c 65 2e 20 2a arch variable. *
f6b0: 2f 0a 20 20 20 20 54 63 6c 5f 48 61 73 68 45 6e /. Tcl_HashEn
f6c0: 74 72 79 20 2a 68 50 74 72 3b 09 20 2f 2a 20 53 try *hPtr;. /* S
f6d0: 65 61 72 63 68 20 76 61 72 69 61 62 6c 65 2e 20 earch variable.
f6e0: 2a 2f 0a 20 20 20 20 52 65 66 6c 65 63 74 65 64 */. Reflected
f6f0: 43 68 61 6e 6e 65 6c 20 2a 72 63 50 74 72 3b 0a Channel *rcPtr;.
f700: 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 Tcl_Channel
f710: 63 68 61 6e 3b 0a 0a 23 69 66 64 65 66 20 54 43 chan;..#ifdef TC
f720: 4c 5f 54 48 52 45 41 44 53 0a 20 20 20 20 46 6f L_THREADS. Fo
f730: 72 77 61 72 64 69 6e 67 52 65 73 75 6c 74 20 2a rwardingResult *
f740: 72 65 73 75 6c 74 50 74 72 3b 0a 20 20 20 20 46 resultPtr;. F
f750: 6f 72 77 61 72 64 69 6e 67 45 76 65 6e 74 20 2a orwardingEvent *
f760: 65 76 50 74 72 3b 0a 20 20 20 20 46 6f 72 77 61 evPtr;. Forwa
f770: 72 64 50 61 72 61 6d 20 2a 70 61 72 61 6d 50 74 rdParam *paramPt
f780: 72 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f r;.#endif.. /
f790: 2a 0a 20 20 20 20 20 2a 20 44 65 6c 65 74 65 20 *. * Delete
f7a0: 61 6c 6c 20 65 6e 74 72 69 65 73 2e 20 54 68 65 all entries. The
f7b0: 20 63 68 61 6e 6e 65 6c 73 20 6d 61 79 20 68 61 channels may ha
f7c0: 76 65 20 62 65 65 6e 20 63 6c 6f 73 65 64 20 61 ve been closed a
f7d0: 6c 72 65 61 64 79 2c 20 6f 72 20 77 69 6c 6c 0a lready, or will.
f7e0: 20 20 20 20 20 2a 20 62 65 20 63 6c 6f 73 65 64 * be closed
f7f0: 20 6c 61 74 65 72 2c 20 62 79 20 74 68 65 20 73 later, by the s
f800: 74 61 6e 64 61 72 64 20 49 4f 20 66 69 6e 61 6c tandard IO final
f810: 69 7a 61 74 69 6f 6e 20 6f 66 20 61 6e 20 69 6e ization of an in
f820: 74 65 72 70 72 65 74 65 72 0a 20 20 20 20 20 2a terpreter. *
f830: 20 75 6e 64 65 72 20 64 65 73 74 72 75 63 74 69 under destructi
f840: 6f 6e 2e 20 45 78 63 65 70 74 20 66 6f 72 20 74 on. Except for t
f850: 68 65 20 63 68 61 6e 6e 65 6c 73 20 77 68 69 63 he channels whic
f860: 68 20 77 65 72 65 20 6d 6f 76 65 64 20 74 6f 20 h were moved to
f870: 61 0a 20 20 20 20 20 2a 20 64 69 66 66 65 72 65 a. * differe
f880: 6e 74 20 69 6e 74 65 72 70 72 65 74 65 72 20 61 nt interpreter a
f890: 6e 64 2f 6f 72 20 74 68 72 65 61 64 2e 20 54 68 nd/or thread. Th
f8a0: 65 79 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20 ey do not exist
f8b0: 66 72 6f 6d 20 74 68 65 20 49 4f 0a 20 20 20 20 from the IO.
f8c0: 20 2a 20 73 79 73 74 65 6d 73 20 70 6f 69 6e 74 * systems point
f8d0: 20 6f 66 20 76 69 65 77 20 61 6e 64 20 77 69 6c of view and wil
f8e0: 6c 20 6e 6f 74 20 67 65 74 20 63 6c 6f 73 65 64 l not get closed
f8f0: 2e 20 54 68 65 72 65 66 6f 72 65 20 6d 61 72 6b . Therefore mark
f900: 20 61 6c 6c 20 61 73 0a 20 20 20 20 20 2a 20 64 all as. * d
f910: 65 61 64 20 73 6f 20 74 68 61 74 20 61 6e 79 20 ead so that any
f920: 66 75 74 75 72 65 20 61 63 63 65 73 73 20 77 69 future access wi
f930: 6c 6c 20 63 61 75 73 65 20 61 20 70 72 6f 70 65 ll cause a prope
f940: 72 20 65 72 72 6f 72 2e 20 46 6f 72 20 63 68 61 r error. For cha
f950: 6e 6e 65 6c 73 0a 20 20 20 20 20 2a 20 69 6e 20 nnels. * in
f960: 61 20 64 69 66 66 65 72 65 6e 74 20 74 68 72 65 a different thre
f970: 61 64 20 77 65 20 61 63 74 75 61 6c 6c 79 20 64 ad we actually d
f980: 6f 20 74 68 65 20 73 61 6d 65 20 61 73 0a 20 20 o the same as.
f990: 20 20 20 2a 20 44 65 6c 65 74 65 54 68 72 65 61 * DeleteThrea
f9a0: 64 52 65 66 6c 65 63 74 65 64 43 68 61 6e 6e 65 dReflectedChanne
f9b0: 6c 4d 61 70 28 29 2c 20 6a 75 73 74 20 72 65 73 lMap(), just res
f9c0: 74 72 69 63 74 65 64 20 74 6f 20 74 68 65 20 63 tricted to the c
f9d0: 68 61 6e 6e 65 6c 73 20 6f 66 0a 20 20 20 20 20 hannels of.
f9e0: 2a 20 74 68 69 73 20 69 6e 74 65 72 70 2e 0a 20 * this interp..
f9f0: 20 20 20 20 2a 2f 0a 0a 20 20 20 20 72 63 6d 50 */.. rcmP
fa00: 74 72 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b tr = clientData;
fa10: 0a 20 20 20 20 66 6f 72 20 28 68 50 74 72 20 3d . for (hPtr =
fa20: 20 54 63 6c 5f 46 69 72 73 74 48 61 73 68 45 6e Tcl_FirstHashEn
fa30: 74 72 79 28 26 72 63 6d 50 74 72 2d 3e 6d 61 70 try(&rcmPtr->map
fa40: 2c 20 26 68 53 65 61 72 63 68 29 3b 0a 09 20 20 , &hSearch);..
fa50: 20 20 68 50 74 72 20 21 3d 20 4e 55 4c 4c 3b 0a hPtr != NULL;.
fa60: 09 20 20 20 20 68 50 74 72 20 3d 20 54 63 6c 5f . hPtr = Tcl_
fa70: 46 69 72 73 74 48 61 73 68 45 6e 74 72 79 28 26 FirstHashEntry(&
fa80: 72 63 6d 50 74 72 2d 3e 6d 61 70 2c 20 26 68 53 rcmPtr->map, &hS
fa90: 65 61 72 63 68 29 29 20 7b 0a 09 63 68 61 6e 20 earch)) {..chan
faa0: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 = (Tcl_Channel)
fab0: 54 63 6c 5f 47 65 74 48 61 73 68 56 61 6c 75 65 Tcl_GetHashValue
fac0: 20 28 68 50 74 72 29 3b 0a 09 72 63 50 74 72 20 (hPtr);..rcPtr
fad0: 3d 20 28 52 65 66 6c 65 63 74 65 64 43 68 61 6e = (ReflectedChan
fae0: 6e 65 6c 20 2a 29 20 54 63 6c 5f 47 65 74 43 68 nel *) Tcl_GetCh
faf0: 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 annelInstanceDat
fb00: 61 28 63 68 61 6e 29 3b 0a 0a 09 72 63 50 74 72 a(chan);...rcPtr
fb10: 2d 3e 69 6e 74 65 72 70 20 3d 20 4e 55 4c 4c 3b ->interp = NULL;
fb20: 0a 09 54 63 6c 5f 44 65 6c 65 74 65 48 61 73 68 ..Tcl_DeleteHash
fb30: 45 6e 74 72 79 28 68 50 74 72 29 3b 0a 20 20 20 Entry(hPtr);.
fb40: 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 6c 65 74 }. Tcl_Delet
fb50: 65 48 61 73 68 54 61 62 6c 65 28 26 72 63 6d 50 eHashTable(&rcmP
fb60: 74 72 2d 3e 6d 61 70 29 3b 0a 20 20 20 20 63 6b tr->map);. ck
fb70: 66 72 65 65 28 28 63 68 61 72 20 2a 29 20 26 72 free((char *) &r
fb80: 63 6d 50 74 72 2d 3e 6d 61 70 29 3b 0a 0a 23 69 cmPtr->map);..#i
fb90: 66 64 65 66 20 54 43 4c 5f 54 48 52 45 41 44 53 fdef TCL_THREADS
fba0: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 54 . /*. * T
fbb0: 68 65 20 6f 72 69 67 69 6e 20 69 6e 74 65 72 70 he origin interp
fbc0: 72 65 74 65 72 20 66 6f 72 20 6f 6e 65 20 6f 72 reter for one or
fbd0: 20 6d 6f 72 65 20 72 65 66 6c 65 63 74 65 64 20 more reflected
fbe0: 63 68 61 6e 6e 65 6c 73 20 69 73 20 67 6f 6e 65 channels is gone
fbf0: 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 2f .. */.. /
fc00: 2a 0a 20 20 20 20 20 2a 20 47 6f 20 74 68 72 6f *. * Go thro
fc10: 75 67 68 20 74 68 65 20 6c 69 73 74 20 6f 66 20 ugh the list of
fc20: 70 65 6e 64 69 6e 67 20 72 65 73 75 6c 74 73 20 pending results
fc30: 61 6e 64 20 63 61 6e 63 65 6c 20 61 6c 6c 20 77 and cancel all w
fc40: 68 6f 73 65 20 65 76 65 6e 74 73 20 77 65 72 65 hose events were
fc50: 0a 20 20 20 20 20 2a 20 64 65 73 74 69 6e 65 64 . * destined
fc60: 20 66 6f 72 20 74 68 69 73 20 69 6e 74 65 72 70 for this interp
fc70: 72 65 74 65 72 2e 20 57 68 69 6c 65 20 74 68 69 reter. While thi
fc80: 73 20 69 73 20 69 6e 20 70 72 6f 67 72 65 73 73 s is in progress
fc90: 20 77 65 20 62 6c 6f 63 6b 20 61 6e 79 0a 20 20 we block any.
fca0: 20 20 20 2a 20 6f 74 68 65 72 20 61 63 63 65 73 * other acces
fcb0: 73 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 s to the list of
fcc0: 20 70 65 6e 64 69 6e 67 20 72 65 73 75 6c 74 73 pending results
fcd0: 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 54 .. */.. T
fce0: 63 6c 5f 4d 75 74 65 78 4c 6f 63 6b 28 26 72 63 cl_MutexLock(&rc
fcf0: 46 6f 72 77 61 72 64 4d 75 74 65 78 29 3b 0a 0a ForwardMutex);..
fd00: 20 20 20 20 66 6f 72 20 28 72 65 73 75 6c 74 50 for (resultP
fd10: 74 72 20 3d 20 66 6f 72 77 61 72 64 4c 69 73 74 tr = forwardList
fd20: 3b 0a 09 20 20 20 20 72 65 73 75 6c 74 50 74 72 ;.. resultPtr
fd30: 20 21 3d 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 72 != NULL;.. r
fd40: 65 73 75 6c 74 50 74 72 20 3d 20 72 65 73 75 6c esultPtr = resul
fd50: 74 50 74 72 2d 3e 6e 65 78 74 50 74 72 29 20 7b tPtr->nextPtr) {
fd60: 0a 09 69 66 20 28 72 65 73 75 6c 74 50 74 72 2d ..if (resultPtr-
fd70: 3e 64 73 74 69 20 21 3d 20 69 6e 74 65 72 70 29 >dsti != interp)
fd80: 20 7b 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 {.. /*..
fd90: 20 2a 20 49 67 6e 6f 72 65 20 72 65 73 75 6c 74 * Ignore result
fda0: 73 2f 65 76 65 6e 74 73 20 66 6f 72 20 6f 74 68 s/events for oth
fdb0: 65 72 20 69 6e 74 65 72 70 72 65 74 65 72 73 2e er interpreters.
fdc0: 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20 .. */...
fdd0: 63 6f 6e 74 69 6e 75 65 3b 0a 09 7d 0a 0a 09 2f continue;..}.../
fde0: 2a 0a 09 20 2a 20 54 68 65 20 72 65 63 65 69 76 *.. * The receiv
fdf0: 65 72 20 66 6f 72 20 74 68 65 20 65 76 65 6e 74 er for the event
fe00: 20 65 78 69 74 65 64 2c 20 62 65 66 6f 72 65 20 exited, before
fe10: 70 72 6f 63 65 73 73 69 6e 67 20 74 68 65 20 65 processing the e
fe20: 76 65 6e 74 2e 20 57 65 0a 09 20 2a 20 64 65 74 vent. We.. * det
fe30: 61 63 68 20 74 68 65 20 72 65 73 75 6c 74 20 6e ach the result n
fe40: 6f 77 2c 20 77 61 6b 65 20 74 68 65 20 6f 72 69 ow, wake the ori
fe50: 67 69 6e 61 74 6f 72 20 75 70 20 61 6e 64 20 73 ginator up and s
fe60: 69 67 6e 61 6c 20 66 61 69 6c 75 72 65 2e 0a 09 ignal failure...
fe70: 20 2a 2f 0a 0a 09 65 76 50 74 72 20 3d 20 72 65 */...evPtr = re
fe80: 73 75 6c 74 50 74 72 2d 3e 65 76 50 74 72 3b 0a sultPtr->evPtr;.
fe90: 09 70 61 72 61 6d 50 74 72 20 3d 20 65 76 50 74 .paramPtr = evPt
fea0: 72 2d 3e 70 61 72 61 6d 3b 0a 0a 09 65 76 50 74 r->param;...evPt
feb0: 72 2d 3e 72 65 73 75 6c 74 50 74 72 20 3d 20 4e r->resultPtr = N
fec0: 55 4c 4c 3b 0a 09 72 65 73 75 6c 74 50 74 72 2d ULL;..resultPtr-
fed0: 3e 65 76 50 74 72 20 3d 20 4e 55 4c 4c 3b 0a 09 >evPtr = NULL;..
fee0: 72 65 73 75 6c 74 50 74 72 2d 3e 72 65 73 75 6c resultPtr->resul
fef0: 74 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a t = TCL_ERROR;..
ff00: 09 46 6f 72 77 61 72 64 53 65 74 53 74 61 74 69 .ForwardSetStati
ff10: 63 45 72 72 6f 72 28 70 61 72 61 6d 50 74 72 2c cError(paramPtr,
ff20: 20 6d 73 67 5f 73 65 6e 64 5f 64 73 74 6c 6f 73 msg_send_dstlos
ff30: 74 29 3b 0a 0a 09 54 63 6c 5f 43 6f 6e 64 69 74 t);...Tcl_Condit
ff40: 69 6f 6e 4e 6f 74 69 66 79 28 26 72 65 73 75 6c ionNotify(&resul
ff50: 74 50 74 72 2d 3e 64 6f 6e 65 29 3b 0a 20 20 20 tPtr->done);.
ff60: 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 }.. /*.
ff70: 2a 20 47 65 74 20 74 68 65 20 6d 61 70 20 6f 66 * Get the map of
ff80: 20 61 6c 6c 20 63 68 61 6e 6e 65 6c 73 20 68 61 all channels ha
ff90: 6e 64 6c 65 64 20 62 79 20 74 68 65 20 63 75 72 ndled by the cur
ffa0: 72 65 6e 74 20 74 68 72 65 61 64 2e 20 54 68 69 rent thread. Thi
ffb0: 73 20 69 73 20 61 0a 20 20 20 20 20 2a 20 52 65 s is a. * Re
ffc0: 66 6c 65 63 74 65 64 43 68 61 6e 6e 65 6c 4d 61 flectedChannelMa
ffd0: 70 2c 20 62 75 74 20 6f 6e 20 61 20 70 65 72 2d p, but on a per-
ffe0: 74 68 72 65 61 64 20 62 61 73 69 73 2c 20 6e 6f thread basis, no
fff0: 74 20 70 65 72 2d 69 6e 74 65 72 70 2e 20 47 6f t per-interp. Go
10000 0a 20 20 20 20 20 2a 20 74 68 72 6f 75 67 68 20 . * through
10010 74 68 65 20 63 68 61 6e 6e 65 6c 73 20 61 6e 64 the channels and
10020 20 72 65 6d 6f 76 65 20 61 6c 6c 20 77 68 69 63 remove all whic
10030 68 20 77 65 72 65 20 68 61 6e 64 6c 65 64 20 62 h were handled b
10040 79 20 74 68 69 73 0a 20 20 20 20 20 2a 20 69 6e y this. * in
10050 74 65 72 70 72 65 74 65 72 2e 20 54 68 65 79 20 terpreter. They
10060 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 have already bee
10070 6e 20 6d 61 72 6b 65 64 20 61 73 20 64 65 61 64 n marked as dead
10080 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 72 .. */.. r
10090 63 6d 50 74 72 20 3d 20 47 65 74 54 68 72 65 61 cmPtr = GetThrea
100a0 64 52 65 66 6c 65 63 74 65 64 43 68 61 6e 6e 65 dReflectedChanne
100b0 6c 4d 61 70 28 29 3b 0a 20 20 20 20 66 6f 72 20 lMap();. for
100c0 28 68 50 74 72 20 3d 20 54 63 6c 5f 46 69 72 73 (hPtr = Tcl_Firs
100d0 74 48 61 73 68 45 6e 74 72 79 28 26 72 63 6d 50 tHashEntry(&rcmP
100e0 74 72 2d 3e 6d 61 70 2c 20 26 68 53 65 61 72 63 tr->map, &hSearc
100f0 68 29 3b 0a 09 20 20 20 20 68 50 74 72 20 21 3d h);.. hPtr !=
10100 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 68 50 74 72 NULL;.. hPtr
10110 20 3d 20 54 63 6c 5f 4e 65 78 74 48 61 73 68 45 = Tcl_NextHashE
10120 6e 74 72 79 28 26 68 53 65 61 72 63 68 29 29 20 ntry(&hSearch))
10130 7b 0a 09 63 68 61 6e 20 3d 20 28 54 63 6c 5f 43 {..chan = (Tcl_C
10140 68 61 6e 6e 65 6c 29 20 54 63 6c 5f 47 65 74 48 hannel) Tcl_GetH
10150 61 73 68 56 61 6c 75 65 20 28 68 50 74 72 29 3b ashValue (hPtr);
10160 0a 09 72 63 50 74 72 20 3d 20 28 52 65 66 6c 65 ..rcPtr = (Refle
10170 63 74 65 64 43 68 61 6e 6e 65 6c 20 2a 29 20 54 ctedChannel *) T
10180 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 cl_GetChannelIns
10190 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29 3b tanceData(chan);
101a0 0a 0a 09 69 66 20 28 72 63 50 74 72 2d 3e 69 6e ...if (rcPtr->in
101b0 74 65 72 70 20 21 3d 20 69 6e 74 65 72 70 29 20 terp != interp)
101c0 7b 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 {.. /*..
101d0 2a 20 49 67 6e 6f 72 65 20 65 6e 74 72 69 65 73 * Ignore entries
101e0 20 66 6f 72 20 6f 74 68 65 72 20 69 6e 74 65 72 for other inter
101f0 70 72 65 74 65 72 73 2e 0a 09 20 20 20 20 20 2a preters... *
10200 2f 0a 0a 09 20 20 20 20 63 6f 6e 74 69 6e 75 65 /... continue
10210 3b 0a 09 7d 0a 0a 09 54 63 6c 5f 44 65 6c 65 74 ;..}...Tcl_Delet
10220 65 48 61 73 68 45 6e 74 72 79 28 68 50 74 72 29 eHashEntry(hPtr)
10230 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c ;. }.. Tcl
10240 5f 4d 75 74 65 78 55 6e 6c 6f 63 6b 28 26 72 63 _MutexUnlock(&rc
10250 46 6f 72 77 61 72 64 4d 75 74 65 78 29 3b 0a 23 ForwardMutex);.#
10260 65 6e 64 69 66 0a 7d 0a 0c 0a 23 69 66 64 65 66 endif.}...#ifdef
10270 20 54 43 4c 5f 54 48 52 45 41 44 53 0a 2f 2a 0a TCL_THREADS./*.
10280 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
10290 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
102a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
102b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
102c0 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 47 --------. *. * G
102d0 65 74 54 68 72 65 61 64 52 65 66 6c 65 63 74 65 etThreadReflecte
102e0 64 43 68 61 6e 6e 65 6c 4d 61 70 20 2d 2d 0a 20 dChannelMap --.
102f0 2a 0a 20 2a 09 47 65 74 73 20 61 6e 64 20 70 6f *. *.Gets and po
10300 74 65 6e 74 69 61 6c 6c 79 20 69 6e 69 74 69 61 tentially initia
10310 6c 69 7a 65 73 20 74 68 65 20 72 65 66 6c 65 63 lizes the reflec
10320 74 65 64 20 63 68 61 6e 6e 65 6c 20 6d 61 70 20 ted channel map
10330 66 6f 72 20 61 0a 20 2a 09 74 68 72 65 61 64 2e for a. *.thread.
10340 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
10350 20 2a 09 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 *.A pointer to
10360 74 68 65 20 6d 61 70 20 63 72 65 61 74 65 64 2c the map created,
10370 20 66 6f 72 20 75 73 65 20 62 79 20 74 68 65 20 for use by the
10380 63 61 6c 6c 65 72 2e 0a 20 2a 0a 20 2a 20 53 69 caller.. *. * Si
10390 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 49 de effects:. *.I
103a0 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 65 20 72 nitializes the r
103b0 65 66 6c 65 63 74 65 64 20 63 68 61 6e 6e 65 6c eflected channel
103c0 20 6d 61 70 20 66 6f 72 20 61 20 74 68 72 65 61 map for a threa
103d0 64 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d d.. *. *--------
103e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
103f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10400 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10410 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
10420 2a 2f 0a 0a 73 74 61 74 69 63 20 52 65 66 6c 65 */..static Refle
10430 63 74 65 64 43 68 61 6e 6e 65 6c 4d 61 70 20 2a ctedChannelMap *
10440 0a 47 65 74 54 68 72 65 61 64 52 65 66 6c 65 63 .GetThreadReflec
10450 74 65 64 43 68 61 6e 6e 65 6c 4d 61 70 28 76 6f tedChannelMap(vo
10460 69 64 29 0a 7b 0a 20 20 20 20 54 68 72 65 61 64 id).{. Thread
10470 53 70 65 63 69 66 69 63 44 61 74 61 20 2a 74 73 SpecificData *ts
10480 64 50 74 72 20 3d 20 54 43 4c 5f 54 53 44 5f 49 dPtr = TCL_TSD_I
10490 4e 49 54 28 26 64 61 74 61 4b 65 79 29 3b 0a 0a NIT(&dataKey);..
104a0 20 20 20 20 69 66 20 28 21 74 73 64 50 74 72 2d if (!tsdPtr-
104b0 3e 72 63 6d 50 74 72 29 20 7b 0a 09 74 73 64 50 >rcmPtr) {..tsdP
104c0 74 72 2d 3e 72 63 6d 50 74 72 20 3d 20 28 52 65 tr->rcmPtr = (Re
104d0 66 6c 65 63 74 65 64 43 68 61 6e 6e 65 6c 4d 61 flectedChannelMa
104e0 70 20 2a 29 0a 09 09 63 6b 61 6c 6c 6f 63 28 73 p *)...ckalloc(s
104f0 69 7a 65 6f 66 28 52 65 66 6c 65 63 74 65 64 43 izeof(ReflectedC
10500 68 61 6e 6e 65 6c 4d 61 70 29 29 3b 0a 09 54 63 hannelMap));..Tc
10510 6c 5f 49 6e 69 74 48 61 73 68 54 61 62 6c 65 28 l_InitHashTable(
10520 26 74 73 64 50 74 72 2d 3e 72 63 6d 50 74 72 2d &tsdPtr->rcmPtr-
10530 3e 6d 61 70 2c 20 54 43 4c 5f 53 54 52 49 4e 47 >map, TCL_STRING
10540 5f 4b 45 59 53 29 3b 0a 09 54 63 6c 5f 43 72 65 _KEYS);..Tcl_Cre
10550 61 74 65 54 68 72 65 61 64 45 78 69 74 48 61 6e ateThreadExitHan
10560 64 6c 65 72 28 44 65 6c 65 74 65 54 68 72 65 61 dler(DeleteThrea
10570 64 52 65 66 6c 65 63 74 65 64 43 68 61 6e 6e 65 dReflectedChanne
10580 6c 4d 61 70 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 lMap, NULL);.
10590 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 74 }.. return t
105a0 73 64 50 74 72 2d 3e 72 63 6d 50 74 72 3b 0a 7d sdPtr->rcmPtr;.}
105b0 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d .../*. *--------
105c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
105d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
105e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
105f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
10600 2a 0a 20 2a 20 44 65 6c 65 74 65 54 68 72 65 61 *. * DeleteThrea
10610 64 52 65 66 6c 65 63 74 65 64 43 68 61 6e 6e 65 dReflectedChanne
10620 6c 4d 61 70 20 2d 2d 0a 20 2a 0a 20 2a 09 44 65 lMap --. *. *.De
10630 6c 65 74 65 73 20 74 68 65 20 63 68 61 6e 6e 65 letes the channe
10640 6c 20 74 61 62 6c 65 20 66 6f 72 20 61 20 74 68 l table for a th
10650 72 65 61 64 2e 20 54 68 69 73 20 70 72 6f 63 65 read. This proce
10660 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 dure is invoked
10670 77 68 65 6e 0a 20 2a 09 61 20 74 68 72 65 61 64 when. *.a thread
10680 20 69 73 20 64 65 6c 65 74 65 64 2e 20 54 68 65 is deleted. The
10690 20 63 68 61 6e 6e 65 6c 73 20 68 61 76 65 20 61 channels have a
106a0 6c 72 65 61 64 79 20 62 65 65 6e 20 6d 61 72 6b lready been mark
106b0 65 64 20 61 73 20 64 65 61 64 2c 20 69 6e 0a 20 ed as dead, in.
106c0 2a 20 20 20 20 20 20 44 65 6c 65 74 65 52 65 66 * DeleteRef
106d0 6c 65 63 74 65 64 43 68 61 6e 6e 65 6c 4d 61 70 lectedChannelMap
106e0 28 29 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 ().. *. * Result
106f0 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 s:. *.None.. *.
10700 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
10710 20 2a 09 44 65 6c 65 74 65 73 20 74 68 65 20 68 *.Deletes the h
10720 61 73 68 20 74 61 62 6c 65 20 6f 66 20 63 68 61 ash table of cha
10730 6e 6e 65 6c 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d nnels.. *. *----
10740 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10750 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10760 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10770 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10780 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76 --. */..static v
10790 6f 69 64 0a 44 65 6c 65 74 65 54 68 72 65 61 64 oid.DeleteThread
107a0 52 65 66 6c 65 63 74 65 64 43 68 61 6e 6e 65 6c ReflectedChannel
107b0 4d 61 70 28 0a 20 20 20 20 43 6c 69 65 6e 74 44 Map(. ClientD
107c0 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 29 09 ata clientData).
107d0 2f 2a 20 54 68 65 20 70 65 72 2d 74 68 72 65 61 /* The per-threa
107e0 64 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 d data structure
107f0 2e 20 2a 2f 0a 7b 0a 20 20 20 20 54 63 6c 5f 48 . */.{. Tcl_H
10800 61 73 68 53 65 61 72 63 68 20 68 53 65 61 72 63 ashSearch hSearc
10810 68 3b 09 20 2f 2a 20 53 65 61 72 63 68 20 76 61 h;. /* Search va
10820 72 69 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 54 riable. */. T
10830 63 6c 5f 48 61 73 68 45 6e 74 72 79 20 2a 68 50 cl_HashEntry *hP
10840 74 72 3b 09 20 2f 2a 20 53 65 61 72 63 68 20 76 tr;. /* Search v
10850 61 72 69 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 ariable. */.
10860 54 63 6c 5f 54 68 72 65 61 64 49 64 20 73 65 6c Tcl_ThreadId sel
10870 66 20 3d 20 54 63 6c 5f 47 65 74 43 75 72 72 65 f = Tcl_GetCurre
10880 6e 74 54 68 72 65 61 64 28 29 3b 0a 20 20 20 20 ntThread();.
10890 52 65 66 6c 65 63 74 65 64 43 68 61 6e 6e 65 6c ReflectedChannel
108a0 4d 61 70 20 2a 72 63 6d 50 74 72 3b 20 2f 2a 20 Map *rcmPtr; /*
108b0 54 68 65 20 6d 61 70 20 2a 2f 0a 20 20 20 20 46 The map */. F
108c0 6f 72 77 61 72 64 69 6e 67 52 65 73 75 6c 74 20 orwardingResult
108d0 2a 72 65 73 75 6c 74 50 74 72 3b 0a 0a 20 20 20 *resultPtr;..
108e0 20 2f 2a 0a 20 20 20 20 20 2a 20 54 68 65 20 6f /*. * The o
108f0 72 69 67 69 6e 20 74 68 72 65 61 64 20 66 6f 72 rigin thread for
10900 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 72 65 66 one or more ref
10910 6c 65 63 74 65 64 20 63 68 61 6e 6e 65 6c 73 20 lected channels
10920 69 73 20 67 6f 6e 65 2e 0a 20 20 20 20 20 2a 20 is gone.. *
10930 4e 4f 54 45 3a 20 49 66 20 74 68 69 73 20 66 75 NOTE: If this fu
10940 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 nction is called
10950 20 64 75 65 20 74 6f 20 61 20 74 68 72 65 61 64 due to a thread
10960 20 67 65 74 74 69 6e 67 20 6b 69 6c 6c 65 64 20 getting killed
10970 74 68 65 0a 20 20 20 20 20 2a 20 20 20 20 20 20 the. *
10980 20 70 65 72 2d 69 6e 74 65 72 70 20 44 65 6c 65 per-interp Dele
10990 74 65 52 65 66 6c 65 63 74 65 64 43 68 61 6e 6e teReflectedChann
109a0 65 6c 4d 61 70 20 69 73 20 61 70 70 61 72 65 6e elMap is apparen
109b0 74 6c 79 20 6e 6f 74 20 63 61 6c 6c 65 64 2e 0a tly not called..
109c0 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 2f 2a 0a */.. /*.
109d0 20 20 20 20 20 2a 20 47 6f 20 74 68 72 6f 75 67 * Go throug
109e0 68 20 74 68 65 20 6c 69 73 74 20 6f 66 20 70 65 h the list of pe
109f0 6e 64 69 6e 67 20 72 65 73 75 6c 74 73 20 61 6e nding results an
10a00 64 20 63 61 6e 63 65 6c 20 61 6c 6c 20 77 68 6f d cancel all who
10a10 73 65 20 65 76 65 6e 74 73 20 77 65 72 65 0a 20 se events were.
10a20 20 20 20 20 2a 20 64 65 73 74 69 6e 65 64 20 66 * destined f
10a30 6f 72 20 74 68 69 73 20 74 68 72 65 61 64 2e 20 or this thread.
10a40 57 68 69 6c 65 20 74 68 69 73 20 69 73 20 69 6e While this is in
10a50 20 70 72 6f 67 72 65 73 73 20 77 65 20 62 6c 6f progress we blo
10a60 63 6b 20 61 6e 79 0a 20 20 20 20 20 2a 20 6f 74 ck any. * ot
10a70 68 65 72 20 61 63 63 65 73 73 20 74 6f 20 74 68 her access to th
10a80 65 20 6c 69 73 74 20 6f 66 20 70 65 6e 64 69 6e e list of pendin
10a90 67 20 72 65 73 75 6c 74 73 2e 0a 20 20 20 20 20 g results..
10aa0 2a 2f 0a 0a 20 20 20 20 54 63 6c 5f 4d 75 74 65 */.. Tcl_Mute
10ab0 78 4c 6f 63 6b 28 26 72 63 46 6f 72 77 61 72 64 xLock(&rcForward
10ac0 4d 75 74 65 78 29 3b 0a 0a 20 20 20 20 66 6f 72 Mutex);.. for
10ad0 20 28 72 65 73 75 6c 74 50 74 72 20 3d 20 66 6f (resultPtr = fo
10ae0 72 77 61 72 64 4c 69 73 74 3b 0a 09 20 20 20 20 rwardList;..
10af0 72 65 73 75 6c 74 50 74 72 20 21 3d 20 4e 55 4c resultPtr != NUL
10b00 4c 3b 0a 09 20 20 20 20 72 65 73 75 6c 74 50 74 L;.. resultPt
10b10 72 20 3d 20 72 65 73 75 6c 74 50 74 72 2d 3e 6e r = resultPtr->n
10b20 65 78 74 50 74 72 29 20 7b 0a 09 46 6f 72 77 61 extPtr) {..Forwa
10b30 72 64 69 6e 67 45 76 65 6e 74 20 2a 65 76 50 74 rdingEvent *evPt
10b40 72 3b 0a 09 46 6f 72 77 61 72 64 50 61 72 61 6d r;..ForwardParam
10b50 20 2a 70 61 72 61 6d 50 74 72 3b 0a 0a 09 69 66 *paramPtr;...if
10b60 20 28 72 65 73 75 6c 74 50 74 72 2d 3e 64 73 74 (resultPtr->dst
10b70 20 21 3d 20 73 65 6c 66 29 20 7b 0a 09 20 20 20 != self) {..
10b80 20 2f 2a 0a 09 20 20 20 20 20 2a 20 49 67 6e 6f /*.. * Igno
10b90 72 65 20 72 65 73 75 6c 74 73 2f 65 76 65 6e 74 re results/event
10ba0 73 20 66 6f 72 20 6f 74 68 65 72 20 74 68 72 65 s for other thre
10bb0 61 64 73 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 ads... */...
10bc0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 09 7d continue;..}
10bd0 0a 0a 09 2f 2a 0a 09 20 2a 20 54 68 65 20 72 65 .../*.. * The re
10be0 63 65 69 76 65 72 20 66 6f 72 20 74 68 65 20 65 ceiver for the e
10bf0 76 65 6e 74 20 65 78 69 74 65 64 2c 20 62 65 66 vent exited, bef
10c00 6f 72 65 20 70 72 6f 63 65 73 73 69 6e 67 20 74 ore processing t
10c10 68 65 20 65 76 65 6e 74 2e 20 57 65 0a 09 20 2a he event. We.. *
10c20 20 64 65 74 61 63 68 20 74 68 65 20 72 65 73 75 detach the resu
10c30 6c 74 20 6e 6f 77 2c 20 77 61 6b 65 20 74 68 65 lt now, wake the
10c40 20 6f 72 69 67 69 6e 61 74 6f 72 20 75 70 20 61 originator up a
10c50 6e 64 20 73 69 67 6e 61 6c 20 66 61 69 6c 75 72 nd signal failur
10c60 65 2e 0a 09 20 2a 2f 0a 0a 09 65 76 50 74 72 20 e... */...evPtr
10c70 3d 20 72 65 73 75 6c 74 50 74 72 2d 3e 65 76 50 = resultPtr->evP
10c80 74 72 3b 0a 09 70 61 72 61 6d 50 74 72 20 3d 20 tr;..paramPtr =
10c90 65 76 50 74 72 2d 3e 70 61 72 61 6d 3b 0a 0a 09 evPtr->param;...
10ca0 65 76 50 74 72 2d 3e 72 65 73 75 6c 74 50 74 72 evPtr->resultPtr
10cb0 20 3d 20 4e 55 4c 4c 3b 0a 09 72 65 73 75 6c 74 = NULL;..result
10cc0 50 74 72 2d 3e 65 76 50 74 72 20 3d 20 4e 55 4c Ptr->evPtr = NUL
10cd0 4c 3b 0a 09 72 65 73 75 6c 74 50 74 72 2d 3e 72 L;..resultPtr->r
10ce0 65 73 75 6c 74 20 3d 20 54 43 4c 5f 45 52 52 4f esult = TCL_ERRO
10cf0 52 3b 0a 0a 09 46 6f 72 77 61 72 64 53 65 74 53 R;...ForwardSetS
10d00 74 61 74 69 63 45 72 72 6f 72 28 70 61 72 61 6d taticError(param
10d10 50 74 72 2c 20 6d 73 67 5f 73 65 6e 64 5f 64 73 Ptr, msg_send_ds
10d20 74 6c 6f 73 74 29 3b 0a 0a 09 54 63 6c 5f 43 6f tlost);...Tcl_Co
10d30 6e 64 69 74 69 6f 6e 4e 6f 74 69 66 79 28 26 72 nditionNotify(&r
10d40 65 73 75 6c 74 50 74 72 2d 3e 64 6f 6e 65 29 3b esultPtr->done);
10d50 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 . }.. /*.
10d60 20 20 20 20 2a 20 47 65 74 20 74 68 65 20 6d 61 * Get the ma
10d70 70 20 6f 66 20 61 6c 6c 20 63 68 61 6e 6e 65 6c p of all channel
10d80 73 20 68 61 6e 64 6c 65 64 20 62 79 20 74 68 65 s handled by the
10d90 20 63 75 72 72 65 6e 74 20 74 68 72 65 61 64 2e current thread.
10da0 20 54 68 69 73 20 69 73 20 61 0a 20 20 20 20 20 This is a.
10db0 2a 20 52 65 66 6c 65 63 74 65 64 43 68 61 6e 6e * ReflectedChann
10dc0 65 6c 4d 61 70 2c 20 62 75 74 20 6f 6e 20 61 20 elMap, but on a
10dd0 70 65 72 2d 74 68 72 65 61 64 20 62 61 73 69 73 per-thread basis
10de0 2c 20 6e 6f 74 20 70 65 72 2d 69 6e 74 65 72 70 , not per-interp
10df0 2e 20 47 6f 0a 20 20 20 20 20 2a 20 74 68 72 6f . Go. * thro
10e00 75 67 68 20 74 68 65 20 63 68 61 6e 6e 65 6c 73 ugh the channels
10e10 2c 20 72 65 6d 6f 76 65 20 61 6c 6c 2c 20 6d 61 , remove all, ma
10e20 72 6b 20 74 68 65 6d 20 61 73 20 64 65 61 64 2e rk them as dead.
10e30 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 72 63 . */.. rc
10e40 6d 50 74 72 20 3d 20 47 65 74 54 68 72 65 61 64 mPtr = GetThread
10e50 52 65 66 6c 65 63 74 65 64 43 68 61 6e 6e 65 6c ReflectedChannel
10e60 4d 61 70 28 29 3b 0a 20 20 20 20 66 6f 72 20 28 Map();. for (
10e70 68 50 74 72 20 3d 20 54 63 6c 5f 46 69 72 73 74 hPtr = Tcl_First
10e80 48 61 73 68 45 6e 74 72 79 28 26 72 63 6d 50 74 HashEntry(&rcmPt
10e90 72 2d 3e 6d 61 70 2c 20 26 68 53 65 61 72 63 68 r->map, &hSearch
10ea0 29 3b 0a 09 20 20 20 20 68 50 74 72 20 21 3d 20 );.. hPtr !=
10eb0 4e 55 4c 4c 3b 0a 09 20 20 20 20 68 50 74 72 20 NULL;.. hPtr
10ec0 3d 20 54 63 6c 5f 46 69 72 73 74 48 61 73 68 45 = Tcl_FirstHashE
10ed0 6e 74 72 79 28 26 72 63 6d 50 74 72 2d 3e 6d 61 ntry(&rcmPtr->ma
10ee0 70 2c 20 26 68 53 65 61 72 63 68 29 29 20 7b 0a p, &hSearch)) {.
10ef0 09 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 .Tcl_Channel cha
10f00 6e 20 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c n = (Tcl_Channel
10f10 29 20 54 63 6c 5f 47 65 74 48 61 73 68 56 61 6c ) Tcl_GetHashVal
10f20 75 65 28 68 50 74 72 29 3b 0a 09 52 65 66 6c 65 ue(hPtr);..Refle
10f30 63 74 65 64 43 68 61 6e 6e 65 6c 20 2a 72 63 50 ctedChannel *rcP
10f40 74 72 20 3d 20 28 52 65 66 6c 65 63 74 65 64 43 tr = (ReflectedC
10f50 68 61 6e 6e 65 6c 20 2a 29 0a 09 09 54 63 6c 5f hannel *)...Tcl_
10f60 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e GetChannelInstan
10f70 63 65 44 61 74 61 28 63 68 61 6e 29 3b 0a 0a 09 ceData(chan);...
10f80 72 63 50 74 72 2d 3e 69 6e 74 65 72 70 20 3d 20 rcPtr->interp =
10f90 4e 55 4c 4c 3b 0a 09 54 63 6c 5f 44 65 6c 65 74 NULL;..Tcl_Delet
10fa0 65 48 61 73 68 45 6e 74 72 79 28 68 50 74 72 29 eHashEntry(hPtr)
10fb0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c ;. }.. Tcl
10fc0 5f 4d 75 74 65 78 55 6e 6c 6f 63 6b 28 26 72 63 _MutexUnlock(&rc
10fd0 46 6f 72 77 61 72 64 4d 75 74 65 78 29 3b 0a 7d ForwardMutex);.}
10fe0 0a 0c 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 46 ...static void.F
10ff0 6f 72 77 61 72 64 4f 70 54 6f 4f 77 6e 65 72 54 orwardOpToOwnerT
11000 68 72 65 61 64 28 0a 20 20 20 20 52 65 66 6c 65 hread(. Refle
11010 63 74 65 64 43 68 61 6e 6e 65 6c 20 2a 72 63 50 ctedChannel *rcP
11020 74 72 2c 09 2f 2a 20 43 68 61 6e 6e 65 6c 20 69 tr,./* Channel i
11030 6e 73 74 61 6e 63 65 20 2a 2f 0a 20 20 20 20 46 nstance */. F
11040 6f 72 77 61 72 64 65 64 4f 70 65 72 61 74 69 6f orwardedOperatio
11050 6e 20 6f 70 2c 09 2f 2a 20 46 6f 72 77 61 72 64 n op,./* Forward
11060 65 64 20 64 72 69 76 65 72 20 6f 70 65 72 61 74 ed driver operat
11070 69 6f 6e 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 ion */. const
11080 20 76 6f 69 64 20 2a 70 61 72 61 6d 29 09 09 2f void *param)../
11090 2a 20 41 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 7b * Arguments */.{
110a0 0a 20 20 20 20 54 63 6c 5f 54 68 72 65 61 64 49 . Tcl_ThreadI
110b0 64 20 64 73 74 20 3d 20 72 63 50 74 72 2d 3e 74 d dst = rcPtr->t
110c0 68 72 65 61 64 3b 0a 20 20 20 20 46 6f 72 77 61 hread;. Forwa
110d0 72 64 69 6e 67 45 76 65 6e 74 20 2a 65 76 50 74 rdingEvent *evPt
110e0 72 3b 0a 20 20 20 20 46 6f 72 77 61 72 64 69 6e r;. Forwardin
110f0 67 52 65 73 75 6c 74 20 2a 72 65 73 75 6c 74 50 gResult *resultP
11100 74 72 3b 0a 20 20 20 20 69 6e 74 20 72 65 73 75 tr;. int resu
11110 6c 74 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 lt;.. /*.
11120 20 2a 20 57 65 20 67 61 74 68 65 72 20 74 68 65 * We gather the
11130 20 6c 6f 63 6b 20 65 61 72 6c 79 2e 20 54 68 69 lock early. Thi
11140 73 20 61 6c 6c 6f 77 73 20 75 73 20 74 6f 20 63 s allows us to c
11150 68 65 63 6b 20 74 68 65 20 6c 69 76 65 6e 65 73 heck the livenes
11160 73 20 6f 66 20 74 68 65 0a 20 20 20 20 20 2a 20 s of the. *
11170 63 68 61 6e 6e 65 6c 20 77 69 74 68 6f 75 74 20 channel without
11180 69 6e 74 65 72 66 65 72 65 6e 63 65 20 66 72 6f interference fro
11190 6d 20 44 65 6c 65 74 65 54 68 72 65 61 64 52 65 m DeleteThreadRe
111a0 66 6c 65 63 74 65 64 43 68 61 6e 6e 65 6c 4d 61 flectedChannelMa
111b0 70 28 29 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 p().. */..
111c0 20 20 54 63 6c 5f 4d 75 74 65 78 4c 6f 63 6b 28 Tcl_MutexLock(
111d0 26 72 63 46 6f 72 77 61 72 64 4d 75 74 65 78 29 &rcForwardMutex)
111e0 3b 0a 0a 20 20 20 20 69 66 20 28 72 63 50 74 72 ;.. if (rcPtr
111f0 2d 3e 69 6e 74 65 72 70 20 3d 3d 20 4e 55 4c 4c ->interp == NULL
11200 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 54 68 65 20 ) {../*.. * The
11210 63 68 61 6e 6e 65 6c 20 69 73 20 6d 61 72 6b 65 channel is marke
11220 64 20 61 73 20 64 65 61 64 2e 20 42 61 69 6c 20 d as dead. Bail
11230 6f 75 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 2c out immediately,
11240 20 77 69 74 68 20 61 6e 0a 09 20 2a 20 61 70 70 with an.. * app
11250 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 2e 20 ropriate error.
11260 44 6f 20 6e 6f 74 20 66 6f 72 67 65 74 20 74 6f Do not forget to
11270 20 75 6e 6c 6f 63 6b 20 74 68 65 20 6d 75 74 65 unlock the mute
11280 78 20 6f 6e 20 74 68 69 73 20 70 61 74 68 2e 0a x on this path..
11290 09 20 2a 2f 0a 0a 09 46 6f 72 77 61 72 64 53 65 . */...ForwardSe
112a0 74 53 74 61 74 69 63 45 72 72 6f 72 28 28 46 6f tStaticError((Fo
112b0 72 77 61 72 64 50 61 72 61 6d 20 2a 29 20 70 61 rwardParam *) pa
112c0 72 61 6d 2c 20 6d 73 67 5f 73 65 6e 64 5f 64 73 ram, msg_send_ds
112d0 74 6c 6f 73 74 29 3b 0a 09 54 63 6c 5f 4d 75 74 tlost);..Tcl_Mut
112e0 65 78 55 6e 6c 6f 63 6b 28 26 72 63 46 6f 72 77 exUnlock(&rcForw
112f0 61 72 64 4d 75 74 65 78 29 3b 0a 09 72 65 74 75 ardMutex);..retu
11300 72 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f rn;. }.. /
11310 2a 0a 20 20 20 20 20 2a 20 43 72 65 61 74 65 20 *. * Create
11320 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 and initialize t
11330 68 65 20 65 76 65 6e 74 20 61 6e 64 20 64 61 74 he event and dat
11340 61 20 73 74 72 75 63 74 75 72 65 73 2e 0a 20 20 a structures..
11350 20 20 20 2a 2f 0a 0a 20 20 20 20 65 76 50 74 72 */.. evPtr
11360 20 3d 20 28 46 6f 72 77 61 72 64 69 6e 67 45 76 = (ForwardingEv
11370 65 6e 74 20 2a 29 20 63 6b 61 6c 6c 6f 63 28 73 ent *) ckalloc(s
11380 69 7a 65 6f 66 28 46 6f 72 77 61 72 64 69 6e 67 izeof(Forwarding
11390 45 76 65 6e 74 29 29 3b 0a 20 20 20 20 72 65 73 Event));. res
113a0 75 6c 74 50 74 72 20 3d 20 28 46 6f 72 77 61 72 ultPtr = (Forwar
113b0 64 69 6e 67 52 65 73 75 6c 74 20 2a 29 20 63 6b dingResult *) ck
113c0 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 46 6f 72 alloc(sizeof(For
113d0 77 61 72 64 69 6e 67 52 65 73 75 6c 74 29 29 3b wardingResult));
113e0 0a 0a 20 20 20 20 65 76 50 74 72 2d 3e 65 76 65 .. evPtr->eve
113f0 6e 74 2e 70 72 6f 63 20 3d 20 46 6f 72 77 61 72 nt.proc = Forwar
11400 64 50 72 6f 63 3b 0a 20 20 20 20 65 76 50 74 72 dProc;. evPtr
11410 2d 3e 72 65 73 75 6c 74 50 74 72 20 3d 20 72 65 ->resultPtr = re
11420 73 75 6c 74 50 74 72 3b 0a 20 20 20 20 65 76 50 sultPtr;. evP
11430 74 72 2d 3e 6f 70 20 3d 20 6f 70 3b 0a 20 20 20 tr->op = op;.
11440 20 65 76 50 74 72 2d 3e 72 63 50 74 72 20 3d 20 evPtr->rcPtr =
11450 72 63 50 74 72 3b 0a 20 20 20 20 65 76 50 74 72 rcPtr;. evPtr
11460 2d 3e 70 61 72 61 6d 20 3d 20 28 46 6f 72 77 61 ->param = (Forwa
11470 72 64 50 61 72 61 6d 20 2a 29 20 70 61 72 61 6d rdParam *) param
11480 3b 0a 0a 20 20 20 20 72 65 73 75 6c 74 50 74 72 ;.. resultPtr
11490 2d 3e 73 72 63 20 3d 20 54 63 6c 5f 47 65 74 43 ->src = Tcl_GetC
114a0 75 72 72 65 6e 74 54 68 72 65 61 64 28 29 3b 0a urrentThread();.
114b0 20 20 20 20 72 65 73 75 6c 74 50 74 72 2d 3e 64 resultPtr->d
114c0 73 74 20 3d 20 64 73 74 3b 0a 20 20 20 20 72 65 st = dst;. re
114d0 73 75 6c 74 50 74 72 2d 3e 64 73 74 69 20 3d 20 sultPtr->dsti =
114e0 72 63 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 rcPtr->interp;.
114f0 20 20 20 72 65 73 75 6c 74 50 74 72 2d 3e 64 6f resultPtr->do
11500 6e 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 72 ne = NULL;. r
11510 65 73 75 6c 74 50 74 72 2d 3e 72 65 73 75 6c 74 esultPtr->result
11520 20 3d 20 2d 31 3b 0a 20 20 20 20 72 65 73 75 6c = -1;. resul
11530 74 50 74 72 2d 3e 65 76 50 74 72 20 3d 20 65 76 tPtr->evPtr = ev
11540 50 74 72 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 Ptr;.. /*.
11550 20 20 2a 20 4e 6f 77 20 65 78 65 63 75 74 65 20 * Now execute
11560 74 68 65 20 66 6f 72 77 61 72 64 2e 0a 20 20 20 the forward..
11570 20 20 2a 2f 0a 0a 20 20 20 20 54 63 6c 53 70 6c */.. TclSpl
11580 69 63 65 49 6e 28 72 65 73 75 6c 74 50 74 72 2c iceIn(resultPtr,
11590 20 66 6f 72 77 61 72 64 4c 69 73 74 29 3b 0a 20 forwardList);.
115a0 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 75 6e 6c /* Do not unl
115b0 6f 63 6b 20 68 65 72 65 2e 20 54 68 61 74 20 69 ock here. That i
115c0 73 20 64 6f 6e 65 20 62 79 20 74 68 65 20 43 6f s done by the Co
115d0 6e 64 69 74 69 6f 6e 57 61 69 74 20 2a 2f 0a 0a nditionWait */..
115e0 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 45 6e /*. * En
115f0 73 75 72 65 20 63 6c 65 61 6e 75 70 20 6f 66 20 sure cleanup of
11600 74 68 65 20 65 76 65 6e 74 20 69 66 20 74 68 65 the event if the
11610 20 6f 72 69 67 69 6e 20 74 68 72 65 61 64 20 65 origin thread e
11620 78 69 74 73 20 77 68 69 6c 65 20 74 68 69 73 20 xits while this
11630 65 76 65 6e 74 0a 20 20 20 20 20 2a 20 69 73 20 event. * is
11640 70 65 6e 64 69 6e 67 20 6f 72 20 69 6e 20 70 72 pending or in pr
11650 6f 67 72 65 73 73 2e 20 45 78 69 74 20 6f 66 20 ogress. Exit of
11660 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 the destination
11670 74 68 72 65 61 64 20 69 73 20 68 61 6e 64 6c 65 thread is handle
11680 64 20 62 79 0a 20 20 20 20 20 2a 20 44 65 6c 65 d by. * Dele
11690 74 65 54 68 72 65 61 64 52 65 66 6c 65 63 74 69 teThreadReflecti
116a0 6f 6e 43 68 61 6e 6e 65 6c 4d 61 70 28 29 2c 20 onChannelMap(),
116b0 74 68 69 73 20 69 73 20 73 65 74 20 75 70 20 62 this is set up b
116c0 79 0a 20 20 20 20 20 2a 20 47 65 74 54 68 72 65 y. * GetThre
116d0 61 64 52 65 66 6c 65 63 74 65 64 43 68 61 6e 6e adReflectedChann
116e0 65 6c 4d 61 70 28 29 2e 20 54 68 69 73 20 69 73 elMap(). This is
116f0 20 77 68 61 74 20 77 65 20 75 73 65 20 74 68 65 what we use the
11700 20 27 66 6f 72 77 61 72 64 4c 69 73 74 27 0a 20 'forwardList'.
11710 20 20 20 20 2a 20 28 73 65 65 20 61 62 6f 76 65 * (see above
11720 29 20 66 6f 72 2e 0a 20 20 20 20 20 2a 2f 0a 0a ) for.. */..
11730 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 54 68 Tcl_CreateTh
11740 72 65 61 64 45 78 69 74 48 61 6e 64 6c 65 72 28 readExitHandler(
11750 53 72 63 45 78 69 74 50 72 6f 63 2c 20 28 43 6c SrcExitProc, (Cl
11760 69 65 6e 74 44 61 74 61 29 20 65 76 50 74 72 29 ientData) evPtr)
11770 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a ;.. /*. *
11780 20 51 75 65 75 65 20 74 68 65 20 65 76 65 6e 74 Queue the event
11790 20 61 6e 64 20 70 6f 6b 65 20 74 68 65 20 6f 74 and poke the ot
117a0 68 65 72 20 74 68 72 65 61 64 27 73 20 6e 6f 74 her thread's not
117b0 69 66 69 65 72 2e 0a 20 20 20 20 20 2a 2f 0a 0a ifier.. */..
117c0 20 20 20 20 54 63 6c 5f 54 68 72 65 61 64 51 75 Tcl_ThreadQu
117d0 65 75 65 45 76 65 6e 74 28 64 73 74 2c 20 28 54 eueEvent(dst, (T
117e0 63 6c 5f 45 76 65 6e 74 20 2a 29 65 76 50 74 72 cl_Event *)evPtr
117f0 2c 20 54 43 4c 5f 51 55 45 55 45 5f 54 41 49 4c , TCL_QUEUE_TAIL
11800 29 3b 0a 20 20 20 20 54 63 6c 5f 54 68 72 65 61 );. Tcl_Threa
11810 64 41 6c 65 72 74 28 64 73 74 29 3b 0a 0a 20 20 dAlert(dst);..
11820 20 20 2f 2a 0a 20 20 20 20 20 2a 20 28 2a 29 20 /*. * (*)
11830 42 6c 6f 63 6b 20 75 6e 74 69 6c 20 74 68 65 20 Block until the
11840 6f 74 68 65 72 20 74 68 72 65 61 64 20 68 61 73 other thread has
11850 20 65 69 74 68 65 72 20 70 72 6f 63 65 73 73 65 either processe
11860 64 20 74 68 65 20 74 72 61 6e 73 66 65 72 20 6f d the transfer o
11870 72 0a 20 20 20 20 20 2a 20 72 65 6a 65 63 74 65 r. * rejecte
11880 64 20 69 74 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 d it.. */..
11890 20 20 20 77 68 69 6c 65 20 28 72 65 73 75 6c 74 while (result
118a0 50 74 72 2d 3e 72 65 73 75 6c 74 20 3c 20 30 29 Ptr->result < 0)
118b0 20 7b 0a 09 2f 2a 0a 09 20 2a 20 4e 4f 54 45 20 {../*.. * NOTE
118c0 28 31 29 3a 20 49 73 20 69 74 20 70 6f 73 73 69 (1): Is it possi
118d0 62 6c 65 20 74 68 61 74 20 74 68 65 20 63 75 72 ble that the cur
118e0 72 65 6e 74 20 74 68 72 65 61 64 20 67 6f 65 73 rent thread goes
118f0 20 61 77 61 79 20 77 68 69 6c 65 0a 09 20 2a 20 away while.. *
11900 77 61 69 74 69 6e 67 20 68 65 72 65 3f 20 49 4f waiting here? IO
11910 57 20 49 73 20 69 74 20 70 6f 73 73 69 62 6c 65 W Is it possible
11920 20 74 68 61 74 20 22 53 72 63 45 78 69 74 50 72 that "SrcExitPr
11930 6f 63 22 20 69 73 20 63 61 6c 6c 65 64 20 77 68 oc" is called wh
11940 69 6c 65 0a 09 20 2a 20 77 65 20 61 72 65 20 68 ile.. * we are h
11950 65 72 65 3f 20 53 65 65 20 63 6f 6d 70 6c 65 6d ere? See complem
11960 65 6e 74 61 72 79 20 6e 6f 74 65 20 28 32 29 20 entary note (2)
11970 69 6e 20 22 53 72 63 45 78 69 74 50 72 6f 63 22 in "SrcExitProc"
11980 0a 09 20 2a 0a 09 20 2a 20 54 68 65 20 43 6f 6e .. *.. * The Con
11990 64 69 74 69 6f 6e 57 61 69 74 20 75 6e 6c 6f 63 ditionWait unloc
119a0 6b 73 20 74 68 65 20 6d 75 74 65 78 20 64 75 72 ks the mutex dur
119b0 69 6e 67 20 74 68 65 20 77 61 69 74 20 61 6e 64 ing the wait and
119c0 20 72 65 6c 6f 63 6b 73 20 69 74 0a 09 20 2a 20 relocks it.. *
119d0 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 immediately afte
119e0 72 2e 0a 09 20 2a 2f 0a 0a 09 54 63 6c 5f 43 6f r... */...Tcl_Co
119f0 6e 64 69 74 69 6f 6e 57 61 69 74 28 26 72 65 73 nditionWait(&res
11a00 75 6c 74 50 74 72 2d 3e 64 6f 6e 65 2c 20 26 72 ultPtr->done, &r
11a10 63 46 6f 72 77 61 72 64 4d 75 74 65 78 2c 20 4e cForwardMutex, N
11a20 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 ULL);. }..
11a30 20 2f 2a 0a 20 20 20 20 20 2a 20 55 6e 6c 69 6e /*. * Unlin
11a40 6b 20 72 65 73 75 6c 74 20 66 72 6f 6d 20 74 68 k result from th
11a50 65 20 66 6f 72 77 61 72 64 65 72 20 6c 69 73 74 e forwarder list
11a60 2e 20 4e 6f 20 6e 65 65 64 20 74 6f 20 6c 6f 63 . No need to loc
11a70 6b 2e 20 45 69 74 68 65 72 20 73 74 69 6c 6c 0a k. Either still.
11a80 20 20 20 20 20 2a 20 6c 6f 63 6b 65 64 2c 20 6f * locked, o
11a90 72 20 6c 6f 63 6b 65 64 20 62 79 20 74 68 65 20 r locked by the
11aa0 43 6f 6e 64 69 74 69 6f 6e 57 61 69 74 0a 20 20 ConditionWait.
11ab0 20 20 20 2a 2f 0a 0a 20 20 20 20 54 63 6c 53 70 */.. TclSp
11ac0 6c 69 63 65 4f 75 74 28 72 65 73 75 6c 74 50 74 liceOut(resultPt
11ad0 72 2c 20 66 6f 72 77 61 72 64 4c 69 73 74 29 3b r, forwardList);
11ae0 0a 0a 20 20 20 20 72 65 73 75 6c 74 50 74 72 2d .. resultPtr-
11af0 3e 6e 65 78 74 50 74 72 20 3d 20 4e 55 4c 4c 3b >nextPtr = NULL;
11b00 0a 20 20 20 20 72 65 73 75 6c 74 50 74 72 2d 3e . resultPtr->
11b10 70 72 65 76 50 74 72 20 3d 20 4e 55 4c 4c 3b 0a prevPtr = NULL;.
11b20 0a 20 20 20 20 54 63 6c 5f 4d 75 74 65 78 55 6e . Tcl_MutexUn
11b30 6c 6f 63 6b 28 26 72 63 46 6f 72 77 61 72 64 4d lock(&rcForwardM
11b40 75 74 65 78 29 3b 0a 20 20 20 20 54 63 6c 5f 43 utex);. Tcl_C
11b50 6f 6e 64 69 74 69 6f 6e 46 69 6e 61 6c 69 7a 65 onditionFinalize
11b60 28 26 72 65 73 75 6c 74 50 74 72 2d 3e 64 6f 6e (&resultPtr->don
11b70 65 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 e);.. /*.
11b80 20 2a 20 4b 69 6c 6c 20 74 68 65 20 63 6c 65 61 * Kill the clea
11b90 6e 75 70 20 68 61 6e 64 6c 65 72 20 6e 6f 77 2c nup handler now,
11ba0 20 61 6e 64 20 74 68 65 20 72 65 73 75 6c 74 20 and the result
11bb0 73 74 72 75 63 74 75 72 65 20 61 73 20 77 65 6c structure as wel
11bc0 6c 2c 20 62 65 66 6f 72 65 0a 20 20 20 20 20 2a l, before. *
11bd0 20 72 65 74 75 72 6e 69 6e 67 20 74 68 65 20 73 returning the s
11be0 75 63 63 65 73 73 20 63 6f 64 65 2e 0a 20 20 20 uccess code..
11bf0 20 20 2a 0a 20 20 20 20 20 2a 20 4e 6f 74 65 3a *. * Note:
11c00 20 54 68 65 20 65 76 65 6e 74 20 73 74 72 75 63 The event struc
11c10 74 75 72 65 20 68 61 73 20 61 6c 72 65 61 64 79 ture has already
11c20 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2e 0a 20 been deleted..
11c30 20 20 20 20 2a 2f 0a 0a 20 20 20 20 54 63 6c 5f */.. Tcl_
11c40 44 65 6c 65 74 65 54 68 72 65 61 64 45 78 69 74 DeleteThreadExit
11c50 48 61 6e 64 6c 65 72 28 53 72 63 45 78 69 74 50 Handler(SrcExitP
11c60 72 6f 63 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 roc, (ClientData
11c70 29 20 65 76 50 74 72 29 3b 0a 0a 20 20 20 20 72 ) evPtr);.. r
11c80 65 73 75 6c 74 20 3d 20 72 65 73 75 6c 74 50 74 esult = resultPt
11c90 72 2d 3e 72 65 73 75 6c 74 3b 0a 20 20 20 20 63 r->result;. c
11ca0 6b 66 72 65 65 28 28 63 68 61 72 20 2a 29 20 72 kfree((char *) r
11cb0 65 73 75 6c 74 50 74 72 29 3b 0a 7d 0a 0c 0a 73 esultPtr);.}...s
11cc0 74 61 74 69 63 20 69 6e 74 0a 46 6f 72 77 61 72 tatic int.Forwar
11cd0 64 50 72 6f 63 28 0a 20 20 20 20 54 63 6c 5f 45 dProc(. Tcl_E
11ce0 76 65 6e 74 20 2a 65 76 47 50 74 72 2c 0a 20 20 vent *evGPtr,.
11cf0 20 20 69 6e 74 20 6d 61 73 6b 29 0a 7b 0a 20 20 int mask).{.
11d00 20 20 2f 2a 0a 20 20 20 20 20 2a 20 4e 6f 74 65 /*. * Note
11d10 73 20 72 65 67 61 72 64 69 6e 67 20 61 63 63 65 s regarding acce
11d20 73 73 20 74 6f 20 74 68 65 20 72 65 66 65 72 65 ss to the refere
11d30 6e 63 65 64 20 64 61 74 61 2e 0a 20 20 20 20 20 nced data..
11d40 2a 0a 20 20 20 20 20 2a 20 49 6e 20 70 72 69 6e *. * In prin
11d50 63 69 70 6c 65 20 74 68 65 20 64 61 74 61 20 62 ciple the data b
11d60 65 6c 6f 6e 67 73 20 74 6f 20 74 68 65 20 6f 72 elongs to the or
11d70 69 67 69 6e 61 74 69 6e 67 20 74 68 72 65 61 64 iginating thread
11d80 20 28 73 65 65 0a 20 20 20 20 20 2a 20 65 76 50 (see. * evP
11d90 74 72 2d 3e 73 72 63 29 2c 20 68 6f 77 65 76 65 tr->src), howeve
11da0 72 20 74 68 69 73 20 74 68 72 65 61 64 20 69 73 r this thread is
11db0 20 63 75 72 72 65 6e 74 6c 79 20 62 6c 6f 63 6b currently block
11dc0 65 64 20 61 74 20 28 2a 29 2c 20 69 2e 65 2e 0a ed at (*), i.e..
11dd0 20 20 20 20 20 2a 20 71 75 69 65 73 63 65 6e 74 * quiescent
11de0 2e 20 42 65 63 61 75 73 65 20 6f 66 20 74 68 69 . Because of thi
11df0 73 20 77 65 20 63 61 6e 20 74 72 65 61 74 20 74 s we can treat t
11e00 68 65 20 64 61 74 61 20 61 73 20 62 65 6c 6f 6e he data as belon
11e10 67 69 6e 67 20 74 6f 20 75 73 2c 0a 20 20 20 20 ging to us,.
11e20 20 2a 20 77 69 74 68 6f 75 74 20 66 65 61 72 20 * without fear
11e30 6f 66 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f of race conditio
11e40 6e 73 2e 20 49 2e 65 2e 20 77 65 20 63 61 6e 20 ns. I.e. we can
11e50 72 65 61 64 20 61 6e 64 20 77 72 69 74 65 20 61 read and write a
11e60 73 20 77 65 20 6c 69 6b 65 2e 0a 20 20 20 20 20 s we like..
11e70 2a 0a 20 20 20 20 20 2a 20 54 68 65 20 6f 6e 6c *. * The onl
11e80 79 20 74 68 69 6e 67 20 77 65 20 63 61 6e 6e 6f y thing we canno
11e90 74 20 62 65 20 73 75 72 65 20 6f 66 20 69 73 20 t be sure of is
11ea0 74 68 65 20 72 65 73 75 6c 74 50 74 72 2e 20 54 the resultPtr. T
11eb0 68 69 73 20 63 61 6e 20 62 65 20 62 65 0a 20 20 his can be be.
11ec0 20 20 20 2a 20 4e 55 4c 4c 65 64 20 69 66 20 74 * NULLed if t
11ed0 68 65 20 6f 72 69 67 69 6e 61 74 69 6e 67 20 74 he originating t
11ee0 68 72 65 61 64 20 77 65 6e 74 20 61 77 61 79 20 hread went away
11ef0 77 68 69 6c 65 20 74 68 65 20 65 76 65 6e 74 20 while the event
11f00 69 73 20 68 61 6e 64 6c 65 64 0a 20 20 20 20 20 is handled.
11f10 2a 20 68 65 72 65 20 6e 6f 77 2e 0a 20 20 20 20 * here now..
11f20 20 2a 2f 0a 0a 20 20 20 20 46 6f 72 77 61 72 64 */.. Forward
11f30 69 6e 67 45 76 65 6e 74 20 2a 65 76 50 74 72 20 ingEvent *evPtr
11f40 3d 20 28 46 6f 72 77 61 72 64 69 6e 67 45 76 65 = (ForwardingEve
11f50 6e 74 20 2a 29 20 65 76 47 50 74 72 3b 0a 20 20 nt *) evGPtr;.
11f60 20 20 46 6f 72 77 61 72 64 69 6e 67 52 65 73 75 ForwardingResu
11f70 6c 74 20 2a 72 65 73 75 6c 74 50 74 72 20 3d 20 lt *resultPtr =
11f80 65 76 50 74 72 2d 3e 72 65 73 75 6c 74 50 74 72 evPtr->resultPtr
11f90 3b 0a 20 20 20 20 52 65 66 6c 65 63 74 65 64 43 ;. ReflectedC
11fa0 68 61 6e 6e 65 6c 20 2a 72 63 50 74 72 20 3d 20 hannel *rcPtr =
11fb0 65 76 50 74 72 2d 3e 72 63 50 74 72 3b 0a 20 20 evPtr->rcPtr;.
11fc0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e Tcl_Interp *in
11fd0 74 65 72 70 20 3d 20 72 63 50 74 72 2d 3e 69 6e terp = rcPtr->in
11fe0 74 65 72 70 3b 0a 20 20 20 20 46 6f 72 77 61 72 terp;. Forwar
11ff0 64 50 61 72 61 6d 20 2a 70 61 72 61 6d 50 74 72 dParam *paramPtr
12000 20 3d 20 65 76 50 74 72 2d 3e 70 61 72 61 6d 3b = evPtr->param;
12010 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 72 65 . Tcl_Obj *re
12020 73 4f 62 6a 20 3d 20 4e 55 4c 4c 3b 09 2f 2a 20 sObj = NULL;./*
12030 49 6e 74 65 72 70 20 72 65 73 75 6c 74 20 6f 66 Interp result of
12040 20 49 6e 76 6f 6b 65 54 63 6c 4d 65 74 68 6f 64 InvokeTclMethod
12050 20 2a 2f 0a 20 20 20 20 52 65 66 6c 65 63 74 65 */. Reflecte
12060 64 43 68 61 6e 6e 65 6c 4d 61 70 20 2a 72 63 6d dChannelMap *rcm
12070 50 74 72 3b 0a 09 09 09 09 2f 2a 20 4d 61 70 20 Ptr;...../* Map
12080 6f 66 20 72 65 66 6c 65 63 74 65 64 20 63 68 61 of reflected cha
12090 6e 6e 65 6c 73 20 77 69 74 68 20 68 61 6e 64 6c nnels with handl
120a0 65 72 73 20 69 6e 0a 09 09 09 09 20 2a 20 74 68 ers in..... * th
120b0 69 73 20 69 6e 74 65 72 70 2e 20 2a 2f 0a 20 20 is interp. */.
120c0 20 20 54 63 6c 5f 48 61 73 68 45 6e 74 72 79 20 Tcl_HashEntry
120d0 2a 68 50 74 72 3b 20 20 20 20 20 20 20 20 2f 2a *hPtr; /*
120e0 20 45 6e 74 72 79 20 69 6e 20 74 68 65 20 61 62 Entry in the ab
120f0 6f 76 65 20 6d 61 70 20 2a 2f 0a 0a 20 20 20 20 ove map */..
12100 2f 2a 0a 20 20 20 20 20 2a 20 49 67 6e 6f 72 65 /*. * Ignore
12110 20 74 68 65 20 65 76 65 6e 74 20 69 66 20 6e 6f the event if no
12120 20 6f 6e 65 20 69 73 20 77 61 69 74 69 6e 67 20 one is waiting
12130 66 6f 72 20 69 74 73 20 72 65 73 75 6c 74 20 61 for its result a
12140 6e 79 6d 6f 72 65 2e 0a 20 20 20 20 20 2a 2f 0a nymore.. */.
12150 0a 20 20 20 20 69 66 20 28 21 72 65 73 75 6c 74 . if (!result
12160 50 74 72 29 20 7b 0a 09 72 65 74 75 72 6e 20 31 Ptr) {..return 1
12170 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 61 72 ;. }.. par
12180 61 6d 50 74 72 2d 3e 62 61 73 65 2e 63 6f 64 65 amPtr->base.code
12190 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 70 = TCL_OK;. p
121a0 61 72 61 6d 50 74 72 2d 3e 62 61 73 65 2e 6d 73 aramPtr->base.ms
121b0 67 53 74 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 gStr = NULL;.
121c0 20 70 61 72 61 6d 50 74 72 2d 3e 62 61 73 65 2e paramPtr->base.
121d0 6d 75 73 74 46 72 65 65 20 3d 20 30 3b 0a 0a 20 mustFree = 0;..
121e0 20 20 20 73 77 69 74 63 68 20 28 65 76 50 74 72 switch (evPtr
121f0 2d 3e 6f 70 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 ->op) {../*.. *
12200 54 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 The destination
12210 74 68 72 65 61 64 20 66 6f 72 20 74 68 65 20 66 thread for the f
12220 6f 6c 6c 6f 77 69 6e 67 20 6f 70 65 72 61 74 69 ollowing operati
12230 6f 6e 73 20 69 73 0a 09 20 2a 20 72 63 50 74 72 ons is.. * rcPtr
12240 2d 3e 74 68 72 65 61 64 2c 20 77 68 69 63 68 20 ->thread, which
12250 63 6f 6e 74 61 69 6e 73 20 72 63 50 74 72 2d 3e contains rcPtr->
12260 69 6e 74 65 72 70 2c 20 74 68 65 20 69 6e 74 65 interp, the inte
12270 72 70 20 77 65 20 68 61 76 65 20 74 6f 0a 09 20 rp we have to..
12280 2a 20 63 61 6c 6c 20 75 70 6f 6e 20 66 6f 72 20 * call upon for
12290 74 68 65 20 64 72 69 76 65 72 2e 0a 09 20 2a 2f the driver... */
122a0 0a 0a 20 20 20 20 63 61 73 65 20 46 6f 72 77 61 .. case Forwa
122b0 72 64 65 64 43 6c 6f 73 65 3a 0a 09 2f 2a 0a 09 rdedClose:../*..
122c0 20 2a 20 4e 6f 20 70 61 72 61 6d 65 74 65 72 73 * No parameters
122d0 2f 72 65 73 75 6c 74 73 2e 0a 09 20 2a 2f 0a 0a /results... */..
122e0 09 69 66 20 28 49 6e 76 6f 6b 65 54 63 6c 4d 65 .if (InvokeTclMe
122f0 74 68 6f 64 28 72 63 50 74 72 2c 20 22 66 69 6e thod(rcPtr, "fin
12300 61 6c 69 7a 65 22 2c 20 4e 55 4c 4c 2c 20 4e 55 alize", NULL, NU
12310 4c 4c 2c 20 26 72 65 73 4f 62 6a 29 21 3d 54 43 LL, &resObj)!=TC
12320 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 46 6f 72 L_OK) {.. For
12330 77 61 72 64 53 65 74 4f 62 6a 45 72 72 6f 72 28 wardSetObjError(
12340 70 61 72 61 6d 50 74 72 2c 20 72 65 73 4f 62 6a paramPtr, resObj
12350 29 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 46 );..}.../*.. * F
12360 72 65 65 69 6e 67 20 69 73 20 64 6f 6e 65 20 68 reeing is done h
12370 65 72 65 2c 20 69 6e 20 74 68 65 20 6f 72 69 67 ere, in the orig
12380 69 6e 20 74 68 72 65 61 64 2c 20 62 65 63 61 75 in thread, becau
12390 73 65 20 74 68 65 20 61 72 67 76 5b 5d 0a 09 20 se the argv[]..
123a0 2a 20 6f 62 6a 65 63 74 73 20 62 65 6c 6f 6e 67 * objects belong
123b0 20 74 6f 20 74 68 69 73 20 74 68 72 65 61 64 2e to this thread.
123c0 20 44 65 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68 Deallocating th
123d0 65 6d 20 69 6e 20 61 20 64 69 66 66 65 72 65 6e em in a differen
123e0 74 0a 09 20 2a 20 74 68 72 65 61 64 20 69 73 20 t.. * thread is
123f0 6e 6f 74 20 61 6c 6c 6f 77 65 64 0a 09 20 2a 0a not allowed.. *.
12400 09 20 2a 20 57 65 20 72 65 6d 6f 76 65 20 74 68 . * We remove th
12410 65 20 63 68 61 6e 6e 65 6c 20 66 72 6f 6d 20 62 e channel from b
12420 6f 74 68 20 69 6e 74 65 72 70 72 65 74 65 72 20 oth interpreter
12430 61 6e 64 20 74 68 72 65 61 64 20 6d 61 70 73 20 and thread maps
12440 62 65 66 6f 72 65 0a 09 20 2a 20 72 65 6c 65 61 before.. * relea
12450 73 69 6e 67 20 74 68 65 20 6d 65 6d 6f 72 79 2c sing the memory,
12460 20 74 6f 20 70 72 65 76 65 6e 74 20 66 75 74 75 to prevent futu
12470 72 65 20 61 63 63 65 73 73 65 73 20 28 6c 69 6b re accesses (lik
12480 65 20 62 79 0a 09 20 2a 20 27 70 6f 73 74 65 76 e by.. * 'postev
12490 65 6e 74 27 29 20 66 72 6f 6d 20 66 69 6e 64 69 ent') from findi
124a0 6e 67 20 61 6e 64 20 64 65 72 65 66 65 72 65 6e ng and dereferen
124b0 63 69 6e 67 20 61 20 64 61 6e 67 6c 69 6e 67 20 cing a dangling
124c0 70 6f 69 6e 74 65 72 2e 0a 09 20 2a 2f 0a 0a 09 pointer... */...
124d0 72 63 6d 50 74 72 20 3d 20 47 65 74 52 65 66 6c rcmPtr = GetRefl
124e0 65 63 74 65 64 43 68 61 6e 6e 65 6c 4d 61 70 28 ectedChannelMap(
124f0 69 6e 74 65 72 70 29 3b 0a 09 68 50 74 72 20 3d interp);..hPtr =
12500 20 54 63 6c 5f 46 69 6e 64 48 61 73 68 45 6e 74 Tcl_FindHashEnt
12510 72 79 28 26 72 63 6d 50 74 72 2d 3e 6d 61 70 2c ry(&rcmPtr->map,
12520 20 0a 09 09 54 63 6c 5f 47 65 74 43 68 61 6e 6e ...Tcl_GetChann
12530 65 6c 4e 61 6d 65 28 72 63 50 74 72 2d 3e 63 68 elName(rcPtr->ch
12540 61 6e 29 29 3b 0a 09 54 63 6c 5f 44 65 6c 65 74 an));..Tcl_Delet
12550 65 48 61 73 68 45 6e 74 72 79 28 68 50 74 72 29 eHashEntry(hPtr)
12560 3b 0a 0a 20 20 20 20 20 20 20 20 72 63 6d 50 74 ;.. rcmPt
12570 72 20 3d 20 47 65 74 54 68 72 65 61 64 52 65 66 r = GetThreadRef
12580 6c 65 63 74 65 64 43 68 61 6e 6e 65 6c 4d 61 70 lectedChannelMap
12590 28 29 3b 0a 09 68 50 74 72 20 3d 20 54 63 6c 5f ();..hPtr = Tcl_
125a0 46 69 6e 64 48 61 73 68 45 6e 74 72 79 28 26 72 FindHashEntry(&r
125b0 63 6d 50 74 72 2d 3e 6d 61 70 2c 20 0a 09 09 54 cmPtr->map, ...T
125c0 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d cl_GetChannelNam
125d0 65 28 72 63 50 74 72 2d 3e 63 68 61 6e 29 29 3b e(rcPtr->chan));
125e0 0a 09 54 63 6c 5f 44 65 6c 65 74 65 48 61 73 68 ..Tcl_DeleteHash
125f0 45 6e 74 72 79 28 68 50 74 72 29 3b 0a 0a 09 46 Entry(hPtr);...F
12600 72 65 65 52 65 66 6c 65 63 74 65 64 43 68 61 6e reeReflectedChan
12610 6e 65 6c 28 72 63 50 74 72 29 3b 0a 09 62 72 65 nel(rcPtr);..bre
12620 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 46 6f ak;.. case Fo
12630 72 77 61 72 64 65 64 49 6e 70 75 74 3a 20 7b 0a rwardedInput: {.
12640 09 54 63 6c 5f 4f 62 6a 20 2a 74 6f 52 65 61 64 .Tcl_Obj *toRead
12650 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 49 6e 74 Obj = Tcl_NewInt
12660 4f 62 6a 28 70 61 72 61 6d 50 74 72 2d 3e 69 6e Obj(paramPtr->in
12670 70 75 74 2e 74 6f 52 65 61 64 29 3b 0a 0a 09 69 put.toRead);...i
12680 66 20 28 49 6e 76 6f 6b 65 54 63 6c 4d 65 74 68 f (InvokeTclMeth
12690 6f 64 28 72 63 50 74 72 2c 20 22 72 65 61 64 22 od(rcPtr, "read"
126a0 2c 20 74 6f 52 65 61 64 4f 62 6a 2c 20 4e 55 4c , toReadObj, NUL
126b0 4c 2c 20 26 72 65 73 4f 62 6a 29 21 3d 54 43 4c L, &resObj)!=TCL
126c0 5f 4f 4b 29 7b 0a 09 20 20 20 20 46 6f 72 77 61 _OK){.. Forwa
126d0 72 64 53 65 74 4f 62 6a 45 72 72 6f 72 28 70 61 rdSetObjError(pa
126e0 72 61 6d 50 74 72 2c 20 72 65 73 4f 62 6a 29 3b ramPtr, resObj);
126f0 0a 09 20 20 20 20 70 61 72 61 6d 50 74 72 2d 3e .. paramPtr->
12700 69 6e 70 75 74 2e 74 6f 52 65 61 64 20 3d 20 2d input.toRead = -
12710 31 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 1;..} else {..
12720 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20 50 72 6f /*.. * Pro
12730 63 65 73 73 20 61 20 72 65 67 75 6c 61 72 20 72 cess a regular r
12740 65 73 75 6c 74 2e 0a 09 20 20 20 20 20 2a 2f 0a esult... */.
12750 0a 09 20 20 20 20 69 6e 74 20 62 79 74 65 63 3b .. int bytec;
12760 09 09 09 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 .../* Number of
12770 72 65 74 75 72 6e 65 64 20 62 79 74 65 73 20 2a returned bytes *
12780 2f 0a 09 20 20 20 20 75 6e 73 69 67 6e 65 64 20 /.. unsigned
12790 63 68 61 72 20 2a 62 79 74 65 76 3b 09 2f 2a 20 char *bytev;./*
127a0 41 72 72 61 79 20 6f 66 20 72 65 74 75 72 6e 65 Array of returne
127b0 64 20 62 79 74 65 73 20 2a 2f 0a 0a 09 20 20 20 d bytes */...
127c0 20 62 79 74 65 76 20 3d 20 54 63 6c 5f 47 65 74 bytev = Tcl_Get
127d0 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a ByteArrayFromObj
127e0 28 72 65 73 4f 62 6a 2c 20 26 62 79 74 65 63 29 (resObj, &bytec)
127f0 3b 0a 0a 09 20 20 20 20 69 66 20 28 70 61 72 61 ;... if (para
12800 6d 50 74 72 2d 3e 69 6e 70 75 74 2e 74 6f 52 65 mPtr->input.toRe
12810 61 64 20 3c 20 62 79 74 65 63 29 20 7b 0a 09 09 ad < bytec) {...
12820 46 6f 72 77 61 72 64 53 65 74 53 74 61 74 69 63 ForwardSetStatic
12830 45 72 72 6f 72 28 70 61 72 61 6d 50 74 72 2c 20 Error(paramPtr,
12840 6d 73 67 5f 72 65 61 64 5f 74 6f 6f 6d 75 63 68 msg_read_toomuch
12850 29 3b 0a 09 09 70 61 72 61 6d 50 74 72 2d 3e 69 );...paramPtr->i
12860 6e 70 75 74 2e 74 6f 52 65 61 64 20 3d 20 2d 31 nput.toRead = -1
12870 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a ;.. } else {.
12880 09 09 69 66 20 28 62 79 74 65 63 20 3e 20 30 29 ..if (bytec > 0)
12890 20 7b 0a 09 09 20 20 20 20 6d 65 6d 63 70 79 28 {... memcpy(
128a0 70 61 72 61 6d 50 74 72 2d 3e 69 6e 70 75 74 2e paramPtr->input.
128b0 62 75 66 2c 20 62 79 74 65 76 2c 20 28 73 69 7a buf, bytev, (siz
128c0 65 5f 74 29 62 79 74 65 63 29 3b 0a 09 09 7d 0a e_t)bytec);...}.
128d0 09 09 70 61 72 61 6d 50 74 72 2d 3e 69 6e 70 75 ..paramPtr->inpu
128e0 74 2e 74 6f 52 65 61 64 20 3d 20 62 79 74 65 63 t.toRead = bytec
128f0 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 62 72 65 ;.. }..}..bre
12900 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 ak;. }.. c
12910 61 73 65 20 46 6f 72 77 61 72 64 65 64 4f 75 74 ase ForwardedOut
12920 70 75 74 3a 20 7b 0a 09 54 63 6c 5f 4f 62 6a 20 put: {..Tcl_Obj
12930 2a 62 75 66 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 *bufObj = Tcl_Ne
12940 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 28 75 wByteArrayObj((u
12950 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 0a nsigned char *).
12960 09 09 70 61 72 61 6d 50 74 72 2d 3e 6f 75 74 70 ..paramPtr->outp
12970 75 74 2e 62 75 66 2c 20 70 61 72 61 6d 50 74 72 ut.buf, paramPtr
12980 2d 3e 6f 75 74 70 75 74 2e 74 6f 57 72 69 74 65 ->output.toWrite
12990 29 3b 0a 0a 09 69 66 20 28 49 6e 76 6f 6b 65 54 );...if (InvokeT
129a0 63 6c 4d 65 74 68 6f 64 28 72 63 50 74 72 2c 20 clMethod(rcPtr,
129b0 22 77 72 69 74 65 22 2c 20 62 75 66 4f 62 6a 2c "write", bufObj,
129c0 20 4e 55 4c 4c 2c 20 26 72 65 73 4f 62 6a 29 20 NULL, &resObj)
129d0 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 != TCL_OK) {..
129e0 20 20 46 6f 72 77 61 72 64 53 65 74 4f 62 6a 45 ForwardSetObjE
129f0 72 72 6f 72 28 70 61 72 61 6d 50 74 72 2c 20 72 rror(paramPtr, r
12a00 65 73 4f 62 6a 29 3b 0a 09 20 20 20 20 70 61 72 esObj);.. par
12a10 61 6d 50 74 72 2d 3e 6f 75 74 70 75 74 2e 74 6f amPtr->output.to
12a20 57 72 69 74 65 20 3d 20 2d 31 3b 0a 09 7d 20 65 Write = -1;..} e
12a30 6c 73 65 20 7b 0a 09 20 20 20 20 2f 2a 0a 09 20 lse {.. /*..
12a40 20 20 20 20 2a 20 50 72 6f 63 65 73 73 20 61 20 * Process a
12a50 72 65 67 75 6c 61 72 20 72 65 73 75 6c 74 2e 0a regular result..
12a60 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20 69 . */... i
12a70 6e 74 20 77 72 69 74 74 65 6e 3b 0a 0a 09 20 20 nt written;...
12a80 20 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 if (Tcl_GetInt
12a90 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 FromObj(interp,
12aa0 72 65 73 4f 62 6a 2c 20 26 77 72 69 74 74 65 6e resObj, &written
12ab0 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 ) != TCL_OK) {..
12ac0 09 46 6f 72 77 61 72 64 53 65 74 4f 62 6a 45 72 .ForwardSetObjEr
12ad0 72 6f 72 28 70 61 72 61 6d 50 74 72 2c 20 4d 61 ror(paramPtr, Ma
12ae0 72 73 68 61 6c 6c 45 72 72 6f 72 28 69 6e 74 65 rshallError(inte
12af0 72 70 29 29 3b 0a 09 09 70 61 72 61 6d 50 74 72 rp));...paramPtr
12b00 2d 3e 6f 75 74 70 75 74 2e 74 6f 57 72 69 74 65 ->output.toWrite
12b10 20 3d 20 2d 31 3b 0a 09 20 20 20 20 7d 20 65 6c = -1;.. } el
12b20 73 65 20 69 66 20 28 77 72 69 74 74 65 6e 3d 3d se if (written==
12b30 30 20 7c 7c 20 70 61 72 61 6d 50 74 72 2d 3e 6f 0 || paramPtr->o
12b40 75 74 70 75 74 2e 74 6f 57 72 69 74 65 3c 77 72 utput.toWrite<wr
12b50 69 74 74 65 6e 29 20 7b 0a 09 09 46 6f 72 77 61 itten) {...Forwa
12b60 72 64 53 65 74 53 74 61 74 69 63 45 72 72 6f 72 rdSetStaticError
12b70 28 70 61 72 61 6d 50 74 72 2c 20 6d 73 67 5f 77 (paramPtr, msg_w
12b80 72 69 74 65 5f 74 6f 6f 6d 75 63 68 29 3b 0a 09 rite_toomuch);..
12b90 09 70 61 72 61 6d 50 74 72 2d 3e 6f 75 74 70 75 .paramPtr->outpu
12ba0 74 2e 74 6f 57 72 69 74 65 20 3d 20 2d 31 3b 0a t.toWrite = -1;.
12bb0 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 . } else {...
12bc0 70 61 72 61 6d 50 74 72 2d 3e 6f 75 74 70 75 74 paramPtr->output
12bd0 2e 74 6f 57 72 69 74 65 20 3d 20 77 72 69 74 74 .toWrite = writt
12be0 65 6e 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 62 en;.. }..}..b
12bf0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 reak;. }..
12c00 20 63 61 73 65 20 46 6f 72 77 61 72 64 65 64 53 case ForwardedS
12c10 65 65 6b 3a 20 7b 0a 09 54 63 6c 5f 4f 62 6a 20 eek: {..Tcl_Obj
12c20 2a 6f 66 66 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 *offObj = Tcl_Ne
12c30 77 57 69 64 65 49 6e 74 4f 62 6a 28 70 61 72 61 wWideIntObj(para
12c40 6d 50 74 72 2d 3e 73 65 65 6b 2e 6f 66 66 73 65 mPtr->seek.offse
12c50 74 29 3b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 62 61 t);..Tcl_Obj *ba
12c60 73 65 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 53 seObj = Tcl_NewS
12c70 74 72 69 6e 67 4f 62 6a 28 0a 09 09 28 70 61 72 tringObj(...(par
12c80 61 6d 50 74 72 2d 3e 73 65 65 6b 2e 73 65 65 6b amPtr->seek.seek
12c90 4d 6f 64 65 3d 3d 53 45 45 4b 5f 53 45 54 29 20 Mode==SEEK_SET)
12ca0 3f 20 22 73 74 61 72 74 22 20 3a 0a 09 09 28 70 ? "start" :...(p
12cb0 61 72 61 6d 50 74 72 2d 3e 73 65 65 6b 2e 73 65 aramPtr->seek.se
12cc0 65 6b 4d 6f 64 65 3d 3d 53 45 45 4b 5f 43 55 52 ekMode==SEEK_CUR
12cd0 29 20 3f 20 22 63 75 72 72 65 6e 74 22 20 3a 20 ) ? "current" :
12ce0 22 65 6e 64 22 2c 20 2d 31 29 3b 0a 0a 09 69 66 "end", -1);...if
12cf0 20 28 49 6e 76 6f 6b 65 54 63 6c 4d 65 74 68 6f (InvokeTclMetho
12d00 64 28 72 63 50 74 72 2c 20 22 73 65 65 6b 22 2c d(rcPtr, "seek",
12d10 20 6f 66 66 4f 62 6a 2c 20 62 61 73 65 4f 62 6a offObj, baseObj
12d20 2c 20 26 72 65 73 4f 62 6a 29 21 3d 54 43 4c 5f , &resObj)!=TCL_
12d30 4f 4b 29 7b 0a 09 20 20 20 20 46 6f 72 77 61 72 OK){.. Forwar
12d40 64 53 65 74 4f 62 6a 45 72 72 6f 72 28 70 61 72 dSetObjError(par
12d50 61 6d 50 74 72 2c 20 72 65 73 4f 62 6a 29 3b 0a amPtr, resObj);.
12d60 09 20 20 20 20 70 61 72 61 6d 50 74 72 2d 3e 73 . paramPtr->s
12d70 65 65 6b 2e 6f 66 66 73 65 74 20 3d 20 2d 31 3b eek.offset = -1;
12d80 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 ..} else {..
12d90 2f 2a 0a 09 20 20 20 20 20 2a 20 50 72 6f 63 65 /*.. * Proce
12da0 73 73 20 61 20 72 65 67 75 6c 61 72 20 72 65 73 ss a regular res
12db0 75 6c 74 2e 20 49 66 20 74 68 65 20 74 79 70 65 ult. If the type
12dc0 20 69 73 20 77 72 6f 6e 67 20 74 68 69 73 20 6d is wrong this m
12dd0 61 79 20 63 68 61 6e 67 65 0a 09 20 20 20 20 20 ay change..
12de0 2a 20 69 6e 74 6f 20 61 6e 20 65 72 72 6f 72 2e * into an error.
12df0 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20 .. */...
12e00 54 63 6c 5f 57 69 64 65 49 6e 74 20 6e 65 77 4c Tcl_WideInt newL
12e10 6f 63 3b 0a 0a 09 20 20 20 20 69 66 20 28 54 63 oc;... if (Tc
12e20 6c 5f 47 65 74 57 69 64 65 49 6e 74 46 72 6f 6d l_GetWideIntFrom
12e30 4f 62 6a 28 69 6e 74 65 72 70 2c 20 72 65 73 4f Obj(interp, resO
12e40 62 6a 2c 20 26 6e 65 77 4c 6f 63 29 20 3d 3d 20 bj, &newLoc) ==
12e50 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 69 66 20 28 TCL_OK) {...if (
12e60 6e 65 77 4c 6f 63 20 3c 20 54 63 6c 5f 4c 6f 6e newLoc < Tcl_Lon
12e70 67 41 73 57 69 64 65 28 30 29 29 20 7b 0a 09 09 gAsWide(0)) {...
12e80 20 20 20 20 46 6f 72 77 61 72 64 53 65 74 53 74 ForwardSetSt
12e90 61 74 69 63 45 72 72 6f 72 28 70 61 72 61 6d 50 aticError(paramP
12ea0 74 72 2c 20 6d 73 67 5f 73 65 65 6b 5f 62 65 66 tr, msg_seek_bef
12eb0 6f 72 65 73 74 61 72 74 29 3b 0a 09 09 20 20 20 orestart);...
12ec0 20 70 61 72 61 6d 50 74 72 2d 3e 73 65 65 6b 2e paramPtr->seek.
12ed0 6f 66 66 73 65 74 20 3d 20 2d 31 3b 0a 09 09 7d offset = -1;...}
12ee0 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 70 61 else {... pa
12ef0 72 61 6d 50 74 72 2d 3e 73 65 65 6b 2e 6f 66 66 ramPtr->seek.off
12f00 73 65 74 20 3d 20 6e 65 77 4c 6f 63 3b 0a 09 09 set = newLoc;...
12f10 7d 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a }.. } else {.
12f20 09 09 46 6f 72 77 61 72 64 53 65 74 4f 62 6a 45 ..ForwardSetObjE
12f30 72 72 6f 72 28 70 61 72 61 6d 50 74 72 2c 20 4d rror(paramPtr, M
12f40 61 72 73 68 61 6c 6c 45 72 72 6f 72 28 69 6e 74 arshallError(int
12f50 65 72 70 29 29 3b 0a 09 09 70 61 72 61 6d 50 74 erp));...paramPt
12f60 72 2d 3e 73 65 65 6b 2e 6f 66 66 73 65 74 20 3d r->seek.offset =
12f70 20 2d 31 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 -1;.. }..}..
12f80 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 break;. }..
12f90 20 20 63 61 73 65 20 46 6f 72 77 61 72 64 65 64 case Forwarded
12fa0 57 61 74 63 68 3a 20 7b 0a 09 54 63 6c 5f 4f 62 Watch: {..Tcl_Ob
12fb0 6a 20 2a 6d 61 73 6b 4f 62 6a 20 3d 20 44 65 63 j *maskObj = Dec
12fc0 6f 64 65 45 76 65 6e 74 4d 61 73 6b 28 70 61 72 odeEventMask(par
12fd0 61 6d 50 74 72 2d 3e 77 61 74 63 68 2e 6d 61 73 amPtr->watch.mas
12fe0 6b 29 3b 0a 0a 09 28 76 6f 69 64 29 20 49 6e 76 k);...(void) Inv
12ff0 6f 6b 65 54 63 6c 4d 65 74 68 6f 64 28 72 63 50 okeTclMethod(rcP
13000 74 72 2c 20 22 77 61 74 63 68 22 2c 20 6d 61 73 tr, "watch", mas
13010 6b 4f 62 6a 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c kObj, NULL, NULL
13020 29 3b 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43 );..Tcl_DecrRefC
13030 6f 75 6e 74 28 6d 61 73 6b 4f 62 6a 29 3b 0a 09 ount(maskObj);..
13040 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 break;. }..
13050 20 20 63 61 73 65 20 46 6f 72 77 61 72 64 65 64 case Forwarded
13060 42 6c 6f 63 6b 3a 20 7b 0a 09 54 63 6c 5f 4f 62 Block: {..Tcl_Ob
13070 6a 20 2a 62 6c 6f 63 6b 4f 62 6a 20 3d 20 54 63 j *blockObj = Tc
13080 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 l_NewBooleanObj(
13090 21 70 61 72 61 6d 50 74 72 2d 3e 62 6c 6f 63 6b !paramPtr->block
130a0 2e 6e 6f 6e 62 6c 6f 63 6b 69 6e 67 29 3b 0a 0a .nonblocking);..
130b0 09 69 66 20 28 49 6e 76 6f 6b 65 54 63 6c 4d 65 .if (InvokeTclMe
130c0 74 68 6f 64 28 72 63 50 74 72 2c 20 22 62 6c 6f thod(rcPtr, "blo
130d0 63 6b 69 6e 67 22 2c 20 62 6c 6f 63 6b 4f 62 6a cking", blockObj
130e0 2c 20 4e 55 4c 4c 2c 0a 09 09 26 72 65 73 4f 62 , NULL,...&resOb
130f0 6a 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a j) != TCL_OK) {.
13100 09 20 20 20 20 46 6f 72 77 61 72 64 53 65 74 4f . ForwardSetO
13110 62 6a 45 72 72 6f 72 28 70 61 72 61 6d 50 74 72 bjError(paramPtr
13120 2c 20 72 65 73 4f 62 6a 29 3b 0a 09 7d 0a 09 62 , resObj);..}..b
13130 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 reak;. }..
13140 20 63 61 73 65 20 46 6f 72 77 61 72 64 65 64 53 case ForwardedS
13150 65 74 4f 70 74 3a 20 7b 0a 09 54 63 6c 5f 4f 62 etOpt: {..Tcl_Ob
13160 6a 20 2a 6f 70 74 69 6f 6e 4f 62 6a 20 3d 20 54 j *optionObj = T
13170 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
13180 70 61 72 61 6d 50 74 72 2d 3e 73 65 74 4f 70 74 paramPtr->setOpt
13190 2e 6e 61 6d 65 2c 20 2d 31 29 3b 0a 09 54 63 6c .name, -1);..Tcl
131a0 5f 4f 62 6a 20 2a 76 61 6c 75 65 4f 62 6a 20 3d _Obj *valueObj =
131b0 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
131c0 6a 28 70 61 72 61 6d 50 74 72 2d 3e 73 65 74 4f j(paramPtr->setO
131d0 70 74 2e 76 61 6c 75 65 2c 20 2d 31 29 3b 0a 0a pt.value, -1);..
131e0 09 69 66 20 28 49 6e 76 6f 6b 65 54 63 6c 4d 65 .if (InvokeTclMe
131f0 74 68 6f 64 28 72 63 50 74 72 2c 20 22 63 6f 6e thod(rcPtr, "con
13200 66 69 67 75 72 65 22 2c 20 6f 70 74 69 6f 6e 4f figure", optionO
13210 62 6a 2c 20 76 61 6c 75 65 4f 62 6a 2c 0a 09 09 bj, valueObj,...
13220 26 72 65 73 4f 62 6a 29 20 21 3d 20 54 43 4c 5f &resObj) != TCL_
13230 4f 4b 29 20 7b 0a 09 20 20 20 20 46 6f 72 77 61 OK) {.. Forwa
13240 72 64 53 65 74 4f 62 6a 45 72 72 6f 72 28 70 61 rdSetObjError(pa
13250 72 61 6d 50 74 72 2c 20 72 65 73 4f 62 6a 29 3b ramPtr, resObj);
13260 0a 09 7d 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 ..}..break;.
13270 7d 0a 0a 20 20 20 20 63 61 73 65 20 46 6f 72 77 }.. case Forw
13280 61 72 64 65 64 47 65 74 4f 70 74 3a 20 7b 0a 09 ardedGetOpt: {..
13290 2f 2a 0a 09 20 2a 20 52 65 74 72 69 65 76 65 20 /*.. * Retrieve
132a0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6f 6e 65 the value of one
132b0 20 6f 70 74 69 6f 6e 2e 0a 09 20 2a 2f 0a 0a 09 option... */...
132c0 54 63 6c 5f 4f 62 6a 20 2a 6f 70 74 69 6f 6e 4f Tcl_Obj *optionO
132d0 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 bj = Tcl_NewStri
132e0 6e 67 4f 62 6a 28 70 61 72 61 6d 50 74 72 2d 3e ngObj(paramPtr->
132f0 67 65 74 4f 70 74 2e 6e 61 6d 65 2c 20 2d 31 29 getOpt.name, -1)
13300 3b 0a 0a 09 69 66 20 28 49 6e 76 6f 6b 65 54 63 ;...if (InvokeTc
13310 6c 4d 65 74 68 6f 64 28 72 63 50 74 72 2c 20 22 lMethod(rcPtr, "
13320 63 67 65 74 22 2c 20 6f 70 74 69 6f 6e 4f 62 6a cget", optionObj
13330 2c 20 4e 55 4c 4c 2c 20 26 72 65 73 4f 62 6a 29 , NULL, &resObj)
13340 21 3d 54 43 4c 5f 4f 4b 29 7b 0a 09 20 20 20 20 !=TCL_OK){..
13350 46 6f 72 77 61 72 64 53 65 74 4f 62 6a 45 72 72 ForwardSetObjErr
13360 6f 72 28 70 61 72 61 6d 50 74 72 2c 20 72 65 73 or(paramPtr, res
13370 4f 62 6a 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a Obj);..} else {.
13380 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 . Tcl_DString
13390 41 70 70 65 6e 64 28 70 61 72 61 6d 50 74 72 2d Append(paramPtr-
133a0 3e 67 65 74 4f 70 74 2e 76 61 6c 75 65 2c 0a 09 >getOpt.value,..
133b0 09 20 20 20 20 54 63 6c 47 65 74 53 74 72 69 6e . TclGetStrin
133c0 67 28 72 65 73 4f 62 6a 29 2c 20 2d 31 29 3b 0a g(resObj), -1);.
133d0 09 7d 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d .}..break;. }
133e0 0a 0a 20 20 20 20 63 61 73 65 20 46 6f 72 77 61 .. case Forwa
133f0 72 64 65 64 47 65 74 4f 70 74 41 6c 6c 3a 0a 09 rdedGetOptAll:..
13400 2f 2a 0a 09 20 2a 20 52 65 74 72 69 65 76 65 20 /*.. * Retrieve
13410 61 6c 6c 20 6f 70 74 69 6f 6e 73 2e 0a 09 20 2a all options... *
13420 2f 0a 0a 09 69 66 20 28 49 6e 76 6f 6b 65 54 63 /...if (InvokeTc
13430 6c 4d 65 74 68 6f 64 28 72 63 50 74 72 2c 20 22 lMethod(rcPtr, "
13440 63 67 65 74 61 6c 6c 22 2c 20 4e 55 4c 4c 2c 20 cgetall", NULL,
13450 4e 55 4c 4c 2c 20 26 72 65 73 4f 62 6a 29 20 21 NULL, &resObj) !
13460 3d 20 54 43 4c 5f 4f 4b 29 7b 0a 09 20 20 20 20 = TCL_OK){..
13470 46 6f 72 77 61 72 64 53 65 74 4f 62 6a 45 72 72 ForwardSetObjErr
13480 6f 72 28 70 61 72 61 6d 50 74 72 2c 20 72 65 73 or(paramPtr, res
13490 4f 62 6a 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a Obj);..} else {.
134a0 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20 . /*.. *
134b0 45 78 74 72 61 63 74 20 6c 69 73 74 2c 20 76 61 Extract list, va
134c0 6c 69 64 61 74 65 20 74 68 61 74 20 69 74 20 69 lidate that it i
134d0 73 20 61 20 6c 69 73 74 2c 20 61 6e 64 20 23 65 s a list, and #e
134e0 6c 65 6d 65 6e 74 73 2e 20 53 65 65 0a 09 20 20 lements. See..
134f0 20 20 20 2a 20 4e 4f 54 45 20 28 34 29 20 61 73 * NOTE (4) as
13500 20 77 65 6c 6c 2e 0a 09 20 20 20 20 20 2a 2f 0a well... */.
13510 0a 09 20 20 20 20 69 6e 74 20 6c 69 73 74 63 3b .. int listc;
13520 0a 09 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a .. Tcl_Obj **
13530 6c 69 73 74 76 3b 0a 0a 09 20 20 20 20 69 66 20 listv;... if
13540 28 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45 (Tcl_ListObjGetE
13550 6c 65 6d 65 6e 74 73 28 69 6e 74 65 72 70 2c 20 lements(interp,
13560 72 65 73 4f 62 6a 2c 20 26 6c 69 73 74 63 2c 0a resObj, &listc,.
13570 09 09 20 20 20 20 26 6c 69 73 74 76 29 20 21 3d .. &listv) !=
13580 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 46 6f 72 TCL_OK) {...For
13590 77 61 72 64 53 65 74 4f 62 6a 45 72 72 6f 72 28 wardSetObjError(
135a0 70 61 72 61 6d 50 74 72 2c 20 4d 61 72 73 68 61 paramPtr, Marsha
135b0 6c 6c 45 72 72 6f 72 28 69 6e 74 65 72 70 29 29 llError(interp))
135c0 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 ;.. } else if
135d0 20 28 28 6c 69 73 74 63 20 25 20 32 29 20 3d 3d ((listc % 2) ==
135e0 20 31 29 20 7b 0a 09 09 2f 2a 0a 09 09 20 2a 20 1) {.../*... *
135f0 4f 64 64 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c Odd number of el
13600 65 6d 65 6e 74 73 20 69 73 20 77 72 6f 6e 67 2e ements is wrong.
13610 20 5b 78 5d 2e 0a 09 09 20 2a 2f 0a 0a 09 09 63 [x].... */....c
13620 68 61 72 20 2a 62 75 66 20 3d 20 63 6b 61 6c 6c har *buf = ckall
13630 6f 63 28 32 30 30 29 3b 0a 09 09 73 70 72 69 6e oc(200);...sprin
13640 74 66 28 62 75 66 2c 0a 09 09 09 22 7b 45 78 70 tf(buf,...."{Exp
13650 65 63 74 65 64 20 6c 69 73 74 20 77 69 74 68 20 ected list with
13660 65 76 65 6e 20 6e 75 6d 62 65 72 20 6f 66 20 65 even number of e
13670 6c 65 6d 65 6e 74 73 2c 20 67 6f 74 20 25 64 20 lements, got %d
13680 25 73 20 69 6e 73 74 65 61 64 7d 22 2c 0a 09 09 %s instead}",...
13690 09 6c 69 73 74 63 2c 20 28 6c 69 73 74 63 20 3d .listc, (listc =
136a0 3d 20 31 20 3f 20 22 65 6c 65 6d 65 6e 74 22 20 = 1 ? "element"
136b0 3a 20 22 65 6c 65 6d 65 6e 74 73 22 29 29 3b 0a : "elements"));.
136c0 0a 09 09 46 6f 72 77 61 72 64 53 65 74 44 79 6e ...ForwardSetDyn
136d0 61 6d 69 63 45 72 72 6f 72 28 70 61 72 61 6d 50 amicError(paramP
136e0 74 72 2c 20 62 75 66 29 3b 0a 09 20 20 20 20 7d tr, buf);.. }
136f0 20 65 6c 73 65 20 7b 0a 09 09 69 6e 74 20 6c 65 else {...int le
13700 6e 3b 0a 09 09 63 6f 6e 73 74 20 63 68 61 72 20 n;...const char
13710 2a 73 74 72 20 3d 20 54 63 6c 5f 47 65 74 53 74 *str = Tcl_GetSt
13720 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 72 65 73 4f ringFromObj(resO
13730 62 6a 2c 20 26 6c 65 6e 29 3b 0a 0a 09 09 69 66 bj, &len);....if
13740 20 28 6c 65 6e 29 20 7b 0a 09 09 20 20 20 20 54 (len) {... T
13750 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 cl_DStringAppend
13760 28 70 61 72 61 6d 50 74 72 2d 3e 67 65 74 4f 70 (paramPtr->getOp
13770 74 2e 76 61 6c 75 65 2c 20 22 20 22 2c 20 31 29 t.value, " ", 1)
13780 3b 0a 09 09 20 20 20 20 54 63 6c 5f 44 53 74 72 ;... Tcl_DStr
13790 69 6e 67 41 70 70 65 6e 64 28 70 61 72 61 6d 50 ingAppend(paramP
137a0 74 72 2d 3e 67 65 74 4f 70 74 2e 76 61 6c 75 65 tr->getOpt.value
137b0 2c 20 73 74 72 2c 20 6c 65 6e 29 3b 0a 09 09 7d , str, len);...}
137c0 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 62 72 65 61 .. }..}..brea
137d0 6b 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a k;.. default:
137e0 0a 09 2f 2a 0a 09 20 2a 20 42 61 64 20 6f 70 65 ../*.. * Bad ope
137f0 72 61 74 69 6f 6e 20 63 6f 64 65 2e 0a 09 20 2a ration code... *
13800 2f 0a 0a 09 54 63 6c 5f 50 61 6e 69 63 28 22 42 /...Tcl_Panic("B
13810 61 64 20 6f 70 65 72 61 74 69 6f 6e 20 63 6f 64 ad operation cod
13820 65 20 69 6e 20 46 6f 72 77 61 72 64 50 72 6f 63 e in ForwardProc
13830 22 29 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 ");..break;.
13840 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a }.. /*. *
13850 20 52 65 6d 6f 76 65 20 74 68 65 20 72 65 66 65 Remove the refe
13860 72 65 6e 63 65 20 77 65 20 68 65 6c 64 20 6f 6e rence we held on
13870 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 the result of t
13880 68 65 20 69 6e 76 6f 6b 65 2c 20 69 66 20 77 65 he invoke, if we
13890 20 68 61 64 0a 20 20 20 20 20 2a 20 73 75 63 68 had. * such
138a0 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69 .. */.. i
138b0 66 20 28 72 65 73 4f 62 6a 20 21 3d 20 4e 55 4c f (resObj != NUL
138c0 4c 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65 L) {..Tcl_DecrRe
138d0 66 43 6f 75 6e 74 28 72 65 73 4f 62 6a 29 3b 0a fCount(resObj);.
138e0 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 72 }.. if (r
138f0 65 73 75 6c 74 50 74 72 29 20 7b 0a 09 2f 2a 0a esultPtr) {../*.
13900 09 20 2a 20 52 65 70 6f 72 74 20 74 68 65 20 66 . * Report the f
13910 6f 72 77 61 72 64 69 6e 67 20 72 65 73 75 6c 74 orwarding result
13920 20 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 74 synchronously t
13930 6f 20 74 68 65 20 77 61 69 74 69 6e 67 20 63 61 o the waiting ca
13940 6c 6c 65 72 2e 0a 09 20 2a 20 54 68 69 73 20 75 ller... * This u
13950 6e 62 6c 6f 63 6b 73 20 28 2a 29 20 61 73 20 77 nblocks (*) as w
13960 65 6c 6c 2e 20 54 68 69 73 20 69 73 20 77 72 61 ell. This is wra
13970 70 70 65 64 20 69 6e 74 6f 20 61 20 63 6f 6e 64 pped into a cond
13980 69 74 69 6f 6e 61 6c 0a 09 20 2a 20 62 65 63 61 itional.. * beca
13990 75 73 65 20 74 68 65 20 63 61 6c 6c 65 72 20 6d use the caller m
139a0 61 79 20 68 61 76 65 20 65 78 69 74 65 64 20 69 ay have exited i
139b0 6e 20 74 68 65 20 6d 65 61 6e 20 74 69 6d 65 2e n the mean time.
139c0 0a 09 20 2a 2f 0a 0a 09 54 63 6c 5f 4d 75 74 65 .. */...Tcl_Mute
139d0 78 4c 6f 63 6b 28 26 72 63 46 6f 72 77 61 72 64 xLock(&rcForward
139e0 4d 75 74 65 78 29 3b 0a 09 72 65 73 75 6c 74 50 Mutex);..resultP
139f0 74 72 2d 3e 72 65 73 75 6c 74 20 3d 20 54 43 4c tr->result = TCL
13a00 5f 4f 4b 3b 0a 09 54 63 6c 5f 43 6f 6e 64 69 74 _OK;..Tcl_Condit
13a10 69 6f 6e 4e 6f 74 69 66 79 28 26 72 65 73 75 6c ionNotify(&resul
13a20 74 50 74 72 2d 3e 64 6f 6e 65 29 3b 0a 09 54 63 tPtr->done);..Tc
13a30 6c 5f 4d 75 74 65 78 55 6e 6c 6f 63 6b 28 26 72 l_MutexUnlock(&r
13a40 63 46 6f 72 77 61 72 64 4d 75 74 65 78 29 3b 0a cForwardMutex);.
13a50 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 }.. retur
13a60 6e 20 31 3b 0a 7d 0a 0c 0a 73 74 61 74 69 63 20 n 1;.}...static
13a70 76 6f 69 64 0a 53 72 63 45 78 69 74 50 72 6f 63 void.SrcExitProc
13a80 28 0a 20 20 20 20 43 6c 69 65 6e 74 44 61 74 61 (. ClientData
13a90 20 63 6c 69 65 6e 74 44 61 74 61 29 0a 7b 0a 20 clientData).{.
13aa0 20 20 20 46 6f 72 77 61 72 64 69 6e 67 45 76 65 ForwardingEve
13ab0 6e 74 20 2a 65 76 50 74 72 20 3d 20 28 46 6f 72 nt *evPtr = (For
13ac0 77 61 72 64 69 6e 67 45 76 65 6e 74 20 2a 29 20 wardingEvent *)
13ad0 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 20 20 clientData;.
13ae0 46 6f 72 77 61 72 64 69 6e 67 52 65 73 75 6c 74 ForwardingResult
13af0 20 2a 72 65 73 75 6c 74 50 74 72 3b 0a 20 20 20 *resultPtr;.
13b00 20 46 6f 72 77 61 72 64 50 61 72 61 6d 20 2a 70 ForwardParam *p
13b10 61 72 61 6d 50 74 72 3b 0a 0a 20 20 20 20 2f 2a aramPtr;.. /*
13b20 0a 20 20 20 20 20 2a 20 4e 4f 54 45 20 28 32 29 . * NOTE (2)
13b30 3a 20 43 61 6e 20 74 68 69 73 20 68 61 6e 64 6c : Can this handl
13b40 65 72 20 62 65 20 63 61 6c 6c 65 64 20 77 69 74 er be called wit
13b50 68 20 74 68 65 20 6f 72 69 67 69 6e 61 74 6f 72 h the originator
13b60 20 62 6c 6f 63 6b 65 64 3f 0a 20 20 20 20 20 2a blocked?. *
13b70 2f 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a /.. /*. *
13b80 20 54 68 65 20 6f 72 69 67 69 6e 61 74 6f 72 20 The originator
13b90 66 6f 72 20 74 68 65 20 65 76 65 6e 74 20 65 78 for the event ex
13ba0 69 74 65 64 2e 20 49 74 20 69 73 20 6e 6f 74 20 ited. It is not
13bb0 73 75 72 65 20 69 66 20 74 68 69 73 20 63 61 6e sure if this can
13bc0 20 68 61 70 70 65 6e 2c 0a 20 20 20 20 20 2a 20 happen,. *
13bd0 61 73 20 74 68 65 20 6f 72 69 67 69 6e 61 74 6f as the originato
13be0 72 20 73 68 6f 75 6c 64 20 62 65 20 62 6c 6f 63 r should be bloc
13bf0 6b 65 64 20 61 74 20 28 2a 29 20 77 68 69 6c 65 ked at (*) while
13c00 20 74 68 65 20 65 76 65 6e 74 20 69 73 20 69 6e the event is in
13c10 0a 20 20 20 20 20 2a 20 74 72 61 6e 73 69 74 2f . * transit/
13c20 70 65 6e 64 69 6e 67 2e 0a 20 20 20 20 20 2a 0a pending.. *.
13c30 20 20 20 20 20 2a 20 57 65 20 6d 61 6b 65 20 73 * We make s
13c40 75 72 65 20 74 68 61 74 20 74 68 65 20 65 76 65 ure that the eve
13c50 6e 74 20 63 61 6e 6e 6f 74 20 72 65 66 65 72 20 nt cannot refer
13c60 74 6f 20 74 68 65 20 72 65 73 75 6c 74 20 61 6e to the result an
13c70 79 6d 6f 72 65 2c 20 72 65 6d 6f 76 65 0a 20 20 ymore, remove.
13c80 20 20 20 2a 20 69 74 20 66 72 6f 6d 20 74 68 65 * it from the
13c90 20 6c 69 73 74 20 6f 66 20 70 65 6e 64 69 6e 67 list of pending
13ca0 20 72 65 73 75 6c 74 73 20 61 6e 64 20 66 72 65 results and fre
13cb0 65 20 74 68 65 20 73 74 72 75 63 74 75 72 65 2e e the structure.
13cc0 20 4c 6f 63 6b 69 6e 67 20 74 68 65 0a 20 20 20 Locking the.
13cd0 20 20 2a 20 61 63 63 65 73 73 20 65 6e 73 75 72 * access ensur
13ce0 65 73 20 74 68 61 74 20 77 65 20 63 61 6e 6e 6f es that we canno
13cf0 74 20 67 65 74 20 69 6e 20 63 6f 6e 66 6c 69 63 t get in conflic
13d00 74 20 77 69 74 68 20 22 46 6f 72 77 61 72 64 50 t with "ForwardP
13d10 72 6f 63 22 2c 0a 20 20 20 20 20 2a 20 73 68 6f roc",. * sho
13d20 75 6c 64 20 69 74 20 61 6c 72 65 61 64 79 20 65 uld it already e
13d30 78 65 63 75 74 65 20 74 68 65 20 65 76 65 6e 74 xecute the event
13d40 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 54 .. */.. T
13d50 63 6c 5f 4d 75 74 65 78 4c 6f 63 6b 28 26 72 63 cl_MutexLock(&rc
13d60 46 6f 72 77 61 72 64 4d 75 74 65 78 29 3b 0a 0a ForwardMutex);..
13d70 20 20 20 20 72 65 73 75 6c 74 50 74 72 20 3d 20 resultPtr =
13d80 65 76 50 74 72 2d 3e 72 65 73 75 6c 74 50 74 72 evPtr->resultPtr
13d90 3b 0a 20 20 20 20 70 61 72 61 6d 50 74 72 20 3d ;. paramPtr =
13da0 20 65 76 50 74 72 2d 3e 70 61 72 61 6d 3b 0a 0a evPtr->param;..
13db0 20 20 20 20 65 76 50 74 72 2d 3e 72 65 73 75 6c evPtr->resul
13dc0 74 50 74 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 tPtr = NULL;.
13dd0 20 72 65 73 75 6c 74 50 74 72 2d 3e 65 76 50 74 resultPtr->evPt
13de0 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 72 65 r = NULL;. re
13df0 73 75 6c 74 50 74 72 2d 3e 72 65 73 75 6c 74 20 sultPtr->result
13e00 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 = TCL_ERROR;..
13e10 20 20 46 6f 72 77 61 72 64 53 65 74 53 74 61 74 ForwardSetStat
13e20 69 63 45 72 72 6f 72 28 70 61 72 61 6d 50 74 72 icError(paramPtr
13e30 2c 20 6d 73 67 5f 73 65 6e 64 5f 6f 72 69 67 69 , msg_send_origi
13e40 6e 6c 6f 73 74 29 3b 0a 0a 20 20 20 20 2f 2a 0a nlost);.. /*.
13e50 20 20 20 20 20 2a 20 53 65 65 20 62 65 6c 6f 77 * See below
13e60 3a 20 54 63 6c 53 70 6c 69 63 65 4f 75 74 28 72 : TclSpliceOut(r
13e70 65 73 75 6c 74 50 74 72 2c 20 66 6f 72 77 61 72 esultPtr, forwar
13e80 64 4c 69 73 74 29 3b 0a 20 20 20 20 20 2a 2f 0a dList);. */.
13e90 0a 20 20 20 20 54 63 6c 5f 4d 75 74 65 78 55 6e . Tcl_MutexUn
13ea0 6c 6f 63 6b 28 26 72 63 46 6f 72 77 61 72 64 4d lock(&rcForwardM
13eb0 75 74 65 78 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 utex);.. /*.
13ec0 20 20 20 20 2a 20 54 68 69 73 20 75 6e 6c 6f 63 * This unloc
13ed0 6b 73 20 28 2a 29 2e 20 54 68 65 20 73 74 72 75 ks (*). The stru
13ee0 63 74 75 72 65 20 77 69 6c 6c 20 62 65 20 73 70 cture will be sp
13ef0 6c 69 63 65 64 20 6f 75 74 20 61 6e 64 20 66 72 liced out and fr
13f00 65 65 64 20 62 79 0a 20 20 20 20 20 2a 20 22 46 eed by. * "F
13f10 6f 72 77 61 72 64 50 72 6f 63 22 2e 20 4d 61 79 orwardProc". May
13f20 62 65 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 be.. */..
13f30 20 54 63 6c 5f 43 6f 6e 64 69 74 69 6f 6e 4e 6f Tcl_ConditionNo
13f40 74 69 66 79 28 26 72 65 73 75 6c 74 50 74 72 2d tify(&resultPtr-
13f50 3e 64 6f 6e 65 29 3b 0a 7d 0a 0c 0a 73 74 61 74 >done);.}...stat
13f60 69 63 20 76 6f 69 64 0a 46 6f 72 77 61 72 64 53 ic void.ForwardS
13f70 65 74 4f 62 6a 45 72 72 6f 72 28 0a 20 20 20 20 etObjError(.
13f80 46 6f 72 77 61 72 64 50 61 72 61 6d 20 2a 70 61 ForwardParam *pa
13f90 72 61 6d 50 74 72 2c 0a 20 20 20 20 54 63 6c 5f ramPtr,. Tcl_
13fa0 4f 62 6a 20 2a 6f 62 6a 29 0a 7b 0a 20 20 20 20 Obj *obj).{.
13fb0 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 63 6f 6e int len;. con
13fc0 73 74 20 63 68 61 72 20 2a 6d 73 67 53 74 72 20 st char *msgStr
13fd0 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 = Tcl_GetStringF
13fe0 72 6f 6d 4f 62 6a 28 6f 62 6a 2c 20 26 6c 65 6e romObj(obj, &len
13ff0 29 3b 0a 0a 20 20 20 20 6c 65 6e 2b 2b 3b 0a 20 );.. len++;.
14000 20 20 20 46 6f 72 77 61 72 64 53 65 74 44 79 6e ForwardSetDyn
14010 61 6d 69 63 45 72 72 6f 72 28 70 61 72 61 6d 50 amicError(paramP
14020 74 72 2c 20 63 6b 61 6c 6c 6f 63 28 28 75 6e 73 tr, ckalloc((uns
14030 69 67 6e 65 64 29 20 6c 65 6e 29 29 3b 0a 20 20 igned) len));.
14040 20 20 6d 65 6d 63 70 79 28 70 61 72 61 6d 50 74 memcpy(paramPt
14050 72 2d 3e 62 61 73 65 2e 6d 73 67 53 74 72 2c 20 r->base.msgStr,
14060 6d 73 67 53 74 72 2c 20 28 75 6e 73 69 67 6e 65 msgStr, (unsigne
14070 64 29 20 6c 65 6e 29 3b 0a 7d 0a 23 65 6e 64 69 d) len);.}.#endi
14080 66 0a 0c 0a 2f 2a 0a 20 2a 20 4c 6f 63 61 6c 20 f.../*. * Local
14090 56 61 72 69 61 62 6c 65 73 3a 0a 20 2a 20 6d 6f Variables:. * mo
140a0 64 65 3a 20 63 0a 20 2a 20 63 2d 62 61 73 69 63 de: c. * c-basic
140b0 2d 6f 66 66 73 65 74 3a 20 34 0a 20 2a 20 66 69 -offset: 4. * fi
140c0 6c 6c 2d 63 6f 6c 75 6d 6e 3a 20 37 38 0a 20 2a ll-column: 78. *
140d0 20 45 6e 64 3a 0a 20 2a 2f 0a End:. */.