[PATCH] ntdll: Don't enter uninterrupted section when get_cached_fd hits
Daniel Horn
danielrh at dropbox.com
Sun Apr 6 11:04:47 CDT 2014
Thanks for thinking this through. An alternative is using a trylock and assuming a cache miss (or not adding to the cache) if trylock fails.
That would surely be simpler code. I will benchmark both variants vs the original and let you know my findings
- Daniel
On Sun, Apr 6, 2014 at 8:47 AM, Ken Thomases <ken at codeweavers.com> wrote:
> On Apr 5, 2014, at 8:37 PM, Ken Thomases wrote:
>> It might be possible to have a safe, lockless version of get_cached_fd() that sometimes produces a false-negative. Then, if it fails, you'd enter the uninterrupted section and try the reliable version before making the server call. Devising such a scheme and convincing us that it's safe and reliable is the hard part. It might be sufficient put a memory barrier before the lookup of the fd in get_cached_fd() and then something like this at the bottom of that block:
>>
>> if (interlocked_cmpxchg( &fd_cache[entry][idx].fd, fd + 1, fd + 1) != fd + 1)
>> fd = -1;
>>
>> The idea is to verify that the fd has not been replaced or removed after we fetched it and its properties.
> It occurred to me that, for this to work, add_fd_to_cache() has to be changed, too. I think the fd has to be temporarily cleared, then the properties have to be stored, and then the fd can be stored. A write memory barrier is required, but is supplied by interlocked_xchg() which is already used.
> So, adding looks like:
> clear fd
> store properties
> store fd
> Getting looks like:
> get fd
> get properties
> get fd again and compare
> If a valid fd was read and it didn't change between the two points, then you can be sure the properties that you read go with the fd.
> -Ken
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.winehq.org/pipermail/wine-devel/attachments/20140406/26a705ba/attachment-0001.html>
More information about the wine-devel
mailing list