On 04/22/2015 08:54 PM, Maxim Uvarov wrote:
> On 04/22/15 19:06, Ciprian Barbu wrote:
>> On Wed, Apr 22, 2015 at 5:13 PM, Maxim Uvarov 
>> <maxim.uva...@linaro.org> wrote:
>>> On 04/22/15 15:53, Bill Fischofer wrote:
>>>> It does that, but as Taras points out there is a race condition.  If 
>>>> one
>>>> thread does an odp_pool_destroy() and it succeeds, another thread 
>>>> could do
>>>> an odp_pool_create() before the second odp_pool_destroy() and get 
>>>> the same
>>>> pool handle which would then be deleted by the second 
>>>> odp_pool_destroy()
>>>> call.
>>>>
>>> odp_pool_destroy() should hold lock inside it. (i.e. it already does 
>>> that).
>> The scenario is not about a race condition on create/delete, it's
>> actually even simpler:
>>
>> th1: lock -> create_pool -> unlock
>> th1: lock -> destroy_pool -> unlock
>> th2: lock -> create_pool -> unlock
>> th1: lock -> destroy_pool -> unlock
> Ok, but it's not undefined behavior. If you work with threads you should 
> know what you do.
> 
> So behavior is: destroy function fails if pool already destroyed.
> 
> I still think that Mikes test is valid. It's single threaded application 
> with very exact case.
> Analogy for example:
> char *a = malloc(10);
> a[5] = 1;
> 
> On your logic it has to be undefined behavior due to some other thread 
> can free or malloc with different size.

This in not a valid analogy. Should be something like this.

char *a = malloc(10);
free(a);
free(a); /* Here you may free a block which is allocated again by another 
thread */
_______________________________________________
lng-odp mailing list
lng-odp@lists.linaro.org
https://lists.linaro.org/mailman/listinfo/lng-odp

Reply via email to