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
Patch (5.93 KB, patch)
2021-08-03 09:49 PDT, Imanol Fernandez
no flags
Patch (5.95 KB, patch)
2021-08-06 08:08 PDT, Imanol Fernandez
no flags
Patch for landing (5.96 KB, patch)
2021-08-09 02:24 PDT, Imanol Fernandez
no flags
Patch for landing (5.96 KB, patch)
2021-08-09 02:25 PDT, Imanol Fernandez
no flags
Imanol Fernandez
Comment 1 2021-07-07 03:11:54 PDT
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.