On 24.6.2010, at 12.09, Alan Cox wrote:

>> size_t memrar_allocator_largest_free_area(struct memrar_allocator *allocator)
>> {
>> -    if (allocator == NULL)
>> -            return 0;
>> -    return allocator->largest_free_area;
>> +    size_t tmp = 0;
>> +
>> +    if (allocator != NULL) {
>> +            mutex_lock(&allocator->lock);
>> +            tmp = allocator->largest_free_area;
>> +            mutex_unlock(&allocator->lock);
> 
> This doesn't seem to make any sense (in either version). The moment you
> drop the lock the value in "tmp" becomes stale as the allocator could
> change it. ?
> 

The idea was proposed by Ossama Othman in his earlier reply.


Begin forwarded message:

> From: "Othman, Ossama" <[email protected]>
> To: Henri Häkkinen <[email protected]>, "[email protected]" <[email protected]>, 
> "[email protected]" <[email protected]>, "[email protected]" 
> <[email protected]>
> Cc: "[email protected]" <[email protected]>, 
> "[email protected]" <[email protected]>
> Subject: RE: [PATCH] Staging: memrar: Moved memrar_allocator struct into 
> memrar_allocator.c
> 
> Hi,
> 
>> Forward declared memrar_allocator in memrar_allocator.h and moved it
>> to memrar_allocator.c file.  Implemented memrar_allocator_capacity(),
>> memrar_allocator_largest_free_area(), memrar_allocoator_lock() and
>> memrar_allocator_unlock().
> ...
>> -    mutex_lock(&allocator->lock);
>> -    r->largest_block_size = allocator->largest_free_area;
>> -    mutex_unlock(&allocator->lock);
>> +    memrar_allocator_lock(allocator);
>> +    r->largest_block_size =
>> memrar_allocator_largest_free_area(allocator);
>> +    memrar_allocator_unlock(allocator);
> 
> I don't think it's necessary to expose the allocator lock.  Why not just grab 
> the lock in memrar_allocator_largest_free_area() while the underlying struct 
> field is being accessed and then unlock it before that function returns?  
> That would allow the allocator lock to remain an internal implementation 
> detail.  We only need to ensure access to the struct field itself is 
> synchronized, e.g.:
> 
> size_t memrar_allocator_largest_free_area(struct memrar_allocator *allocator)
> {
>       size_t tmp = 0;
> 
>       if (allocator != NULL) {
>               mutex_lock(&allocator->lock);
>               tmp = allocator->largest_free_area;
>               mutex_unlock(&allocator->lock);
>       }
> 
>       return tmp;
> }
> 
> Certainly the allocator->largest_free_area value could be updated after the 
> lock is released and by the time it is returned to the user (for statistical 
> purposes), but at least the internal allocator state would remain consistent 
> in the presences of multiple threads.
> 
> HTH,
> -Ossama
> 

_______________________________________________
devel mailing list
[email protected]
http://driverdev.linuxdriverproject.org/mailman/listinfo/devel

Reply via email to