* USE OR PERFORMANCE OF THIS SOFTWARE.
*
* $Log: wirtcl.c,v $
- * Revision 1.2 1995/10/27 17:30:16 adam
+ * Revision 1.3 1995/10/30 17:35:18 adam
+ * New function zwait that waits for a variable change - due to i/o events
+ * that invoke callback routines.
+ *
+ * Revision 1.2 1995/10/27 17:30:16 adam
* First search request/response that works.
*
* Revision 1.1 1995/10/27 15:12:08 adam
};
+static int events (struct tcl_info *p, char *waitVar);
+
+static int proc_zwait_invoke (ClientData clientData, Tcl_Interp *interp,
+ int argc, char **argv)
+{
+ struct tcl_info *p = (struct tcl_info*) clientData;
+
+ if (argc < 2)
+ return TCL_OK;
+ events (p, argv[1]);
+ return TCL_OK;
+}
+
+
+
/* select(2) callbacks */
struct callback {
void (*r_handle)(ClientData);
exit (1);
}
/* initialize irtcl */
+ Tcl_CreateCommand (p->interp, "zwait", proc_zwait_invoke, p, NULL);
for (i=0; i<MAX_CALLBACK; i++)
{
callback_table[i].r_handle = NULL;
static int do_exec (const char *fname, char *parms, void *mydata)
{
struct tcl_info *p = mydata;
- int i, r, min_fd = 0;
- const char *cp;
+ int r;
+ if ((r = w_interp_exec (p->w_interp, fname, parms)))
+ return r;
+ return 0;
+}
+
+
+static int events (struct tcl_info *p, char *waitVar)
+{
+ int r, i, min_fd = 0;
+ char *cp;
+ char *waitVarVal;
static fd_set fdset_tcl_r;
static fd_set fdset_tcl_w;
static fd_set fdset_tcl_x;
- if ((r = w_interp_exec (p->w_interp, fname, parms)))
- return r;
+ assert (waitVar);
+ if ((cp = Tcl_GetVar (p->interp, waitVar, 0)))
+ {
+ waitVarVal = malloc (strlen(cp)+1);
+ strcpy (waitVarVal, cp);
+ }
+ else
+ {
+ gw_log (GW_LOG_WARN, mod, "Variable %s doesn't exist", waitVar);
+ return 0;
+ }
+ gw_log (GW_LOG_DEBUG, mod, "Waiting for variable %s=%s",
+ waitVar, waitVarVal);
while (1)
{
+ if (!(cp = Tcl_GetVar (p->interp, waitVar, 0)) ||
+ strcmp (cp, waitVarVal))
+ {
+ free (waitVarVal);
+ return 0;
+ }
FD_ZERO (&fdset_tcl_r);
FD_ZERO (&fdset_tcl_w);
FD_ZERO (&fdset_tcl_x);
-
- if ((cp=Tcl_GetVar (p->interp, "sessionWait", 0)) && !strcmp (cp, "0"))
- return 0;
+
for (r=0, i=min_fd; i<=max_fd; i++)
{
if (callback_table[i].w_handle)
}
}
if (!r)
- return 0;
+ break;
if ((r = select(max_fd+1, &fdset_tcl_r, &fdset_tcl_w,
&fdset_tcl_x, 0)) < 0)
{
}
}
}
+ free (waitVarVal);
return 0;
}