IPDL now supports async returns with MozPromise

Hello!

With bug 1313200 landed, async IPC messages can now return data via
MozPromises.

The IPDL syntax:

    protocol PFoo {
    child:
        async Bar() returns (bool param);
    };

will generate IPC code that allow the send method like this:

    SendBar()->Then(AbstractThread::GetCurrent(), __func__,
                    [](bool param) {
                      // do something
                    },
                    [](PromiseRejectReason aReason) {
                      // handle send failure
                    });

For a message named Foo it will receive a promise resolver with type
FooPromise. For example the receiving side of previous message
PFoo::Bar the handler looks like this:

    mozilla::ipc::IPCResult
    FooChild::RecvBarMessage(RefPtr<BarMessagePromise>&& aPromise)
    {
        bool result;
        // do some computation
        aPromise->Resolve(result);
    }

If there are multiple return values, they will be wrapped in a
mozilla::Tuple.

The usual MozPromise rule applies. You can store the promise and
resolve it later. You can direct the ThenFunction to be run on other
threads. If the channel is closed before all promises are resolved,
the pending promises will be rejected with
PromiseRejectReason::ChannelClosed. Promises resolved after channel
close are ignored.

It is discouraged for the receiving handler to reject the promise. It
should be reserved for the IPC system to signal errors. If you must
reject the promise, only PromiseRejectReason::HandlerRejected is valid
value.

Please give it a try. In theory this should work for all IPC actors. If
you encountered issues or have ideas to
improve this, please file a bug in Core :: IPC.

Thanks,
Kanru

P.S. Note that async constructor or destructor does not support return
promises because the semantic is still not clear.
0
Kan
4/19/2017 6:54:02 PM
mozilla.dev.platform 5698 articles. 0 followers. Post Follow

0 Replies
26 Views

Similar Articles

[PageSpeed] 6

Reply: