On Mon, Nov 25, 2013 at 1:27 PM, Jim Jagielski <j...@jagunet.com> wrote:

>
> On Nov 24, 2013, at 7:18 PM, Jeff Trawick <traw...@gmail.com> wrote:
>
> > On Sat, Nov 23, 2013 at 5:39 PM, Yann Ylavic <ylavic....@gmail.com>
> wrote:
> > Couldn't ap_queue_info_try_get_idler() and the event_pre_config() check
> use :
> >
> >
> >     prev_idlers = apr_atomic_add32((apr_uint32_t
> *)&(queue_info->idlers), -1);
> >
> > like ap_queue_info_wait_for_idler() does ?
> >
> > I think that's correct...
> >
> > What the code really wants is new_idlers, so edit that slightly to
> >
> > new_idlers =  apr_atomic_add32((apr_uint32_t *)&(queue_info->idlers),
> -1) - 1;
> > if (new_idlers <= 0) {
> >     ...
> >     return APR_EAGAIN;
> > }
>
> It just wants to see if there are any idle ones... If there wasn't
> before the dec, then we need to return APR_EAGAIN. Recall that
> a 0 means "no idlers" and neg means 'this many blocking', and
> the logic is the same in both cases, minus the "wake up" scenario.
>
>
I think this is a safe progression from the original code, which was:

apr_status_t ap_queue_info_try_get_idler(fd_queue_info_t * queue_info)
{
    int prev_idlers;
    prev_idlers = apr_atomic_dec32((apr_uint32_t *)&(queue_info->idlers));
    if (prev_idlers <= 0) {

We know now that ALMOST every apr_atomic_dec32() returned the new idlers
value, and none returned the previous value, so fix the variable name to
reflect reality where it worked:

apr_status_t ap_queue_info_try_get_idler(fd_queue_info_t * queue_info)
{
    int new_idlers;
    new_idlers = apr_atomic_dec32((apr_uint32_t *)&(queue_info->idlers));
    if (new_idlers <= 0) {

You can't simply replace apr_atomic_dec32(foo) with apr_atomic_add32(foo,
-1) since the latter returns the old value instead of the new value, so you
have to subtract 1 from the return code of apr_atomic_dec32() to set
new_idlers to the same result as before.

-- 
Born in Roswell... married an alien...
http://emptyhammock.com/

Reply via email to