You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@apr.apache.org by Ian Holsman <li...@holsman.net> on 2003/02/24 21:59:41 UTC

Re: [PATCH] Problem with the queues - commited

Thanks guys.
this code has been committed. 


On Fri, 21 Feb 2003 09:57:31 -0800, Jacob Lewallen wrote:

> Some more problems with apr_queue. . .
> 
> Erwin De Wolff wrote:
> 
>>My application uses queues and I notice that I had some difficulties when
>>reaching the end and start of the queue. I'm using the latest (21 febr
>>2003) snapshot of apr and apr-util. Platforms on which it occurs, Windows
>>and Linux. To make the problem more accessible I use most of the same
>>code as the testqueue.c provided in the distribution. Only to simplify I
>>use one producer and one consumer only and a queue of size 1. The
>>producer pushes values 0,1,2,3,... and the consumer pops them one by one.
>>The following output is obtained:
>>
>>	0: value 0 succesfully pushed.
>>	1: value 1 succesfully pushed.
>>	        0: value 1 succesfully popped.
>>	2: value 2 succesfully pushed.
>>      	  1: value 2 succesfully popped.
>>	3: value 3 succesfully pushed.
>>      	  2: value 3 succesfully popped.
>>	        3: value 3 succesfully popped.
>>
>>You can notice a few things:
>>1. value 0 is never popped
>>2. there are two values pushed on a queue of size 1! 3. value 3 is popped
>>twice on a queue of size 1.
>>
>>I don't think I made a mistake in the code, but just for those who might
>>doubt that, I attached the used code.
>>  
>>  
> [code removed]
> 
> Here's what's going on here. With a queue size of 1, there's only one
> position in the queue for placing data. In apr_queue_pop, we return the
> address of the popped item "in the queue's own array" (hence us having to
> dereference twice to get our integer pointer above). So here's how things
> breakdown:
> 
>  P: we push 0, its placed in data[0]
>  P: we try to push 1, its blocked, because we're full C: we pop, and are
>  returned the address of data[0] (in our case, a
> pointer to where the pointer to 0 is zero)
>  P: unblock, push 1 into the queue (overwriting data[0] with the new
> pointer)
>  C: we dereference the pointer to data[0] that was returned, which has
> since been replaced with a pointer to 1.
> 
> And this goes on. I think that this is responsible for all of the behavior
> we see above. I'm almost positive that I've seen someone complain about
> how the apr_queue code returns the address of the item, rather than the
> value itself. This is what the attached patch does, if anybody has any
> reason for keeping the existing behavior, I'd love to hear them. This, of
> course, breaks any code that uses apr_queue_pop, so it's a big deal.
> 
> jacob lewallen
> jlewalle@cs.ucr.edu