static int tek_lib_exec_getmsg(lua_State *L) { struct LuaExecTask *lexec = tek_lib_exec_check(L); struct TExecBase *TExecBase = lexec->exec; char *msg = TGetMsg(TGetUserPort(TNULL)); if (msg) { TSIZE size = TGetSize(msg) - TEK_LIB_TASKNAME_LEN; lua_pushlstring(L, msg, size); lua_pushstring(L, msg + size); TAckMsg(msg); return 2; } lua_pushnil(L); lua_pushnil(L); return 2; }
static void vis_modclose(struct TVisualBase *inst) { struct TVisualBase *mod = (struct TVisualBase *) inst->vis_Module.tmd_ModSuper; struct TExecBase *TExecBase = TGetExecBase(mod); if (inst != mod) { struct TNode *node; TAPTR imsg; if (inst->vis_Flags & TVISFL_IMSGPORT_OWNER) { TINT n = 0; while ((imsg = TGetMsg(inst->vis_IMsgPort))) { TAckMsg(imsg); n++; } if (n > 0) TDBPRINTF(TDB_WARN,("freed &d pending input message\n", n)); } while ((node = TRemHead(&inst->vis_ReqPool))) TFree(node); while ((node = TRemHead(&inst->vis_WaitList))) { TWaitIO((struct TIORequest *) node); TFree(node); } vis_destroyports(inst); TFreeInstance(&inst->vis_Module); } TLock(mod->vis_Lock); if (--mod->vis_RefCount == 0) vis_exit(mod); TUnlock(mod->vis_Lock); }
static void tek_lib_visual_io_task(struct TTask *task) { struct TExecBase *TExecBase = TGetExecBase(task); struct IOData *iodata = TGetTaskData(task); TEKVisual *vis = iodata->vis; TIMSG *imsg; TUINT sig; #if defined(ENABLE_FILENO) || defined(ENABLE_DGRAM) char buf[256]; fd_set rset; #endif do { #if defined(ENABLE_FILENO) || defined(ENABLE_DGRAM) FD_ZERO(&rset); FD_SET(iodata->fd_pipe[0], &rset); #endif #if defined(ENABLE_FILENO) if (iodata->fd_stdin != -1) FD_SET(iodata->fd_stdin, &rset); #endif #if defined(ENABLE_DGRAM) FD_SET(iodata->fd_dgram, &rset); #endif #if defined(ENABLE_FILENO) || defined(ENABLE_DGRAM) if (select(iodata->fdmax, &rset, NULL, NULL, NULL) > 0) { int nbytes = 0; /* consume signal: */ if (FD_ISSET(iodata->fd_pipe[0], &rset)) { ioctl(iodata->fd_pipe[0], FIONREAD, &nbytes); if (nbytes > 0) if (read(iodata->fd_pipe[0], buf, TMIN(sizeof(buf), (size_t) nbytes)) != nbytes) TDBPRINTF(TDB_ERROR,("Error reading from selfpipe\n")); } #if defined(ENABLE_FILENO) /* stdin line reader: */ if (iodata->fd_stdin >= 0 && FD_ISSET(iodata->fd_stdin, &rset)) { if (ioctl(iodata->fd_stdin, FIONREAD, &nbytes) == 0) { if (nbytes == 0) iodata->fd_stdin = -1; /* stop processing */ else { char *line; size_t len; visual_io_reader_addbytes(&iodata->linereader, nbytes); while (visual_io_readline(&iodata->linereader, &line, &len)) { if (getusermsg(vis, &imsg, TITYPE_USER, len)) { memcpy((void *) (imsg + 1), line, len); TPutMsg(vis->vis_IMsgPort, TNULL, &imsg->timsg_Node); } } } } else iodata->fd_stdin = -1; /* stop processing */ } #endif #if defined(ENABLE_DGRAM) if (iodata->fd_dgram >= 0 && FD_ISSET(iodata->fd_dgram, &rset)) { char umsg[IOMAXMSGSIZE]; TIMSG *imsg; ssize_t len = recv(iodata->fd_dgram, umsg, sizeof umsg, 0); if (len >= 0 && getusermsg(vis, &imsg, TITYPE_USER, len)) { memcpy((void *) (imsg + 1), umsg, len); TPutMsg(vis->vis_IMsgPort, TNULL, &imsg->timsg_Node); } } #endif } sig = TSetSignal(0, TTASK_SIG_ABORT | TTASK_SIG_USER); #else sig = TWait(TTASK_SIG_ABORT | TTASK_SIG_USER); #endif if (sig & TTASK_SIG_USER) { TAPTR msg, uport = TGetUserPort(TNULL); while ((msg = TGetMsg(uport))) { TSIZE len = TGetSize(msg); /* repackage into user input message */ if (getusermsg(vis, &imsg, TITYPE_USER, len)) { memcpy((void *) (imsg + 1), msg, len); TPutMsg(vis->vis_IMsgPort, TNULL, &imsg->timsg_Node); } TAckMsg(msg); } } } while (!(sig & TTASK_SIG_ABORT)); tek_lib_visual_io_exit(task); }