WebKit Bugzilla
New
Browse
Log In
×
Sign in with GitHub
or
Remember my login
Create Account
·
Forgot Password
Forgotten password account recovery
RESOLVED FIXED
227740
Allow custom IPC::Attachment messaging in ConnectionUnix.cpp
https://bugs.webkit.org/show_bug.cgi?id=227740
Summary
Allow custom IPC::Attachment messaging in ConnectionUnix.cpp
Imanol Fernandez
Reported
2021-07-07 03:07:59 PDT
We need to pass AHardwareBuffer instance from the UIProcess to the WebProcess, which requires calling functions such as AHardwareBuffer_sendHandleToUnixSocket(). By adding custom IPC::Attachmentmessaging we can call the AHardwareBuffer helper functions to pass and get AHardwareBuffers via IPC
Attachments
Patch
(1.26 KB, patch)
2021-07-07 03:11 PDT
,
Imanol Fernandez
no flags
Details
Formatted Diff
Diff
Patch
(5.93 KB, patch)
2021-08-03 09:49 PDT
,
Imanol Fernandez
no flags
Details
Formatted Diff
Diff
Patch
(5.95 KB, patch)
2021-08-06 08:08 PDT
,
Imanol Fernandez
no flags
Details
Formatted Diff
Diff
Patch for landing
(5.96 KB, patch)
2021-08-09 02:24 PDT
,
Imanol Fernandez
no flags
Details
Formatted Diff
Diff
Patch for landing
(5.96 KB, patch)
2021-08-09 02:25 PDT
,
Imanol Fernandez
no flags
Details
Formatted Diff
Diff
Show Obsolete
(4)
View All
Add attachment
proposed patch, testcase, etc.
Imanol Fernandez
Comment 1
2021-07-07 03:11:54 PDT
Created
attachment 433021
[details]
Patch
Michael Catanzaro
Comment 2
2021-07-07 18:04:28 PDT
Comment on
attachment 433021
[details]
Patch View in context:
https://bugs.webkit.org/attachment.cgi?id=433021&action=review
> Source/WebKit/Platform/IPC/unix/ConnectionUnix.cpp:59 > -#endif // SOCK_SEQPACKET > +#endif // SOCK_SEQPACKET > > -namespace IPC { > +namespace IPC {
I assume there was some accident with this patch? :)
Imanol Fernandez
Comment 3
2021-07-12 07:23:10 PDT
yes, it was just a compilation test to discard what it looked like a intermittent compilation error
bug 226919
I'll upload the real patch soon :)
Imanol Fernandez
Comment 4
2021-08-03 09:49:35 PDT
Created
attachment 434836
[details]
Patch Implement CustomWriterType Attachment
Imanol Fernandez
Comment 5
2021-08-03 09:54:58 PDT
This is an example of how the API can be used to send aHardwareBuffer via IPC: void ArgumentCoder<PlatformXR::AHardwareBufferWrapper>::encode(Encoder& encoder, const PlatformXR::AHardwareBufferWrapper& wrapper) { auto hardwarebuffer = wrapper.hardwarebuffer; Attachment attachment(Attachment::CustomWriter { [hardwarebuffer](int socketDescriptor) { while (true) { int ret = AHardwareBuffer_sendHandleToUnixSocket(hardwarebuffer, socketDescriptor); if (!ret || ret != -EAGAIN) break; } }}); encoder << attachment; } bool ArgumentCoder<PlatformXR::AHardwareBufferWrapper>::decode(Decoder& decoder, PlatformXR::AHardwareBufferWrapper& wrapper) { Attachment attachment; if (!decoder.decode(attachment)) return false; auto socketDescriptor = WTF::get<Attachment::SocketDescriptor>(attachment.customWriter()); while (true) { auto ret = AHardwareBuffer_recvHandleFromUnixSocket(socketDescriptor, &wrapper.hardwarebuffer); if (!ret || ret != -EAGAIN) break; } return true; }
Imanol Fernandez
Comment 6
2021-08-06 08:08:30 PDT
Created
attachment 435068
[details]
Patch Use WTF::function instead of std::function
Zan Dobersek (Reviews)
Comment 7
2021-08-06 08:40:26 PDT
Comment on
attachment 435068
[details]
Patch View in context:
https://bugs.webkit.org/attachment.cgi?id=435068&action=review
> Source/WebKit/Platform/IPC/unix/ConnectionUnix.cpp:593 > + for (size_t i = 0; i < attachments.size(); ++i) {
for (auto& attachment : attachments)
Imanol Fernandez
Comment 8
2021-08-09 02:24:00 PDT
Created
attachment 435176
[details]
Patch for landing
Imanol Fernandez
Comment 9
2021-08-09 02:25:35 PDT
Created
attachment 435177
[details]
Patch for landing
EWS
Comment 10
2021-08-09 02:58:30 PDT
Committed
r280769
(
240353@main
): <
https://commits.webkit.org/240353@main
> All reviewed patches have been landed. Closing bug and clearing flags on
attachment 435177
[details]
.
Kimmo Kinnunen
Comment 11
2022-05-05 02:57:39 PDT
Did the client for this ever land? I think this is a fair deviation of the intended purpose of Attachment, and maybe forms undue cognitive overhead while maintenance. Hanging arbitrary function closure to the IPC message attachment is cumbersome as it's unclear what is the contract to call the function. What thread is it ok to call? Is it ok to call many times? What's the lifetime of the closed variables? In the example in the comments, there's a potential to try to access a already freed ANB. Message send can be delayed, and as such it's not guaranteed that the ANB pointer closed by the function is alive at the time of actual message send. Some time in the future the non-Cocoa and Cocoa parts could/should/must share more of the implementation. In these cases, it's not ok to run arbitrary code, as the send may happen in other thread. The intended use of IPC::Attachment is that all objects that cannot be transferred as pure data are stored in IPC::Attachment. In this case, it'd be better to store an owning reference to a ANB in the Attachment, and then explicitly say "Connection knows how to transfer UnixFileDescriptor" (e.g this is already there) "Connection knows how to transfer ANB" (e.g. you make ConnectionUnix.cpp call AHardwareBuffer_sendHandleToUnixSocket et al) So Unix variant of Connection would have class Attachment { std::variant<UnixFileDescriptor #if USE(ANDROID_NATIVE_BUFFER) , Ref<AHardwareBuffer> #endif > }; (Ref<AHardwareBuffer> uses AHardwareBuffer_acquire, AHardwareBuffer_release to implement ref(), unref())
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