Esempio n. 1
0
int	broadcast(t_stck *s, int fd, t_wait *t)
{
  char	*cmd;
  char	*tmp;
  int	k;
  int	i;

  cmd = t->cmd + 10;
  i = 3;
  tmp = Xmalloc(strlen(cmd) + 32);
  while (++i <= s->max_fd)
    {
      if (s->fds[i].type != FD_IA || i == fd)
	continue;
      k = get_rep(s, &(s->fds[fd]), &(s->fds[i]));
      memset(tmp, 0, strlen(cmd) + 32);
      sprintf(tmp, "message %d,%s", k, cmd);
      send_one(tmp, i, s);
    }
  send_one("ok", fd, s);
  event_broadcast(s, fd, cmd);
  return (0);
}
Esempio n. 2
0
static void check_fds(bool block)
{
    fd_set readfds, writefds;
    int nfound, fd;
    struct timeval tv, *tvp;

    if (NumFds == 0) {
        if (block) {
          sigset_t set;
          sigemptyset(&set);
          sigsuspend(&set);
        }
        return;
    }

    memcpy(&readfds, &Readers.fds, sizeof(readfds));
    memcpy(&writefds, &Writers.fds, sizeof(writefds));

#ifdef WIN32
    do {
            for (fd = 0; fd < NumFds; fd++) {
            if (FD_ISSET(fd, &Readers.fds) && input_available(fd)) {
                event_broadcast(Readers.events[fd]);
                FD_CLR(fd, &Readers.fds);
                block = 0;
            }
            if (FD_ISSET(fd, &Writers.fds) && output_writable(fd)) {
                event_broadcast(Writers.events[fd]);
                FD_CLR(fd, &Writers.fds);
                block = 0;
            }
        }
    } while (block);
    for (fd = NumFds - 1; fd >= 0; fd--)   /* Adjust NumFds */
        if (FD_ISSET(fd, &Readers.fds) || FD_ISSET(fd, &Writers.fds))
            break;
    NumFds = fd+1;
#else
    if (block)
        tvp = NULL;
    else {
        tv.tv_usec = 0;
        tv.tv_sec = 0;
        tvp = &tv;
    }

    nfound = select(NumFds, &readfds, &writefds, NULL, tvp);

    if (nfound < 0) {
        switch (errno) {
          case EBADF:
            /* One of the file descriptors when bad.  Wake everyone up */
            /* and let the individual threads figure out who is selecting */
            /* on a bogus fd. */
            for (fd = 0; fd < NumFds; fd++) {
                if (FD_ISSET(fd, &Readers.fds))
                    event_broadcast(Readers.events[fd]);
                if (FD_ISSET(fd, &Writers.fds))
                    event_broadcast(Writers.events[fd]);
            }
            FD_ZERO(&Readers.fds);
            FD_ZERO(&Writers.fds);
            NumFds = 0;
            break;

          case EINTR:
            break;
          case EINVAL:
            lose("select failed with EINVAL?");
        }
    }
    else if (nfound > 0) {
        for (fd = 0; fd < NumFds; fd++) {
            if (FD_ISSET(fd, &readfds)) {
                event_broadcast(Readers.events[fd]);
                FD_CLR(fd, &Readers.fds);
            }
            if (FD_ISSET(fd, &writefds)) {
                event_broadcast(Writers.events[fd]);
                FD_CLR(fd, &Writers.fds);
            }
        }
        for (fd = NumFds - 1; fd >= 0; fd--)
            if (FD_ISSET(fd, &Readers.fds) || FD_ISSET(fd, &Writers.fds))
                break;
        NumFds = fd+1;
    }
#endif
}