Optimizing synchronization objects
Daniel Santos
daniel.santos at pobox.com
Thu Sep 17 02:36:51 CDT 2015
On 09/16/2015 10:49 AM, Vincent Povirk wrote:
> Well, I didn't read what he said that way:
>
> On Mon, Sep 14, 2015 at 2:18 AM, Alexandre Julliard <julliard at winehq.org> wrote:
>> Using shared memory means you'll need one page per object, because you
>> can't allow a process to corrupt the state of unrelated objects. This
>> doesn't scale.
> This is true only if you share memory between multiple clients. If you
> share memory only between wineserver and individual clients, you need
> at least one page per client, but you can use the entire page (and
> most of the overhead can remain in the individual processes, ideally
> you only need 32 or 64 bits of shared memory per object).
>
> Maybe there's another objection to this approach, but I didn't see it
> in this thread.
>
Actually, this does not need to be true if you share memory between
multiple clients. Every unique combination of processes involved in
sharing objects can have it's own "process group" where those objects,
and only those objects reside. Further, to identify corruption, each
process can keep accounting on its interaction with each object which
can be used to validate that the memory has not been altered outside of
proper use of the API. For a semaphore, I think that 32 bits will be
enough to and leave plenty of room left over for various flags, like one
for "object being moved" and another for "server wants a notification."
If an additional process gains access to the object it can just be moved
again to the new process group. This design would allow complex waits to
occur on the server without requiring the object to be migrated. Of
course the server would never block, it will rely upon the client to
signal it in some form when a "signaling" function is performed
(ReleaseMutex, ReleaseSemaphore, WakeConditionVariable, etc.).
What are your thoughts Alexandre? If I implement it and provide tests to
reasonably prove that memory corruption cannot affect the wineserver's
function, nor the stability of other programs that are not sharing
objects will you consider it at some point? I know that something like
this would have to sit in staging for a long time, but I just don't want
to build something that has no chance of being merged.
Thanks,
Daniel
More information about the wine-devel
mailing list