#1294 Tcl_Main misses file events unless [update] is explicitly ca

obsolete: 8.2
closed-invalid
8
2004-11-23
2000-10-26
Anonymous
No

OriginalBugID: 2660 Bug
Version: 8.2
SubmitDate: '1999-08-31'
LastModified: '1999-12-03'
Severity: SER
Status: UnAssn
Submitter: techsupp
ChangedBy: hobbs
OS: Solaris
OSVersion: 2.6
Machine: Other
FixedDate: '2000-10-25'
ClosedDate: '2000-10-25'

Name:
Michael Santos

Extensions:
BLT 2.4i (but not required for above)

Comments:
I have had similar problems in programs using Tcl_DoOneEvent(). In this
case, the connection is established correctly (ConnectPort() is called),
but subsequent communication is impossible. The server seems to ignore
communication on the channel even though Tcl_CreateChannelHandler was
used to setup a callback. This latter problem seems to only happen when
Tcl 8.2 is compiled with threads support. Disabling thread support
seemed to restore the correct behavior. If I can adapt the test program
for this case, I will submit another bug report.

ReproducibleScript:
When opening a TCP server socket and using Tcl_Main in an interactive
application, connections will be ignored unless "update" or "update
idletasks" is explicitly invoked on the command line.

Below is a simple C file to illustrate. Connecting to the specified
port with some other program will not generate the message in
ConnectPort() until you invoke update on the command line.

#include <stdio.h>
#include <tcl.h>

Tcl_Interp *gInterp;

void
ConnectPort(ClientData clientData, Tcl_Channel new_socket,
char *hostName, int port) {
fprintf(stderr, "ConnectPort() called with hostname %s, port %d\n",
hostName, port);

Tcl_Close(gInterp, new_socket);
}

void
StartServer(ClientData clientData) {
Tcl_Channel socket;
fprintf(stderr, "StartServer() called.\n");
socket =
Tcl_OpenTcpServer(gInterp, 50099, NULL,
ConnectPort, (ClientData)NULL);
if (!socket) {
Tcl_Exit(1);
}
}

int
Tcl_AppInit(Tcl_Interp *interp) {
gInterp = interp;
if (Tcl_Init(interp) != TCL_OK) {
fprintf(stderr, "Tcl failed to initialize.\n");
Tcl_Exit(1);
}

StartServer(NULL);

return TCL_OK;
}

int
main(int argc, char *argv[]) {
Tcl_Main(argc, argv, Tcl_AppInit);

return 0;
}

ObservedBehavior:
As mentioned above, connecting to the server socket will not result in a
call to ConnectSocket() until "update" is entered on the command line of
the server process.

DesiredBehavior:
I expect to see the behavior of 8.0.5 (and previous versions -- haven't
ever tried 8.1). With 8.0.5, the server program will print the
ConnectPort() message immediately upon connecting to the port from
another program. No update call is needed to trigger it.

Discussion

  • Jeffrey Hobbs

    Jeffrey Hobbs - 2002-03-22
    • summary: Tcl_Main misses file events unless "update" is explicitly ca --> Tcl_Main misses file events unless "update" is explicitly ca
     
  • Jeffrey Hobbs

    Jeffrey Hobbs - 2002-03-22

    Logged In: YES
    user_id=72656

    see also 219302.

     
  • Donal K. Fellows

    • assigned_to: nobody --> andreas_kupries
    • summary: Tcl_Main misses file events unless "update" is explicitly ca --> Tcl_Main misses file events unless [update] is explicitly ca
     
  • Don Porter

    Don Porter - 2002-10-22

    Logged In: YES
    user_id=80530

    Is this solved now with the avilability of
    Tcl_SetMainLoop() ?

     
  • Don Porter

    Don Porter - 2003-10-02
    • priority: 5 --> 8
     
  • Andreas Kupries

    Andreas Kupries - 2003-10-22

    Logged In: YES
    user_id=75003

    I have no idea. The example is so short, possibly even
    incomplete. For example it has no call of Tcl_FindExecutable.

     
  • Don Porter

    Don Porter - 2003-10-22

    Logged In: YES
    user_id=80530

    If not for the reference to
    Tcl Bug 219302 as a
    Duplicate, I'd close this
    one as Out of Date.

    Does that report more clearly
    point out what the real issue
    is (and whether we've already
    solved it)?

     
  • Andreas Kupries

    Andreas Kupries - 2004-10-28

    Logged In: YES
    user_id=75003

    The other bug mentions SSH and X11 port forwarding, this one
    does not.. Beyond that the two report truly look the same,
    i.e. the other is no more clear than this one.

     
  • David Gravereaux

    Logged In: YES
    user_id=7549

    1) fprintf(stderr,...) is buffered according to however the
    system decides. If instead, you used
    Tcl_Write(Tcl_GetStdChannel(TCL_STDERR),...), the buffer is
    managed by Tcl, and is also more cross-platform.

    2) To churn the event loop in Tcl, one must actually churn
    it. Normally, the interactive shell is blocked on the stdin
    channel get'ing something. One can setup the shell for
    async mode on stdin. tclhttpd does this.

    If this had worked before, it might have been an odd fringe
    effect.

    This bug should be closed as it isn't a blocking Tcl_Gets
    responsibility to churn the event loop.

     
  • Donal K. Fellows

    • status: open --> closed-invalid
     
  • Donal K. Fellows

    Logged In: YES
    user_id=79902

    As stated elsewhere, this is Pilot Error. Closing...