So, in this pattern, if the target thread's execution of SomeRunnable::Run could fail, causing ~SomeRunnable to call mMyRef's destructor and thus free the referent on the target thread, that would be a bug?
On Mon, Sep 12, 2016 at 12:47 PM, Boris Zbarsky <bzbar...@mit.edu> wrote: > On 9/12/16 3:40 PM, Jim Blandy wrote: > >> Could you go into more detail here? Either the caller will free it, or the >> callee will free it --- but they're both on the same thread. >> > > We have this pretty common pattern for handing references around threads > safely: > > Main thread: > > RefPtr<SomeRunnable> runnable = new SomeRunnable(myRef.forget()); > someTarget->Dispatch(runnable.forget()); > > Target thread, runnable's Run method: > > RefPtr<ResponseRunnable> runnable = new ResponseRunnable(mMyRef.forget > ()); > originalThread->Dispatch(runnable.forget()); > > And then back on the original thread the thing in myRef is worked with > again. The idea is to keep that thing alive without ever refcounting it on > the target thread, because for example it may not have a threadsafe > refcount implementation. > > If the callee >> puts the reference someplace where another thread will free it, then >> that's >> the operation that needs to be audited. >> > > Right, this all assumes that the Dispatch() calls above are infallible. > Which they are, iirc. > > > -Boris > > _______________________________________________ > dev-platform mailing list > dev-platform@lists.mozilla.org > https://lists.mozilla.org/listinfo/dev-platform > _______________________________________________ dev-platform mailing list dev-platform@lists.mozilla.org https://lists.mozilla.org/listinfo/dev-platform