WebKit Bugzilla
New
Browse
Log In
×
Sign in with GitHub
or
Remember my login
Create Account
·
Forgot Password
Forgotten password account recovery
RESOLVED FIXED
220974
WebGL IPC should use shared memory for synchronous messages
https://bugs.webkit.org/show_bug.cgi?id=220974
Summary
WebGL IPC should use shared memory for synchronous messages
Kimmo Kinnunen
Reported
2021-01-26 05:54:13 PST
WebGL IPC should send synchronised messages through the shared memory. Also the replies should by default be written to the shared memory.
Attachments
Patch
(75.71 KB, patch)
2021-03-03 03:31 PST
,
Kimmo Kinnunen
no flags
Details
Formatted Diff
Diff
rebase
(77.40 KB, patch)
2021-03-15 05:49 PDT
,
Kimmo Kinnunen
no flags
Details
Formatted Diff
Diff
rebase
(77.39 KB, patch)
2021-03-15 05:51 PDT
,
Kimmo Kinnunen
no flags
Details
Formatted Diff
Diff
rebase
(77.42 KB, patch)
2021-03-15 06:14 PDT
,
Kimmo Kinnunen
no flags
Details
Formatted Diff
Diff
Show Obsolete
(3)
View All
Add attachment
proposed patch, testcase, etc.
Radar WebKit Bug Importer
Comment 1
2021-02-02 05:55:13 PST
<
rdar://problem/73876947
>
Kimmo Kinnunen
Comment 2
2021-03-03 03:31:47 PST
Created
attachment 422055
[details]
Patch
Geoffrey Garen
Comment 3
2021-03-10 14:14:01 PST
Comment on
attachment 422055
[details]
Patch View in context:
https://bugs.webkit.org/attachment.cgi?id=422055&action=review
Nice speedup! I think I may have spotted a small bug. Can you re-check EWS (and the small bug) before landing?
> Source/WebKit/Platform/IPC/Connection.h:326 > + bool pushPendingSyncRequestID(uint64_t syncRequestID = 0);
Can we remove the default 0 argument here? Feels like it might invite mistakes. Seems unused so far.
> Source/WebKit/Platform/IPC/StreamClientConnection.h:284 > +#if PLATFORM(COCOA) > + ClientLimit clientLimit = sharedClientLimit().exchange(ClientLimit::clientIsWaitingTag, std::memory_order_acq_rel); > + ClientOffset clientOffset = sharedClientOffset().load(std::memory_order_acquire); > +#else > + ClientLimit clientLimit = sharedClientLimit().load(std::memory_order_acquire); > + ClientOffset clientOffset = sharedClientOffset().load(std::memory_order_acquire); > +#endif > + if (!clientLimit && (clientOffset == ClientOffset::serverIsSleepingTag || !clientOffset)) > + break;
In the iteration where we break out of the loop, we temporarily set clientIsWaitingTag, but never wait on our semaphore. What happens if the server notices clientIsWaitingTag, and signals our semaphore, before we have a chance to clear clientIsWaitingTag? Does that put our semaphore out of balance? Perhaps it would be better to just do two loads (removing the cocoa-specific path), and only store clientIsWaitingTag right before we wait.
Kimmo Kinnunen
Comment 4
2021-03-15 05:49:51 PDT
Created
attachment 423163
[details]
rebase
Kimmo Kinnunen
Comment 5
2021-03-15 05:51:34 PDT
Created
attachment 423164
[details]
rebase
Kimmo Kinnunen
Comment 6
2021-03-15 06:11:56 PDT
Thanks for the review! (In reply to Geoffrey Garen from
comment #3
)
> In the iteration where we break out of the loop, we temporarily set > clientIsWaitingTag, but never wait on our semaphore. What happens if the > server notices clientIsWaitingTag, and signals our semaphore, before we have > a chance to clear clientIsWaitingTag? Does that put our semaphore out of > balance?
All the sites expect spurious wakeups from the semaphore waits.
> Perhaps it would be better to just do two loads (removing the cocoa-specific > path), and only store clientIsWaitingTag right before we wait.
That's what the code tries to avoid with the exchange. It is the race the wait structure always has. E.g. it would be as follows: for(;;) { clientOffset = sharedClientOffset.load(); clientLimit = sharedClientLimit.load(); if (!clientOffset && !clientLimit) break; // Race here: what if the server sets clientOffset = clientLimit = 0 here and goes on to wait // for next command from the client? sharedClientLimit.store(clientIsWaitingTag); wait(); // If the above happens, this waits forever. }
Kimmo Kinnunen
Comment 7
2021-03-15 06:14:51 PDT
Created
attachment 423167
[details]
rebase
EWS
Comment 8
2021-03-15 13:02:08 PDT
Committed
r274433
: <
https://commits.webkit.org/r274433
> All reviewed patches have been landed. Closing bug and clearing flags on
attachment 423167
[details]
.
Geoffrey Garen
Comment 9
2021-03-16 13:59:35 PDT
> All the sites expect spurious wakeups from the semaphore waits.
Got it. I hadn't noticed this before. Thanks!
Note
You need to
log in
before you can comment on or make changes to this bug.
Top of Page
Format For Printing
XML
Clone This Bug