[PATCH 1/2] advapi32: HKCR merge: foundation

George Stephanos gaf.stephanos at gmail.com
Thu Oct 24 19:48:55 CDT 2013


On Fri, Sep 27, 2013 at 11:13 AM, Alexandre Julliard <julliard at winehq.org>wrote:

> George Stephanos <gaf.stephanos at gmail.com> writes:
>
> > @@ -224,13 +248,138 @@ static NTSTATUS open_key( HKEY *retkey,
> ACCESS_MASK access, OBJECT_ATTRIBUTES *a
> >
> >  }
> >
> > +static LSTATUS create_hkcr_struct( HKEY *hkey, opened_hkcr_t **hkcr )
> > +{
> > +    UINT_PTR handle = nb_hkcr_handles, i;
> > +    LSTATUS ret = ERROR_SUCCESS;
> > +
> > +    EnterCriticalSection( &hkcr_handles_cs );
> > +
> > +    for (i = 0; i < nb_hkcr_handles; i++)
> > +    {
> > +        if (!hkcr_handles[i])
> > +        {
> > +            handle = i;
> > +            break;
> > +        }
> > +    }
>
> You need some sort of free list instead of a linear search.


Alright.

Also you can probably avoid one level of pointers and store objects
> directly.
>

I thought about this. If I store objects directly, accessing any would
require a lock on the whole table so I guarantee it's not moved or
reallocated elsewhere. This would obviously be pretty slow.

>
> Returning a pointer to the object outside of the critical section is not
> a good idea.


The critical section just protects the table and not the handles/structs
themselves.

>
> > +static HKEY resolve_hkcr( HKEY hkey )
> > +{
> > +    HKEY ret;
> > +    UINT_PTR idx = (UINT_PTR)hkey >> 2;
> > +    opened_hkcr_t *hkcr;
> > +    if (idx <= nb_hkcr_handles)
> > +    {
> > +        EnterCriticalSection( &hkcr_handles_cs );
>
> The count needs to be protected by the critical section too.
>
> Also please write a better subject line for the commit.
>
> --
> Alexandre Julliard
> julliard at winehq.org
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.winehq.org/pipermail/wine-devel/attachments/20131025/4ea5f75f/attachment.html>


More information about the wine-devel mailing list