[#4858] Build fails on OSX Tiger 10.4 — noreply@...

Bugs item #1883, was opened at 2005-05-06 14:55

21 messages 2005/05/06
[#4862] Re: [ ruby-Bugs-1883 ] Build fails on OSX Tiger 10.4 — Yukihiro Matsumoto <matz@...> 2005/05/07

Hi,

[#4865] Re: [ ruby-Bugs-1883 ] Build fails on OSX Tiger 10.4 — Ryan Davis <ryand-ruby@...> 2005/05/07

[#4868] Re: [ ruby-Bugs-1883 ] Build fails on OSX Tiger 10.4 — nobu.nokada@... 2005/05/07

Hi,

[#5053] Re: [ ruby-Bugs-1883 ] Build fails on OSX Tiger 10.4 — Shugo Maeda <shugo@...> 2005/05/19

Hi,

[#5056] Re: [ ruby-Bugs-1883 ] Build fails on OSX Tiger 10.4 — Mark Hubbart <discordantus@...> 2005/05/19

On 5/19/05, Shugo Maeda <shugo@ruby-lang.org> wrote:

[#4874] - Need to reduce Ruby Sources to the Minimal — Ilias Lazaridis <ilias@...>

Hello all,

31 messages 2005/05/10
[#4879] Re: [THIN] - Need to reduce Ruby Sources to the Minimal — Pit Capitain <pit@...> 2005/05/11

Ilias Lazaridis schrieb:

[#4883] Re: [THIN] - Need to reduce Ruby Sources to the Minimal — Ilias Lazaridis <ilias@...> 2005/05/12

Pit Capitain wrote:

[#4884] Re: [THIN] - Need to reduce Ruby Sources to the Minimal — Ryan Davis <ryand-ruby@...> 2005/05/12

[#4888] Re: [THIN] - Need to reduce Ruby Sources to the Minimal — Ilias Lazaridis <ilias@...> 2005/05/12

Ryan Davis wrote:

[#4889] Re: [THIN] - Need to reduce Ruby Sources to the Minimal — ES <ruby-ml@...> 2005/05/12

[#4890] Re: [THIN] - Need to reduce Ruby Sources to the Minimal — Ilias Lazaridis <ilias@...> 2005/05/12

ES wrote:

[#4891] Re: [THIN] - Need to reduce Ruby Sources to the Minimal — Alexander Kellett <ruby-lists@...> 2005/05/12

On May 12, 2005, at 3:13 PM, Ilias Lazaridis wrote:

[#4911] Pointless argc check in Array#select — noreply@...

Patches item #1900, was opened at 2005-05-12 09:33

11 messages 2005/05/12

[#4919] - Hierarchical/Modular Directory Structure — Ilias Lazaridis <ilias@...>

The source-code structure should be simplified, lowering barriers for

20 messages 2005/05/12

Re: select() on non-sockets in eval.c

From: nobu.nokada@...
Date: 2005-05-27 14:25:58 UTC
List: ruby-core #5114
Hi,

At Fri, 27 May 2005 22:49:50 +0900,
BG - Ben Armstrong wrote in [ruby-core:05113]:
> Nobu, if I understand this code correctly, I think I see a problem:

Correct.

> Later, once we have ruled out the socket-only & non-socket-only cases
> which are trivial, we go on to just select against the socket fds: 
> 
> > +    ret = select(maxsock, rp, wp, ep, &z);

I forgot to initialize rp, wp and ep.

> If an error was returned, we just ignore it and return nsocks, the # of
> non-socket fds, and return the non-socket fd bits in rfd, wfd & efd.  So
> far, so good.

Counting non-sockets was wrong.

> But if select returned >= 0, then for each set bit in rp, wp & ep, we
> set a bit in rfd, wfd & efd to return:
> 
> > +    for (i = 0; i < maxsock; ++i) {
> > +	if (rp && FD_ISSET(i, rp)) {
> > +	    FD_SET(i, rfd);
> > +	    ret++;
> > +	}
> ... etc. ...
> 
> This is where I get confused about what you intended.  Ret started as
> the return value from select on the sockets, and rp, wp and ep should
> already contain the ready socket fds.  Why are we adding into ret the
> count of *socket* fds ready?  Shouldn't this be setting rfd, wfd and efd
> to the returned rp, wp and ep, and then add in the *non-socket* bits
> (and increment ret per ready non-socket fd)?  But we don't have any
> variables storing just the non-socket bits, so we can't do that.

New select() wrapper function, does this work?

int
rb_vms_select(int maxfd, fd_set *rfd, fd_set *wfd, fd_set *efd, struct timeval *tv)
{
    int i, maxsock, socks, nsocks;
    fd_set rs, ws, es, *rp = 0, *wp = 0, *ep = 0;
    struct timeval z;

    FD_ZERO(&rs);
    FD_ZERO(&ws);
    FD_ZERO(&es);

    /* count socket and non-socket fds, and move socket bits to local
     * fd_sets */
    maxsock = socks = nsocks = 0;
    if (rfd || wfd || efd) {
	for (i = 0; i < maxfd; ++i) {
	    int r = (rfd != 0) && FD_ISSET(i, rfd);
	    int w = (wfd != 0) && FD_ISSET(i, wfd);
	    int e = (efd != 0) && FD_ISSET(i, efd);
	    if (!r && !w && !e) continue;
	    if (is_socket(i)) {
		if (r) {
		    FD_SET(i, (rp = &rs));
		    FD_CLR(i, rfd);
		}
		if (w) {
		    FD_SET(i, (wp = &ws));
		    FD_CLR(i, wfd);
		}
		if (e) {
		    FD_SET(i, (ep = &es));
		    FD_CLR(i, efd);
		}
		maxsock = i + 1;
		socks++;
	    }
	    else {
		nsocks += r + w + e;
	    }
	}
    }

    if (!nsocks) {
	/* sockets only */
	return select(maxsock, rfd, wfd, efd, tv);
    }

    if (!socks) {
	/* assuming non-socket fds are always ready */
	return nsocks;
    }

    /* check if sockets are ready */
    z.tv_sec = 0;
    z.tv_usec = 0;
    ret = select(maxsock, rp, wp, ep, &z);
    if (ret <= 0) {
	return nsocks;
    }

    /* copy set bits back */
    for (i = 0; i < maxsock; ++i) {
	if (rp && FD_ISSET(i, rp)) FD_SET(i, rfd);
	if (wp && FD_ISSET(i, wp)) FD_SET(i, wfd);
	if (ep && FD_ISSET(i, ep)) FD_SET(i, efd);
    }
    ret += nsocks;

    return ret;
}

-- 
Nobu Nakada

In This Thread

Prev Next