apr-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Bill Stoddard <b...@wstoddard.com>
Subject Re: RESEND: PATCH: Update requested events for a descriptor that is already in a poll set
Date Mon, 15 Mar 2004 14:37:30 GMT
Robert Norris wrote:

Robert,
Thanks for resending... No promises but I'll try to review this this week. Please, someone
beat me to it.

Bill

> [ I'm resending this, because I didn't get any responses to it the first
> time. ]
> 
> Attached is a patch that adds a function apr_pollset_update(). This
> updates the list of requested events for the descriptor in the
> underlying implementation for a descriptor that is already in a pollset.
> 
> It works well enough, but I'm not happy with it because it requires a
> search through the pollset (just as apr_pollset_remove() does). On a
> server with hundreds or thousands of descriptors in the set and changing
> events often, this might end up being too expensive.
> 
> The optimisation that I'd like to do is to maintain a pointer (by index
> or explicit) for each descriptor that points to the descriptors'
> underlying pollfd structure, and just use this. This would lose the
> ability to enter a socket into the set multiple times with different
> events, as is currently possible, but would eliminate the search.
> 
> The only problem with this is that such a pointer would really belong in
> apr_pollfd_t, except that its specific to the poll() implementation, and
> that type is not opaque. So I'd appreciate some pointers on how to best
> do this.
> 
> Rob.
> 
> 
> 
> ------------------------------------------------------------------------
> 
> diff -U3 -r /home/box/downloads/apr-0.9.4/include/apr_poll.h apr-0.9.4/include/apr_poll.h
> --- /home/box/downloads/apr-0.9.4/include/apr_poll.h	2003-03-06 08:22:26.000000000 +1100
> +++ apr-0.9.4/include/apr_poll.h	2004-03-05 08:57:56.000000000 +1100
> @@ -270,6 +270,14 @@
>                                               const apr_pollfd_t *descriptor);
>  
>  /**
> + * Update the requested events for the descriptor in the underlying implementation
> + * @param pollset The pollset that the descriptor is a member of
> + * @param descriptor The descriptor to update
> + */
> +APR_DECLARE(apr_status_t) apr_pollset_update(apr_pollset_t *pollset,
> +                                             const apr_pollfd_t *descriptor);
> +
> +/**
>   * Block for activity on the descriptor(s) in a pollset
>   * @param pollset The pollset to use
>   * @param timeout Timeout in microseconds
> diff -U3 -r /home/box/downloads/apr-0.9.4/poll/unix/poll.c apr-0.9.4/poll/unix/poll.c
> --- /home/box/downloads/apr-0.9.4/poll/unix/poll.c	2003-01-07 11:52:56.000000000 +1100
> +++ apr-0.9.4/poll/unix/poll.c	2004-03-05 09:26:54.000000000 +1100
> @@ -515,6 +515,55 @@
>      return APR_NOTFOUND;
>  }
>  
> +APR_DECLARE(apr_status_t) apr_pollset_update(apr_pollset_t *pollset,
> +                                             const apr_pollfd_t *descriptor)
> +{
> +    apr_uint32_t i;
> +
> +#ifndef HAVE_POLL
> +    apr_os_sock_t fd;
> +
> +    if (descriptor->desc_type == APR_POLL_SOCKET) {
> +        fd = descriptor->desc.s->socketdes;
> +    }
> +    else {
> +#if !APR_FILES_AS_SOCKETS
> +        return APR_EBADF;
> +#else
> +        fd = descriptor->desc.f->filedes;
> +#endif
> +    }
> +#endif /* !HAVE_POLL */
> +
> +    for (i = 0; i < pollset->nelts; i++) {
> +        if (descriptor->desc.s == pollset->query_set[i].desc.s) {
> +            /* Found an instance of the fd: update its events */
> +            pollset->query_set[i].reqevents = descriptor->reqevents;
> +
> +#ifdef HAVE_POLL
> +            pollset->pollset[i].events = get_event(descriptor->reqevents);
> +#else
> +            if (descriptor->reqevents & APR_POLLIN) {
> +                FD_SET(fd, &(pollset->readset));
> +            }
> +            if (descriptor->reqevents & APR_POLLOUT) {
> +                FD_SET(fd, &(pollset->writeset));
> +            }
> +            if (descriptor->reqevents &
> +                (APR_POLLPRI | APR_POLLERR | APR_POLLHUP | APR_POLLNVAL)) {
> +                FD_SET(fd, &(pollset->exceptset));
> +            }
> +#endif
> +        }
> +    }
> +    
> +    if (i == pollset->nelts) {
> +        return APR_NOTFOUND;
> +    }
> +
> +    return APR_SUCCESS;
> +}
> +
>  #ifdef HAVE_POLL
>  APR_DECLARE(apr_status_t) apr_pollset_poll(apr_pollset_t *pollset,
>                                             apr_interval_time_t timeout,


Mime
View raw message